Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Toshok <toshok@novell.com>2010-01-28 22:05:59 +0300
committerChris Toshok <toshok@novell.com>2010-01-28 22:05:59 +0300
commita17f894b666841189aeffb3d2a172c63c9f4f0b6 (patch)
tree819aad30e3555f3ccef95d1e3d9c78a2e90e9272
parent7c591aef6990c3f45e264c8ba8eff0215c967572 (diff)
parent70ffc535d0d72eaf0811a19b2e7faeb99330123d (diff)
merge up to r150220 from branch 2-6moon/moon-2-3moon/2.2moon/2.1
svn path=/branches/moon/moon-2-0/mono/; revision=150389
-rw-r--r--ChangeLog9
-rw-r--r--configure.in21
-rwxr-xr-xdocs/AgilityPack.dllbin82432 -> 0 bytes
-rw-r--r--docs/ChangeLog13
-rw-r--r--docs/HtmlAgilityPack/EncodingFoundException.cs33
-rw-r--r--docs/HtmlAgilityPack/HtmlAttribute.cs260
-rw-r--r--docs/HtmlAgilityPack/HtmlAttributeCollection.cs394
-rw-r--r--docs/HtmlAgilityPack/HtmlCmdLine.cs142
-rw-r--r--docs/HtmlAgilityPack/HtmlCommentNode.cs76
-rw-r--r--docs/HtmlAgilityPack/HtmlConsoleListener.cs33
-rw-r--r--docs/HtmlAgilityPack/HtmlDocument.cs1962
-rw-r--r--docs/HtmlAgilityPack/HtmlElementFlag.cs32
-rw-r--r--docs/HtmlAgilityPack/HtmlEntity.cs826
-rw-r--r--docs/HtmlAgilityPack/HtmlNameTable.cs52
-rw-r--r--docs/HtmlAgilityPack/HtmlNode.cs1996
-rw-r--r--docs/HtmlAgilityPack/HtmlNodeCollection.cs512
-rw-r--r--docs/HtmlAgilityPack/HtmlNodeNavigator.cs768
-rw-r--r--docs/HtmlAgilityPack/HtmlNodeType.cs29
-rw-r--r--docs/HtmlAgilityPack/HtmlParseError.cs92
-rw-r--r--docs/HtmlAgilityPack/HtmlParseErrorCode.cs34
-rw-r--r--docs/HtmlAgilityPack/HtmlTextNode.cs69
-rw-r--r--docs/HtmlAgilityPack/HtmlWeb.cs907
-rw-r--r--docs/HtmlAgilityPack/HtmlWebException.cs24
-rw-r--r--docs/HtmlAgilityPack/IOLibrary.cs28
-rw-r--r--docs/HtmlAgilityPack/LICENSE27
-rw-r--r--docs/HtmlAgilityPack/MixedCodeDocument.cs453
-rw-r--r--docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs51
-rw-r--r--docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs95
-rw-r--r--docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs236
-rw-r--r--docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs19
-rw-r--r--docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs32
-rw-r--r--docs/HtmlAgilityPack/NameValuePair.cs35
-rw-r--r--docs/HtmlAgilityPack/NameValuePairList.cs101
-rw-r--r--docs/HtmlAgilityPack/crc32.cs156
-rw-r--r--docs/Makefile.am9
-rw-r--r--docs/README6
-rw-r--r--docs/docs.make3
-rw-r--r--mono-core.spec.in2
-rw-r--r--mono/metadata/ChangeLog341
-rw-r--r--mono/metadata/assembly.c1
-rw-r--r--mono/metadata/class-internals.h9
-rw-r--r--mono/metadata/class.c508
-rw-r--r--mono/metadata/cominterop.c13
-rw-r--r--mono/metadata/culture-info-tables.h2198
-rw-r--r--mono/metadata/domain.c13
-rw-r--r--mono/metadata/generic-sharing.c12
-rw-r--r--mono/metadata/icall.c46
-rw-r--r--mono/metadata/loader.c25
-rw-r--r--mono/metadata/locales.c5
-rw-r--r--mono/metadata/marshal.c19
-rw-r--r--mono/metadata/marshal.h7
-rw-r--r--mono/metadata/metadata-internals.h1
-rw-r--r--mono/metadata/metadata-verify.c54
-rw-r--r--mono/metadata/metadata.c2
-rw-r--r--mono/metadata/monitor.c17
-rw-r--r--mono/metadata/object.c9
-rw-r--r--mono/metadata/pedump.c25
-rw-r--r--mono/metadata/reflection.c44
-rw-r--r--mono/metadata/security-core-clr.c2
-rw-r--r--mono/metadata/socket-io.c8
-rw-r--r--mono/metadata/verify-internals.h3
-rw-r--r--mono/metadata/verify.c46
-rw-r--r--mono/mini/ChangeLog191
-rw-r--r--mono/mini/Makefile.am1
-rw-r--r--mono/mini/aot-compiler.c31
-rw-r--r--mono/mini/aot-runtime.c15
-rw-r--r--mono/mini/arrays.cs7
-rw-r--r--mono/mini/branch-opts.c5
-rw-r--r--mono/mini/debugger-agent.c36
-rw-r--r--mono/mini/driver.c2
-rw-r--r--mono/mini/exceptions-amd64.c4
-rw-r--r--mono/mini/exceptions.cs17
-rw-r--r--mono/mini/generics.cs22
-rw-r--r--mono/mini/jit-icalls.c45
-rw-r--r--mono/mini/jit-icalls.h4
-rw-r--r--mono/mini/jit.h19
-rw-r--r--mono/mini/method-to-ir.c93
-rw-r--r--mono/mini/mini-alpha.c4
-rw-r--r--mono/mini/mini-amd64.c18
-rw-r--r--mono/mini/mini-arm.c4
-rw-r--r--mono/mini/mini-exceptions.c34
-rw-r--r--mono/mini/mini-ia64.c4
-rw-r--r--mono/mini/mini-llvm-cpp.cpp29
-rw-r--r--mono/mini/mini-llvm.c4
-rw-r--r--mono/mini/mini-mips.c14
-rw-r--r--mono/mini/mini-posix.c5
-rw-r--r--mono/mini/mini-ppc.c14
-rw-r--r--mono/mini/mini-s390.c4
-rw-r--r--mono/mini/mini-sparc.c4
-rw-r--r--mono/mini/mini-trampolines.c8
-rw-r--r--mono/mini/mini-x86.c43
-rw-r--r--mono/mini/mini.c47
-rw-r--r--mono/mini/mini.h7
-rw-r--r--mono/profiler/ChangeLog5
-rw-r--r--mono/profiler/mono-profiler-logging.c2
-rw-r--r--mono/tests/ChangeLog4
-rw-r--r--mono/tests/libtest.c6
-rw-r--r--mono/tests/pinvoke2.cs42
-rw-r--r--mono/utils/ChangeLog10
-rw-r--r--mono/utils/mono-error.c2
-rw-r--r--mono/utils/mono-path.c2
-rw-r--r--support/ChangeLog8
-rw-r--r--support/zlib-helper.c8
-rw-r--r--tools/locale-builder/ChangeLog20
-rw-r--r--tools/locale-builder/Driver.cs28
-rw-r--r--tools/locale-builder/Makefile.am11
-rw-r--r--tools/locale-builder/langs/ka.xml2159
-rwxr-xr-xtools/locale-builder/lcids.xml2
-rw-r--r--tools/locale-builder/locales/ka_GE.xml10
-rw-r--r--tools/locale-builder/supp/ka_GE.xml33
110 files changed, 14665 insertions, 1367 deletions
diff --git a/ChangeLog b/ChangeLog
index 1c6189f7071..062dcc02b5b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2009-12-22 Geoff Norton <gnorton@novell.com>
+
+ * configure.in: Fix invalid escaping. Patch from Spina from
+ www.slacky.eu.
+
+2009-12-21 Zoltan Varga <vargaz@gmail.com>
+
+ * configure.in: Add an LLVM_CFLAGS automake variable.
+
2009-12-11 Zoltan Varga <vargaz@gmail.com>
* configure.in: Applied patch from Matt McClellan (matt@mc-c.net). Add a check
diff --git a/configure.in b/configure.in
index c57b25a0d0d..0a9ed0f3dc4 100644
--- a/configure.in
+++ b/configure.in
@@ -6,7 +6,7 @@ AC_CANONICAL_SYSTEM
m4_ifdef([_A][M_PROG_TAR],[_A][M_SET_OPTION([tar-ustar])])
AM_CONFIG_HEADER(config.h)
-AM_INIT_AUTOMAKE(mono,2.6)
+AM_INIT_AUTOMAKE(mono,2.6.1)
AM_MAINTAINER_MODE
API_VER=1.0
@@ -1896,11 +1896,26 @@ if test "x$enable_llvm" = "xyes"; then
AC_MSG_ERROR([llvm-config not found.])
fi
- LLVM_CXXFLAGS=`$LLVM_CONFIG --cflags`
+ # The output of --cflags seems to include optimizations flags too
+ LLVM_CFLAGS=`$LLVM_CONFIG --cflags | sed -e 's/-O2//g' | sed -e 's/-O0//g' | sed -e 's/-fomit-frame-pointer//g' | sed -e 's/-fPIC//g'`
+ LLVM_CXXFLAGS=`$LLVM_CONFIG --cxxflags`
LLVM_LDFLAGS=`$LLVM_CONFIG --ldflags`
LLVM_LIBS=`$LLVM_CONFIG --libs core bitwriter jit x86codegen`
LLVM_LIBS="$LLVM_LDFLAGS $LLVM_LIBS -lstdc++"
+ # Should be something like '2.6' or '2.7svn'
+ llvm_version=`$LLVM_CONFIG --version`
+ major_version=`echo $llvm_version | cut -c 1`
+ minor_version=`echo $llvm_version | cut -c 3`
+
+ AC_DEFINE_UNQUOTED(LLVM_MAJOR_VERSION, $major_version, [Major version of LLVM libraries])
+ AC_DEFINE_UNQUOTED(LLVM_MINOR_VERSION, $minor_version, [Minor version of LLVM libraries])
+
+ # Have to pass these on the command line since mini-llvm-cpp.h already includes
+ # llvm's config.h
+ LLVM_CXXFLAGS="$LLVM_CXXFLAGS -DLLVM_MAJOR_VERSION=$major_version -DLLVM_MINOR_VERSION=$minor_version"
+
+ AC_SUBST(LLVM_CFLAGS)
AC_SUBST(LLVM_CXXFLAGS)
AC_SUBST(LLVM_LIBS)
AC_SUBST(LLVM_LDFLAGS)
@@ -2428,7 +2443,7 @@ if test x$platform_win32 = xyes; then
if test "x$cross_compiling" = "xno"; then
mono_cfg_dir=`cygpath -w -a $mono_cfg_root`\\etc
else
- mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\\'`\\etc
+ mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\'`\\etc
fi
else
mono_cfg_dir=$mono_cfg_root/etc
diff --git a/docs/AgilityPack.dll b/docs/AgilityPack.dll
deleted file mode 100755
index 881836dcb59..00000000000
--- a/docs/AgilityPack.dll
+++ /dev/null
Binary files differ
diff --git a/docs/ChangeLog b/docs/ChangeLog
index 20f2e861732..4ad7435db8b 100644
--- a/docs/ChangeLog
+++ b/docs/ChangeLog
@@ -1,3 +1,16 @@
+2009-12-22 Jo Shields <directhex@apebox.org>
+ * HtmlAgilityPack/LICENSE: Include upstream license (Ms-PL) since the
+ file headers don't specify it
+
+2009-12-22 Jo Shields <directhex@apebox.org>
+
+ * HtmlAgilityPack/*: Bundle HtmlAgilityPack 1.4~beta2 from
+ http://www.codeplex.com/htmlagilitypack in source form.
+
+ * AgilityPack.dll: Remove binary assembly, use source instead.
+
+ * docs.make Makefile.am README: Reflect above changes
+
2009-02-12 Zoltan Varga <vargaz@gmail.com>
* Makefile.am (EXTRA_DIST): Remove removed files.
diff --git a/docs/HtmlAgilityPack/EncodingFoundException.cs b/docs/HtmlAgilityPack/EncodingFoundException.cs
new file mode 100644
index 00000000000..bffdc025561
--- /dev/null
+++ b/docs/HtmlAgilityPack/EncodingFoundException.cs
@@ -0,0 +1,33 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Text;
+
+namespace HtmlAgilityPack
+{
+ internal class EncodingFoundException : Exception
+ {
+ #region Fields
+
+ private Encoding _encoding;
+
+ #endregion
+
+ #region Constructors
+
+ internal EncodingFoundException(Encoding encoding)
+ {
+ _encoding = encoding;
+ }
+
+ #endregion
+
+ #region Properties
+
+ internal Encoding Encoding
+ {
+ get { return _encoding; }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlAttribute.cs b/docs/HtmlAgilityPack/HtmlAttribute.cs
new file mode 100644
index 00000000000..7a3de047bea
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlAttribute.cs
@@ -0,0 +1,260 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+
+#region
+
+using System;
+using System.Diagnostics;
+
+#endregion
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML attribute.
+ /// </summary>
+ [DebuggerDisplay("Name: {OriginalName}, Value: {Value}")]
+ public class HtmlAttribute : IComparable
+ {
+ #region Fields
+
+ private int _line;
+ internal int _lineposition;
+ internal string _name;
+ internal int _namelength;
+ internal int _namestartindex;
+ internal HtmlDocument _ownerdocument; // attribute can exists without a node
+ internal HtmlNode _ownernode;
+ private AttributeValueQuote _quoteType = AttributeValueQuote.DoubleQuote;
+ internal int _streamposition;
+ internal string _value;
+ internal int _valuelength;
+ internal int _valuestartindex;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlAttribute(HtmlDocument ownerdocument)
+ {
+ _ownerdocument = ownerdocument;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the line number of this attribute in the document.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ internal set { _line = value; }
+ }
+
+ /// <summary>
+ /// Gets the column number of this attribute in the document.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _lineposition; }
+ }
+
+ /// <summary>
+ /// Gets the qualified name of the attribute.
+ /// </summary>
+ public string Name
+ {
+ get
+ {
+ if (_name == null)
+ {
+ _name = _ownerdocument._text.Substring(_namestartindex, _namelength);
+ }
+ return _name.ToLower();
+ }
+ set
+ {
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+ _name = value;
+ if (_ownernode != null)
+ {
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Name of attribute with original case
+ /// </summary>
+ public string OriginalName
+ {
+ get { return _name; }
+ }
+
+ /// <summary>
+ /// Gets the HTML document to which this attribute belongs.
+ /// </summary>
+ public HtmlDocument OwnerDocument
+ {
+ get { return _ownerdocument; }
+ }
+
+ /// <summary>
+ /// Gets the HTML node to which this attribute belongs.
+ /// </summary>
+ public HtmlNode OwnerNode
+ {
+ get { return _ownernode; }
+ }
+
+ /// <summary>
+ /// Specifies what type of quote the data should be wrapped in
+ /// </summary>
+ public AttributeValueQuote QuoteType
+ {
+ get { return _quoteType; }
+ set { _quoteType = value; }
+ }
+
+ /// <summary>
+ /// Gets the stream position of this attribute in the document, relative to the start of the document.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return _streamposition; }
+ }
+
+ /// <summary>
+ /// Gets or sets the value of the attribute.
+ /// </summary>
+ public string Value
+ {
+ get
+ {
+ if (_value == null)
+ {
+ _value = _ownerdocument._text.Substring(_valuestartindex, _valuelength);
+ }
+ return _value;
+ }
+ set
+ {
+ _value = value;
+ if (_ownernode != null)
+ {
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+ }
+ }
+
+ internal string XmlName
+ {
+ get { return HtmlDocument.GetXmlName(Name); }
+ }
+
+ internal string XmlValue
+ {
+ get { return Value; }
+ }
+
+ /// <summary>
+ /// Gets a valid XPath string that points to this Attribute
+ /// </summary>
+ public string XPath
+ {
+ get
+ {
+ string basePath = (OwnerNode == null) ? "/" : OwnerNode.XPath + "/";
+ return basePath + GetRelativeXpath();
+ }
+ }
+
+ #endregion
+
+ #region IComparable Members
+
+ /// <summary>
+ /// Compares the current instance with another attribute. Comparison is based on attributes' name.
+ /// </summary>
+ /// <param name="obj">An attribute to compare with this instance.</param>
+ /// <returns>A 32-bit signed integer that indicates the relative order of the names comparison.</returns>
+ public int CompareTo(object obj)
+ {
+ HtmlAttribute att = obj as HtmlAttribute;
+ if (att == null)
+ {
+ throw new ArgumentException("obj");
+ }
+ return Name.CompareTo(att.Name);
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Creates a duplicate of this attribute.
+ /// </summary>
+ /// <returns>The cloned attribute.</returns>
+ public HtmlAttribute Clone()
+ {
+ HtmlAttribute att = new HtmlAttribute(_ownerdocument);
+ att.Name = Name;
+ att.Value = Value;
+ return att;
+ }
+
+ /// <summary>
+ /// Removes this attribute from it's parents collection
+ /// </summary>
+ public void Remove()
+ {
+ _ownernode.Attributes.Remove(this);
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private string GetRelativeXpath()
+ {
+ if (OwnerNode == null)
+ return Name;
+
+ int i = 1;
+ foreach (HtmlAttribute node in OwnerNode.Attributes)
+ {
+ if (node.Name != Name) continue;
+
+ if (node == this)
+ break;
+
+ i++;
+ }
+ return "@" + Name + "[" + i + "]";
+ }
+
+ #endregion
+ }
+
+ /// <summary>
+ /// An Enum representing different types of Quotes used for surrounding attribute values
+ /// </summary>
+ public enum AttributeValueQuote
+ {
+ /// <summary>
+ /// A single quote mark '
+ /// </summary>
+ SingleQuote,
+ /// <summary>
+ /// A double quote mark "
+ /// </summary>
+ DoubleQuote
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlAttributeCollection.cs b/docs/HtmlAgilityPack/HtmlAttributeCollection.cs
new file mode 100644
index 00000000000..07af9979ddb
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlAttributeCollection.cs
@@ -0,0 +1,394 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a combined list and collection of HTML nodes.
+ /// </summary>
+ public class HtmlAttributeCollection : IList<HtmlAttribute>
+ {
+ #region Fields
+
+ internal Dictionary<string, HtmlAttribute> Hashitems = new Dictionary<string, HtmlAttribute>();
+ private HtmlNode _ownernode;
+ private List<HtmlAttribute> items = new List<HtmlAttribute>();
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlAttributeCollection(HtmlNode ownernode)
+ {
+ _ownernode = ownernode;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets a given attribute from the list using its name.
+ /// </summary>
+ public HtmlAttribute this[string name]
+ {
+ get
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ return Hashitems.ContainsKey(name.ToLower()) ? Hashitems[name.ToLower()] : null;
+ }
+ set { Append(value); }
+ }
+
+ #endregion
+
+ #region IList<HtmlAttribute> Members
+
+ /// <summary>
+ /// Gets the number of elements actually contained in the list.
+ /// </summary>
+ public int Count
+ {
+ get { return items.Count; }
+ }
+
+ /// <summary>
+ /// Gets readonly status of colelction
+ /// </summary>
+ public bool IsReadOnly
+ {
+ get { return false; }
+ }
+
+ /// <summary>
+ /// Gets the attribute at the specified index.
+ /// </summary>
+ public HtmlAttribute this[int index]
+ {
+ get { return items[index]; }
+ set { items[index] = value; }
+ }
+
+ /// <summary>
+ /// Adds supplied item to collection
+ /// </summary>
+ /// <param name="item"></param>
+ public void Add(HtmlAttribute item)
+ {
+ Append(item);
+ }
+
+ /// <summary>
+ /// Explicit clear
+ /// </summary>
+ void ICollection<HtmlAttribute>.Clear()
+ {
+ items.Clear();
+ }
+
+ /// <summary>
+ /// Retreives existence of supplied item
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Contains(HtmlAttribute item)
+ {
+ return items.Contains(item);
+ }
+
+ /// <summary>
+ /// Copies collection to array
+ /// </summary>
+ /// <param name="array"></param>
+ /// <param name="arrayIndex"></param>
+ public void CopyTo(HtmlAttribute[] array, int arrayIndex)
+ {
+ items.CopyTo(array, arrayIndex);
+ }
+
+ /// <summary>
+ /// Get Explicit enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator<HtmlAttribute> IEnumerable<HtmlAttribute>.GetEnumerator()
+ {
+ return items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Explicit non-generic enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Retrieves the index for the supplied item, -1 if not found
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int IndexOf(HtmlAttribute item)
+ {
+ return items.IndexOf(item);
+ }
+
+ /// <summary>
+ /// Inserts given item into collection at supplied index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="item"></param>
+ public void Insert(int index, HtmlAttribute item)
+ {
+ if (item == null)
+ {
+ throw new ArgumentNullException("item");
+ }
+
+ Hashitems[item.Name] = item;
+ item._ownernode = _ownernode;
+ items.Insert(index, item);
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+
+ /// <summary>
+ /// Explicit collection remove
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ bool ICollection<HtmlAttribute>.Remove(HtmlAttribute item)
+ {
+ return items.Remove(item);
+ }
+
+ /// <summary>
+ /// Removes the attribute at the specified index.
+ /// </summary>
+ /// <param name="index">The index of the attribute to remove.</param>
+ public void RemoveAt(int index)
+ {
+ HtmlAttribute att = items[index];
+ Hashitems.Remove(att.Name);
+ items.RemoveAt(index);
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Adds a new attribute to the collection with the given values
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="value"></param>
+ public void Add(string name, string value)
+ {
+ Append(name, value);
+ }
+
+ /// <summary>
+ /// Inserts the specified attribute as the last attribute in the collection.
+ /// </summary>
+ /// <param name="newAttribute">The attribute to insert. May not be null.</param>
+ /// <returns>The appended attribute.</returns>
+ public HtmlAttribute Append(HtmlAttribute newAttribute)
+ {
+ if (newAttribute == null)
+ {
+ throw new ArgumentNullException("newAttribute");
+ }
+
+ Hashitems[newAttribute.Name] = newAttribute;
+ newAttribute._ownernode = _ownernode;
+ items.Add(newAttribute);
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ return newAttribute;
+ }
+
+ /// <summary>
+ /// Creates and inserts a new attribute as the last attribute in the collection.
+ /// </summary>
+ /// <param name="name">The name of the attribute to insert.</param>
+ /// <returns>The appended attribute.</returns>
+ public HtmlAttribute Append(string name)
+ {
+ HtmlAttribute att = _ownernode._ownerdocument.CreateAttribute(name);
+ return Append(att);
+ }
+
+ /// <summary>
+ /// Creates and inserts a new attribute as the last attribute in the collection.
+ /// </summary>
+ /// <param name="name">The name of the attribute to insert.</param>
+ /// <param name="value">The value of the attribute to insert.</param>
+ /// <returns>The appended attribute.</returns>
+ public HtmlAttribute Append(string name, string value)
+ {
+ HtmlAttribute att = _ownernode._ownerdocument.CreateAttribute(name, value);
+ return Append(att);
+ }
+
+ /// <summary>
+ /// Checks for existance of attribute with given name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public bool Contains(string name)
+ {
+ for (int i = 0; i < items.Count; i++)
+ {
+ if (items[i].Name.Equals(name.ToLower()))
+ return true;
+ }
+ return false;
+ }
+
+ /// <summary>
+ /// Inserts the specified attribute as the first node in the collection.
+ /// </summary>
+ /// <param name="newAttribute">The attribute to insert. May not be null.</param>
+ /// <returns>The prepended attribute.</returns>
+ public HtmlAttribute Prepend(HtmlAttribute newAttribute)
+ {
+ Insert(0, newAttribute);
+ return newAttribute;
+ }
+
+ /// <summary>
+ /// Removes a given attribute from the list.
+ /// </summary>
+ /// <param name="attribute">The attribute to remove. May not be null.</param>
+ public void Remove(HtmlAttribute attribute)
+ {
+ if (attribute == null)
+ {
+ throw new ArgumentNullException("attribute");
+ }
+ int index = GetAttributeIndex(attribute);
+ if (index == -1)
+ {
+ throw new IndexOutOfRangeException();
+ }
+ RemoveAt(index);
+ }
+
+ /// <summary>
+ /// Removes an attribute from the list, using its name. If there are more than one attributes with this name, they will all be removed.
+ /// </summary>
+ /// <param name="name">The attribute's name. May not be null.</param>
+ public void Remove(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ string lname = name.ToLower();
+ for (int i = 0; i < items.Count; i++)
+ {
+ HtmlAttribute att = items[i];
+ if (att.Name == lname)
+ {
+ RemoveAt(i);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Remove all attributes in the list.
+ /// </summary>
+ public void RemoveAll()
+ {
+ Hashitems.Clear();
+ items.Clear();
+
+ _ownernode._innerchanged = true;
+ _ownernode._outerchanged = true;
+ }
+
+ #endregion
+
+ #region LINQ Methods
+
+ /// <summary>
+ /// Returns all attributes with specified name. Handles case insentivity
+ /// </summary>
+ /// <param name="attributeName">Name of the attribute</param>
+ /// <returns></returns>
+ public IEnumerable<HtmlAttribute> AttributesWithName(string attributeName)
+ {
+ attributeName = attributeName.ToLower();
+ for (int i = 0; i < items.Count; i++)
+ {
+ if (items[i].Name.Equals(attributeName))
+ yield return items[i];
+ }
+ }
+
+ /// <summary>
+ /// Removes all attributes from the collection
+ /// </summary>
+ public void Remove()
+ {
+ foreach (HtmlAttribute item in items)
+ item.Remove();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ /// <summary>
+ /// Clears the attribute collection
+ /// </summary>
+ internal void Clear()
+ {
+ Hashitems.Clear();
+ items.Clear();
+ }
+
+ internal int GetAttributeIndex(HtmlAttribute attribute)
+ {
+ if (attribute == null)
+ {
+ throw new ArgumentNullException("attribute");
+ }
+ for (int i = 0; i < items.Count; i++)
+ {
+ if ((items[i]) == attribute)
+ return i;
+ }
+ return -1;
+ }
+
+ internal int GetAttributeIndex(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ string lname = name.ToLower();
+ for (int i = 0; i < items.Count; i++)
+ {
+ if ((items[i]).Name == lname)
+ return i;
+ }
+ return -1;
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlCmdLine.cs b/docs/HtmlAgilityPack/HtmlCmdLine.cs
new file mode 100644
index 00000000000..1421765252f
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlCmdLine.cs
@@ -0,0 +1,142 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+
+namespace HtmlAgilityPack
+{
+ internal class HtmlCmdLine
+ {
+ #region Static Members
+
+ internal static bool Help;
+
+ #endregion
+
+ #region Constructors
+
+ static HtmlCmdLine()
+ {
+ Help = false;
+ ParseArgs();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal static string GetOption(string name, string def)
+ {
+ string p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ GetStringArg(args[i], name, ref p);
+ }
+ return p;
+ }
+
+ internal static string GetOption(int index, string def)
+ {
+ string p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ int j = 0;
+ for (int i = 1; i < args.Length; i++)
+ {
+ if (GetStringArg(args[i], ref p))
+ {
+ if (index == j)
+ return p;
+ else
+ p = def;
+ j++;
+ }
+ }
+ return p;
+ }
+
+ internal static bool GetOption(string name, bool def)
+ {
+ bool p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ GetBoolArg(args[i], name, ref p);
+ }
+ return p;
+ }
+
+ internal static int GetOption(string name, int def)
+ {
+ int p = def;
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ GetIntArg(args[i], name, ref p);
+ }
+ return p;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static void GetBoolArg(string Arg, string Name, ref bool ArgValue)
+ {
+ if (Arg.Length < (Name.Length + 1)) // -name is 1 more than name
+ return;
+ if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
+ return;
+ if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
+ ArgValue = true;
+ }
+
+ private static void GetIntArg(string Arg, string Name, ref int ArgValue)
+ {
+ if (Arg.Length < (Name.Length + 3)) // -name:12 is 3 more than name
+ return;
+ if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
+ return;
+ if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
+ {
+ try
+ {
+ ArgValue = Convert.ToInt32(Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2));
+ }
+ catch
+ {
+ }
+ }
+ }
+
+ private static bool GetStringArg(string Arg, ref string ArgValue)
+ {
+ if (('/' == Arg[0]) || ('-' == Arg[0]))
+ return false;
+ ArgValue = Arg;
+ return true;
+ }
+
+ private static void GetStringArg(string Arg, string Name, ref string ArgValue)
+ {
+ if (Arg.Length < (Name.Length + 3)) // -name:x is 3 more than name
+ return;
+ if (('/' != Arg[0]) && ('-' != Arg[0])) // not a param
+ return;
+ if (Arg.Substring(1, Name.Length).ToLower() == Name.ToLower())
+ ArgValue = Arg.Substring(Name.Length + 2, Arg.Length - Name.Length - 2);
+ }
+
+ private static void ParseArgs()
+ {
+ string[] args = Environment.GetCommandLineArgs();
+ for (int i = 1; i < args.Length; i++)
+ {
+ // help
+ GetBoolArg(args[i], "?", ref Help);
+ GetBoolArg(args[i], "h", ref Help);
+ GetBoolArg(args[i], "help", ref Help);
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlCommentNode.cs b/docs/HtmlAgilityPack/HtmlCommentNode.cs
new file mode 100644
index 00000000000..1091dcb13c7
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlCommentNode.cs
@@ -0,0 +1,76 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML comment.
+ /// </summary>
+ public class HtmlCommentNode : HtmlNode
+ {
+ #region Fields
+
+ private string _comment;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlCommentNode(HtmlDocument ownerdocument, int index)
+ :
+ base(HtmlNodeType.Comment, ownerdocument, index)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or Sets the comment text of the node.
+ /// </summary>
+ public string Comment
+ {
+ get
+ {
+ if (_comment == null)
+ {
+ return base.InnerHtml;
+ }
+ return _comment;
+ }
+ set { _comment = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml.
+ /// </summary>
+ public override string InnerHtml
+ {
+ get
+ {
+ if (_comment == null)
+ {
+ return base.InnerHtml;
+ }
+ return _comment;
+ }
+ set { _comment = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the object and its content in HTML.
+ /// </summary>
+ public override string OuterHtml
+ {
+ get
+ {
+ if (_comment == null)
+ {
+ return base.OuterHtml;
+ }
+ return "<!--" + _comment + "-->";
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlConsoleListener.cs b/docs/HtmlAgilityPack/HtmlConsoleListener.cs
new file mode 100644
index 00000000000..bd14a7a244d
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlConsoleListener.cs
@@ -0,0 +1,33 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Diagnostics;
+
+namespace HtmlAgilityPack
+{
+ internal class HtmlConsoleListener : TraceListener
+ {
+ #region Public Methods
+
+ public override void Write(string Message)
+ {
+ Write(Message, "");
+ }
+
+ public override void Write(string Message, string Category)
+ {
+ Console.Write("T:" + Category + ": " + Message);
+ }
+
+ public override void WriteLine(string Message)
+ {
+ Write(Message + "\n");
+ }
+
+ public override void WriteLine(string Message, string Category)
+ {
+ Write(Message + "\n", Category);
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlDocument.cs b/docs/HtmlAgilityPack/HtmlDocument.cs
new file mode 100644
index 00000000000..7233da0dfbe
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlDocument.cs
@@ -0,0 +1,1962 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a complete HTML document.
+ /// </summary>
+ public class HtmlDocument : IXPathNavigable
+ {
+ #region Fields
+
+ private int _c;
+ private Crc32 _crc32;
+ private HtmlAttribute _currentattribute;
+ private HtmlNode _currentnode;
+ private Encoding _declaredencoding;
+ private HtmlNode _documentnode;
+ private bool _fullcomment;
+ private int _index;
+ internal Hashtable _lastnodes = new Hashtable();
+ private HtmlNode _lastparentnode;
+ private int _line;
+ private int _lineposition, _maxlineposition;
+ internal Hashtable _nodesid;
+ private ParseState _oldstate;
+ private bool _onlyDetectEncoding;
+ internal Hashtable _openednodes;
+ private List<HtmlParseError> _parseerrors = new List<HtmlParseError>();
+ private string _remainder;
+ private int _remainderOffset;
+ private ParseState _state;
+ private Encoding _streamencoding;
+ internal string _text;
+
+ // public props
+
+ /// <summary>
+ /// Adds Debugging attributes to node. Default is false.
+ /// </summary>
+ public bool OptionAddDebuggingAttributes;
+
+ /// <summary>
+ /// Defines if closing for non closed nodes must be done at the end or directly in the document.
+ /// Setting this to true can actually change how browsers render the page. Default is false.
+ /// </summary>
+ public bool OptionAutoCloseOnEnd; // close errors at the end
+
+ /// <summary>
+ /// Defines if non closed nodes will be checked at the end of parsing. Default is true.
+ /// </summary>
+ public bool OptionCheckSyntax = true;
+
+ /// <summary>
+ /// Defines if a checksum must be computed for the document while parsing. Default is false.
+ /// </summary>
+ public bool OptionComputeChecksum;
+
+ /// <summary>
+ /// Defines the default stream encoding to use. Default is System.Text.Encoding.Default.
+ /// </summary>
+ public Encoding OptionDefaultStreamEncoding = Encoding.Default;
+
+ /// <summary>
+ /// Defines if source text must be extracted while parsing errors.
+ /// If the document has a lot of errors, or cascading errors, parsing performance can be dramatically affected if set to true.
+ /// Default is false.
+ /// </summary>
+ public bool OptionExtractErrorSourceText;
+
+ // turning this on can dramatically slow performance if a lot of errors are detected
+
+ /// <summary>
+ /// Defines the maximum length of source text or parse errors. Default is 100.
+ /// </summary>
+ public int OptionExtractErrorSourceTextMaxLength = 100;
+
+ /// <summary>
+ /// Defines if LI, TR, TH, TD tags must be partially fixed when nesting errors are detected. Default is false.
+ /// </summary>
+ public bool OptionFixNestedTags; // fix li, tr, th, td tags
+
+ /// <summary>
+ /// Defines if output must conform to XML, instead of HTML.
+ /// </summary>
+ public bool OptionOutputAsXml;
+
+ /// <summary>
+ /// Defines if attribute value output must be optimized (not bound with double quotes if it is possible). Default is false.
+ /// </summary>
+ public bool OptionOutputOptimizeAttributeValues;
+
+ /// <summary>
+ /// Defines if name must be output with it's original case. Useful for asp.net tags and attributes
+ /// </summary>
+ public bool OptionOutputOriginalCase;
+
+ /// <summary>
+ /// Defines if name must be output in uppercase. Default is false.
+ /// </summary>
+ public bool OptionOutputUpperCase;
+
+ /// <summary>
+ /// Defines if declared encoding must be read from the document.
+ /// Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node.
+ /// Default is true.
+ /// </summary>
+ public bool OptionReadEncoding = true;
+
+ /// <summary>
+ /// Defines the name of a node that will throw the StopperNodeException when found as an end node. Default is null.
+ /// </summary>
+ public string OptionStopperNodeName;
+
+ /// <summary>
+ /// Defines if the 'id' attribute must be specifically used. Default is true.
+ /// </summary>
+ public bool OptionUseIdAttribute = true;
+
+ /// <summary>
+ /// Defines if empty nodes must be written as closed during output. Default is false.
+ /// </summary>
+ public bool OptionWriteEmptyNodes;
+
+ #endregion
+
+ #region Static Members
+
+ internal static readonly string HtmlExceptionRefNotChild = "Reference node must be a child of this node";
+
+ internal static readonly string HtmlExceptionUseIdAttributeFalse =
+ "You need to set UseIdAttribute property to true to enable this feature";
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Creates an instance of an HTML document.
+ /// </summary>
+ public HtmlDocument()
+ {
+ _documentnode = CreateNode(HtmlNodeType.Document, 0);
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the document CRC32 checksum if OptionComputeChecksum was set to true before parsing, 0 otherwise.
+ /// </summary>
+ public int CheckSum
+ {
+ get
+ {
+ if (_crc32 == null)
+ {
+ return 0;
+ }
+ else
+ {
+ return (int) _crc32.CheckSum;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the document's declared encoding.
+ /// Declared encoding is determined using the meta http-equiv="content-type" content="text/html;charset=XXXXX" html node.
+ /// </summary>
+ public Encoding DeclaredEncoding
+ {
+ get { return _declaredencoding; }
+ }
+
+ /// <summary>
+ /// Gets the root node of the document.
+ /// </summary>
+ public HtmlNode DocumentNode
+ {
+ get { return _documentnode; }
+ }
+
+ /// <summary>
+ /// Gets the document's output encoding.
+ /// </summary>
+ public Encoding Encoding
+ {
+ get { return GetOutEncoding(); }
+ }
+
+ /// <summary>
+ /// Gets a list of parse errors found in the document.
+ /// </summary>
+ public IEnumerable<HtmlParseError> ParseErrors
+ {
+ get { return _parseerrors; }
+ }
+
+ /// <summary>
+ /// Gets the remaining text.
+ /// Will always be null if OptionStopperNodeName is null.
+ /// </summary>
+ public string Remainder
+ {
+ get { return _remainder; }
+ }
+
+ /// <summary>
+ /// Gets the offset of Remainder in the original Html text.
+ /// If OptionStopperNodeName is null, this will return the length of the original Html text.
+ /// </summary>
+ public int RemainderOffset
+ {
+ get { return _remainderOffset; }
+ }
+
+ /// <summary>
+ /// Gets the document's stream encoding.
+ /// </summary>
+ public Encoding StreamEncoding
+ {
+ get { return _streamencoding; }
+ }
+
+ #endregion
+
+ #region IXPathNavigable Members
+
+ /// <summary>
+ /// Creates a new XPathNavigator object for navigating this HTML document.
+ /// </summary>
+ /// <returns>An XPathNavigator object. The XPathNavigator is positioned on the root of the document.</returns>
+ public XPathNavigator CreateNavigator()
+ {
+ return new HtmlNodeNavigator(this, _documentnode);
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Gets a valid XML name.
+ /// </summary>
+ /// <param name="name">Any text.</param>
+ /// <returns>A string that is a valid XML name.</returns>
+ public static string GetXmlName(string name)
+ {
+ string xmlname = string.Empty;
+ bool nameisok = true;
+ for (int i = 0; i < name.Length; i++)
+ {
+ // names are lcase
+ // note: we are very limited here, too much?
+ if (((name[i] >= 'a') && (name[i] <= 'z')) ||
+ ((name[i] >= '0') && (name[i] <= '9')) ||
+ // (name[i]==':') || (name[i]=='_') || (name[i]=='-') || (name[i]=='.')) // these are bads in fact
+ (name[i] == '_') || (name[i] == '-') || (name[i] == '.'))
+ {
+ xmlname += name[i];
+ }
+ else
+ {
+ nameisok = false;
+ byte[] bytes = Encoding.UTF8.GetBytes(new char[] {name[i]});
+ for (int j = 0; j < bytes.Length; j++)
+ {
+ xmlname += bytes[j].ToString("x2");
+ }
+ xmlname += "_";
+ }
+ }
+ if (nameisok)
+ {
+ return xmlname;
+ }
+ return "_" + xmlname;
+ }
+
+ /// <summary>
+ /// Applies HTML encoding to a specified string.
+ /// </summary>
+ /// <param name="html">The input string to encode. May not be null.</param>
+ /// <returns>The encoded string.</returns>
+ public static string HtmlEncode(string html)
+ {
+ if (html == null)
+ {
+ throw new ArgumentNullException("html");
+ }
+ // replace & by &amp; but only once!
+ Regex rx = new Regex("&(?!(amp;)|(lt;)|(gt;)|(quot;))", RegexOptions.IgnoreCase);
+ return rx.Replace(html, "&amp;").Replace("<", "&lt;").Replace(">", "&gt;").Replace("\"", "&quot;");
+ }
+
+ /// <summary>
+ /// Determines if the specified character is considered as a whitespace character.
+ /// </summary>
+ /// <param name="c">The character to check.</param>
+ /// <returns>true if if the specified character is considered as a whitespace character.</returns>
+ public static bool IsWhiteSpace(int c)
+ {
+ if ((c == 10) || (c == 13) || (c == 32) || (c == 9))
+ {
+ return true;
+ }
+ return false;
+ }
+
+ /// <summary>
+ /// Creates an HTML attribute with the specified name.
+ /// </summary>
+ /// <param name="name">The name of the attribute. May not be null.</param>
+ /// <returns>The new HTML attribute.</returns>
+ public HtmlAttribute CreateAttribute(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlAttribute att = CreateAttribute();
+ att.Name = name;
+ return att;
+ }
+
+ /// <summary>
+ /// Creates an HTML attribute with the specified name.
+ /// </summary>
+ /// <param name="name">The name of the attribute. May not be null.</param>
+ /// <param name="value">The value of the attribute.</param>
+ /// <returns>The new HTML attribute.</returns>
+ public HtmlAttribute CreateAttribute(string name, string value)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlAttribute att = CreateAttribute(name);
+ att.Value = value;
+ return att;
+ }
+
+ /// <summary>
+ /// Creates an HTML comment node.
+ /// </summary>
+ /// <returns>The new HTML comment node.</returns>
+ public HtmlCommentNode CreateComment()
+ {
+ return (HtmlCommentNode) CreateNode(HtmlNodeType.Comment);
+ }
+
+ /// <summary>
+ /// Creates an HTML comment node with the specified comment text.
+ /// </summary>
+ /// <param name="comment">The comment text. May not be null.</param>
+ /// <returns>The new HTML comment node.</returns>
+ public HtmlCommentNode CreateComment(string comment)
+ {
+ if (comment == null)
+ {
+ throw new ArgumentNullException("comment");
+ }
+ HtmlCommentNode c = CreateComment();
+ c.Comment = comment;
+ return c;
+ }
+
+ /// <summary>
+ /// Creates an HTML element node with the specified name.
+ /// </summary>
+ /// <param name="name">The qualified name of the element. May not be null.</param>
+ /// <returns>The new HTML node.</returns>
+ public HtmlNode CreateElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlNode node = CreateNode(HtmlNodeType.Element);
+ node.Name = name;
+ return node;
+ }
+
+ /// <summary>
+ /// Creates an HTML text node.
+ /// </summary>
+ /// <returns>The new HTML text node.</returns>
+ public HtmlTextNode CreateTextNode()
+ {
+ return (HtmlTextNode) CreateNode(HtmlNodeType.Text);
+ }
+
+ /// <summary>
+ /// Creates an HTML text node with the specified text.
+ /// </summary>
+ /// <param name="text">The text of the node. May not be null.</param>
+ /// <returns>The new HTML text node.</returns>
+ public HtmlTextNode CreateTextNode(string text)
+ {
+ if (text == null)
+ {
+ throw new ArgumentNullException("text");
+ }
+ HtmlTextNode t = CreateTextNode();
+ t.Text = text;
+ return t;
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML stream.
+ /// </summary>
+ /// <param name="stream">The input stream. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncoding(Stream stream)
+ {
+ if (stream == null)
+ {
+ throw new ArgumentNullException("stream");
+ }
+ return DetectEncoding(new StreamReader(stream));
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML file.
+ /// </summary>
+ /// <param name="path">Path for the file containing the HTML document to detect. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncoding(string path)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ StreamReader sr = new StreamReader(path, OptionDefaultStreamEncoding);
+ Encoding encoding = DetectEncoding(sr);
+ sr.Close();
+ return encoding;
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML text provided on a TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncoding(TextReader reader)
+ {
+ if (reader == null)
+ {
+ throw new ArgumentNullException("reader");
+ }
+ _onlyDetectEncoding = true;
+ if (OptionCheckSyntax)
+ {
+ _openednodes = new Hashtable();
+ }
+ else
+ {
+ _openednodes = null;
+ }
+
+ if (OptionUseIdAttribute)
+ {
+ _nodesid = new Hashtable();
+ }
+ else
+ {
+ _nodesid = null;
+ }
+
+ StreamReader sr = reader as StreamReader;
+ if (sr != null)
+ {
+ _streamencoding = sr.CurrentEncoding;
+ }
+ else
+ {
+ _streamencoding = null;
+ }
+ _declaredencoding = null;
+
+ _text = reader.ReadToEnd();
+ _documentnode = CreateNode(HtmlNodeType.Document, 0);
+
+ // this is almost a hack, but it allows us not to muck with the original parsing code
+ try
+ {
+ Parse();
+ }
+ catch (EncodingFoundException ex)
+ {
+ return ex.Encoding;
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML document from a file first, and then loads the file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ public void DetectEncodingAndLoad(string path)
+ {
+ DetectEncodingAndLoad(path, true);
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML document from a file first, and then loads the file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="detectEncoding">true to detect encoding, false otherwise.</param>
+ public void DetectEncodingAndLoad(string path, bool detectEncoding)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ Encoding enc;
+ if (detectEncoding)
+ {
+ enc = DetectEncoding(path);
+ }
+ else
+ {
+ enc = null;
+ }
+
+ if (enc == null)
+ {
+ Load(path);
+ }
+ else
+ {
+ Load(path, enc);
+ }
+ }
+
+ /// <summary>
+ /// Detects the encoding of an HTML text.
+ /// </summary>
+ /// <param name="html">The input html text. May not be null.</param>
+ /// <returns>The detected encoding.</returns>
+ public Encoding DetectEncodingHtml(string html)
+ {
+ if (html == null)
+ {
+ throw new ArgumentNullException("html");
+ }
+ StringReader sr = new StringReader(html);
+ Encoding encoding = DetectEncoding(sr);
+ sr.Close();
+ return encoding;
+ }
+
+ /// <summary>
+ /// Gets the HTML node with the specified 'id' attribute value.
+ /// </summary>
+ /// <param name="id">The attribute id to match. May not be null.</param>
+ /// <returns>The HTML node with the matching id or null if not found.</returns>
+ public HtmlNode GetElementbyId(string id)
+ {
+ if (id == null)
+ {
+ throw new ArgumentNullException("id");
+ }
+ if (_nodesid == null)
+ {
+ throw new Exception(HtmlExceptionUseIdAttributeFalse);
+ }
+
+ return _nodesid[id.ToLower()] as HtmlNode;
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ public void Load(Stream stream)
+ {
+ Load(new StreamReader(stream, OptionDefaultStreamEncoding));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Load(Stream stream, Encoding encoding)
+ {
+ Load(new StreamReader(stream, encoding));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks, buffersize));
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ public void Load(string path)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ StreamReader sr = new StreamReader(path, OptionDefaultStreamEncoding);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, bool detectEncodingFromByteOrderMarks)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ StreamReader sr = new StreamReader(path, detectEncodingFromByteOrderMarks);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ public void Load(string path, Encoding encoding)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamReader sr = new StreamReader(path, encoding);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamReader sr = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ if (path == null)
+ {
+ throw new ArgumentNullException("path");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamReader sr = new StreamReader(path, encoding, detectEncodingFromByteOrderMarks, buffersize);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Loads the HTML document from the specified TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML data into the document. May not be null.</param>
+ public void Load(TextReader reader)
+ {
+ // all Load methods pass down to this one
+ if (reader == null)
+ {
+ throw new ArgumentNullException("reader");
+ }
+
+ _onlyDetectEncoding = false;
+
+ if (OptionCheckSyntax)
+ {
+ _openednodes = new Hashtable();
+ }
+ else
+ {
+ _openednodes = null;
+ }
+
+ if (OptionUseIdAttribute)
+ {
+ _nodesid = new Hashtable();
+ }
+ else
+ {
+ _nodesid = null;
+ }
+
+ StreamReader sr = reader as StreamReader;
+ if (sr != null)
+ {
+ try
+ {
+ // trigger bom read if needed
+ sr.Peek();
+ }
+ // ReSharper disable EmptyGeneralCatchClause
+ catch (Exception)
+ // ReSharper restore EmptyGeneralCatchClause
+ {
+ // void on purpose
+ }
+ _streamencoding = sr.CurrentEncoding;
+ }
+ else
+ {
+ _streamencoding = null;
+ }
+ _declaredencoding = null;
+
+ _text = reader.ReadToEnd();
+ _documentnode = CreateNode(HtmlNodeType.Document, 0);
+ Parse();
+
+ if (OptionCheckSyntax)
+ {
+ foreach (HtmlNode node in _openednodes.Values)
+ {
+ if (!node._starttag) // already reported
+ {
+ continue;
+ }
+
+ string html;
+ if (OptionExtractErrorSourceText)
+ {
+ html = node.OuterHtml;
+ if (html.Length > OptionExtractErrorSourceTextMaxLength)
+ {
+ html = html.Substring(0, OptionExtractErrorSourceTextMaxLength);
+ }
+ }
+ else
+ {
+ html = string.Empty;
+ }
+ AddError(
+ HtmlParseErrorCode.TagNotClosed,
+ node._line, node._lineposition,
+ node._streamposition, html,
+ "End tag </" + node.Name + "> was not found");
+ }
+
+ // we don't need this anymore
+ _openednodes.Clear();
+ }
+ }
+
+ /// <summary>
+ /// Loads the HTML document from the specified string.
+ /// </summary>
+ /// <param name="html">String containing the HTML document to load. May not be null.</param>
+ public void LoadHtml(string html)
+ {
+ if (html == null)
+ {
+ throw new ArgumentNullException("html");
+ }
+ StringReader sr = new StringReader(html);
+ Load(sr);
+ sr.Close();
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save.</param>
+ public void Save(Stream outStream)
+ {
+ StreamWriter sw = new StreamWriter(outStream, GetOutEncoding());
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ public void Save(Stream outStream, Encoding encoding)
+ {
+ if (outStream == null)
+ {
+ throw new ArgumentNullException("outStream");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamWriter sw = new StreamWriter(outStream, encoding);
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document.</param>
+ public void Save(string filename)
+ {
+ StreamWriter sw = new StreamWriter(filename, false, GetOutEncoding());
+ Save(sw);
+ sw.Close();
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document. May not be null.</param>
+ /// <param name="encoding">The character encoding to use. May not be null.</param>
+ public void Save(string filename, Encoding encoding)
+ {
+ if (filename == null)
+ {
+ throw new ArgumentNullException("filename");
+ }
+ if (encoding == null)
+ {
+ throw new ArgumentNullException("encoding");
+ }
+ StreamWriter sw = new StreamWriter(filename, false, encoding);
+ Save(sw);
+ sw.Close();
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified StreamWriter.
+ /// </summary>
+ /// <param name="writer">The StreamWriter to which you want to save.</param>
+ public void Save(StreamWriter writer)
+ {
+ Save((TextWriter) writer);
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified TextWriter.
+ /// </summary>
+ /// <param name="writer">The TextWriter to which you want to save. May not be null.</param>
+ public void Save(TextWriter writer)
+ {
+ if (writer == null)
+ {
+ throw new ArgumentNullException("writer");
+ }
+ DocumentNode.WriteTo(writer);
+ }
+
+ /// <summary>
+ /// Saves the HTML document to the specified XmlWriter.
+ /// </summary>
+ /// <param name="writer">The XmlWriter to which you want to save.</param>
+ public void Save(XmlWriter writer)
+ {
+ DocumentNode.WriteTo(writer);
+ writer.Flush();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal HtmlAttribute CreateAttribute()
+ {
+ return new HtmlAttribute(this);
+ }
+
+ internal HtmlNode CreateNode(HtmlNodeType type)
+ {
+ return CreateNode(type, -1);
+ }
+
+ internal HtmlNode CreateNode(HtmlNodeType type, int index)
+ {
+ switch (type)
+ {
+ case HtmlNodeType.Comment:
+ return new HtmlCommentNode(this, index);
+
+ case HtmlNodeType.Text:
+ return new HtmlTextNode(this, index);
+
+ default:
+ return new HtmlNode(type, this, index);
+ }
+ }
+
+ internal Encoding GetOutEncoding()
+ {
+ // when unspecified, use the stream encoding first
+ if (_declaredencoding != null)
+ {
+ return _declaredencoding;
+ }
+ else
+ {
+ if (_streamencoding != null)
+ {
+ return _streamencoding;
+ }
+ }
+ return OptionDefaultStreamEncoding;
+ }
+
+ internal HtmlNode GetXmlDeclaration()
+ {
+ if (!_documentnode.HasChildNodes)
+ {
+ return null;
+ }
+
+ foreach (HtmlNode node in _documentnode._childnodes)
+ {
+ if (node.Name == "?xml") // it's ok, names are case sensitive
+ {
+ return node;
+ }
+ }
+ return null;
+ }
+
+ internal void SetIdForNode(HtmlNode node, string id)
+ {
+ if (!OptionUseIdAttribute)
+ {
+ return;
+ }
+
+ if ((_nodesid == null) || (id == null))
+ {
+ return;
+ }
+
+ if (node == null)
+ {
+ _nodesid.Remove(id.ToLower());
+ }
+ else
+ {
+ _nodesid[id.ToLower()] = node;
+ }
+ }
+
+ internal void UpdateLastParentNode()
+ {
+ do
+ {
+ if (_lastparentnode.Closed)
+ {
+ _lastparentnode = _lastparentnode.ParentNode;
+ }
+ } while ((_lastparentnode != null) && (_lastparentnode.Closed));
+ if (_lastparentnode == null)
+ {
+ _lastparentnode = _documentnode;
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private HtmlParseError AddError(
+ HtmlParseErrorCode code,
+ int line,
+ int linePosition,
+ int streamPosition,
+ string sourceText,
+ string reason)
+ {
+ HtmlParseError err = new HtmlParseError(code, line, linePosition, streamPosition, sourceText, reason);
+ _parseerrors.Add(err);
+ return err;
+ }
+
+ private void CloseCurrentNode()
+ {
+ if (_currentnode.Closed) // text or document are by def closed
+ return;
+
+ bool error = false;
+
+ // find last node of this kind
+ HtmlNode prev = (HtmlNode) _lastnodes[_currentnode.Name];
+ if (prev == null)
+ {
+ if (HtmlNode.IsClosedElement(_currentnode.Name))
+ {
+ // </br> will be seen as <br>
+ _currentnode.CloseNode(_currentnode);
+
+ // add to parent node
+ if (_lastparentnode != null)
+ {
+ HtmlNode foundNode = null;
+ Stack futureChild = new Stack();
+ for (HtmlNode node = _lastparentnode.LastChild; node != null; node = node.PreviousSibling)
+ {
+ if ((node.Name == _currentnode.Name) && (!node.HasChildNodes))
+ {
+ foundNode = node;
+ break;
+ }
+ futureChild.Push(node);
+ }
+ if (foundNode != null)
+ {
+ HtmlNode node = null;
+ while (futureChild.Count != 0)
+ {
+ node = (HtmlNode) futureChild.Pop();
+ _lastparentnode.RemoveChild(node);
+ foundNode.AppendChild(node);
+ }
+ }
+ else
+ {
+ _lastparentnode.AppendChild(_currentnode);
+ }
+ }
+ }
+ else
+ {
+ // node has no parent
+ // node is not a closed node
+
+ if (HtmlNode.CanOverlapElement(_currentnode.Name))
+ {
+ // this is a hack: add it as a text node
+ HtmlNode closenode = CreateNode(HtmlNodeType.Text, _currentnode._outerstartindex);
+ closenode._outerlength = _currentnode._outerlength;
+ ((HtmlTextNode) closenode).Text = ((HtmlTextNode) closenode).Text.ToLower();
+ if (_lastparentnode != null)
+ {
+ _lastparentnode.AppendChild(closenode);
+ }
+ }
+ else
+ {
+ if (HtmlNode.IsEmptyElement(_currentnode.Name))
+ {
+ AddError(
+ HtmlParseErrorCode.EndTagNotRequired,
+ _currentnode._line, _currentnode._lineposition,
+ _currentnode._streamposition, _currentnode.OuterHtml,
+ "End tag </" + _currentnode.Name + "> is not required");
+ }
+ else
+ {
+ // node cannot overlap, node is not empty
+ AddError(
+ HtmlParseErrorCode.TagNotOpened,
+ _currentnode._line, _currentnode._lineposition,
+ _currentnode._streamposition, _currentnode.OuterHtml,
+ "Start tag <" + _currentnode.Name + "> was not found");
+ error = true;
+ }
+ }
+ }
+ }
+ else
+ {
+ if (OptionFixNestedTags)
+ {
+ if (FindResetterNodes(prev, GetResetters(_currentnode.Name)))
+ {
+ AddError(
+ HtmlParseErrorCode.EndTagInvalidHere,
+ _currentnode._line, _currentnode._lineposition,
+ _currentnode._streamposition, _currentnode.OuterHtml,
+ "End tag </" + _currentnode.Name + "> invalid here");
+ error = true;
+ }
+ }
+
+ if (!error)
+ {
+ _lastnodes[_currentnode.Name] = prev._prevwithsamename;
+ prev.CloseNode(_currentnode);
+ }
+ }
+
+
+ // we close this node, get grandparent
+ if (!error)
+ {
+ if ((_lastparentnode != null) &&
+ ((!HtmlNode.IsClosedElement(_currentnode.Name)) ||
+ (_currentnode._starttag)))
+ {
+ UpdateLastParentNode();
+ }
+ }
+ }
+
+ private string CurrentAttributeName()
+ {
+ return _text.Substring(_currentattribute._namestartindex, _currentattribute._namelength);
+ }
+
+ private string CurrentAttributeValue()
+ {
+ return _text.Substring(_currentattribute._valuestartindex, _currentattribute._valuelength);
+ }
+
+ private string CurrentNodeInner()
+ {
+ return _text.Substring(_currentnode._innerstartindex, _currentnode._innerlength);
+ }
+
+ private string CurrentNodeName()
+ {
+ return _text.Substring(_currentnode._namestartindex, _currentnode._namelength);
+ }
+
+ private string CurrentNodeOuter()
+ {
+ return _text.Substring(_currentnode._outerstartindex, _currentnode._outerlength);
+ }
+
+
+ private void DecrementPosition()
+ {
+ _index--;
+ if (_lineposition == 1)
+ {
+ _lineposition = _maxlineposition;
+ _line--;
+ }
+ else
+ {
+ _lineposition--;
+ }
+ }
+
+ private HtmlNode FindResetterNode(HtmlNode node, string name)
+ {
+ HtmlNode resetter = (HtmlNode) _lastnodes[name];
+ if (resetter == null)
+ return null;
+ if (resetter.Closed)
+ {
+ return null;
+ }
+ if (resetter._streamposition < node._streamposition)
+ {
+ return null;
+ }
+ return resetter;
+ }
+
+ private bool FindResetterNodes(HtmlNode node, string[] names)
+ {
+ if (names == null)
+ {
+ return false;
+ }
+ for (int i = 0; i < names.Length; i++)
+ {
+ if (FindResetterNode(node, names[i]) != null)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private void FixNestedTag(string name, string[] resetters)
+ {
+ if (resetters == null)
+ return;
+
+ HtmlNode prev;
+
+ // if we find a previous unclosed same name node, without a resetter node between, we must close it
+ prev = (HtmlNode) _lastnodes[name];
+ if ((prev != null) && (!prev.Closed))
+ {
+ // try to find a resetter node, if found, we do nothing
+ if (FindResetterNodes(prev, resetters))
+ {
+ return;
+ }
+
+ // ok we need to close the prev now
+ // create a fake closer node
+ HtmlNode close = new HtmlNode(prev.NodeType, this, -1);
+ close._endnode = close;
+ prev.CloseNode(close);
+ }
+ }
+
+ private void FixNestedTags()
+ {
+ // we are only interested by start tags, not closing tags
+ if (!_currentnode._starttag)
+ return;
+
+ string name = CurrentNodeName();
+ FixNestedTag(name, GetResetters(name));
+ }
+
+ private string[] GetResetters(string name)
+ {
+ switch (name)
+ {
+ case "li":
+ return new string[] {"ul"};
+
+ case "tr":
+ return new string[] {"table"};
+
+ case "th":
+ case "td":
+ return new string[] {"tr", "table"};
+
+ default:
+ return null;
+ }
+ }
+
+ private void IncrementPosition()
+ {
+ if (_crc32 != null)
+ {
+ // REVIEW: should we add some checksum code in DecrementPosition too?
+ _crc32.AddToCRC32(_c);
+ }
+
+ _index++;
+ _maxlineposition = _lineposition;
+ if (_c == 10)
+ {
+ _lineposition = 1;
+ _line++;
+ }
+ else
+ {
+ _lineposition++;
+ }
+ }
+
+ private bool NewCheck()
+ {
+ if (_c != '<')
+ {
+ return false;
+ }
+ if (_index < _text.Length)
+ {
+ if (_text[_index] == '%')
+ {
+ switch (_state)
+ {
+ case ParseState.AttributeAfterEquals:
+ PushAttributeValueStart(_index - 1);
+ break;
+
+ case ParseState.BetweenAttributes:
+ PushAttributeNameStart(_index - 1);
+ break;
+
+ case ParseState.WhichTag:
+ PushNodeNameStart(true, _index - 1);
+ _state = ParseState.Tag;
+ break;
+ }
+ _oldstate = _state;
+ _state = ParseState.ServerSideCode;
+ return true;
+ }
+ }
+
+ if (!PushNodeEnd(_index - 1, true))
+ {
+ // stop parsing
+ _index = _text.Length;
+ return true;
+ }
+ _state = ParseState.WhichTag;
+ if ((_index - 1) <= (_text.Length - 2))
+ {
+ if (_text[_index] == '!')
+ {
+ PushNodeStart(HtmlNodeType.Comment, _index - 1);
+ PushNodeNameStart(true, _index);
+ PushNodeNameEnd(_index + 1);
+ _state = ParseState.Comment;
+ if (_index < (_text.Length - 2))
+ {
+ if ((_text[_index + 1] == '-') &&
+ (_text[_index + 2] == '-'))
+ {
+ _fullcomment = true;
+ }
+ else
+ {
+ _fullcomment = false;
+ }
+ }
+ return true;
+ }
+ }
+ PushNodeStart(HtmlNodeType.Element, _index - 1);
+ return true;
+ }
+
+ private void Parse()
+ {
+ int lastquote = 0;
+ if (OptionComputeChecksum)
+ {
+ _crc32 = new Crc32();
+ }
+
+ _lastnodes = new Hashtable();
+ _c = 0;
+ _fullcomment = false;
+ _parseerrors = new List<HtmlParseError>();
+ _line = 1;
+ _lineposition = 1;
+ _maxlineposition = 1;
+
+ _state = ParseState.Text;
+ _oldstate = _state;
+ _documentnode._innerlength = _text.Length;
+ _documentnode._outerlength = _text.Length;
+ _remainderOffset = _text.Length;
+
+ _lastparentnode = _documentnode;
+ _currentnode = CreateNode(HtmlNodeType.Text, 0);
+ _currentattribute = null;
+
+ _index = 0;
+ PushNodeStart(HtmlNodeType.Text, 0);
+ while (_index < _text.Length)
+ {
+ _c = _text[_index];
+ IncrementPosition();
+
+ switch (_state)
+ {
+ case ParseState.Text:
+ if (NewCheck())
+ continue;
+ break;
+
+ case ParseState.WhichTag:
+ if (NewCheck())
+ continue;
+ if (_c == '/')
+ {
+ PushNodeNameStart(false, _index);
+ }
+ else
+ {
+ PushNodeNameStart(true, _index - 1);
+ DecrementPosition();
+ }
+ _state = ParseState.Tag;
+ break;
+
+ case ParseState.Tag:
+ if (NewCheck())
+ continue;
+ if (IsWhiteSpace(_c))
+ {
+ PushNodeNameEnd(_index - 1);
+ if (_state != ParseState.Tag)
+ continue;
+ _state = ParseState.BetweenAttributes;
+ continue;
+ }
+ if (_c == '/')
+ {
+ PushNodeNameEnd(_index - 1);
+ if (_state != ParseState.Tag)
+ continue;
+ _state = ParseState.EmptyTag;
+ continue;
+ }
+ if (_c == '>')
+ {
+ PushNodeNameEnd(_index - 1);
+ if (_state != ParseState.Tag)
+ continue;
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.Tag)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ }
+ break;
+
+ case ParseState.BetweenAttributes:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ continue;
+
+ if ((_c == '/') || (_c == '?'))
+ {
+ _state = ParseState.EmptyTag;
+ continue;
+ }
+
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+
+ if (_state != ParseState.BetweenAttributes)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+
+ PushAttributeNameStart(_index - 1);
+ _state = ParseState.AttributeName;
+ break;
+
+ case ParseState.EmptyTag:
+ if (NewCheck())
+ continue;
+
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, true))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+
+ if (_state != ParseState.EmptyTag)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ _state = ParseState.BetweenAttributes;
+ break;
+
+ case ParseState.AttributeName:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ {
+ PushAttributeNameEnd(_index - 1);
+ _state = ParseState.AttributeBeforeEquals;
+ continue;
+ }
+ if (_c == '=')
+ {
+ PushAttributeNameEnd(_index - 1);
+ _state = ParseState.AttributeAfterEquals;
+ continue;
+ }
+ if (_c == '>')
+ {
+ PushAttributeNameEnd(_index - 1);
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeName)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ break;
+
+ case ParseState.AttributeBeforeEquals:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ continue;
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeBeforeEquals)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ if (_c == '=')
+ {
+ _state = ParseState.AttributeAfterEquals;
+ continue;
+ }
+ // no equals, no whitespace, it's a new attrribute starting
+ _state = ParseState.BetweenAttributes;
+ DecrementPosition();
+ break;
+
+ case ParseState.AttributeAfterEquals:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ continue;
+
+ if ((_c == '\'') || (_c == '"'))
+ {
+ _state = ParseState.QuotedAttributeValue;
+ PushAttributeValueStart(_index, _c);
+ lastquote = _c;
+ continue;
+ }
+ if (_c == '>')
+ {
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeAfterEquals)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ PushAttributeValueStart(_index - 1);
+ _state = ParseState.AttributeValue;
+ break;
+
+ case ParseState.AttributeValue:
+ if (NewCheck())
+ continue;
+
+ if (IsWhiteSpace(_c))
+ {
+ PushAttributeValueEnd(_index - 1);
+ _state = ParseState.BetweenAttributes;
+ continue;
+ }
+
+ if (_c == '>')
+ {
+ PushAttributeValueEnd(_index - 1);
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ if (_state != ParseState.AttributeValue)
+ continue;
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ break;
+
+ case ParseState.QuotedAttributeValue:
+ if (_c == lastquote)
+ {
+ PushAttributeValueEnd(_index - 1);
+ _state = ParseState.BetweenAttributes;
+ continue;
+ }
+ if (_c == '<')
+ {
+ if (_index < _text.Length)
+ {
+ if (_text[_index] == '%')
+ {
+ _oldstate = _state;
+ _state = ParseState.ServerSideCode;
+ continue;
+ }
+ }
+ }
+ break;
+
+ case ParseState.Comment:
+ if (_c == '>')
+ {
+ if (_fullcomment)
+ {
+ if ((_text[_index - 2] != '-') ||
+ (_text[_index - 3] != '-'))
+ {
+ continue;
+ }
+ }
+ if (!PushNodeEnd(_index, false))
+ {
+ // stop parsing
+ _index = _text.Length;
+ break;
+ }
+ _state = ParseState.Text;
+ PushNodeStart(HtmlNodeType.Text, _index);
+ continue;
+ }
+ break;
+
+ case ParseState.ServerSideCode:
+ if (_c == '%')
+ {
+ if (_index < _text.Length)
+ {
+ if (_text[_index] == '>')
+ {
+ switch (_oldstate)
+ {
+ case ParseState.AttributeAfterEquals:
+ _state = ParseState.AttributeValue;
+ break;
+
+ case ParseState.BetweenAttributes:
+ PushAttributeNameEnd(_index + 1);
+ _state = ParseState.BetweenAttributes;
+ break;
+
+ default:
+ _state = _oldstate;
+ break;
+ }
+ IncrementPosition();
+ }
+ }
+ }
+ break;
+
+ case ParseState.PcData:
+ // look for </tag + 1 char
+
+ // check buffer end
+ if ((_currentnode._namelength + 3) <= (_text.Length - (_index - 1)))
+ {
+ if (string.Compare(_text.Substring(_index - 1, _currentnode._namelength + 2),
+ "</" + _currentnode.Name, true) == 0)
+ {
+ int c = _text[_index - 1 + 2 + _currentnode.Name.Length];
+ if ((c == '>') || (IsWhiteSpace(c)))
+ {
+ // add the script as a text node
+ HtmlNode script = CreateNode(HtmlNodeType.Text,
+ _currentnode._outerstartindex +
+ _currentnode._outerlength);
+ script._outerlength = _index - 1 - script._outerstartindex;
+ _currentnode.AppendChild(script);
+
+
+ PushNodeStart(HtmlNodeType.Element, _index - 1);
+ PushNodeNameStart(false, _index - 1 + 2);
+ _state = ParseState.Tag;
+ IncrementPosition();
+ }
+ }
+ }
+ break;
+ }
+ }
+
+ // finish the current work
+ if (_currentnode._namestartindex > 0)
+ {
+ PushNodeNameEnd(_index);
+ }
+ PushNodeEnd(_index, false);
+
+ // we don't need this anymore
+ _lastnodes.Clear();
+ }
+
+ private void PushAttributeNameEnd(int index)
+ {
+ _currentattribute._namelength = index - _currentattribute._namestartindex;
+ _currentnode.Attributes.Append(_currentattribute);
+ }
+
+ private void PushAttributeNameStart(int index)
+ {
+ _currentattribute = CreateAttribute();
+ _currentattribute._namestartindex = index;
+ _currentattribute.Line = _line;
+ _currentattribute._lineposition = _lineposition;
+ _currentattribute._streamposition = index;
+ }
+
+ private void PushAttributeValueEnd(int index)
+ {
+ _currentattribute._valuelength = index - _currentattribute._valuestartindex;
+ }
+
+ private void PushAttributeValueStart(int index)
+ {
+ PushAttributeValueStart(index, 0);
+ }
+
+ private void PushAttributeValueStart(int index, int quote)
+ {
+ _currentattribute._valuestartindex = index;
+ if (quote == '\'')
+ _currentattribute.QuoteType = AttributeValueQuote.SingleQuote;
+ }
+
+ private bool PushNodeEnd(int index, bool close)
+ {
+ _currentnode._outerlength = index - _currentnode._outerstartindex;
+
+ if ((_currentnode._nodetype == HtmlNodeType.Text) ||
+ (_currentnode._nodetype == HtmlNodeType.Comment))
+ {
+ // forget about void nodes
+ if (_currentnode._outerlength > 0)
+ {
+ _currentnode._innerlength = _currentnode._outerlength;
+ _currentnode._innerstartindex = _currentnode._outerstartindex;
+ if (_lastparentnode != null)
+ {
+ _lastparentnode.AppendChild(_currentnode);
+ }
+ }
+ }
+ else
+ {
+ if ((_currentnode._starttag) && (_lastparentnode != _currentnode))
+ {
+ // add to parent node
+ if (_lastparentnode != null)
+ {
+ _lastparentnode.AppendChild(_currentnode);
+ }
+
+ ReadDocumentEncoding(_currentnode);
+
+ // remember last node of this kind
+ HtmlNode prev = (HtmlNode) _lastnodes[_currentnode.Name];
+ _currentnode._prevwithsamename = prev;
+ _lastnodes[_currentnode.Name] = _currentnode;
+
+ // change parent?
+ if ((_currentnode.NodeType == HtmlNodeType.Document) ||
+ (_currentnode.NodeType == HtmlNodeType.Element))
+ {
+ _lastparentnode = _currentnode;
+ }
+
+ if (HtmlNode.IsCDataElement(CurrentNodeName()))
+ {
+ _state = ParseState.PcData;
+ return true;
+ }
+
+ if ((HtmlNode.IsClosedElement(_currentnode.Name)) ||
+ (HtmlNode.IsEmptyElement(_currentnode.Name)))
+ {
+ close = true;
+ }
+ }
+ }
+
+ if ((close) || (!_currentnode._starttag))
+ {
+ if ((OptionStopperNodeName != null) && (_remainder == null) &&
+ (string.Compare(_currentnode.Name, OptionStopperNodeName, true) == 0))
+ {
+ _remainderOffset = index;
+ _remainder = _text.Substring(_remainderOffset);
+ CloseCurrentNode();
+ return false; // stop parsing
+ }
+ CloseCurrentNode();
+ }
+ return true;
+ }
+
+ private void PushNodeNameEnd(int index)
+ {
+ _currentnode._namelength = index - _currentnode._namestartindex;
+ if (OptionFixNestedTags)
+ {
+ FixNestedTags();
+ }
+ }
+
+ private void PushNodeNameStart(bool starttag, int index)
+ {
+ _currentnode._starttag = starttag;
+ _currentnode._namestartindex = index;
+ }
+
+ private void PushNodeStart(HtmlNodeType type, int index)
+ {
+ _currentnode = CreateNode(type, index);
+ _currentnode._line = _line;
+ _currentnode._lineposition = _lineposition;
+ if (type == HtmlNodeType.Element)
+ {
+ _currentnode._lineposition--;
+ }
+ _currentnode._streamposition = index;
+ }
+
+ private void ReadDocumentEncoding(HtmlNode node)
+ {
+ if (!OptionReadEncoding)
+ return;
+ // format is
+ // <meta http-equiv="content-type" content="text/html;charset=iso-8859-1" />
+
+ // when we append a child, we are in node end, so attributes are already populated
+ if (node._namelength == 4) // quick check, avoids string alloc
+ {
+ if (node.Name == "meta") // all nodes names are lowercase
+ {
+ HtmlAttribute att = node.Attributes["http-equiv"];
+ if (att != null)
+ {
+ if (string.Compare(att.Value, "content-type", true) == 0)
+ {
+ HtmlAttribute content = node.Attributes["content"];
+ if (content != null)
+ {
+ string charset = NameValuePairList.GetNameValuePairsValue(content.Value, "charset");
+ if (charset != null && (charset = charset.Trim()).Length > 0)
+ {
+ _declaredencoding = Encoding.GetEncoding(charset.Trim());
+ if (_onlyDetectEncoding)
+ {
+ throw new EncodingFoundException(_declaredencoding);
+ }
+
+ if (_streamencoding != null)
+ {
+ if (_declaredencoding.WindowsCodePage != _streamencoding.WindowsCodePage)
+ {
+ AddError(
+ HtmlParseErrorCode.CharsetMismatch,
+ _line, _lineposition,
+ _index, node.OuterHtml,
+ "Encoding mismatch between StreamEncoding: " +
+ _streamencoding.WebName + " and DeclaredEncoding: " +
+ _declaredencoding.WebName);
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Nested type: ParseState
+
+ private enum ParseState
+ {
+ Text,
+ WhichTag,
+ Tag,
+ BetweenAttributes,
+ EmptyTag,
+ AttributeName,
+ AttributeBeforeEquals,
+ AttributeAfterEquals,
+ AttributeValue,
+ Comment,
+ QuotedAttributeValue,
+ ServerSideCode,
+ PcData
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlElementFlag.cs b/docs/HtmlAgilityPack/HtmlElementFlag.cs
new file mode 100644
index 00000000000..01232cda8ed
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlElementFlag.cs
@@ -0,0 +1,32 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Flags that describe the behavior of an Element node.
+ /// </summary>
+ [Flags]
+ public enum HtmlElementFlag
+ {
+ /// <summary>
+ /// The node is a CDATA node.
+ /// </summary>
+ CData = 1,
+
+ /// <summary>
+ /// The node is empty. META or IMG are example of such nodes.
+ /// </summary>
+ Empty = 2,
+
+ /// <summary>
+ /// The node will automatically be closed during parsing.
+ /// </summary>
+ Closed = 4,
+
+ /// <summary>
+ /// The node can overlap.
+ /// </summary>
+ CanOverlap = 8
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlEntity.cs b/docs/HtmlAgilityPack/HtmlEntity.cs
new file mode 100644
index 00000000000..b79404dc4b6
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlEntity.cs
@@ -0,0 +1,826 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Text;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// A utility class to replace special characters by entities and vice-versa.
+ /// Follows HTML 4.0 specification found at http://www.w3.org/TR/html4/sgml/entities.html
+ /// </summary>
+ public class HtmlEntity
+ {
+ #region Static Members
+
+ private static readonly int _maxEntitySize;
+ private static Hashtable _entityName;
+ private static Hashtable _entityValue;
+
+ /// <summary>
+ /// A collection of entities indexed by name.
+ /// </summary>
+ public static Hashtable EntityName
+ {
+ get { return _entityName; }
+ }
+
+ /// <summary>
+ /// A collection of entities indexed by value.
+ /// </summary>
+ public static Hashtable EntityValue
+ {
+ get { return _entityValue; }
+ }
+
+ #endregion
+
+ #region Constructors
+
+ static HtmlEntity()
+ {
+ _entityName = new Hashtable();
+ _entityValue = new Hashtable();
+
+ #region Entities Definition
+
+ _entityValue.Add("nbsp", 160); // no-break space = non-breaking space, U+00A0 ISOnum
+ _entityName.Add(160, "nbsp");
+ _entityValue.Add("iexcl", 161); // inverted exclamation mark, U+00A1 ISOnum
+ _entityName.Add(161, "iexcl");
+ _entityValue.Add("cent", 162); // cent sign, U+00A2 ISOnum
+ _entityName.Add(162, "cent");
+ _entityValue.Add("pound", 163); // pound sign, U+00A3 ISOnum
+ _entityName.Add(163, "pound");
+ _entityValue.Add("curren", 164); // currency sign, U+00A4 ISOnum
+ _entityName.Add(164, "curren");
+ _entityValue.Add("yen", 165); // yen sign = yuan sign, U+00A5 ISOnum
+ _entityName.Add(165, "yen");
+ _entityValue.Add("brvbar", 166); // broken bar = broken vertical bar, U+00A6 ISOnum
+ _entityName.Add(166, "brvbar");
+ _entityValue.Add("sect", 167); // section sign, U+00A7 ISOnum
+ _entityName.Add(167, "sect");
+ _entityValue.Add("uml", 168); // diaeresis = spacing diaeresis, U+00A8 ISOdia
+ _entityName.Add(168, "uml");
+ _entityValue.Add("copy", 169); // copyright sign, U+00A9 ISOnum
+ _entityName.Add(169, "copy");
+ _entityValue.Add("ordf", 170); // feminine ordinal indicator, U+00AA ISOnum
+ _entityName.Add(170, "ordf");
+ _entityValue.Add("laquo", 171);
+ // left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum
+ _entityName.Add(171, "laquo");
+ _entityValue.Add("not", 172); // not sign, U+00AC ISOnum
+ _entityName.Add(172, "not");
+ _entityValue.Add("shy", 173); // soft hyphen = discretionary hyphen, U+00AD ISOnum
+ _entityName.Add(173, "shy");
+ _entityValue.Add("reg", 174); // registered sign = registered trade mark sign, U+00AE ISOnum
+ _entityName.Add(174, "reg");
+ _entityValue.Add("macr", 175); // macron = spacing macron = overline = APL overbar, U+00AF ISOdia
+ _entityName.Add(175, "macr");
+ _entityValue.Add("deg", 176); // degree sign, U+00B0 ISOnum
+ _entityName.Add(176, "deg");
+ _entityValue.Add("plusmn", 177); // plus-minus sign = plus-or-minus sign, U+00B1 ISOnum
+ _entityName.Add(177, "plusmn");
+ _entityValue.Add("sup2", 178); // superscript two = superscript digit two = squared, U+00B2 ISOnum
+ _entityName.Add(178, "sup2");
+ _entityValue.Add("sup3", 179); // superscript three = superscript digit three = cubed, U+00B3 ISOnum
+ _entityName.Add(179, "sup3");
+ _entityValue.Add("acute", 180); // acute accent = spacing acute, U+00B4 ISOdia
+ _entityName.Add(180, "acute");
+ _entityValue.Add("micro", 181); // micro sign, U+00B5 ISOnum
+ _entityName.Add(181, "micro");
+ _entityValue.Add("para", 182); // pilcrow sign = paragraph sign, U+00B6 ISOnum
+ _entityName.Add(182, "para");
+ _entityValue.Add("middot", 183); // middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum
+ _entityName.Add(183, "middot");
+ _entityValue.Add("cedil", 184); // cedilla = spacing cedilla, U+00B8 ISOdia
+ _entityName.Add(184, "cedil");
+ _entityValue.Add("sup1", 185); // superscript one = superscript digit one, U+00B9 ISOnum
+ _entityName.Add(185, "sup1");
+ _entityValue.Add("ordm", 186); // masculine ordinal indicator, U+00BA ISOnum
+ _entityName.Add(186, "ordm");
+ _entityValue.Add("raquo", 187);
+ // right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum
+ _entityName.Add(187, "raquo");
+ _entityValue.Add("frac14", 188); // vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum
+ _entityName.Add(188, "frac14");
+ _entityValue.Add("frac12", 189); // vulgar fraction one half = fraction one half, U+00BD ISOnum
+ _entityName.Add(189, "frac12");
+ _entityValue.Add("frac34", 190); // vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum
+ _entityName.Add(190, "frac34");
+ _entityValue.Add("iquest", 191); // inverted question mark = turned question mark, U+00BF ISOnum
+ _entityName.Add(191, "iquest");
+ _entityValue.Add("Agrave", 192);
+ // latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1
+ _entityName.Add(192, "Agrave");
+ _entityValue.Add("Aacute", 193); // latin capital letter A with acute, U+00C1 ISOlat1
+ _entityName.Add(193, "Aacute");
+ _entityValue.Add("Acirc", 194); // latin capital letter A with circumflex, U+00C2 ISOlat1
+ _entityName.Add(194, "Acirc");
+ _entityValue.Add("Atilde", 195); // latin capital letter A with tilde, U+00C3 ISOlat1
+ _entityName.Add(195, "Atilde");
+ _entityValue.Add("Auml", 196); // latin capital letter A with diaeresis, U+00C4 ISOlat1
+ _entityName.Add(196, "Auml");
+ _entityValue.Add("Aring", 197);
+ // latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1
+ _entityName.Add(197, "Aring");
+ _entityValue.Add("AElig", 198); // latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1
+ _entityName.Add(198, "AElig");
+ _entityValue.Add("Ccedil", 199); // latin capital letter C with cedilla, U+00C7 ISOlat1
+ _entityName.Add(199, "Ccedil");
+ _entityValue.Add("Egrave", 200); // latin capital letter E with grave, U+00C8 ISOlat1
+ _entityName.Add(200, "Egrave");
+ _entityValue.Add("Eacute", 201); // latin capital letter E with acute, U+00C9 ISOlat1
+ _entityName.Add(201, "Eacute");
+ _entityValue.Add("Ecirc", 202); // latin capital letter E with circumflex, U+00CA ISOlat1
+ _entityName.Add(202, "Ecirc");
+ _entityValue.Add("Euml", 203); // latin capital letter E with diaeresis, U+00CB ISOlat1
+ _entityName.Add(203, "Euml");
+ _entityValue.Add("Igrave", 204); // latin capital letter I with grave, U+00CC ISOlat1
+ _entityName.Add(204, "Igrave");
+ _entityValue.Add("Iacute", 205); // latin capital letter I with acute, U+00CD ISOlat1
+ _entityName.Add(205, "Iacute");
+ _entityValue.Add("Icirc", 206); // latin capital letter I with circumflex, U+00CE ISOlat1
+ _entityName.Add(206, "Icirc");
+ _entityValue.Add("Iuml", 207); // latin capital letter I with diaeresis, U+00CF ISOlat1
+ _entityName.Add(207, "Iuml");
+ _entityValue.Add("ETH", 208); // latin capital letter ETH, U+00D0 ISOlat1
+ _entityName.Add(208, "ETH");
+ _entityValue.Add("Ntilde", 209); // latin capital letter N with tilde, U+00D1 ISOlat1
+ _entityName.Add(209, "Ntilde");
+ _entityValue.Add("Ograve", 210); // latin capital letter O with grave, U+00D2 ISOlat1
+ _entityName.Add(210, "Ograve");
+ _entityValue.Add("Oacute", 211); // latin capital letter O with acute, U+00D3 ISOlat1
+ _entityName.Add(211, "Oacute");
+ _entityValue.Add("Ocirc", 212); // latin capital letter O with circumflex, U+00D4 ISOlat1
+ _entityName.Add(212, "Ocirc");
+ _entityValue.Add("Otilde", 213); // latin capital letter O with tilde, U+00D5 ISOlat1
+ _entityName.Add(213, "Otilde");
+ _entityValue.Add("Ouml", 214); // latin capital letter O with diaeresis, U+00D6 ISOlat1
+ _entityName.Add(214, "Ouml");
+ _entityValue.Add("times", 215); // multiplication sign, U+00D7 ISOnum
+ _entityName.Add(215, "times");
+ _entityValue.Add("Oslash", 216);
+ // latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1
+ _entityName.Add(216, "Oslash");
+ _entityValue.Add("Ugrave", 217); // latin capital letter U with grave, U+00D9 ISOlat1
+ _entityName.Add(217, "Ugrave");
+ _entityValue.Add("Uacute", 218); // latin capital letter U with acute, U+00DA ISOlat1
+ _entityName.Add(218, "Uacute");
+ _entityValue.Add("Ucirc", 219); // latin capital letter U with circumflex, U+00DB ISOlat1
+ _entityName.Add(219, "Ucirc");
+ _entityValue.Add("Uuml", 220); // latin capital letter U with diaeresis, U+00DC ISOlat1
+ _entityName.Add(220, "Uuml");
+ _entityValue.Add("Yacute", 221); // latin capital letter Y with acute, U+00DD ISOlat1
+ _entityName.Add(221, "Yacute");
+ _entityValue.Add("THORN", 222); // latin capital letter THORN, U+00DE ISOlat1
+ _entityName.Add(222, "THORN");
+ _entityValue.Add("szlig", 223); // latin small letter sharp s = ess-zed, U+00DF ISOlat1
+ _entityName.Add(223, "szlig");
+ _entityValue.Add("agrave", 224);
+ // latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1
+ _entityName.Add(224, "agrave");
+ _entityValue.Add("aacute", 225); // latin small letter a with acute, U+00E1 ISOlat1
+ _entityName.Add(225, "aacute");
+ _entityValue.Add("acirc", 226); // latin small letter a with circumflex, U+00E2 ISOlat1
+ _entityName.Add(226, "acirc");
+ _entityValue.Add("atilde", 227); // latin small letter a with tilde, U+00E3 ISOlat1
+ _entityName.Add(227, "atilde");
+ _entityValue.Add("auml", 228); // latin small letter a with diaeresis, U+00E4 ISOlat1
+ _entityName.Add(228, "auml");
+ _entityValue.Add("aring", 229);
+ // latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1
+ _entityName.Add(229, "aring");
+ _entityValue.Add("aelig", 230); // latin small letter ae = latin small ligature ae, U+00E6 ISOlat1
+ _entityName.Add(230, "aelig");
+ _entityValue.Add("ccedil", 231); // latin small letter c with cedilla, U+00E7 ISOlat1
+ _entityName.Add(231, "ccedil");
+ _entityValue.Add("egrave", 232); // latin small letter e with grave, U+00E8 ISOlat1
+ _entityName.Add(232, "egrave");
+ _entityValue.Add("eacute", 233); // latin small letter e with acute, U+00E9 ISOlat1
+ _entityName.Add(233, "eacute");
+ _entityValue.Add("ecirc", 234); // latin small letter e with circumflex, U+00EA ISOlat1
+ _entityName.Add(234, "ecirc");
+ _entityValue.Add("euml", 235); // latin small letter e with diaeresis, U+00EB ISOlat1
+ _entityName.Add(235, "euml");
+ _entityValue.Add("igrave", 236); // latin small letter i with grave, U+00EC ISOlat1
+ _entityName.Add(236, "igrave");
+ _entityValue.Add("iacute", 237); // latin small letter i with acute, U+00ED ISOlat1
+ _entityName.Add(237, "iacute");
+ _entityValue.Add("icirc", 238); // latin small letter i with circumflex, U+00EE ISOlat1
+ _entityName.Add(238, "icirc");
+ _entityValue.Add("iuml", 239); // latin small letter i with diaeresis, U+00EF ISOlat1
+ _entityName.Add(239, "iuml");
+ _entityValue.Add("eth", 240); // latin small letter eth, U+00F0 ISOlat1
+ _entityName.Add(240, "eth");
+ _entityValue.Add("ntilde", 241); // latin small letter n with tilde, U+00F1 ISOlat1
+ _entityName.Add(241, "ntilde");
+ _entityValue.Add("ograve", 242); // latin small letter o with grave, U+00F2 ISOlat1
+ _entityName.Add(242, "ograve");
+ _entityValue.Add("oacute", 243); // latin small letter o with acute, U+00F3 ISOlat1
+ _entityName.Add(243, "oacute");
+ _entityValue.Add("ocirc", 244); // latin small letter o with circumflex, U+00F4 ISOlat1
+ _entityName.Add(244, "ocirc");
+ _entityValue.Add("otilde", 245); // latin small letter o with tilde, U+00F5 ISOlat1
+ _entityName.Add(245, "otilde");
+ _entityValue.Add("ouml", 246); // latin small letter o with diaeresis, U+00F6 ISOlat1
+ _entityName.Add(246, "ouml");
+ _entityValue.Add("divide", 247); // division sign, U+00F7 ISOnum
+ _entityName.Add(247, "divide");
+ _entityValue.Add("oslash", 248);
+ // latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1
+ _entityName.Add(248, "oslash");
+ _entityValue.Add("ugrave", 249); // latin small letter u with grave, U+00F9 ISOlat1
+ _entityName.Add(249, "ugrave");
+ _entityValue.Add("uacute", 250); // latin small letter u with acute, U+00FA ISOlat1
+ _entityName.Add(250, "uacute");
+ _entityValue.Add("ucirc", 251); // latin small letter u with circumflex, U+00FB ISOlat1
+ _entityName.Add(251, "ucirc");
+ _entityValue.Add("uuml", 252); // latin small letter u with diaeresis, U+00FC ISOlat1
+ _entityName.Add(252, "uuml");
+ _entityValue.Add("yacute", 253); // latin small letter y with acute, U+00FD ISOlat1
+ _entityName.Add(253, "yacute");
+ _entityValue.Add("thorn", 254); // latin small letter thorn, U+00FE ISOlat1
+ _entityName.Add(254, "thorn");
+ _entityValue.Add("yuml", 255); // latin small letter y with diaeresis, U+00FF ISOlat1
+ _entityName.Add(255, "yuml");
+ _entityValue.Add("fnof", 402); // latin small f with hook = function = florin, U+0192 ISOtech
+ _entityName.Add(402, "fnof");
+ _entityValue.Add("Alpha", 913); // greek capital letter alpha, U+0391
+ _entityName.Add(913, "Alpha");
+ _entityValue.Add("Beta", 914); // greek capital letter beta, U+0392
+ _entityName.Add(914, "Beta");
+ _entityValue.Add("Gamma", 915); // greek capital letter gamma, U+0393 ISOgrk3
+ _entityName.Add(915, "Gamma");
+ _entityValue.Add("Delta", 916); // greek capital letter delta, U+0394 ISOgrk3
+ _entityName.Add(916, "Delta");
+ _entityValue.Add("Epsilon", 917); // greek capital letter epsilon, U+0395
+ _entityName.Add(917, "Epsilon");
+ _entityValue.Add("Zeta", 918); // greek capital letter zeta, U+0396
+ _entityName.Add(918, "Zeta");
+ _entityValue.Add("Eta", 919); // greek capital letter eta, U+0397
+ _entityName.Add(919, "Eta");
+ _entityValue.Add("Theta", 920); // greek capital letter theta, U+0398 ISOgrk3
+ _entityName.Add(920, "Theta");
+ _entityValue.Add("Iota", 921); // greek capital letter iota, U+0399
+ _entityName.Add(921, "Iota");
+ _entityValue.Add("Kappa", 922); // greek capital letter kappa, U+039A
+ _entityName.Add(922, "Kappa");
+ _entityValue.Add("Lambda", 923); // greek capital letter lambda, U+039B ISOgrk3
+ _entityName.Add(923, "Lambda");
+ _entityValue.Add("Mu", 924); // greek capital letter mu, U+039C
+ _entityName.Add(924, "Mu");
+ _entityValue.Add("Nu", 925); // greek capital letter nu, U+039D
+ _entityName.Add(925, "Nu");
+ _entityValue.Add("Xi", 926); // greek capital letter xi, U+039E ISOgrk3
+ _entityName.Add(926, "Xi");
+ _entityValue.Add("Omicron", 927); // greek capital letter omicron, U+039F
+ _entityName.Add(927, "Omicron");
+ _entityValue.Add("Pi", 928); // greek capital letter pi, U+03A0 ISOgrk3
+ _entityName.Add(928, "Pi");
+ _entityValue.Add("Rho", 929); // greek capital letter rho, U+03A1
+ _entityName.Add(929, "Rho");
+ _entityValue.Add("Sigma", 931); // greek capital letter sigma, U+03A3 ISOgrk3
+ _entityName.Add(931, "Sigma");
+ _entityValue.Add("Tau", 932); // greek capital letter tau, U+03A4
+ _entityName.Add(932, "Tau");
+ _entityValue.Add("Upsilon", 933); // greek capital letter upsilon, U+03A5 ISOgrk3
+ _entityName.Add(933, "Upsilon");
+ _entityValue.Add("Phi", 934); // greek capital letter phi, U+03A6 ISOgrk3
+ _entityName.Add(934, "Phi");
+ _entityValue.Add("Chi", 935); // greek capital letter chi, U+03A7
+ _entityName.Add(935, "Chi");
+ _entityValue.Add("Psi", 936); // greek capital letter psi, U+03A8 ISOgrk3
+ _entityName.Add(936, "Psi");
+ _entityValue.Add("Omega", 937); // greek capital letter omega, U+03A9 ISOgrk3
+ _entityName.Add(937, "Omega");
+ _entityValue.Add("alpha", 945); // greek small letter alpha, U+03B1 ISOgrk3
+ _entityName.Add(945, "alpha");
+ _entityValue.Add("beta", 946); // greek small letter beta, U+03B2 ISOgrk3
+ _entityName.Add(946, "beta");
+ _entityValue.Add("gamma", 947); // greek small letter gamma, U+03B3 ISOgrk3
+ _entityName.Add(947, "gamma");
+ _entityValue.Add("delta", 948); // greek small letter delta, U+03B4 ISOgrk3
+ _entityName.Add(948, "delta");
+ _entityValue.Add("epsilon", 949); // greek small letter epsilon, U+03B5 ISOgrk3
+ _entityName.Add(949, "epsilon");
+ _entityValue.Add("zeta", 950); // greek small letter zeta, U+03B6 ISOgrk3
+ _entityName.Add(950, "zeta");
+ _entityValue.Add("eta", 951); // greek small letter eta, U+03B7 ISOgrk3
+ _entityName.Add(951, "eta");
+ _entityValue.Add("theta", 952); // greek small letter theta, U+03B8 ISOgrk3
+ _entityName.Add(952, "theta");
+ _entityValue.Add("iota", 953); // greek small letter iota, U+03B9 ISOgrk3
+ _entityName.Add(953, "iota");
+ _entityValue.Add("kappa", 954); // greek small letter kappa, U+03BA ISOgrk3
+ _entityName.Add(954, "kappa");
+ _entityValue.Add("lambda", 955); // greek small letter lambda, U+03BB ISOgrk3
+ _entityName.Add(955, "lambda");
+ _entityValue.Add("mu", 956); // greek small letter mu, U+03BC ISOgrk3
+ _entityName.Add(956, "mu");
+ _entityValue.Add("nu", 957); // greek small letter nu, U+03BD ISOgrk3
+ _entityName.Add(957, "nu");
+ _entityValue.Add("xi", 958); // greek small letter xi, U+03BE ISOgrk3
+ _entityName.Add(958, "xi");
+ _entityValue.Add("omicron", 959); // greek small letter omicron, U+03BF NEW
+ _entityName.Add(959, "omicron");
+ _entityValue.Add("pi", 960); // greek small letter pi, U+03C0 ISOgrk3
+ _entityName.Add(960, "pi");
+ _entityValue.Add("rho", 961); // greek small letter rho, U+03C1 ISOgrk3
+ _entityName.Add(961, "rho");
+ _entityValue.Add("sigmaf", 962); // greek small letter final sigma, U+03C2 ISOgrk3
+ _entityName.Add(962, "sigmaf");
+ _entityValue.Add("sigma", 963); // greek small letter sigma, U+03C3 ISOgrk3
+ _entityName.Add(963, "sigma");
+ _entityValue.Add("tau", 964); // greek small letter tau, U+03C4 ISOgrk3
+ _entityName.Add(964, "tau");
+ _entityValue.Add("upsilon", 965); // greek small letter upsilon, U+03C5 ISOgrk3
+ _entityName.Add(965, "upsilon");
+ _entityValue.Add("phi", 966); // greek small letter phi, U+03C6 ISOgrk3
+ _entityName.Add(966, "phi");
+ _entityValue.Add("chi", 967); // greek small letter chi, U+03C7 ISOgrk3
+ _entityName.Add(967, "chi");
+ _entityValue.Add("psi", 968); // greek small letter psi, U+03C8 ISOgrk3
+ _entityName.Add(968, "psi");
+ _entityValue.Add("omega", 969); // greek small letter omega, U+03C9 ISOgrk3
+ _entityName.Add(969, "omega");
+ _entityValue.Add("thetasym", 977); // greek small letter theta symbol, U+03D1 NEW
+ _entityName.Add(977, "thetasym");
+ _entityValue.Add("upsih", 978); // greek upsilon with hook symbol, U+03D2 NEW
+ _entityName.Add(978, "upsih");
+ _entityValue.Add("piv", 982); // greek pi symbol, U+03D6 ISOgrk3
+ _entityName.Add(982, "piv");
+ _entityValue.Add("bull", 8226); // bullet = black small circle, U+2022 ISOpub
+ _entityName.Add(8226, "bull");
+ _entityValue.Add("hellip", 8230); // horizontal ellipsis = three dot leader, U+2026 ISOpub
+ _entityName.Add(8230, "hellip");
+ _entityValue.Add("prime", 8242); // prime = minutes = feet, U+2032 ISOtech
+ _entityName.Add(8242, "prime");
+ _entityValue.Add("Prime", 8243); // double prime = seconds = inches, U+2033 ISOtech
+ _entityName.Add(8243, "Prime");
+ _entityValue.Add("oline", 8254); // overline = spacing overscore, U+203E NEW
+ _entityName.Add(8254, "oline");
+ _entityValue.Add("frasl", 8260); // fraction slash, U+2044 NEW
+ _entityName.Add(8260, "frasl");
+ _entityValue.Add("weierp", 8472); // script capital P = power set = Weierstrass p, U+2118 ISOamso
+ _entityName.Add(8472, "weierp");
+ _entityValue.Add("image", 8465); // blackletter capital I = imaginary part, U+2111 ISOamso
+ _entityName.Add(8465, "image");
+ _entityValue.Add("real", 8476); // blackletter capital R = real part symbol, U+211C ISOamso
+ _entityName.Add(8476, "real");
+ _entityValue.Add("trade", 8482); // trade mark sign, U+2122 ISOnum
+ _entityName.Add(8482, "trade");
+ _entityValue.Add("alefsym", 8501); // alef symbol = first transfinite cardinal, U+2135 NEW
+ _entityName.Add(8501, "alefsym");
+ _entityValue.Add("larr", 8592); // leftwards arrow, U+2190 ISOnum
+ _entityName.Add(8592, "larr");
+ _entityValue.Add("uarr", 8593); // upwards arrow, U+2191 ISOnum
+ _entityName.Add(8593, "uarr");
+ _entityValue.Add("rarr", 8594); // rightwards arrow, U+2192 ISOnum
+ _entityName.Add(8594, "rarr");
+ _entityValue.Add("darr", 8595); // downwards arrow, U+2193 ISOnum
+ _entityName.Add(8595, "darr");
+ _entityValue.Add("harr", 8596); // left right arrow, U+2194 ISOamsa
+ _entityName.Add(8596, "harr");
+ _entityValue.Add("crarr", 8629); // downwards arrow with corner leftwards = carriage return, U+21B5 NEW
+ _entityName.Add(8629, "crarr");
+ _entityValue.Add("lArr", 8656); // leftwards double arrow, U+21D0 ISOtech
+ _entityName.Add(8656, "lArr");
+ _entityValue.Add("uArr", 8657); // upwards double arrow, U+21D1 ISOamsa
+ _entityName.Add(8657, "uArr");
+ _entityValue.Add("rArr", 8658); // rightwards double arrow, U+21D2 ISOtech
+ _entityName.Add(8658, "rArr");
+ _entityValue.Add("dArr", 8659); // downwards double arrow, U+21D3 ISOamsa
+ _entityName.Add(8659, "dArr");
+ _entityValue.Add("hArr", 8660); // left right double arrow, U+21D4 ISOamsa
+ _entityName.Add(8660, "hArr");
+ _entityValue.Add("forall", 8704); // for all, U+2200 ISOtech
+ _entityName.Add(8704, "forall");
+ _entityValue.Add("part", 8706); // partial differential, U+2202 ISOtech
+ _entityName.Add(8706, "part");
+ _entityValue.Add("exist", 8707); // there exists, U+2203 ISOtech
+ _entityName.Add(8707, "exist");
+ _entityValue.Add("empty", 8709); // empty set = null set = diameter, U+2205 ISOamso
+ _entityName.Add(8709, "empty");
+ _entityValue.Add("nabla", 8711); // nabla = backward difference, U+2207 ISOtech
+ _entityName.Add(8711, "nabla");
+ _entityValue.Add("isin", 8712); // element of, U+2208 ISOtech
+ _entityName.Add(8712, "isin");
+ _entityValue.Add("notin", 8713); // not an element of, U+2209 ISOtech
+ _entityName.Add(8713, "notin");
+ _entityValue.Add("ni", 8715); // contains as member, U+220B ISOtech
+ _entityName.Add(8715, "ni");
+ _entityValue.Add("prod", 8719); // n-ary product = product sign, U+220F ISOamsb
+ _entityName.Add(8719, "prod");
+ _entityValue.Add("sum", 8721); // n-ary sumation, U+2211 ISOamsb
+ _entityName.Add(8721, "sum");
+ _entityValue.Add("minus", 8722); // minus sign, U+2212 ISOtech
+ _entityName.Add(8722, "minus");
+ _entityValue.Add("lowast", 8727); // asterisk operator, U+2217 ISOtech
+ _entityName.Add(8727, "lowast");
+ _entityValue.Add("radic", 8730); // square root = radical sign, U+221A ISOtech
+ _entityName.Add(8730, "radic");
+ _entityValue.Add("prop", 8733); // proportional to, U+221D ISOtech
+ _entityName.Add(8733, "prop");
+ _entityValue.Add("infin", 8734); // infinity, U+221E ISOtech
+ _entityName.Add(8734, "infin");
+ _entityValue.Add("ang", 8736); // angle, U+2220 ISOamso
+ _entityName.Add(8736, "ang");
+ _entityValue.Add("and", 8743); // logical and = wedge, U+2227 ISOtech
+ _entityName.Add(8743, "and");
+ _entityValue.Add("or", 8744); // logical or = vee, U+2228 ISOtech
+ _entityName.Add(8744, "or");
+ _entityValue.Add("cap", 8745); // intersection = cap, U+2229 ISOtech
+ _entityName.Add(8745, "cap");
+ _entityValue.Add("cup", 8746); // union = cup, U+222A ISOtech
+ _entityName.Add(8746, "cup");
+ _entityValue.Add("int", 8747); // integral, U+222B ISOtech
+ _entityName.Add(8747, "int");
+ _entityValue.Add("there4", 8756); // therefore, U+2234 ISOtech
+ _entityName.Add(8756, "there4");
+ _entityValue.Add("sim", 8764); // tilde operator = varies with = similar to, U+223C ISOtech
+ _entityName.Add(8764, "sim");
+ _entityValue.Add("cong", 8773); // approximately equal to, U+2245 ISOtech
+ _entityName.Add(8773, "cong");
+ _entityValue.Add("asymp", 8776); // almost equal to = asymptotic to, U+2248 ISOamsr
+ _entityName.Add(8776, "asymp");
+ _entityValue.Add("ne", 8800); // not equal to, U+2260 ISOtech
+ _entityName.Add(8800, "ne");
+ _entityValue.Add("equiv", 8801); // identical to, U+2261 ISOtech
+ _entityName.Add(8801, "equiv");
+ _entityValue.Add("le", 8804); // less-than or equal to, U+2264 ISOtech
+ _entityName.Add(8804, "le");
+ _entityValue.Add("ge", 8805); // greater-than or equal to, U+2265 ISOtech
+ _entityName.Add(8805, "ge");
+ _entityValue.Add("sub", 8834); // subset of, U+2282 ISOtech
+ _entityName.Add(8834, "sub");
+ _entityValue.Add("sup", 8835); // superset of, U+2283 ISOtech
+ _entityName.Add(8835, "sup");
+ _entityValue.Add("nsub", 8836); // not a subset of, U+2284 ISOamsn
+ _entityName.Add(8836, "nsub");
+ _entityValue.Add("sube", 8838); // subset of or equal to, U+2286 ISOtech
+ _entityName.Add(8838, "sube");
+ _entityValue.Add("supe", 8839); // superset of or equal to, U+2287 ISOtech
+ _entityName.Add(8839, "supe");
+ _entityValue.Add("oplus", 8853); // circled plus = direct sum, U+2295 ISOamsb
+ _entityName.Add(8853, "oplus");
+ _entityValue.Add("otimes", 8855); // circled times = vector product, U+2297 ISOamsb
+ _entityName.Add(8855, "otimes");
+ _entityValue.Add("perp", 8869); // up tack = orthogonal to = perpendicular, U+22A5 ISOtech
+ _entityName.Add(8869, "perp");
+ _entityValue.Add("sdot", 8901); // dot operator, U+22C5 ISOamsb
+ _entityName.Add(8901, "sdot");
+ _entityValue.Add("lceil", 8968); // left ceiling = apl upstile, U+2308 ISOamsc
+ _entityName.Add(8968, "lceil");
+ _entityValue.Add("rceil", 8969); // right ceiling, U+2309 ISOamsc
+ _entityName.Add(8969, "rceil");
+ _entityValue.Add("lfloor", 8970); // left floor = apl downstile, U+230A ISOamsc
+ _entityName.Add(8970, "lfloor");
+ _entityValue.Add("rfloor", 8971); // right floor, U+230B ISOamsc
+ _entityName.Add(8971, "rfloor");
+ _entityValue.Add("lang", 9001); // left-pointing angle bracket = bra, U+2329 ISOtech
+ _entityName.Add(9001, "lang");
+ _entityValue.Add("rang", 9002); // right-pointing angle bracket = ket, U+232A ISOtech
+ _entityName.Add(9002, "rang");
+ _entityValue.Add("loz", 9674); // lozenge, U+25CA ISOpub
+ _entityName.Add(9674, "loz");
+ _entityValue.Add("spades", 9824); // black spade suit, U+2660 ISOpub
+ _entityName.Add(9824, "spades");
+ _entityValue.Add("clubs", 9827); // black club suit = shamrock, U+2663 ISOpub
+ _entityName.Add(9827, "clubs");
+ _entityValue.Add("hearts", 9829); // black heart suit = valentine, U+2665 ISOpub
+ _entityName.Add(9829, "hearts");
+ _entityValue.Add("diams", 9830); // black diamond suit, U+2666 ISOpub
+ _entityName.Add(9830, "diams");
+ _entityValue.Add("quot", 34); // quotation mark = APL quote, U+0022 ISOnum
+ _entityName.Add(34, "quot");
+ _entityValue.Add("amp", 38); // ampersand, U+0026 ISOnum
+ _entityName.Add(38, "amp");
+ _entityValue.Add("lt", 60); // less-than sign, U+003C ISOnum
+ _entityName.Add(60, "lt");
+ _entityValue.Add("gt", 62); // greater-than sign, U+003E ISOnum
+ _entityName.Add(62, "gt");
+ _entityValue.Add("OElig", 338); // latin capital ligature OE, U+0152 ISOlat2
+ _entityName.Add(338, "OElig");
+ _entityValue.Add("oelig", 339); // latin small ligature oe, U+0153 ISOlat2
+ _entityName.Add(339, "oelig");
+ _entityValue.Add("Scaron", 352); // latin capital letter S with caron, U+0160 ISOlat2
+ _entityName.Add(352, "Scaron");
+ _entityValue.Add("scaron", 353); // latin small letter s with caron, U+0161 ISOlat2
+ _entityName.Add(353, "scaron");
+ _entityValue.Add("Yuml", 376); // latin capital letter Y with diaeresis, U+0178 ISOlat2
+ _entityName.Add(376, "Yuml");
+ _entityValue.Add("circ", 710); // modifier letter circumflex accent, U+02C6 ISOpub
+ _entityName.Add(710, "circ");
+ _entityValue.Add("tilde", 732); // small tilde, U+02DC ISOdia
+ _entityName.Add(732, "tilde");
+ _entityValue.Add("ensp", 8194); // en space, U+2002 ISOpub
+ _entityName.Add(8194, "ensp");
+ _entityValue.Add("emsp", 8195); // em space, U+2003 ISOpub
+ _entityName.Add(8195, "emsp");
+ _entityValue.Add("thinsp", 8201); // thin space, U+2009 ISOpub
+ _entityName.Add(8201, "thinsp");
+ _entityValue.Add("zwnj", 8204); // zero width non-joiner, U+200C NEW RFC 2070
+ _entityName.Add(8204, "zwnj");
+ _entityValue.Add("zwj", 8205); // zero width joiner, U+200D NEW RFC 2070
+ _entityName.Add(8205, "zwj");
+ _entityValue.Add("lrm", 8206); // left-to-right mark, U+200E NEW RFC 2070
+ _entityName.Add(8206, "lrm");
+ _entityValue.Add("rlm", 8207); // right-to-left mark, U+200F NEW RFC 2070
+ _entityName.Add(8207, "rlm");
+ _entityValue.Add("ndash", 8211); // en dash, U+2013 ISOpub
+ _entityName.Add(8211, "ndash");
+ _entityValue.Add("mdash", 8212); // em dash, U+2014 ISOpub
+ _entityName.Add(8212, "mdash");
+ _entityValue.Add("lsquo", 8216); // left single quotation mark, U+2018 ISOnum
+ _entityName.Add(8216, "lsquo");
+ _entityValue.Add("rsquo", 8217); // right single quotation mark, U+2019 ISOnum
+ _entityName.Add(8217, "rsquo");
+ _entityValue.Add("sbquo", 8218); // single low-9 quotation mark, U+201A NEW
+ _entityName.Add(8218, "sbquo");
+ _entityValue.Add("ldquo", 8220); // left double quotation mark, U+201C ISOnum
+ _entityName.Add(8220, "ldquo");
+ _entityValue.Add("rdquo", 8221); // right double quotation mark, U+201D ISOnum
+ _entityName.Add(8221, "rdquo");
+ _entityValue.Add("bdquo", 8222); // double low-9 quotation mark, U+201E NEW
+ _entityName.Add(8222, "bdquo");
+ _entityValue.Add("dagger", 8224); // dagger, U+2020 ISOpub
+ _entityName.Add(8224, "dagger");
+ _entityValue.Add("Dagger", 8225); // double dagger, U+2021 ISOpub
+ _entityName.Add(8225, "Dagger");
+ _entityValue.Add("permil", 8240); // per mille sign, U+2030 ISOtech
+ _entityName.Add(8240, "permil");
+ _entityValue.Add("lsaquo", 8249); // single left-pointing angle quotation mark, U+2039 ISO proposed
+ _entityName.Add(8249, "lsaquo");
+ _entityValue.Add("rsaquo", 8250); // single right-pointing angle quotation mark, U+203A ISO proposed
+ _entityName.Add(8250, "rsaquo");
+ _entityValue.Add("euro", 8364); // euro sign, U+20AC NEW
+ _entityName.Add(8364, "euro");
+
+ _maxEntitySize = 8 + 1; // we add the # char
+
+ #endregion
+ }
+
+ private HtmlEntity()
+ {
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Replace known entities by characters.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <returns>The result text.</returns>
+ public static string DeEntitize(string text)
+ {
+ if (text == null)
+ return null;
+
+ if (text.Length == 0)
+ return text;
+
+ StringBuilder sb = new StringBuilder(text.Length);
+ ParseState state = ParseState.Text;
+ StringBuilder entity = new StringBuilder(10);
+
+ for (int i = 0; i < text.Length; i++)
+ {
+ switch (state)
+ {
+ case ParseState.Text:
+ switch (text[i])
+ {
+ case '&':
+ state = ParseState.EntityStart;
+ break;
+
+ default:
+ sb.Append(text[i]);
+ break;
+ }
+ break;
+
+ case ParseState.EntityStart:
+ switch (text[i])
+ {
+ case ';':
+ if (entity.Length == 0)
+ {
+ sb.Append("&;");
+ }
+ else
+ {
+ if (entity[0] == '#')
+ {
+ string e = entity.ToString();
+ try
+ {
+ int code = Convert.ToInt32(e.Substring(1, e.Length - 1));
+ sb.Append(Convert.ToChar(code));
+ }
+ catch
+ {
+ sb.Append("&#" + e + ";");
+ }
+ }
+ else
+ {
+ // named entity?
+ int code;
+ object o = _entityValue[entity.ToString()];
+ if (o == null)
+ {
+ // nope
+ sb.Append("&" + entity + ";");
+ }
+ else
+ {
+ // we found one
+ code = (int) o;
+ sb.Append(Convert.ToChar(code));
+ }
+ }
+ entity.Remove(0, entity.Length);
+ }
+ state = ParseState.Text;
+ break;
+
+ case '&':
+ // new entity start without end, it was not an entity...
+ sb.Append("&" + entity);
+ entity.Remove(0, entity.Length);
+ break;
+
+ default:
+ entity.Append(text[i]);
+ if (entity.Length > _maxEntitySize)
+ {
+ // unknown stuff, just don't touch it
+ state = ParseState.Text;
+ sb.Append("&" + entity);
+ entity.Remove(0, entity.Length);
+ }
+ break;
+ }
+ break;
+ }
+ }
+
+ // finish the work
+ if (state == ParseState.EntityStart)
+ {
+ sb.Append("&" + entity);
+ }
+ return sb.ToString();
+ }
+
+ /// <summary>
+ /// Clone and entitize an HtmlNode. This will affect attribute values and nodes' text. It will also entitize all child nodes.
+ /// </summary>
+ /// <param name="node">The node to entitize.</param>
+ /// <returns>An entitized cloned node.</returns>
+ public static HtmlNode Entitize(HtmlNode node)
+ {
+ if (node == null)
+ {
+ throw new ArgumentNullException("node");
+ }
+ HtmlNode result = node.CloneNode(true);
+ if (result.HasAttributes)
+ Entitize(result.Attributes);
+
+ if (result.HasChildNodes)
+ {
+ Entitize(result.ChildNodes);
+ }
+ else
+ {
+ if (result.NodeType == HtmlNodeType.Text)
+ {
+ ((HtmlTextNode) result).Text = Entitize(((HtmlTextNode) result).Text, true, true);
+ }
+ }
+ return result;
+ }
+
+
+ /// <summary>
+ /// Replace characters above 127 by entities.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <returns>The result text.</returns>
+ public static string Entitize(string text)
+ {
+ return Entitize(text, true);
+ }
+
+ /// <summary>
+ /// Replace characters above 127 by entities.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <param name="useNames">If set to false, the function will not use known entities name. Default is true.</param>
+ /// <returns>The result text.</returns>
+ public static string Entitize(string text, bool useNames)
+ {
+ return Entitize(text, useNames, false);
+ }
+
+ /// <summary>
+ /// Replace characters above 127 by entities.
+ /// </summary>
+ /// <param name="text">The source text.</param>
+ /// <param name="useNames">If set to false, the function will not use known entities name. Default is true.</param>
+ /// <param name="entitizeQuotAmpAndLtGt">If set to true, the [quote], [ampersand], [lower than] and [greather than] characters will be entitized.</param>
+ /// <returns>The result text</returns>
+ public static string Entitize(string text, bool useNames, bool entitizeQuotAmpAndLtGt)
+// _entityValue.Add("quot", 34); // quotation mark = APL quote, U+0022 ISOnum
+// _entityName.Add(34, "quot");
+// _entityValue.Add("amp", 38); // ampersand, U+0026 ISOnum
+// _entityName.Add(38, "amp");
+// _entityValue.Add("lt", 60); // less-than sign, U+003C ISOnum
+// _entityName.Add(60, "lt");
+// _entityValue.Add("gt", 62); // greater-than sign, U+003E ISOnum
+// _entityName.Add(62, "gt");
+ {
+ if (text == null)
+ return null;
+
+ if (text.Length == 0)
+ return text;
+
+ StringBuilder sb = new StringBuilder(text.Length);
+ for (int i = 0; i < text.Length; i++)
+ {
+ int code = text[i];
+ if ((code > 127) ||
+ (entitizeQuotAmpAndLtGt && ((code == 34) || (code == 38) || (code == 60) || (code == 62))))
+ {
+ string entity = _entityName[code] as string;
+ if ((entity == null) || (!useNames))
+ {
+ sb.Append("&#" + code + ";");
+ }
+ else
+ {
+ sb.Append("&" + entity + ";");
+ }
+ }
+ else
+ {
+ sb.Append(text[i]);
+ }
+ }
+
+ return sb.ToString();
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static void Entitize(HtmlAttributeCollection collection)
+ {
+ foreach (HtmlAttribute at in collection)
+ {
+ at.Value = Entitize(at.Value);
+ }
+ }
+
+ private static void Entitize(HtmlNodeCollection collection)
+ {
+ foreach (HtmlNode node in collection)
+ {
+ if (node.HasAttributes)
+ Entitize(node.Attributes);
+
+ if (node.HasChildNodes)
+ {
+ Entitize(node.ChildNodes);
+ }
+ else
+ {
+ if (node.NodeType == HtmlNodeType.Text)
+ {
+ ((HtmlTextNode) node).Text = Entitize(((HtmlTextNode) node).Text, true, true);
+ }
+ }
+ }
+ }
+
+ #endregion
+
+ #region Nested type: ParseState
+
+ private enum ParseState
+ {
+ Text,
+ EntityStart
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlNameTable.cs b/docs/HtmlAgilityPack/HtmlNameTable.cs
new file mode 100644
index 00000000000..2b9ffd3cb62
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlNameTable.cs
@@ -0,0 +1,52 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System.Xml;
+
+namespace HtmlAgilityPack
+{
+ internal class HtmlNameTable : XmlNameTable
+ {
+ #region Fields
+
+ private NameTable _nametable = new NameTable();
+
+ #endregion
+
+ #region Public Methods
+
+ public override string Add(string array)
+ {
+ return _nametable.Add(array);
+ }
+
+ public override string Add(char[] array, int offset, int length)
+ {
+ return _nametable.Add(array, offset, length);
+ }
+
+ public override string Get(string array)
+ {
+ return _nametable.Get(array);
+ }
+
+ public override string Get(char[] array, int offset, int length)
+ {
+ return _nametable.Get(array, offset, length);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal string GetOrAdd(string array)
+ {
+ string s = Get(array);
+ if (s == null)
+ {
+ return Add(array);
+ }
+ return s;
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlNode.cs b/docs/HtmlAgilityPack/HtmlNode.cs
new file mode 100644
index 00000000000..ecc915e13df
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlNode.cs
@@ -0,0 +1,1996 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML node.
+ /// </summary>
+ [DebuggerDisplay("Name: {OriginalName}}")]
+ public class HtmlNode : IXPathNavigable
+ {
+ #region Fields
+
+ internal HtmlAttributeCollection _attributes;
+ internal HtmlNodeCollection _childnodes;
+ internal HtmlNode _endnode;
+
+ internal bool _innerchanged;
+ internal string _innerhtml;
+ internal int _innerlength;
+ internal int _innerstartindex;
+ internal int _line;
+ internal int _lineposition;
+ private string _name;
+ internal int _namelength;
+ internal int _namestartindex;
+ internal HtmlNode _nextnode;
+ internal HtmlNodeType _nodetype;
+ internal bool _outerchanged;
+ internal string _outerhtml;
+ internal int _outerlength;
+ internal int _outerstartindex;
+ internal HtmlDocument _ownerdocument;
+ internal HtmlNode _parentnode;
+ internal HtmlNode _prevnode;
+ internal HtmlNode _prevwithsamename;
+ internal bool _starttag;
+ internal int _streamposition;
+
+ #endregion
+
+ #region Static Members
+
+ /// <summary>
+ /// Gets the name of a comment node. It is actually defined as '#comment'.
+ /// </summary>
+ public static readonly string HtmlNodeTypeNameComment = "#comment";
+
+ /// <summary>
+ /// Gets the name of the document node. It is actually defined as '#document'.
+ /// </summary>
+ public static readonly string HtmlNodeTypeNameDocument = "#document";
+
+ /// <summary>
+ /// Gets the name of a text node. It is actually defined as '#text'.
+ /// </summary>
+ public static readonly string HtmlNodeTypeNameText = "#text";
+
+ /// <summary>
+ /// Gets a collection of flags that define specific behaviors for specific element nodes.
+ /// The table contains a DictionaryEntry list with the lowercase tag name as the Key, and a combination of HtmlElementFlags as the Value.
+ /// </summary>
+ public static Hashtable ElementsFlags;
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initialize HtmlNode. Builds a list of all tags that have special allowances
+ /// </summary>
+ static HtmlNode()
+ {
+ // tags whose content may be anything
+ ElementsFlags = new Hashtable();
+ ElementsFlags.Add("script", HtmlElementFlag.CData);
+ ElementsFlags.Add("style", HtmlElementFlag.CData);
+ ElementsFlags.Add("noxhtml", HtmlElementFlag.CData);
+
+ // tags that can not contain other tags
+ ElementsFlags.Add("base", HtmlElementFlag.Empty);
+ ElementsFlags.Add("link", HtmlElementFlag.Empty);
+ ElementsFlags.Add("meta", HtmlElementFlag.Empty);
+ ElementsFlags.Add("isindex", HtmlElementFlag.Empty);
+ ElementsFlags.Add("hr", HtmlElementFlag.Empty);
+ ElementsFlags.Add("col", HtmlElementFlag.Empty);
+ ElementsFlags.Add("img", HtmlElementFlag.Empty);
+ ElementsFlags.Add("param", HtmlElementFlag.Empty);
+ ElementsFlags.Add("embed", HtmlElementFlag.Empty);
+ ElementsFlags.Add("frame", HtmlElementFlag.Empty);
+ ElementsFlags.Add("wbr", HtmlElementFlag.Empty);
+ ElementsFlags.Add("bgsound", HtmlElementFlag.Empty);
+ ElementsFlags.Add("spacer", HtmlElementFlag.Empty);
+ ElementsFlags.Add("keygen", HtmlElementFlag.Empty);
+ ElementsFlags.Add("area", HtmlElementFlag.Empty);
+ ElementsFlags.Add("input", HtmlElementFlag.Empty);
+ ElementsFlags.Add("basefont", HtmlElementFlag.Empty);
+
+ ElementsFlags.Add("form", HtmlElementFlag.CanOverlap | HtmlElementFlag.Empty);
+
+ // they sometimes contain, and sometimes they don 't...
+ ElementsFlags.Add("option", HtmlElementFlag.Empty);
+
+ // tag whose closing tag is equivalent to open tag:
+ // <p>bla</p>bla will be transformed into <p>bla</p>bla
+ // <p>bla<p>bla will be transformed into <p>bla<p>bla and not <p>bla></p><p>bla</p> or <p>bla<p>bla</p></p>
+ //<br> see above
+ ElementsFlags.Add("br", HtmlElementFlag.Empty | HtmlElementFlag.Closed);
+ ElementsFlags.Add("p", HtmlElementFlag.Empty | HtmlElementFlag.Closed);
+ }
+
+ /// <summary>
+ /// Initializes HtmlNode, providing type, owner and where it exists in a collection
+ /// </summary>
+ /// <param name="type"></param>
+ /// <param name="ownerdocument"></param>
+ /// <param name="index"></param>
+ public HtmlNode(HtmlNodeType type, HtmlDocument ownerdocument, int index)
+ {
+ _nodetype = type;
+ _ownerdocument = ownerdocument;
+ _outerstartindex = index;
+
+ switch (type)
+ {
+ case HtmlNodeType.Comment:
+ Name = HtmlNodeTypeNameComment;
+ _endnode = this;
+ break;
+
+ case HtmlNodeType.Document:
+ Name = HtmlNodeTypeNameDocument;
+ _endnode = this;
+ break;
+
+ case HtmlNodeType.Text:
+ Name = HtmlNodeTypeNameText;
+ _endnode = this;
+ break;
+ }
+
+ if (_ownerdocument._openednodes != null)
+ {
+ if (!Closed)
+ {
+ // we use the index as the key
+
+ // -1 means the node comes from public
+ if (-1 != index)
+ {
+ _ownerdocument._openednodes.Add(index, this);
+ }
+ }
+ }
+
+ if ((-1 != index) || (type == HtmlNodeType.Comment) || (type == HtmlNodeType.Text)) return;
+ // innerhtml and outerhtml must be calculated
+ _outerchanged = true;
+ _innerchanged = true;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the collection of HTML attributes for this node. May not be null.
+ /// </summary>
+ public HtmlAttributeCollection Attributes
+ {
+ get
+ {
+ if (!HasAttributes)
+ {
+ _attributes = new HtmlAttributeCollection(this);
+ }
+ return _attributes;
+ }
+ internal set { _attributes = value; }
+ }
+
+ /// <summary>
+ /// Gets all the children of the node.
+ /// </summary>
+ public HtmlNodeCollection ChildNodes
+ {
+ get
+ {
+ if (_childnodes == null)
+ {
+ _childnodes = new HtmlNodeCollection(this);
+ }
+ return _childnodes;
+ }
+ internal set { _childnodes = value; }
+ }
+
+ /// <summary>
+ /// Gets a value indicating if this node has been closed or not.
+ /// </summary>
+ public bool Closed
+ {
+ get { return (_endnode != null); }
+ }
+
+ /// <summary>
+ /// Gets the collection of HTML attributes for the closing tag. May not be null.
+ /// </summary>
+ public HtmlAttributeCollection ClosingAttributes
+ {
+ get
+ {
+ if (!HasClosingAttributes)
+ {
+ return new HtmlAttributeCollection(this);
+ }
+ return _endnode.Attributes;
+ }
+ }
+
+ internal HtmlNode EndNode
+ {
+ get { return _endnode; }
+ }
+
+ /// <summary>
+ /// Gets the first child of the node.
+ /// </summary>
+ public HtmlNode FirstChild
+ {
+ get
+ {
+ if (!HasChildNodes)
+ {
+ return null;
+ }
+ return _childnodes[0];
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has any attributes.
+ /// </summary>
+ public bool HasAttributes
+ {
+ get
+ {
+ if (_attributes == null)
+ {
+ return false;
+ }
+
+ if (_attributes.Count <= 0)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether this node has any child nodes.
+ /// </summary>
+ public bool HasChildNodes
+ {
+ get
+ {
+ if (_childnodes == null)
+ {
+ return false;
+ }
+
+ if (_childnodes.Count <= 0)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has any attributes on the closing tag.
+ /// </summary>
+ public bool HasClosingAttributes
+ {
+ get
+ {
+ if ((_endnode == null) || (_endnode == this))
+ {
+ return false;
+ }
+
+ if (_endnode._attributes == null)
+ {
+ return false;
+ }
+
+ if (_endnode._attributes.Count <= 0)
+ {
+ return false;
+ }
+ return true;
+ }
+ }
+
+ /// <summary>
+ /// Gets or sets the value of the 'id' HTML attribute. The document must have been parsed using the OptionUseIdAttribute set to true.
+ /// </summary>
+ public string Id
+ {
+ get
+ {
+ if (_ownerdocument._nodesid == null)
+ {
+ throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
+ }
+ return GetId();
+ }
+ set
+ {
+ if (_ownerdocument._nodesid == null)
+ {
+ throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
+ }
+
+ if (value == null)
+ {
+ throw new ArgumentNullException("value");
+ }
+ SetId(value);
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the HTML between the start and end tags of the object.
+ /// </summary>
+ public virtual string InnerHtml
+ {
+ get
+ {
+ if (_innerchanged)
+ {
+ _innerhtml = WriteContentTo();
+ _innerchanged = false;
+ return _innerhtml;
+ }
+ if (_innerhtml != null)
+ {
+ return _innerhtml;
+ }
+
+ if (_innerstartindex < 0)
+ {
+ return string.Empty;
+ }
+
+ return _ownerdocument._text.Substring(_innerstartindex, _innerlength);
+ }
+ set
+ {
+ HtmlDocument doc = new HtmlDocument();
+ doc.LoadHtml(value);
+
+ RemoveAllChildren();
+ AppendChildren(doc.DocumentNode.ChildNodes);
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the text between the start and end tags of the object.
+ /// </summary>
+ public virtual string InnerText
+ {
+ get
+ {
+ if (_nodetype == HtmlNodeType.Text)
+ {
+ return ((HtmlTextNode) this).Text;
+ }
+
+ if (_nodetype == HtmlNodeType.Comment)
+ {
+ return ((HtmlCommentNode) this).Comment;
+ }
+
+ // note: right now, this method is *slow*, because we recompute everything.
+ // it could be optimised like innerhtml
+ if (!HasChildNodes)
+ {
+ return string.Empty;
+ }
+
+ string s = null;
+ foreach (HtmlNode node in ChildNodes)
+ {
+ s += node.InnerText;
+ }
+ return s;
+ }
+ }
+
+ /// <summary>
+ /// Gets the last child of the node.
+ /// </summary>
+ public HtmlNode LastChild
+ {
+ get
+ {
+ return !HasChildNodes ? null : _childnodes[_childnodes.Count - 1];
+ }
+ }
+
+ /// <summary>
+ /// Gets the line number of this node in the document.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ internal set { _line = value; }
+ }
+
+ /// <summary>
+ /// Gets the column number of this node in the document.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _lineposition; }
+ internal set { _lineposition = value; }
+ }
+
+ /// <summary>
+ /// Gets or sets this node's name.
+ /// </summary>
+ public string Name
+ {
+ get
+ {
+ if (_name == null)
+ {
+ Name = _ownerdocument._text.Substring(_namestartindex, _namelength);
+ }
+ return _name != null ? _name.ToLower() : string.Empty;
+ }
+ set { _name = value; }
+ }
+
+ /// <summary>
+ /// Gets the HTML node immediately following this element.
+ /// </summary>
+ public HtmlNode NextSibling
+ {
+ get { return _nextnode; }
+ internal set { _nextnode = value; }
+ }
+
+ /// <summary>
+ /// Gets the type of this node.
+ /// </summary>
+ public HtmlNodeType NodeType
+ {
+ get { return _nodetype; }
+ internal set { _nodetype = value; }
+ }
+
+ /// <summary>
+ /// The original unaltered name of the tag
+ /// </summary>
+ public string OriginalName
+ {
+ get { return _name; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the object and its content in HTML.
+ /// </summary>
+ public virtual string OuterHtml
+ {
+ get
+ {
+ if (_outerchanged)
+ {
+ _outerhtml = WriteTo();
+ _outerchanged = false;
+ return _outerhtml;
+ }
+
+ if (_outerhtml != null)
+ {
+ return _outerhtml;
+ }
+
+ if (_outerstartindex < 0)
+ {
+ return string.Empty;
+ }
+
+ return _ownerdocument._text.Substring(_outerstartindex, _outerlength);
+ }
+ }
+
+ /// <summary>
+ /// Gets the <see cref="HtmlDocument"/> to which this node belongs.
+ /// </summary>
+ public HtmlDocument OwnerDocument
+ {
+ get { return _ownerdocument; }
+ internal set { _ownerdocument = value; }
+ }
+
+ /// <summary>
+ /// Gets the parent of this node (for nodes that can have parents).
+ /// </summary>
+ public HtmlNode ParentNode
+ {
+ get { return _parentnode; }
+ internal set { _parentnode = value; }
+ }
+
+ /// <summary>
+ /// Gets the node immediately preceding this node.
+ /// </summary>
+ public HtmlNode PreviousSibling
+ {
+ get { return _prevnode; }
+ internal set { _prevnode = value; }
+ }
+
+ /// <summary>
+ /// Gets the stream position of this node in the document, relative to the start of the document.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return _streamposition; }
+ }
+
+ /// <summary>
+ /// Gets a valid XPath string that points to this node
+ /// </summary>
+ public string XPath
+ {
+ get
+ {
+ string basePath = (ParentNode == null || ParentNode.NodeType == HtmlNodeType.Document)
+ ? "/"
+ : ParentNode.XPath + "/";
+ return basePath + GetRelativeXpath();
+ }
+ }
+
+ #endregion
+
+ #region IXPathNavigable Members
+
+ /// <summary>
+ /// Creates a new XPathNavigator object for navigating this HTML node.
+ /// </summary>
+ /// <returns>An XPathNavigator object. The XPathNavigator is positioned on the node from which the method was called. It is not positioned on the root of the document.</returns>
+ public XPathNavigator CreateNavigator()
+ {
+ return new HtmlNodeNavigator(_ownerdocument, this);
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Determines if an element node can be kept overlapped.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be <c>null</c>.</param>
+ /// <returns>true if the name is the name of an element node that can be kept overlapped, <c>false</c> otherwise.</returns>
+ public static bool CanOverlapElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.CanOverlap) != 0;
+ }
+
+ /// <summary>
+ /// Creates an HTML node from a string representing literal HTML.
+ /// </summary>
+ /// <param name="html">The HTML text.</param>
+ /// <returns>The newly created node instance.</returns>
+ public static HtmlNode CreateNode(string html)
+ {
+ // REVIEW: this is *not* optimum...
+ HtmlDocument doc = new HtmlDocument();
+ doc.LoadHtml(html);
+ return doc.DocumentNode.FirstChild;
+ }
+
+ /// <summary>
+ /// Determines if an element node is a CDATA element node.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be null.</param>
+ /// <returns>true if the name is the name of a CDATA element node, false otherwise.</returns>
+ public static bool IsCDataElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.CData) != 0;
+ }
+
+ /// <summary>
+ /// Determines if an element node is closed.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be null.</param>
+ /// <returns>true if the name is the name of a closed element node, false otherwise.</returns>
+ public static bool IsClosedElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.Closed) != 0;
+ }
+
+ /// <summary>
+ /// Determines if an element node is defined as empty.
+ /// </summary>
+ /// <param name="name">The name of the element node to check. May not be null.</param>
+ /// <returns>true if the name is the name of an empty element node, false otherwise.</returns>
+ public static bool IsEmptyElement(string name)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (name.Length == 0)
+ {
+ return true;
+ }
+
+ // <!DOCTYPE ...
+ if ('!' == name[0])
+ {
+ return true;
+ }
+
+ // <?xml ...
+ if ('?' == name[0])
+ {
+ return true;
+ }
+
+ object flag = ElementsFlags[name.ToLower()];
+ if (flag == null)
+ {
+ return false;
+ }
+ return (((HtmlElementFlag) flag) & HtmlElementFlag.Empty) != 0;
+ }
+
+ /// <summary>
+ /// Determines if a text corresponds to the closing tag of an node that can be kept overlapped.
+ /// </summary>
+ /// <param name="text">The text to check. May not be null.</param>
+ /// <returns>true or false.</returns>
+ public static bool IsOverlappedClosingElement(string text)
+ {
+ if (text == null)
+ {
+ throw new ArgumentNullException("text");
+ }
+ // min is </x>: 4
+ if (text.Length <= 4)
+ return false;
+
+ if ((text[0] != '<') ||
+ (text[text.Length - 1] != '>') ||
+ (text[1] != '/'))
+ return false;
+
+ string name = text.Substring(2, text.Length - 3);
+ return CanOverlapElement(name);
+ }
+
+ /// <summary>
+ /// Returns a collection of all ancestor nodes of this element.
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Ancestors()
+ {
+ HtmlNode node = ParentNode;
+ while (node.ParentNode != null)
+ {
+ yield return node.ParentNode;
+ node = node.ParentNode;
+ }
+ }
+
+ /// <summary>
+ /// Get Ancestors with matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Ancestors(string name)
+ {
+ for (HtmlNode n = ParentNode; n != null; n = n.ParentNode)
+ if (n.Name == name)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Returns a collection of all ancestor nodes of this element.
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> AncestorsAndSelf()
+ {
+ for (HtmlNode n = this; n != null; n = n.ParentNode)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Gets all anscestor nodes and the current node
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> AncestorsAndSelf(string name)
+ {
+ for (HtmlNode n = this; n != null; n = n.ParentNode)
+ if (n.Name == name)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Adds the specified node to the end of the list of children of this node.
+ /// </summary>
+ /// <param name="newChild">The node to add. May not be null.</param>
+ /// <returns>The node added.</returns>
+ public HtmlNode AppendChild(HtmlNode newChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+
+ ChildNodes.Append(newChild);
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Adds the specified node to the end of the list of children of this node.
+ /// </summary>
+ /// <param name="newChildren">The node list to add. May not be null.</param>
+ public void AppendChildren(HtmlNodeCollection newChildren)
+ {
+ if (newChildren == null)
+ throw new ArgumentNullException("newChildrend");
+
+ foreach (HtmlNode newChild in newChildren)
+ {
+ AppendChild(newChild);
+ }
+ }
+
+ /// <summary>
+ /// Gets all Attributes with name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlAttribute> ChildAttributes(string name)
+ {
+ return Attributes.AttributesWithName(name);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node
+ /// </summary>
+ /// <returns></returns>
+ public HtmlNode Clone()
+ {
+ return CloneNode(true);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node and changes its name at the same time.
+ /// </summary>
+ /// <param name="newName">The new name of the cloned node. May not be <c>null</c>.</param>
+ /// <returns>The cloned node.</returns>
+ public HtmlNode CloneNode(string newName)
+ {
+ return CloneNode(newName, true);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node and changes its name at the same time.
+ /// </summary>
+ /// <param name="newName">The new name of the cloned node. May not be null.</param>
+ /// <param name="deep">true to recursively clone the subtree under the specified node; false to clone only the node itself.</param>
+ /// <returns>The cloned node.</returns>
+ public HtmlNode CloneNode(string newName, bool deep)
+ {
+ if (newName == null)
+ {
+ throw new ArgumentNullException("newName");
+ }
+
+ HtmlNode node = CloneNode(deep);
+ node.Name = newName;
+ return node;
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node.
+ /// </summary>
+ /// <param name="deep">true to recursively clone the subtree under the specified node; false to clone only the node itself.</param>
+ /// <returns>The cloned node.</returns>
+ public HtmlNode CloneNode(bool deep)
+ {
+ HtmlNode node = _ownerdocument.CreateNode(_nodetype);
+ node.Name = Name;
+
+ switch (_nodetype)
+ {
+ case HtmlNodeType.Comment:
+ ((HtmlCommentNode) node).Comment = ((HtmlCommentNode) this).Comment;
+ return node;
+
+ case HtmlNodeType.Text:
+ ((HtmlTextNode) node).Text = ((HtmlTextNode) this).Text;
+ return node;
+ }
+
+ // attributes
+ if (HasAttributes)
+ {
+ foreach (HtmlAttribute att in _attributes)
+ {
+ HtmlAttribute newatt = att.Clone();
+ node.Attributes.Append(newatt);
+ }
+ }
+
+ // closing attributes
+ if (HasClosingAttributes)
+ {
+ node._endnode = _endnode.CloneNode(false);
+ foreach (HtmlAttribute att in _endnode._attributes)
+ {
+ HtmlAttribute newatt = att.Clone();
+ node._endnode._attributes.Append(newatt);
+ }
+ }
+ if (!deep)
+ {
+ return node;
+ }
+
+ if (!HasChildNodes)
+ {
+ return node;
+ }
+
+ // child nodes
+ foreach (HtmlNode child in _childnodes)
+ {
+ HtmlNode newchild = child.Clone();
+ node.AppendChild(newchild);
+ }
+ return node;
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node and the subtree under it.
+ /// </summary>
+ /// <param name="node">The node to duplicate. May not be <c>null</c>.</param>
+ public void CopyFrom(HtmlNode node)
+ {
+ CopyFrom(node, true);
+ }
+
+ /// <summary>
+ /// Creates a duplicate of the node.
+ /// </summary>
+ /// <param name="node">The node to duplicate. May not be <c>null</c>.</param>
+ /// <param name="deep">true to recursively clone the subtree under the specified node, false to clone only the node itself.</param>
+ public void CopyFrom(HtmlNode node, bool deep)
+ {
+ if (node == null)
+ {
+ throw new ArgumentNullException("node");
+ }
+
+ Attributes.RemoveAll();
+ if (node.HasAttributes)
+ {
+ foreach (HtmlAttribute att in node.Attributes)
+ {
+ SetAttributeValue(att.Name, att.Value);
+ }
+ }
+
+ if (!deep)
+ {
+ RemoveAllChildren();
+ if (node.HasChildNodes)
+ {
+ foreach (HtmlNode child in node.ChildNodes)
+ {
+ AppendChild(child.CloneNode(true));
+ }
+ }
+ }
+ }
+
+ /// <summary>
+ /// Creates an XPathNavigator using the root of this document.
+ /// </summary>
+ /// <returns></returns>
+ public XPathNavigator CreateRootNavigator()
+ {
+ return new HtmlNodeNavigator(_ownerdocument, _ownerdocument.DocumentNode);
+ }
+
+ /// <summary>
+ /// Gets all Descendant nodes for this node and each of child nodes
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantNodes()
+ {
+ foreach (HtmlNode node in ChildNodes)
+ {
+ yield return node;
+ foreach (HtmlNode descendant in node.DescendantNodes())
+ yield return descendant;
+ }
+ }
+
+ /// <summary>
+ /// Returns a collection of all descendant nodes of this element, in document order
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantNodesAndSelf()
+ {
+ return DescendantsAndSelf();
+ }
+
+ /// <summary>
+ /// Gets all Descendant nodes in enumerated list
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants()
+ {
+ foreach (HtmlNode node in DescendantNodes())
+ {
+ yield return node;
+ }
+ }
+
+ /// <summary>
+ /// Get all descendant nodes with matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants(string name)
+ {
+ foreach (HtmlNode node in Descendants())
+ if (node.Name == name)
+ yield return node;
+ }
+
+ /// <summary>
+ /// Returns a collection of all descendant nodes of this element, in document order
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantsAndSelf()
+ {
+ yield return this;
+ foreach (HtmlNode n in DescendantNodes())
+ {
+ HtmlNode el = n;
+ if (el != null)
+ yield return el;
+ }
+ }
+
+ /// <summary>
+ /// Gets all descendant nodes including this node
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantsAndSelf(string name)
+ {
+ yield return this;
+ foreach (HtmlNode node in Descendants())
+ if (node.Name == name)
+ yield return node;
+ }
+
+ /// <summary>
+ /// Gets first generation child node matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public HtmlNode Element(string name)
+ {
+ foreach (HtmlNode node in ChildNodes)
+ if (node.Name == name)
+ return node;
+ return null;
+ }
+
+ /// <summary>
+ /// Gets matching first generation child nodes matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Elements(string name)
+ {
+ foreach (HtmlNode node in ChildNodes)
+ if (node.Name == name)
+ yield return node;
+ }
+
+ /// <summary>
+ /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
+ /// </summary>
+ /// <param name="name">The name of the attribute to get. May not be <c>null</c>.</param>
+ /// <param name="def">The default value to return if not found.</param>
+ /// <returns>The value of the attribute if found, the default value if not found.</returns>
+ public string GetAttributeValue(string name, string def)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (!HasAttributes)
+ {
+ return def;
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return def;
+ }
+ return att.Value;
+ }
+
+ /// <summary>
+ /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
+ /// </summary>
+ /// <param name="name">The name of the attribute to get. May not be <c>null</c>.</param>
+ /// <param name="def">The default value to return if not found.</param>
+ /// <returns>The value of the attribute if found, the default value if not found.</returns>
+ public int GetAttributeValue(string name, int def)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (!HasAttributes)
+ {
+ return def;
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return def;
+ }
+ try
+ {
+ return Convert.ToInt32(att.Value);
+ }
+ catch
+ {
+ return def;
+ }
+ }
+
+ /// <summary>
+ /// Helper method to get the value of an attribute of this node. If the attribute is not found, the default value will be returned.
+ /// </summary>
+ /// <param name="name">The name of the attribute to get. May not be <c>null</c>.</param>
+ /// <param name="def">The default value to return if not found.</param>
+ /// <returns>The value of the attribute if found, the default value if not found.</returns>
+ public bool GetAttributeValue(string name, bool def)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+
+ if (!HasAttributes)
+ {
+ return def;
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return def;
+ }
+ try
+ {
+ return Convert.ToBoolean(att.Value);
+ }
+ catch
+ {
+ return def;
+ }
+ }
+
+ /// <summary>
+ /// Inserts the specified node immediately after the specified reference node.
+ /// </summary>
+ /// <param name="newChild">The node to insert. May not be <c>null</c>.</param>
+ /// <param name="refChild">The node that is the reference node. The newNode is placed after the refNode.</param>
+ /// <returns>The node being inserted.</returns>
+ public HtmlNode InsertAfter(HtmlNode newChild, HtmlNode refChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+
+ if (refChild == null)
+ {
+ return PrependChild(newChild);
+ }
+
+ if (newChild == refChild)
+ {
+ return newChild;
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[refChild];
+ }
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null) _childnodes.Insert(index + 1, newChild);
+
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Inserts the specified node immediately before the specified reference node.
+ /// </summary>
+ /// <param name="newChild">The node to insert. May not be <c>null</c>.</param>
+ /// <param name="refChild">The node that is the reference node. The newChild is placed before this node.</param>
+ /// <returns>The node being inserted.</returns>
+ public HtmlNode InsertBefore(HtmlNode newChild, HtmlNode refChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+
+ if (refChild == null)
+ {
+ return AppendChild(newChild);
+ }
+
+ if (newChild == refChild)
+ {
+ return newChild;
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[refChild];
+ }
+
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null) _childnodes.Insert(index, newChild);
+
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Adds the specified node to the beginning of the list of children of this node.
+ /// </summary>
+ /// <param name="newChild">The node to add. May not be <c>null</c>.</param>
+ /// <returns>The node added.</returns>
+ public HtmlNode PrependChild(HtmlNode newChild)
+ {
+ if (newChild == null)
+ {
+ throw new ArgumentNullException("newChild");
+ }
+ ChildNodes.Prepend(newChild);
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Adds the specified node list to the beginning of the list of children of this node.
+ /// </summary>
+ /// <param name="newChildren">The node list to add. May not be <c>null</c>.</param>
+ public void PrependChildren(HtmlNodeCollection newChildren)
+ {
+ if (newChildren == null)
+ {
+ throw new ArgumentNullException("newChildren");
+ }
+
+ foreach (HtmlNode newChild in newChildren)
+ {
+ PrependChild(newChild);
+ }
+ }
+
+ /// <summary>
+ /// Removes node from parent collection
+ /// </summary>
+ public void Remove()
+ {
+ if (ParentNode != null)
+ ParentNode.ChildNodes.Remove(this);
+ }
+
+ /// <summary>
+ /// Removes all the children and/or attributes of the current node.
+ /// </summary>
+ public void RemoveAll()
+ {
+ RemoveAllChildren();
+
+ if (HasAttributes)
+ {
+ _attributes.Clear();
+ }
+
+ if ((_endnode != null) && (_endnode != this))
+ {
+ if (_endnode._attributes != null)
+ {
+ _endnode._attributes.Clear();
+ }
+ }
+ _outerchanged = true;
+ _innerchanged = true;
+ }
+
+ /// <summary>
+ /// Removes all the children of the current node.
+ /// </summary>
+ public void RemoveAllChildren()
+ {
+ if (!HasChildNodes)
+ {
+ return;
+ }
+
+ if (_ownerdocument.OptionUseIdAttribute)
+ {
+ // remove nodes from id list
+ foreach (HtmlNode node in _childnodes)
+ {
+ _ownerdocument.SetIdForNode(null, node.GetId());
+ }
+ }
+ _childnodes.Clear();
+ _outerchanged = true;
+ _innerchanged = true;
+ }
+
+ /// <summary>
+ /// Removes the specified child node.
+ /// </summary>
+ /// <param name="oldChild">The node being removed. May not be <c>null</c>.</param>
+ /// <returns>The node removed.</returns>
+ public HtmlNode RemoveChild(HtmlNode oldChild)
+ {
+ if (oldChild == null)
+ {
+ throw new ArgumentNullException("oldChild");
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[oldChild];
+ }
+
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null)
+ _childnodes.Remove(index);
+
+ _ownerdocument.SetIdForNode(null, oldChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return oldChild;
+ }
+
+ /// <summary>
+ /// Removes the specified child node.
+ /// </summary>
+ /// <param name="oldChild">The node being removed. May not be <c>null</c>.</param>
+ /// <param name="keepGrandChildren">true to keep grand children of the node, false otherwise.</param>
+ /// <returns>The node removed.</returns>
+ public HtmlNode RemoveChild(HtmlNode oldChild, bool keepGrandChildren)
+ {
+ if (oldChild == null)
+ {
+ throw new ArgumentNullException("oldChild");
+ }
+
+ if ((oldChild._childnodes != null) && keepGrandChildren)
+ {
+ // get prev sibling
+ HtmlNode prev = oldChild.PreviousSibling;
+
+ // reroute grand children to ourselves
+ foreach (HtmlNode grandchild in oldChild._childnodes)
+ {
+ InsertAfter(grandchild, prev);
+ }
+ }
+ RemoveChild(oldChild);
+ _outerchanged = true;
+ _innerchanged = true;
+ return oldChild;
+ }
+
+ /// <summary>
+ /// Replaces the child node oldChild with newChild node.
+ /// </summary>
+ /// <param name="newChild">The new node to put in the child list.</param>
+ /// <param name="oldChild">The node being replaced in the list.</param>
+ /// <returns>The node replaced.</returns>
+ public HtmlNode ReplaceChild(HtmlNode newChild, HtmlNode oldChild)
+ {
+ if (newChild == null)
+ {
+ return RemoveChild(oldChild);
+ }
+
+ if (oldChild == null)
+ {
+ return AppendChild(newChild);
+ }
+
+ int index = -1;
+
+ if (_childnodes != null)
+ {
+ index = _childnodes[oldChild];
+ }
+
+ if (index == -1)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+
+ if (_childnodes != null) _childnodes.Replace(index, newChild);
+
+ _ownerdocument.SetIdForNode(null, oldChild.GetId());
+ _ownerdocument.SetIdForNode(newChild, newChild.GetId());
+ _outerchanged = true;
+ _innerchanged = true;
+ return newChild;
+ }
+
+ /// <summary>
+ /// Selects a list of nodes matching the <see cref="XPath"/> expression.
+ /// </summary>
+ /// <param name="xpath">The XPath expression.</param>
+ /// <returns>An <see cref="HtmlNodeCollection"/> containing a collection of nodes matching the <see cref="XPath"/> query, or <c>null</c> if no node matched the XPath expression.</returns>
+ public HtmlNodeCollection SelectNodes(string xpath)
+ {
+ HtmlNodeCollection list = new HtmlNodeCollection(null);
+
+ HtmlNodeNavigator nav = new HtmlNodeNavigator(_ownerdocument, this);
+ XPathNodeIterator it = nav.Select(xpath);
+ while (it.MoveNext())
+ {
+ HtmlNodeNavigator n = (HtmlNodeNavigator) it.Current;
+ list.Add(n.CurrentNode);
+ }
+ if (list.Count == 0)
+ {
+ return null;
+ }
+ return list;
+ }
+
+ /// <summary>
+ /// Selects the first XmlNode that matches the XPath expression.
+ /// </summary>
+ /// <param name="xpath">The XPath expression. May not be null.</param>
+ /// <returns>The first <see cref="HtmlNode"/> that matches the XPath query or a null reference if no matching node was found.</returns>
+ public HtmlNode SelectSingleNode(string xpath)
+ {
+ if (xpath == null)
+ {
+ throw new ArgumentNullException("xpath");
+ }
+
+ HtmlNodeNavigator nav = new HtmlNodeNavigator(_ownerdocument, this);
+ XPathNodeIterator it = nav.Select(xpath);
+ if (!it.MoveNext())
+ {
+ return null;
+ }
+
+ HtmlNodeNavigator node = (HtmlNodeNavigator) it.Current;
+ return node.CurrentNode;
+ }
+
+ /// <summary>
+ /// Helper method to set the value of an attribute of this node. If the attribute is not found, it will be created automatically.
+ /// </summary>
+ /// <param name="name">The name of the attribute to set. May not be null.</param>
+ /// <param name="value">The value for the attribute.</param>
+ /// <returns>The corresponding attribute instance.</returns>
+ public HtmlAttribute SetAttributeValue(string name, string value)
+ {
+ if (name == null)
+ {
+ throw new ArgumentNullException("name");
+ }
+ HtmlAttribute att = Attributes[name];
+ if (att == null)
+ {
+ return Attributes.Append(_ownerdocument.CreateAttribute(name, value));
+ }
+ att.Value = value;
+ return att;
+ }
+
+ /// <summary>
+ /// Saves all the children of the node to the specified TextWriter.
+ /// </summary>
+ /// <param name="outText">The TextWriter to which you want to save.</param>
+ public void WriteContentTo(TextWriter outText)
+ {
+ if (_childnodes == null)
+ {
+ return;
+ }
+
+ foreach (HtmlNode node in _childnodes)
+ {
+ node.WriteTo(outText);
+ }
+ }
+
+ /// <summary>
+ /// Saves all the children of the node to a string.
+ /// </summary>
+ /// <returns>The saved string.</returns>
+ public string WriteContentTo()
+ {
+ StringWriter sw = new StringWriter();
+ WriteContentTo(sw);
+ sw.Flush();
+ return sw.ToString();
+ }
+
+ /// <summary>
+ /// Saves the current node to the specified TextWriter.
+ /// </summary>
+ /// <param name="outText">The TextWriter to which you want to save.</param>
+ public void WriteTo(TextWriter outText)
+ {
+ string html;
+ switch (_nodetype)
+ {
+ case HtmlNodeType.Comment:
+ html = ((HtmlCommentNode) this).Comment;
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ outText.Write("<!--" + GetXmlComment((HtmlCommentNode) this) + " -->");
+ }
+ else
+ {
+ outText.Write(html);
+ }
+ break;
+
+ case HtmlNodeType.Document:
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ outText.Write("<?xml version=\"1.0\" encoding=\"" + _ownerdocument.GetOutEncoding().BodyName +
+ "\"?>");
+
+ // check there is a root element
+ if (_ownerdocument.DocumentNode.HasChildNodes)
+ {
+ int rootnodes = _ownerdocument.DocumentNode._childnodes.Count;
+ if (rootnodes > 0)
+ {
+ HtmlNode xml = _ownerdocument.GetXmlDeclaration();
+ if (xml != null)
+ {
+ rootnodes --;
+ }
+
+ if (rootnodes > 1)
+ {
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ outText.Write("<SPAN>");
+ WriteContentTo(outText);
+ outText.Write("</SPAN>");
+ }
+ else
+ {
+ outText.Write("<span>");
+ WriteContentTo(outText);
+ outText.Write("</span>");
+ }
+ break;
+ }
+ }
+ }
+ }
+ WriteContentTo(outText);
+ break;
+
+ case HtmlNodeType.Text:
+ html = ((HtmlTextNode) this).Text;
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ outText.Write(HtmlDocument.HtmlEncode(html));
+ }
+ else
+ {
+ outText.Write(html);
+ }
+ break;
+
+ case HtmlNodeType.Element:
+ string name;
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ name = Name.ToUpper();
+ }
+ else
+ {
+ name = Name;
+ }
+
+ if (_ownerdocument.OptionOutputOriginalCase)
+ name = OriginalName;
+
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (name.Length > 0)
+ {
+ if (name[0] == '?')
+ {
+ // forget this one, it's been done at the document level
+ break;
+ }
+
+ if (name.Trim().Length == 0)
+ {
+ break;
+ }
+ name = HtmlDocument.GetXmlName(name);
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ outText.Write("<" + name);
+ WriteAttributes(outText, false);
+
+ if (!HasChildNodes)
+ {
+ if (IsEmptyElement(Name))
+ {
+ if ((_ownerdocument.OptionWriteEmptyNodes) || (_ownerdocument.OptionOutputAsXml))
+ {
+ outText.Write(" />");
+ }
+ else
+ {
+ if (Name.Length > 0)
+ {
+ if (Name[0] == '?')
+ {
+ outText.Write("?");
+ }
+ }
+
+ outText.Write(">");
+ }
+ }
+ else
+ {
+ outText.Write("></" + name + ">");
+ }
+ }
+ else
+ {
+ outText.Write(">");
+ bool cdata = false;
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (IsCDataElement(Name))
+ {
+ // this code and the following tries to output things as nicely as possible for old browsers.
+ cdata = true;
+ outText.Write("\r\n//<![CDATA[\r\n");
+ }
+ }
+
+ if (cdata)
+ {
+ if (HasChildNodes)
+ {
+ // child must be a text
+ ChildNodes[0].WriteTo(outText);
+ }
+ outText.Write("\r\n//]]>//\r\n");
+ }
+ else
+ {
+ WriteContentTo(outText);
+ }
+
+ outText.Write("</" + name);
+ if (!_ownerdocument.OptionOutputAsXml)
+ {
+ WriteAttributes(outText, true);
+ }
+ outText.Write(">");
+ }
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Saves the current node to the specified XmlWriter.
+ /// </summary>
+ /// <param name="writer">The XmlWriter to which you want to save.</param>
+ public void WriteTo(XmlWriter writer)
+ {
+ switch (_nodetype)
+ {
+ case HtmlNodeType.Comment:
+ writer.WriteComment(GetXmlComment((HtmlCommentNode) this));
+ break;
+
+ case HtmlNodeType.Document:
+ writer.WriteProcessingInstruction("xml",
+ "version=\"1.0\" encoding=\"" +
+ _ownerdocument.GetOutEncoding().BodyName + "\"");
+ if (HasChildNodes)
+ {
+ foreach (HtmlNode subnode in ChildNodes)
+ {
+ subnode.WriteTo(writer);
+ }
+ }
+ break;
+
+ case HtmlNodeType.Text:
+ string html = ((HtmlTextNode) this).Text;
+ writer.WriteString(html);
+ break;
+
+ case HtmlNodeType.Element:
+ string name = _ownerdocument.OptionOutputUpperCase ? Name.ToUpper() : Name;
+
+ if (_ownerdocument.OptionOutputOriginalCase)
+ name = OriginalName;
+
+ writer.WriteStartElement(name);
+ WriteAttributes(writer, this);
+
+ if (HasChildNodes)
+ {
+ foreach (HtmlNode subnode in ChildNodes)
+ {
+ subnode.WriteTo(writer);
+ }
+ }
+ writer.WriteEndElement();
+ break;
+ }
+ }
+
+ /// <summary>
+ /// Saves the current node to a string.
+ /// </summary>
+ /// <returns>The saved string.</returns>
+ public string WriteTo()
+ {
+ using (StringWriter sw = new StringWriter())
+ {
+ WriteTo(sw);
+ sw.Flush();
+ return sw.ToString();
+ }
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal static string GetXmlComment(HtmlCommentNode comment)
+ {
+ string s = comment.Comment;
+ return s.Substring(4, s.Length - 7).Replace("--", " - -");
+ }
+
+ internal static void WriteAttributes(XmlWriter writer, HtmlNode node)
+ {
+ if (!node.HasAttributes)
+ {
+ return;
+ }
+ // we use Hashitems to make sure attributes are written only once
+ foreach (HtmlAttribute att in node.Attributes.Hashitems.Values)
+ {
+ writer.WriteAttributeString(att.XmlName, att.Value);
+ }
+ }
+
+ internal void CloseNode(HtmlNode endnode)
+ {
+ if (!_ownerdocument.OptionAutoCloseOnEnd)
+ {
+ // close all children
+ if (_childnodes != null)
+ {
+ foreach (HtmlNode child in _childnodes)
+ {
+ if (child.Closed)
+ continue;
+
+ // create a fake closer node
+ HtmlNode close = new HtmlNode(NodeType, _ownerdocument, -1);
+ close._endnode = close;
+ child.CloseNode(close);
+ }
+ }
+ }
+
+ if (!Closed)
+ {
+ _endnode = endnode;
+
+ if (_ownerdocument._openednodes != null)
+ {
+ _ownerdocument._openednodes.Remove(_outerstartindex);
+ }
+
+ HtmlNode self = _ownerdocument._lastnodes[Name] as HtmlNode;
+ if (self == this)
+ {
+ _ownerdocument._lastnodes.Remove(Name);
+ _ownerdocument.UpdateLastParentNode();
+ }
+
+ if (endnode == this)
+ return;
+
+ // create an inner section
+ _innerstartindex = _outerstartindex + _outerlength;
+ _innerlength = endnode._outerstartindex - _innerstartindex;
+
+ // update full length
+ _outerlength = (endnode._outerstartindex + endnode._outerlength) - _outerstartindex;
+ }
+ }
+
+ internal string GetId()
+ {
+ HtmlAttribute att = Attributes["id"];
+ if (att == null)
+ {
+ return null;
+ }
+ return att.Value;
+ }
+
+ internal void SetId(string id)
+ {
+ HtmlAttribute att = Attributes["id"];
+ if (att == null)
+ {
+ att = _ownerdocument.CreateAttribute("id");
+ }
+ att.Value = id;
+ _ownerdocument.SetIdForNode(this, att.Value);
+ _outerchanged = true;
+ }
+
+ internal void WriteAttribute(TextWriter outText, HtmlAttribute att)
+ {
+ string name;
+ string quote = att.QuoteType == AttributeValueQuote.DoubleQuote ? "\"" : "'";
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ name = att.XmlName.ToUpper();
+ }
+ else
+ {
+ name = att.XmlName;
+ }
+ if (_ownerdocument.OptionOutputOriginalCase)
+ name = att.OriginalName;
+
+ outText.Write(" " + name + "=" + quote + HtmlDocument.HtmlEncode(att.XmlValue) + quote);
+ }
+ else
+ {
+ if (_ownerdocument.OptionOutputUpperCase)
+ {
+ name = att.Name.ToUpper();
+ }
+ else
+ {
+ name = att.Name;
+ }
+
+ if (att.Name.Length >= 4)
+ {
+ if ((att.Name[0] == '<') && (att.Name[1] == '%') &&
+ (att.Name[att.Name.Length - 1] == '>') && (att.Name[att.Name.Length - 2] == '%'))
+ {
+ outText.Write(" " + name);
+ return;
+ }
+ }
+ if (_ownerdocument.OptionOutputOptimizeAttributeValues)
+ {
+ if (att.Value.IndexOfAny(new Char[] {(char) 10, (char) 13, (char) 9, ' '}) < 0)
+ {
+ outText.Write(" " + name + "=" + att.Value);
+ }
+ else
+ {
+ outText.Write(" " + name + "=" + quote + att.Value + quote);
+ }
+ }
+ else
+ {
+ outText.Write(" " + name + "=" + quote + att.Value + quote);
+ }
+ }
+ }
+
+ internal void WriteAttributes(TextWriter outText, bool closing)
+ {
+ if (_ownerdocument.OptionOutputAsXml)
+ {
+ if (_attributes == null)
+ {
+ return;
+ }
+ // we use Hashitems to make sure attributes are written only once
+ foreach (HtmlAttribute att in _attributes.Hashitems.Values)
+ {
+ WriteAttribute(outText, att);
+ }
+ return;
+ }
+
+ if (!closing)
+ {
+ if (_attributes != null)
+ {
+ foreach (HtmlAttribute att in _attributes)
+ {
+ WriteAttribute(outText, att);
+ }
+ }
+ if (_ownerdocument.OptionAddDebuggingAttributes)
+ {
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_closed", Closed.ToString()));
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_children", ChildNodes.Count.ToString()));
+
+ int i = 0;
+ foreach (HtmlNode n in ChildNodes)
+ {
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_child_" + i,
+ n.Name));
+ i++;
+ }
+ }
+ }
+ else
+ {
+ if (_endnode == null)
+ {
+ return;
+ }
+
+ if (_endnode._attributes == null)
+ {
+ return;
+ }
+
+ if (_endnode == this)
+ {
+ return;
+ }
+
+ foreach (HtmlAttribute att in _endnode._attributes)
+ {
+ WriteAttribute(outText, att);
+ }
+ if (_ownerdocument.OptionAddDebuggingAttributes)
+ {
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_closed", Closed.ToString()));
+ WriteAttribute(outText, _ownerdocument.CreateAttribute("_children", ChildNodes.Count.ToString()));
+ }
+ }
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private string GetRelativeXpath()
+ {
+ if (ParentNode == null)
+ return Name;
+ if (NodeType == HtmlNodeType.Document)
+ return string.Empty;
+
+ int i = 1;
+ foreach (HtmlNode node in ParentNode.ChildNodes)
+ {
+ if (node.Name != Name) continue;
+
+ if (node == this)
+ break;
+
+ i++;
+ }
+ return Name + "[" + i + "]";
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlNodeCollection.cs b/docs/HtmlAgilityPack/HtmlNodeCollection.cs
new file mode 100644
index 00000000000..379e37082d7
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlNodeCollection.cs
@@ -0,0 +1,512 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+using System.Collections.Generic;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a combined list and collection of HTML nodes.
+ /// </summary>
+ public class HtmlNodeCollection : IList<HtmlNode>
+ {
+ #region Fields
+
+ private readonly HtmlNode _parentnode;
+ private readonly List<HtmlNode> _items = new List<HtmlNode>();
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Initialize the HtmlNodeCollection with the base parent node
+ /// </summary>
+ /// <param name="parentnode">The base node of the collection</param>
+ public HtmlNodeCollection(HtmlNode parentnode)
+ {
+ _parentnode = parentnode; // may be null
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets a given node from the list.
+ /// </summary>
+ public int this[HtmlNode node]
+ {
+ get
+ {
+ int index = GetNodeIndex(node);
+ if (index == -1)
+ {
+ throw new ArgumentOutOfRangeException("node",
+ "Node \"" + node.CloneNode(false).OuterHtml +
+ "\" was not found in the collection");
+ }
+ return index;
+ }
+ }
+
+ /// <summary>
+ /// Get node with tag name
+ /// </summary>
+ /// <param name="nodeName"></param>
+ /// <returns></returns>
+ public HtmlNode this[string nodeName]
+ {
+ get
+ {
+ nodeName = nodeName.ToLower();
+ for (int i = 0; i < _items.Count; i++)
+ if (_items[i].Equals(nodeName))
+ return _items[i];
+
+ return null;
+ }
+ }
+
+ #endregion
+
+ #region IList<HtmlNode> Members
+
+ /// <summary>
+ /// Gets the number of elements actually contained in the list.
+ /// </summary>
+ public int Count
+ {
+ get { return _items.Count; }
+ }
+
+ /// <summary>
+ /// Is collection read only
+ /// </summary>
+ public bool IsReadOnly
+ {
+ get { return false; }
+ }
+
+ /// <summary>
+ /// Gets the node at the specified index.
+ /// </summary>
+ public HtmlNode this[int index]
+ {
+ get { return _items[index]; }
+ set { _items[index] = value; }
+ }
+
+ /// <summary>
+ /// Add node to the collection
+ /// </summary>
+ /// <param name="node"></param>
+ public void Add(HtmlNode node)
+ {
+ _items.Add(node);
+ }
+
+ /// <summary>
+ /// Clears out the collection of HtmlNodes. Removes each nodes reference to parentnode, nextnode and prevnode
+ /// </summary>
+ public void Clear()
+ {
+ foreach (HtmlNode node in _items)
+ {
+ node.ParentNode = null;
+ node.NextSibling = null;
+ node.PreviousSibling = null;
+ }
+ _items.Clear();
+ }
+
+ /// <summary>
+ /// Gets existence of node in collection
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Contains(HtmlNode item)
+ {
+ return _items.Contains(item);
+ }
+
+ /// <summary>
+ /// Copy collection to array
+ /// </summary>
+ /// <param name="array"></param>
+ /// <param name="arrayIndex"></param>
+ public void CopyTo(HtmlNode[] array, int arrayIndex)
+ {
+ _items.CopyTo(array, arrayIndex);
+ }
+
+ /// <summary>
+ /// Get Enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator<HtmlNode> IEnumerable<HtmlNode>.GetEnumerator()
+ {
+ return _items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Get Explicit Enumerator
+ /// </summary>
+ /// <returns></returns>
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return _items.GetEnumerator();
+ }
+
+ /// <summary>
+ /// Get index of node
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public int IndexOf(HtmlNode item)
+ {
+ return _items.IndexOf(item);
+ }
+
+ /// <summary>
+ /// Insert node at index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="node"></param>
+ public void Insert(int index, HtmlNode node)
+ {
+ HtmlNode next = null;
+ HtmlNode prev = null;
+
+ if (index > 0)
+ {
+ prev = _items[index - 1];
+ }
+
+ if (index < _items.Count)
+ {
+ next = _items[index];
+ }
+
+ _items.Insert(index, node);
+
+ if (prev != null)
+ {
+ if (node == prev)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ prev._nextnode = node;
+ }
+
+ if (next != null)
+ {
+ next._prevnode = node;
+ }
+
+ node._prevnode = prev;
+ if (next == node)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ node._nextnode = next;
+ node._parentnode = _parentnode;
+ }
+
+ /// <summary>
+ /// Remove node
+ /// </summary>
+ /// <param name="item"></param>
+ /// <returns></returns>
+ public bool Remove(HtmlNode item)
+ {
+ int i = _items.IndexOf(item);
+ RemoveAt(i);
+ return true;
+ }
+
+ /// <summary>
+ /// Remove <see cref="HtmlNode"/> at index
+ /// </summary>
+ /// <param name="index"></param>
+ public void RemoveAt(int index)
+ {
+ HtmlNode next = null;
+ HtmlNode prev = null;
+ HtmlNode oldnode = _items[index];
+
+ if (index > 0)
+ {
+ prev = _items[index - 1];
+ }
+
+ if (index < (_items.Count - 1))
+ {
+ next = _items[index + 1];
+ }
+
+ _items.RemoveAt(index);
+
+ if (prev != null)
+ {
+ if (next == prev)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ prev._nextnode = next;
+ }
+
+ if (next != null)
+ {
+ next._prevnode = prev;
+ }
+
+ oldnode._prevnode = null;
+ oldnode._nextnode = null;
+ oldnode._parentnode = null;
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Get first instance of node in supplied collection
+ /// </summary>
+ /// <param name="items"></param>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public static HtmlNode FindFirst(HtmlNodeCollection items, string name)
+ {
+ foreach (HtmlNode node in items)
+ {
+ if (node.Name.ToLower().Contains(name))
+ return node;
+ if (node.HasChildNodes)
+ {
+ HtmlNode returnNode = FindFirst(node.ChildNodes, name);
+ if (returnNode != null)
+ return returnNode;
+ }
+ }
+ return null;
+ }
+
+ /// <summary>
+ /// Add node to the end of the collection
+ /// </summary>
+ /// <param name="node"></param>
+ public void Append(HtmlNode node)
+ {
+ HtmlNode last = null;
+ if (_items.Count > 0)
+ {
+ last = _items[_items.Count - 1];
+ }
+
+ _items.Add(node);
+ node._prevnode = last;
+ node._nextnode = null;
+ node._parentnode = _parentnode;
+ if (last != null)
+ {
+ if (last == node)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ last._nextnode = node;
+ }
+ }
+
+ /// <summary>
+ /// Get first instance of node with name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public HtmlNode FindFirst(string name)
+ {
+ return FindFirst(this, name);
+ }
+
+ /// <summary>
+ /// Get index of node
+ /// </summary>
+ /// <param name="node"></param>
+ /// <returns></returns>
+ public int GetNodeIndex(HtmlNode node)
+ {
+ // TODO: should we rewrite this? what would be the key of a node?
+ for (int i = 0; i < _items.Count; i++)
+ {
+ if (node == (_items[i]))
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /// <summary>
+ /// Add node to the beginning of the collection
+ /// </summary>
+ /// <param name="node"></param>
+ public void Prepend(HtmlNode node)
+ {
+ HtmlNode first = null;
+ if (_items.Count > 0)
+ {
+ first = _items[0];
+ }
+
+ _items.Insert(0, node);
+
+ if (node == first)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ node._nextnode = first;
+ node._prevnode = null;
+ node._parentnode = _parentnode;
+ if (first != null)
+ {
+ first._prevnode = node;
+ }
+ }
+
+ /// <summary>
+ /// Remove node at index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <returns></returns>
+ public bool Remove(int index)
+ {
+ RemoveAt(index);
+ return true;
+ }
+
+ /// <summary>
+ /// Replace node at index
+ /// </summary>
+ /// <param name="index"></param>
+ /// <param name="node"></param>
+ public void Replace(int index, HtmlNode node)
+ {
+ HtmlNode next = null;
+ HtmlNode prev = null;
+ HtmlNode oldnode = _items[index];
+
+ if (index > 0)
+ {
+ prev = _items[index - 1];
+ }
+
+ if (index < (_items.Count - 1))
+ {
+ next = _items[index + 1];
+ }
+
+ _items[index] = node;
+
+ if (prev != null)
+ {
+ if (node == prev)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+ prev._nextnode = node;
+ }
+
+ if (next != null)
+ {
+ next._prevnode = node;
+ }
+
+ node._prevnode = prev;
+
+ if (next == node)
+ {
+ throw new InvalidProgramException("Unexpected error.");
+ }
+
+ node._nextnode = next;
+ node._parentnode = _parentnode;
+
+ oldnode._prevnode = null;
+ oldnode._nextnode = null;
+ oldnode._parentnode = null;
+ }
+
+ #endregion
+
+ #region LINQ Methods
+
+ /// <summary>
+ /// Get all node descended from this collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> DescendantNodes()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.DescendantNodes())
+ yield return n;
+ }
+
+ /// <summary>
+ /// Get all node descended from this collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.Descendants())
+ yield return n;
+ }
+
+ /// <summary>
+ /// Get all node descended from this collection with matching name
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Descendants(string name)
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.Descendants(name))
+ yield return n;
+ }
+
+ /// <summary>
+ /// Gets all first generation elements in collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Elements()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.ChildNodes)
+ yield return n;
+ }
+
+ /// <summary>
+ /// Gets all first generation elements matching name
+ /// </summary>
+ /// <param name="name"></param>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Elements(string name)
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.Elements(name))
+ yield return n;
+ }
+
+ /// <summary>
+ /// All first generation nodes in collection
+ /// </summary>
+ /// <returns></returns>
+ public IEnumerable<HtmlNode> Nodes()
+ {
+ foreach (HtmlNode item in _items)
+ foreach (HtmlNode n in item.ChildNodes)
+ yield return n;
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlNodeNavigator.cs b/docs/HtmlAgilityPack/HtmlNodeNavigator.cs
new file mode 100644
index 00000000000..78375ed72a1
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlNodeNavigator.cs
@@ -0,0 +1,768 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Diagnostics;
+using System.IO;
+using System.Text;
+using System.Xml;
+using System.Xml.XPath;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML navigator on an HTML document seen as a data store.
+ /// </summary>
+ public class HtmlNodeNavigator : XPathNavigator
+ {
+ #region Fields
+
+ private int _attindex;
+ private HtmlNode _currentnode;
+ private HtmlDocument _doc = new HtmlDocument();
+ private HtmlNameTable _nametable = new HtmlNameTable();
+
+ internal bool Trace;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlNodeNavigator()
+ {
+ Reset();
+ }
+
+ internal HtmlNodeNavigator(HtmlDocument doc, HtmlNode currentNode)
+ {
+ if (currentNode == null)
+ {
+ throw new ArgumentNullException("currentNode");
+ }
+ if (currentNode.OwnerDocument != doc)
+ {
+ throw new ArgumentException(HtmlDocument.HtmlExceptionRefNotChild);
+ }
+ InternalTrace(null);
+
+ _doc = doc;
+ Reset();
+ _currentnode = currentNode;
+ }
+
+ private HtmlNodeNavigator(HtmlNodeNavigator nav)
+ {
+ if (nav == null)
+ {
+ throw new ArgumentNullException("nav");
+ }
+ InternalTrace(null);
+
+ _doc = nav._doc;
+ _currentnode = nav._currentnode;
+ _attindex = nav._attindex;
+ _nametable = nav._nametable; // REVIEW: should we do this?
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ public HtmlNodeNavigator(Stream stream)
+ {
+ _doc.Load(stream);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public HtmlNodeNavigator(Stream stream, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(stream, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public HtmlNodeNavigator(Stream stream, Encoding encoding)
+ {
+ _doc.Load(stream, encoding);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ public HtmlNodeNavigator(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(stream, encoding, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the stream.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public HtmlNodeNavigator(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ _doc.Load(stream, encoding, detectEncodingFromByteOrderMarks, buffersize);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML data into the document.</param>
+ public HtmlNodeNavigator(TextReader reader)
+ {
+ _doc.Load(reader);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ public HtmlNodeNavigator(string path)
+ {
+ _doc.Load(path);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public HtmlNodeNavigator(string path, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(path, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public HtmlNodeNavigator(string path, Encoding encoding)
+ {
+ _doc.Load(path, encoding);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public HtmlNodeNavigator(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ _doc.Load(path, encoding, detectEncodingFromByteOrderMarks);
+ Reset();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the HtmlNavigator and loads an HTML document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public HtmlNodeNavigator(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ _doc.Load(path, encoding, detectEncodingFromByteOrderMarks, buffersize);
+ Reset();
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the base URI for the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string BaseURI
+ {
+ get
+ {
+ InternalTrace(">");
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Gets the current HTML document.
+ /// </summary>
+ public HtmlDocument CurrentDocument
+ {
+ get { return _doc; }
+ }
+
+ /// <summary>
+ /// Gets the current HTML node.
+ /// </summary>
+ public HtmlNode CurrentNode
+ {
+ get { return _currentnode; }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has child nodes.
+ /// </summary>
+ public override bool HasAttributes
+ {
+ get
+ {
+ InternalTrace(">" + (_currentnode.Attributes.Count > 0));
+ return (_currentnode.Attributes.Count > 0);
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node has child nodes.
+ /// </summary>
+ public override bool HasChildren
+ {
+ get
+ {
+ InternalTrace(">" + (_currentnode.ChildNodes.Count > 0));
+ return (_currentnode.ChildNodes.Count > 0);
+ }
+ }
+
+ /// <summary>
+ /// Gets a value indicating whether the current node is an empty element.
+ /// </summary>
+ public override bool IsEmptyElement
+ {
+ get
+ {
+ InternalTrace(">" + !HasChildren);
+ // REVIEW: is this ok?
+ return !HasChildren;
+ }
+ }
+
+ /// <summary>
+ /// Gets the name of the current HTML node without the namespace prefix.
+ /// </summary>
+ public override string LocalName
+ {
+ get
+ {
+ if (_attindex != -1)
+ {
+ InternalTrace("att>" + _currentnode.Attributes[_attindex].Name);
+ return _nametable.GetOrAdd(_currentnode.Attributes[_attindex].Name);
+ }
+ InternalTrace("node>" + _currentnode.Name);
+ return _nametable.GetOrAdd(_currentnode.Name);
+ }
+ }
+
+ /// <summary>
+ /// Gets the qualified name of the current node.
+ /// </summary>
+ public override string Name
+ {
+ get
+ {
+ InternalTrace(">" + _currentnode.Name);
+ return _nametable.GetOrAdd(_currentnode.Name);
+ }
+ }
+
+ /// <summary>
+ /// Gets the namespace URI (as defined in the W3C Namespace Specification) of the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string NamespaceURI
+ {
+ get
+ {
+ InternalTrace(">");
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Gets the <see cref="XmlNameTable"/> associated with this implementation.
+ /// </summary>
+ public override XmlNameTable NameTable
+ {
+ get
+ {
+ InternalTrace(null);
+ return _nametable;
+ }
+ }
+
+ /// <summary>
+ /// Gets the type of the current node.
+ /// </summary>
+ public override XPathNodeType NodeType
+ {
+ get
+ {
+ switch (_currentnode.NodeType)
+ {
+ case HtmlNodeType.Comment:
+ InternalTrace(">" + XPathNodeType.Comment);
+ return XPathNodeType.Comment;
+
+ case HtmlNodeType.Document:
+ InternalTrace(">" + XPathNodeType.Root);
+ return XPathNodeType.Root;
+
+ case HtmlNodeType.Text:
+ InternalTrace(">" + XPathNodeType.Text);
+ return XPathNodeType.Text;
+
+ case HtmlNodeType.Element:
+ {
+ if (_attindex != -1)
+ {
+ InternalTrace(">" + XPathNodeType.Attribute);
+ return XPathNodeType.Attribute;
+ }
+ InternalTrace(">" + XPathNodeType.Element);
+ return XPathNodeType.Element;
+ }
+
+ default:
+ throw new NotImplementedException("Internal error: Unhandled HtmlNodeType: " +
+ _currentnode.NodeType);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the prefix associated with the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string Prefix
+ {
+ get
+ {
+ InternalTrace(null);
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ /// <summary>
+ /// Gets the text value of the current node.
+ /// </summary>
+ public override string Value
+ {
+ get
+ {
+ InternalTrace("nt=" + _currentnode.NodeType);
+ switch (_currentnode.NodeType)
+ {
+ case HtmlNodeType.Comment:
+ InternalTrace(">" + ((HtmlCommentNode) _currentnode).Comment);
+ return ((HtmlCommentNode) _currentnode).Comment;
+
+ case HtmlNodeType.Document:
+ InternalTrace(">");
+ return "";
+
+ case HtmlNodeType.Text:
+ InternalTrace(">" + ((HtmlTextNode) _currentnode).Text);
+ return ((HtmlTextNode) _currentnode).Text;
+
+ case HtmlNodeType.Element:
+ {
+ if (_attindex != -1)
+ {
+ InternalTrace(">" + _currentnode.Attributes[_attindex].Value);
+ return _currentnode.Attributes[_attindex].Value;
+ }
+ return _currentnode.InnerText;
+ }
+
+ default:
+ throw new NotImplementedException("Internal error: Unhandled HtmlNodeType: " +
+ _currentnode.NodeType);
+ }
+ }
+ }
+
+ /// <summary>
+ /// Gets the xml:lang scope for the current node.
+ /// Always returns string.Empty in the case of HtmlNavigator implementation.
+ /// </summary>
+ public override string XmlLang
+ {
+ get
+ {
+ InternalTrace(null);
+ return _nametable.GetOrAdd(string.Empty);
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Creates a new HtmlNavigator positioned at the same node as this HtmlNavigator.
+ /// </summary>
+ /// <returns>A new HtmlNavigator object positioned at the same node as the original HtmlNavigator.</returns>
+ public override XPathNavigator Clone()
+ {
+ InternalTrace(null);
+ return new HtmlNodeNavigator(this);
+ }
+
+ /// <summary>
+ /// Gets the value of the HTML attribute with the specified LocalName and NamespaceURI.
+ /// </summary>
+ /// <param name="localName">The local name of the HTML attribute.</param>
+ /// <param name="namespaceURI">The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation.</param>
+ /// <returns>The value of the specified HTML attribute. String.Empty or null if a matching attribute is not found or if the navigator is not positioned on an element node.</returns>
+ public override string GetAttribute(string localName, string namespaceURI)
+ {
+ InternalTrace("localName=" + localName + ", namespaceURI=" + namespaceURI);
+ HtmlAttribute att = _currentnode.Attributes[localName];
+ if (att == null)
+ {
+ InternalTrace(">null");
+ return null;
+ }
+ InternalTrace(">" + att.Value);
+ return att.Value;
+ }
+
+ /// <summary>
+ /// Returns the value of the namespace node corresponding to the specified local name.
+ /// Always returns string.Empty for the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="name">The local name of the namespace node.</param>
+ /// <returns>Always returns string.Empty for the HtmlNavigator implementation.</returns>
+ public override string GetNamespace(string name)
+ {
+ InternalTrace("name=" + name);
+ return string.Empty;
+ }
+
+ /// <summary>
+ /// Determines whether the current HtmlNavigator is at the same position as the specified HtmlNavigator.
+ /// </summary>
+ /// <param name="other">The HtmlNavigator that you want to compare against.</param>
+ /// <returns>true if the two navigators have the same position, otherwise, false.</returns>
+ public override bool IsSamePosition(XPathNavigator other)
+ {
+ HtmlNodeNavigator nav = other as HtmlNodeNavigator;
+ if (nav == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ InternalTrace(">" + (nav._currentnode == _currentnode));
+ return (nav._currentnode == _currentnode);
+ }
+
+ /// <summary>
+ /// Moves to the same position as the specified HtmlNavigator.
+ /// </summary>
+ /// <param name="other">The HtmlNavigator positioned on the node that you want to move to.</param>
+ /// <returns>true if successful, otherwise false. If false, the position of the navigator is unchanged.</returns>
+ public override bool MoveTo(XPathNavigator other)
+ {
+ HtmlNodeNavigator nav = other as HtmlNodeNavigator;
+ if (nav == null)
+ {
+ InternalTrace(">false (nav is not an HtmlNodeNavigator)");
+ return false;
+ }
+ InternalTrace("moveto oid=" + nav.GetHashCode()
+ + ", n:" + nav._currentnode.Name
+ + ", a:" + nav._attindex);
+
+ if (nav._doc == _doc)
+ {
+ _currentnode = nav._currentnode;
+ _attindex = nav._attindex;
+ InternalTrace(">true");
+ return true;
+ }
+ // we don't know how to handle that
+ InternalTrace(">false (???)");
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the HTML attribute with matching LocalName and NamespaceURI.
+ /// </summary>
+ /// <param name="localName">The local name of the HTML attribute.</param>
+ /// <param name="namespaceURI">The namespace URI of the attribute. Unsupported with the HtmlNavigator implementation.</param>
+ /// <returns>true if the HTML attribute is found, otherwise, false. If false, the position of the navigator does not change.</returns>
+ public override bool MoveToAttribute(string localName, string namespaceURI)
+ {
+ InternalTrace("localName=" + localName + ", namespaceURI=" + namespaceURI);
+ int index = _currentnode.Attributes.GetAttributeIndex(localName);
+ if (index == -1)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _attindex = index;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the first sibling of the current node.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the first sibling node, false if there is no first sibling or if the navigator is currently positioned on an attribute node.</returns>
+ public override bool MoveToFirst()
+ {
+ if (_currentnode.ParentNode == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ if (_currentnode.ParentNode.FirstChild == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.ParentNode.FirstChild;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the first HTML attribute.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the first HTML attribute, otherwise, false.</returns>
+ public override bool MoveToFirstAttribute()
+ {
+ if (!HasAttributes)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _attindex = 0;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the first child of the current node.
+ /// </summary>
+ /// <returns>true if there is a first child node, otherwise false.</returns>
+ public override bool MoveToFirstChild()
+ {
+ if (!_currentnode.HasChildNodes)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.ChildNodes[0];
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves the XPathNavigator to the first namespace node of the current element.
+ /// Always returns false for the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="scope">An XPathNamespaceScope value describing the namespace scope.</param>
+ /// <returns>Always returns false for the HtmlNavigator implementation.</returns>
+ public override bool MoveToFirstNamespace(XPathNamespaceScope scope)
+ {
+ InternalTrace(null);
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the node that has an attribute of type ID whose value matches the specified string.
+ /// </summary>
+ /// <param name="id">A string representing the ID value of the node to which you want to move. This argument does not need to be atomized.</param>
+ /// <returns>true if the move was successful, otherwise false. If false, the position of the navigator is unchanged.</returns>
+ public override bool MoveToId(string id)
+ {
+ InternalTrace("id=" + id);
+ HtmlNode node = _doc.GetElementbyId(id);
+ if (node == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = node;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves the XPathNavigator to the namespace node with the specified local name.
+ /// Always returns false for the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="name">The local name of the namespace node.</param>
+ /// <returns>Always returns false for the HtmlNavigator implementation.</returns>
+ public override bool MoveToNamespace(string name)
+ {
+ InternalTrace("name=" + name);
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the next sibling of the current node.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the next sibling node, false if there are no more siblings or if the navigator is currently positioned on an attribute node. If false, the position of the navigator is unchanged.</returns>
+ public override bool MoveToNext()
+ {
+ if (_currentnode.NextSibling == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ InternalTrace("_c=" + _currentnode.CloneNode(false).OuterHtml);
+ InternalTrace("_n=" + _currentnode.NextSibling.CloneNode(false).OuterHtml);
+ _currentnode = _currentnode.NextSibling;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the next HTML attribute.
+ /// </summary>
+ /// <returns></returns>
+ public override bool MoveToNextAttribute()
+ {
+ InternalTrace(null);
+ if (_attindex >= (_currentnode.Attributes.Count - 1))
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _attindex++;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves the XPathNavigator to the next namespace node.
+ /// Always returns falsefor the HtmlNavigator implementation.
+ /// </summary>
+ /// <param name="scope">An XPathNamespaceScope value describing the namespace scope.</param>
+ /// <returns>Always returns false for the HtmlNavigator implementation.</returns>
+ public override bool MoveToNextNamespace(XPathNamespaceScope scope)
+ {
+ InternalTrace(null);
+ return false;
+ }
+
+ /// <summary>
+ /// Moves to the parent of the current node.
+ /// </summary>
+ /// <returns>true if there is a parent node, otherwise false.</returns>
+ public override bool MoveToParent()
+ {
+ if (_currentnode.ParentNode == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.ParentNode;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the previous sibling of the current node.
+ /// </summary>
+ /// <returns>true if the navigator is successful moving to the previous sibling node, false if there is no previous sibling or if the navigator is currently positioned on an attribute node.</returns>
+ public override bool MoveToPrevious()
+ {
+ if (_currentnode.PreviousSibling == null)
+ {
+ InternalTrace(">false");
+ return false;
+ }
+ _currentnode = _currentnode.PreviousSibling;
+ InternalTrace(">true");
+ return true;
+ }
+
+ /// <summary>
+ /// Moves to the root node to which the current node belongs.
+ /// </summary>
+ public override void MoveToRoot()
+ {
+ _currentnode = _doc.DocumentNode;
+ InternalTrace(null);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ [Conditional("TRACE")]
+ internal void InternalTrace(object traceValue)
+ {
+ if (!Trace)
+ {
+ return;
+ }
+ StackFrame sf = new StackFrame(1, true);
+ string name = sf.GetMethod().Name;
+ string nodename = _currentnode == null ? "(null)" : _currentnode.Name;
+ string nodevalue;
+ if (_currentnode == null)
+ {
+ nodevalue = "(null)";
+ }
+ else
+ {
+ switch (_currentnode.NodeType)
+ {
+ case HtmlNodeType.Comment:
+ nodevalue = ((HtmlCommentNode) _currentnode).Comment;
+ break;
+
+ case HtmlNodeType.Document:
+ nodevalue = "";
+ break;
+
+ case HtmlNodeType.Text:
+ nodevalue = ((HtmlTextNode) _currentnode).Text;
+ break;
+
+ default:
+ nodevalue = _currentnode.CloneNode(false).OuterHtml;
+ break;
+ }
+ }
+ System.Diagnostics.Trace.WriteLine(string.Format("oid={0},n={1},a={2},v={3},{4}", GetHashCode(), nodename, _attindex, nodevalue, traceValue), "N!" + name);
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void Reset()
+ {
+ InternalTrace(null);
+ _currentnode = _doc.DocumentNode;
+ _attindex = -1;
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlNodeType.cs b/docs/HtmlAgilityPack/HtmlNodeType.cs
new file mode 100644
index 00000000000..a84e4af4705
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlNodeType.cs
@@ -0,0 +1,29 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents the type of a node.
+ /// </summary>
+ public enum HtmlNodeType
+ {
+ /// <summary>
+ /// The root of a document.
+ /// </summary>
+ Document,
+
+ /// <summary>
+ /// An HTML element.
+ /// </summary>
+ Element,
+
+ /// <summary>
+ /// An HTML comment.
+ /// </summary>
+ Comment,
+
+ /// <summary>
+ /// A text node is always the child of an element or a document node.
+ /// </summary>
+ Text,
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlParseError.cs b/docs/HtmlAgilityPack/HtmlParseError.cs
new file mode 100644
index 00000000000..d3d5e78ba19
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlParseError.cs
@@ -0,0 +1,92 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a parsing error found during document parsing.
+ /// </summary>
+ public class HtmlParseError
+ {
+ #region Fields
+
+ private HtmlParseErrorCode _code;
+ private int _line;
+ private int _linePosition;
+ private string _reason;
+ private string _sourceText;
+ private int _streamPosition;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlParseError(
+ HtmlParseErrorCode code,
+ int line,
+ int linePosition,
+ int streamPosition,
+ string sourceText,
+ string reason)
+ {
+ _code = code;
+ _line = line;
+ _linePosition = linePosition;
+ _streamPosition = streamPosition;
+ _sourceText = sourceText;
+ _reason = reason;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the type of error.
+ /// </summary>
+ public HtmlParseErrorCode Code
+ {
+ get { return _code; }
+ }
+
+ /// <summary>
+ /// Gets the line number of this error in the document.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ }
+
+ /// <summary>
+ /// Gets the column number of this error in the document.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _linePosition; }
+ }
+
+ /// <summary>
+ /// Gets a description for the error.
+ /// </summary>
+ public string Reason
+ {
+ get { return _reason; }
+ }
+
+ /// <summary>
+ /// Gets the the full text of the line containing the error.
+ /// </summary>
+ public string SourceText
+ {
+ get { return _sourceText; }
+ }
+
+ /// <summary>
+ /// Gets the absolute stream position of this error in the document, relative to the start of the document.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return _streamPosition; }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlParseErrorCode.cs b/docs/HtmlAgilityPack/HtmlParseErrorCode.cs
new file mode 100644
index 00000000000..f92128de605
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlParseErrorCode.cs
@@ -0,0 +1,34 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents the type of parsing error.
+ /// </summary>
+ public enum HtmlParseErrorCode
+ {
+ /// <summary>
+ /// A tag was not closed.
+ /// </summary>
+ TagNotClosed,
+
+ /// <summary>
+ /// A tag was not opened.
+ /// </summary>
+ TagNotOpened,
+
+ /// <summary>
+ /// There is a charset mismatch between stream and declared (META) encoding.
+ /// </summary>
+ CharsetMismatch,
+
+ /// <summary>
+ /// An end tag was not required.
+ /// </summary>
+ EndTagNotRequired,
+
+ /// <summary>
+ /// An end tag is invalid at this position.
+ /// </summary>
+ EndTagInvalidHere
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlTextNode.cs b/docs/HtmlAgilityPack/HtmlTextNode.cs
new file mode 100644
index 00000000000..cdf8bcedfeb
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlTextNode.cs
@@ -0,0 +1,69 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an HTML text node.
+ /// </summary>
+ public class HtmlTextNode : HtmlNode
+ {
+ #region Fields
+
+ private string _text;
+
+ #endregion
+
+ #region Constructors
+
+ internal HtmlTextNode(HtmlDocument ownerdocument, int index)
+ :
+ base(HtmlNodeType.Text, ownerdocument, index)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or Sets the HTML between the start and end tags of the object. In the case of a text node, it is equals to OuterHtml.
+ /// </summary>
+ public override string InnerHtml
+ {
+ get { return OuterHtml; }
+ set { _text = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the object and its content in HTML.
+ /// </summary>
+ public override string OuterHtml
+ {
+ get
+ {
+ if (_text == null)
+ {
+ return base.OuterHtml;
+ }
+ return _text;
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the text of the node.
+ /// </summary>
+ public string Text
+ {
+ get
+ {
+ if (_text == null)
+ {
+ return base.OuterHtml;
+ }
+ return _text;
+ }
+ set { _text = value; }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlWeb.cs b/docs/HtmlAgilityPack/HtmlWeb.cs
new file mode 100644
index 00000000000..39dd4267569
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlWeb.cs
@@ -0,0 +1,907 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.IO;
+using System.Net;
+using System.Text;
+using System.Xml;
+using System.Xml.Serialization;
+using System.Xml.Xsl;
+using Microsoft.Win32;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// A utility class to get HTML document from HTTP.
+ /// </summary>
+ public class HtmlWeb
+ {
+ #region Delegates
+
+ /// <summary>
+ /// Represents the method that will handle the PostResponse event.
+ /// </summary>
+ public delegate void PostResponseHandler(HttpWebRequest request, HttpWebResponse response);
+
+ /// <summary>
+ /// Represents the method that will handle the PreHandleDocument event.
+ /// </summary>
+ public delegate void PreHandleDocumentHandler(HtmlDocument document);
+
+ /// <summary>
+ /// Represents the method that will handle the PreRequest event.
+ /// </summary>
+ public delegate bool PreRequestHandler(HttpWebRequest request);
+
+ #endregion
+
+ #region Fields
+
+ private bool _autoDetectEncoding = true;
+ private bool _cacheOnly;
+
+ private string _cachePath;
+ private bool _fromCache;
+ private int _requestDuration;
+ private Uri _responseUri;
+ private HttpStatusCode _statusCode = HttpStatusCode.OK;
+ private int _streamBufferSize = 1024;
+ private bool _useCookies;
+ private bool _usingCache;
+
+ /// <summary>
+ /// Occurs after an HTTP request has been executed.
+ /// </summary>
+ public PostResponseHandler PostResponse;
+
+ /// <summary>
+ /// Occurs before an HTML document is handled.
+ /// </summary>
+ public PreHandleDocumentHandler PreHandleDocument;
+
+ /// <summary>
+ /// Occurs before an HTTP request is executed.
+ /// </summary>
+ public PreRequestHandler PreRequest;
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets or Sets a value indicating if document encoding must be automatically detected.
+ /// </summary>
+ public bool AutoDetectEncoding
+ {
+ get { return _autoDetectEncoding; }
+ set { _autoDetectEncoding = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets a value indicating whether to get document only from the cache.
+ /// If this is set to true and document is not found in the cache, nothing will be loaded.
+ /// </summary>
+ public bool CacheOnly
+ {
+ get { return _cacheOnly; }
+ set
+ {
+ if ((value) && !UsingCache)
+ {
+ throw new HtmlWebException("Cache is not enabled. Set UsingCache to true first.");
+ }
+ _cacheOnly = value;
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets the cache path. If null, no caching mechanism will be used.
+ /// </summary>
+ public string CachePath
+ {
+ get { return _cachePath; }
+ set { _cachePath = value; }
+ }
+
+ /// <summary>
+ /// Gets a value indicating if the last document was retrieved from the cache.
+ /// </summary>
+ public bool FromCache
+ {
+ get { return _fromCache; }
+ }
+
+ /// <summary>
+ /// Gets the last request duration in milliseconds.
+ /// </summary>
+ public int RequestDuration
+ {
+ get { return _requestDuration; }
+ }
+
+ /// <summary>
+ /// Gets the URI of the Internet resource that actually responded to the request.
+ /// </summary>
+ public Uri ResponseUri
+ {
+ get { return _responseUri; }
+ }
+
+ /// <summary>
+ /// Gets the last request status.
+ /// </summary>
+ public HttpStatusCode StatusCode
+ {
+ get { return _statusCode; }
+ }
+
+ /// <summary>
+ /// Gets or Sets the size of the buffer used for memory operations.
+ /// </summary>
+ public int StreamBufferSize
+ {
+ get { return _streamBufferSize; }
+ set
+ {
+ if (_streamBufferSize <= 0)
+ {
+ throw new ArgumentException("Size must be greater than zero.");
+ }
+ _streamBufferSize = value;
+ }
+ }
+
+ /// <summary>
+ /// Gets or Sets a value indicating if cookies will be stored.
+ /// </summary>
+ public bool UseCookies
+ {
+ get { return _useCookies; }
+ set { _useCookies = value; }
+ }
+
+ /// <summary>
+ /// Gets or Sets a value indicating whether the caching mechanisms should be used or not.
+ /// </summary>
+ public bool UsingCache
+ {
+ get
+ {
+ if (_cachePath == null)
+ {
+ return false;
+ }
+ return _usingCache;
+ }
+ set
+ {
+ if ((value) && (_cachePath == null))
+ {
+ throw new HtmlWebException("You need to define a CachePath first.");
+ }
+ _usingCache = value;
+ }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Gets the MIME content type for a given path extension.
+ /// </summary>
+ /// <param name="extension">The input path extension.</param>
+ /// <param name="def">The default content type to return if any error occurs.</param>
+ /// <returns>The path extension's MIME content type.</returns>
+ public static string GetContentTypeForExtension(string extension, string def)
+ {
+ if (string.IsNullOrEmpty(extension))
+ {
+ return def;
+ }
+ string contentType = "";
+ try
+ {
+ RegistryKey reg = Registry.ClassesRoot;
+ reg = reg.OpenSubKey(extension, false);
+ if (reg != null) contentType = (string)reg.GetValue("", def);
+ }
+ catch (Exception)
+ {
+ contentType = def;
+ }
+ return contentType;
+ }
+
+ /// <summary>
+ /// Gets the path extension for a given MIME content type.
+ /// </summary>
+ /// <param name="contentType">The input MIME content type.</param>
+ /// <param name="def">The default path extension to return if any error occurs.</param>
+ /// <returns>The MIME content type's path extension.</returns>
+ public static string GetExtensionForContentType(string contentType, string def)
+ {
+ if (string.IsNullOrEmpty(contentType))
+ {
+ return def;
+ }
+ string ext = "";
+ try
+ {
+ RegistryKey reg = Registry.ClassesRoot;
+ reg = reg.OpenSubKey(@"MIME\Database\Content Type\" + contentType, false);
+ if (reg != null) ext = (string)reg.GetValue("Extension", def);
+ }
+ catch (Exception)
+ {
+ ext = def;
+ }
+ return ext;
+ }
+
+ /// <summary>
+ /// Creates an instance of the given type from the specified Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="type">The requested type.</param>
+ /// <returns>An newly created instance.</returns>
+ public object CreateInstance(string url, Type type)
+ {
+ return CreateInstance(url, null, null, type);
+ }
+
+ /// <summary>
+ /// Creates an instance of the given type from the specified Internet resource.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An <see cref="XsltArgumentList"/> containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="type">The requested type.</param>
+ /// <returns>An newly created instance.</returns>
+ public object CreateInstance(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, Type type)
+ {
+ return CreateInstance(htmlUrl, xsltUrl, xsltArgs, type, null);
+ }
+
+ /// <summary>
+ /// Creates an instance of the given type from the specified Internet resource.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An <see cref="XsltArgumentList"/> containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="type">The requested type.</param>
+ /// <param name="xmlPath">A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes.</param>
+ /// <returns>An newly created instance.</returns>
+ public object CreateInstance(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, Type type,
+ string xmlPath)
+ {
+ StringWriter sw = new StringWriter();
+ XmlTextWriter writer = new XmlTextWriter(sw);
+ if (xsltUrl == null)
+ {
+ LoadHtmlAsXml(htmlUrl, writer);
+ }
+ else
+ {
+ if (xmlPath == null)
+ {
+ LoadHtmlAsXml(htmlUrl, xsltUrl, xsltArgs, writer);
+ }
+ else
+ {
+ LoadHtmlAsXml(htmlUrl, xsltUrl, xsltArgs, writer, xmlPath);
+ }
+ }
+ writer.Flush();
+ StringReader sr = new StringReader(sw.ToString());
+ XmlTextReader reader = new XmlTextReader(sr);
+ XmlSerializer serializer = new XmlSerializer(type);
+ object o;
+ try
+ {
+ o = serializer.Deserialize(reader);
+ }
+ catch (InvalidOperationException ex)
+ {
+ throw new Exception(ex + ", --- xml:" + sw);
+ }
+ return o;
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ public void Get(string url, string path)
+ {
+ Get(url, path, "GET");
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file. - Proxy aware
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ /// <param name="proxy"></param>
+ /// <param name="credentials"></param>
+ public void Get(string url, string path, WebProxy proxy, NetworkCredential credentials)
+ {
+ Get(url, path, proxy, credentials, "GET");
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ public void Get(string url, string path, string method)
+ {
+ Uri uri = new Uri(url);
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ Get(uri, method, path, null, null, null);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource and saves it to the specified file. Understands Proxies
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="path">The location of the file where you want to save the document.</param>
+ /// <param name="credentials"></param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ /// <param name="proxy"></param>
+ public void Get(string url, string path, WebProxy proxy, NetworkCredential credentials, string method)
+ {
+ Uri uri = new Uri(url);
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ Get(uri, method, path, null, proxy, credentials);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+
+ /// <summary>
+ /// Gets the cache file path for a specified url.
+ /// </summary>
+ /// <param name="uri">The url fo which to retrieve the cache path. May not be null.</param>
+ /// <returns>The cache file path.</returns>
+ public string GetCachePath(Uri uri)
+ {
+ if (uri == null)
+ {
+ throw new ArgumentNullException("uri");
+ }
+ if (!UsingCache)
+ {
+ throw new HtmlWebException("Cache is not enabled. Set UsingCache to true first.");
+ }
+ string cachePath;
+ if (uri.AbsolutePath == "/")
+ {
+ cachePath = Path.Combine(_cachePath, ".htm");
+ }
+ else
+ {
+ cachePath = Path.Combine(_cachePath, (uri.Host + uri.AbsolutePath).Replace('/', '\\'));
+ }
+ return cachePath;
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url)
+ {
+ return Load(url, "GET");
+ }
+
+ /// <summary>
+ /// Gets an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="proxyHost">Host to use for Proxy</param>
+ /// <param name="proxyPort">Port the Proxy is on</param>
+ /// <param name="userId">User Id for Authentication</param>
+ /// <param name="password">Password for Authentication</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url, string proxyHost, int proxyPort, string userId, string password)
+ {
+ //Create my proxy
+ WebProxy myProxy = new WebProxy(proxyHost, proxyPort);
+ myProxy.BypassProxyOnLocal = true;
+
+ //Create my credentials
+ NetworkCredential myCreds = null;
+ if ((userId != null) && (password != null))
+ {
+ myCreds = new NetworkCredential(userId, password);
+ CredentialCache credCache = new CredentialCache();
+ //Add the creds
+ credCache.Add(myProxy.Address, "Basic", myCreds);
+ credCache.Add(myProxy.Address, "Digest", myCreds);
+ }
+
+ return Load(url, "GET", myProxy, myCreds);
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url, string method)
+ {
+ Uri uri = new Uri(url);
+ HtmlDocument doc;
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ doc = LoadUrl(uri, method, null, null);
+ }
+ else
+ {
+ if (uri.Scheme == Uri.UriSchemeFile)
+ {
+ doc = new HtmlDocument();
+ doc.OptionAutoCloseOnEnd = false;
+ doc.OptionAutoCloseOnEnd = true;
+ doc.DetectEncodingAndLoad(url, _autoDetectEncoding);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+ if (PreHandleDocument != null)
+ {
+ PreHandleDocument(doc);
+ }
+ return doc;
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource.
+ /// </summary>
+ /// <param name="url">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="method">The HTTP method used to open the connection, such as GET, POST, PUT, or PROPFIND.</param>
+ /// <param name="proxy">Proxy to use with this request</param>
+ /// <param name="credentials">Credentials to use when authenticating</param>
+ /// <returns>A new HTML document.</returns>
+ public HtmlDocument Load(string url, string method, WebProxy proxy, NetworkCredential credentials)
+ {
+ Uri uri = new Uri(url);
+ HtmlDocument doc;
+ if ((uri.Scheme == Uri.UriSchemeHttps) ||
+ (uri.Scheme == Uri.UriSchemeHttp))
+ {
+ doc = LoadUrl(uri, method, proxy, credentials);
+ }
+ else
+ {
+ if (uri.Scheme == Uri.UriSchemeFile)
+ {
+ doc = new HtmlDocument();
+ doc.OptionAutoCloseOnEnd = false;
+ doc.OptionAutoCloseOnEnd = true;
+ doc.DetectEncodingAndLoad(url, _autoDetectEncoding);
+ }
+ else
+ {
+ throw new HtmlWebException("Unsupported uri scheme: '" + uri.Scheme + "'.");
+ }
+ }
+ if (PreHandleDocument != null)
+ {
+ PreHandleDocument(doc);
+ }
+ return doc;
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="writer">The XmlTextWriter to which you want to save.</param>
+ public void LoadHtmlAsXml(string htmlUrl, XmlTextWriter writer)
+ {
+ HtmlDocument doc = Load(htmlUrl);
+ doc.Save(writer);
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp".</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An XsltArgumentList containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="writer">The XmlTextWriter to which you want to save.</param>
+ public void LoadHtmlAsXml(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, XmlTextWriter writer)
+ {
+ LoadHtmlAsXml(htmlUrl, xsltUrl, xsltArgs, writer, null);
+ }
+
+ /// <summary>
+ /// Loads an HTML document from an Internet resource and saves it to the specified XmlTextWriter, after an XSLT transformation.
+ /// </summary>
+ /// <param name="htmlUrl">The requested URL, such as "http://Myserver/Mypath/Myfile.asp". May not be null.</param>
+ /// <param name="xsltUrl">The URL that specifies the XSLT stylesheet to load.</param>
+ /// <param name="xsltArgs">An XsltArgumentList containing the namespace-qualified arguments used as input to the transform.</param>
+ /// <param name="writer">The XmlTextWriter to which you want to save.</param>
+ /// <param name="xmlPath">A file path where the temporary XML before transformation will be saved. Mostly used for debugging purposes.</param>
+ public void LoadHtmlAsXml(string htmlUrl, string xsltUrl, XsltArgumentList xsltArgs, XmlTextWriter writer,
+ string xmlPath)
+ {
+ if (htmlUrl == null)
+ {
+ throw new ArgumentNullException("htmlUrl");
+ }
+
+ HtmlDocument doc = Load(htmlUrl);
+
+ if (xmlPath != null)
+ {
+ XmlTextWriter w = new XmlTextWriter(xmlPath, doc.Encoding);
+ doc.Save(w);
+ w.Close();
+ }
+ if (xsltArgs == null)
+ {
+ xsltArgs = new XsltArgumentList();
+ }
+
+ // add some useful variables to the xslt doc
+ xsltArgs.AddParam("url", "", htmlUrl);
+ xsltArgs.AddParam("requestDuration", "", RequestDuration);
+ xsltArgs.AddParam("fromCache", "", FromCache);
+
+ XslCompiledTransform xslt = new XslCompiledTransform();
+ xslt.Load(xsltUrl);
+ xslt.Transform(doc, xsltArgs, writer);
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static void FilePreparePath(string target)
+ {
+ if (File.Exists(target))
+ {
+ FileAttributes atts = File.GetAttributes(target);
+ File.SetAttributes(target, atts & ~FileAttributes.ReadOnly);
+ }
+ else
+ {
+ string dir = Path.GetDirectoryName(target);
+ if (!Directory.Exists(dir))
+ {
+ Directory.CreateDirectory(dir);
+ }
+ }
+ }
+
+ private static DateTime RemoveMilliseconds(DateTime t)
+ {
+ return new DateTime(t.Year, t.Month, t.Day, t.Hour, t.Minute, t.Second, 0);
+ }
+
+ // ReSharper disable UnusedMethodReturnValue.Local
+ private static long SaveStream(Stream stream, string path, DateTime touchDate, int streamBufferSize)
+ // ReSharper restore UnusedMethodReturnValue.Local
+ {
+ FilePreparePath(path);
+ FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write);
+ BinaryReader br = null;
+ BinaryWriter bw = null;
+ long len = 0;
+ try
+ {
+ br = new BinaryReader(stream);
+ bw = new BinaryWriter(fs);
+
+ byte[] buffer;
+ do
+ {
+ buffer = br.ReadBytes(streamBufferSize);
+ len += buffer.Length;
+ if (buffer.Length > 0)
+ {
+ bw.Write(buffer);
+ }
+ } while (buffer.Length > 0);
+ }
+ finally
+ {
+ if (br != null)
+ {
+ br.Close();
+ }
+ if (bw != null)
+ {
+ bw.Flush();
+ bw.Close();
+ }
+ if (fs != null)
+ {
+ fs.Close();
+ }
+ }
+ File.SetLastWriteTime(path, touchDate);
+ return len;
+ }
+
+ private HttpStatusCode Get(Uri uri, string method, string path, HtmlDocument doc, IWebProxy proxy,
+ ICredentials creds)
+ {
+ string cachePath = null;
+ HttpWebRequest req;
+ bool oldFile = false;
+
+ req = WebRequest.Create(uri) as HttpWebRequest;
+ req.Method = method;
+
+ if (proxy != null)
+ {
+ if (creds != null)
+ {
+ proxy.Credentials = creds;
+ req.Credentials = creds;
+ }
+ else
+ {
+ proxy.Credentials = CredentialCache.DefaultCredentials;
+ req.Credentials = CredentialCache.DefaultCredentials;
+ }
+ req.Proxy = proxy;
+ }
+
+ _fromCache = false;
+ _requestDuration = 0;
+ int tc = Environment.TickCount;
+ if (UsingCache)
+ {
+ cachePath = GetCachePath(req.RequestUri);
+ if (File.Exists(cachePath))
+ {
+ req.IfModifiedSince = File.GetLastAccessTime(cachePath);
+ oldFile = true;
+ }
+ }
+
+ if (_cacheOnly)
+ {
+ if (!File.Exists(cachePath))
+ {
+ throw new HtmlWebException("File was not found at cache path: '" + cachePath + "'");
+ }
+
+ if (path != null)
+ {
+ IOLibrary.CopyAlways(cachePath, path);
+ // touch the file
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ _fromCache = true;
+ return HttpStatusCode.NotModified;
+ }
+
+ if (_useCookies)
+ {
+ req.CookieContainer = new CookieContainer();
+ }
+
+ if (PreRequest != null)
+ {
+ // allow our user to change the request at will
+ if (!PreRequest(req))
+ {
+ return HttpStatusCode.ResetContent;
+ }
+
+ // dump cookie
+ // if (_useCookies)
+ // {
+ // foreach(Cookie cookie in req.CookieContainer.GetCookies(req.RequestUri))
+ // {
+ // HtmlLibrary.Trace("Cookie " + cookie.Name + "=" + cookie.Value + " path=" + cookie.Path + " domain=" + cookie.Domain);
+ // }
+ // }
+ }
+
+ HttpWebResponse resp;
+
+ try
+ {
+ resp = req.GetResponse() as HttpWebResponse;
+ }
+ catch (WebException we)
+ {
+ _requestDuration = Environment.TickCount - tc;
+ resp = (HttpWebResponse)we.Response;
+ if (resp == null)
+ {
+ if (oldFile)
+ {
+ if (path != null)
+ {
+ IOLibrary.CopyAlways(cachePath, path);
+ // touch the file
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ return HttpStatusCode.NotModified;
+ }
+ throw;
+ }
+ }
+ catch (Exception)
+ {
+ _requestDuration = Environment.TickCount - tc;
+ throw;
+ }
+
+ // allow our user to get some info from the response
+ if (PostResponse != null)
+ {
+ PostResponse(req, resp);
+ }
+
+ _requestDuration = Environment.TickCount - tc;
+ _responseUri = resp.ResponseUri;
+
+ bool html = IsHtmlContent(resp.ContentType);
+ Encoding respenc;
+
+ if ((resp.ContentEncoding != null) && (resp.ContentEncoding.Length > 0))
+ {
+ respenc = Encoding.GetEncoding(resp.ContentEncoding);
+ }
+ else
+ {
+ respenc = null;
+ }
+
+ if (resp.StatusCode == HttpStatusCode.NotModified)
+ {
+ if (UsingCache)
+ {
+ _fromCache = true;
+ if (path != null)
+ {
+ IOLibrary.CopyAlways(cachePath, path);
+ // touch the file
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ return resp.StatusCode;
+ }
+ else
+ {
+ // this should *never* happen...
+ throw new HtmlWebException("Server has send a NotModifed code, without cache enabled.");
+ }
+ }
+ Stream s = resp.GetResponseStream();
+ if (s != null)
+ {
+ if (UsingCache)
+ {
+ // NOTE: LastModified does not contain milliseconds, so we remove them to the file
+ SaveStream(s, cachePath, RemoveMilliseconds(resp.LastModified), _streamBufferSize);
+
+ // save headers
+ SaveCacheHeaders(req.RequestUri, resp);
+
+ if (path != null)
+ {
+ // copy and touch the file
+ IOLibrary.CopyAlways(cachePath, path);
+ File.SetLastWriteTime(path, File.GetLastWriteTime(cachePath));
+ }
+ }
+ else
+ {
+ // try to work in-memory
+ if ((doc != null) && (html))
+ {
+ if (respenc != null)
+ {
+ doc.Load(s, respenc);
+ }
+ else
+ {
+ doc.Load(s, true);
+ }
+ }
+ }
+ resp.Close();
+ }
+ return resp.StatusCode;
+ }
+
+ private string GetCacheHeader(Uri requestUri, string name, string def)
+ {
+ // note: some headers are collection (ex: www-authenticate)
+ // we don't handle that here
+ XmlDocument doc = new XmlDocument();
+ doc.Load(GetCacheHeadersPath(requestUri));
+ XmlNode node =
+ doc.SelectSingleNode("//h[translate(@n, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='" +
+ name.ToUpper() + "']");
+ if (node == null)
+ {
+ return def;
+ }
+ // attribute should exist
+ return node.Attributes[name].Value;
+ }
+
+ private string GetCacheHeadersPath(Uri uri)
+ {
+ //return Path.Combine(GetCachePath(uri), ".h.xml");
+ return GetCachePath(uri) + ".h.xml";
+ }
+
+ private bool IsCacheHtmlContent(string path)
+ {
+ string ct = GetContentTypeForExtension(Path.GetExtension(path), null);
+ return IsHtmlContent(ct);
+ }
+
+ private bool IsHtmlContent(string contentType)
+ {
+ return contentType.ToLower().StartsWith("text/html");
+ }
+
+ private HtmlDocument LoadUrl(Uri uri, string method, WebProxy proxy, NetworkCredential creds)
+ {
+ HtmlDocument doc = new HtmlDocument();
+ doc.OptionAutoCloseOnEnd = false;
+ doc.OptionFixNestedTags = true;
+ _statusCode = Get(uri, method, null, doc, proxy, creds);
+ if (_statusCode == HttpStatusCode.NotModified)
+ {
+ // read cached encoding
+ doc.DetectEncodingAndLoad(GetCachePath(uri));
+ }
+ return doc;
+ }
+
+ private void SaveCacheHeaders(Uri requestUri, HttpWebResponse resp)
+ {
+ // we cache the original headers aside the cached document.
+ string file = GetCacheHeadersPath(requestUri);
+ XmlDocument doc = new XmlDocument();
+ doc.LoadXml("<c></c>");
+ XmlNode cache = doc.FirstChild;
+ foreach (string header in resp.Headers)
+ {
+ XmlNode entry = doc.CreateElement("h");
+ XmlAttribute att = doc.CreateAttribute("n");
+ att.Value = header;
+ entry.Attributes.Append(att);
+
+ att = doc.CreateAttribute("v");
+ att.Value = resp.Headers[header];
+ entry.Attributes.Append(att);
+
+ cache.AppendChild(entry);
+ }
+ doc.Save(file);
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/HtmlWebException.cs b/docs/HtmlAgilityPack/HtmlWebException.cs
new file mode 100644
index 00000000000..6896257facc
--- /dev/null
+++ b/docs/HtmlAgilityPack/HtmlWebException.cs
@@ -0,0 +1,24 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents an exception thrown by the HtmlWeb utility class.
+ /// </summary>
+ public class HtmlWebException : Exception
+ {
+ #region Constructors
+
+ /// <summary>
+ /// Creates an instance of the HtmlWebException.
+ /// </summary>
+ /// <param name="message">The exception's message.</param>
+ public HtmlWebException(string message)
+ : base(message)
+ {
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/IOLibrary.cs b/docs/HtmlAgilityPack/IOLibrary.cs
new file mode 100644
index 00000000000..031040ded9a
--- /dev/null
+++ b/docs/HtmlAgilityPack/IOLibrary.cs
@@ -0,0 +1,28 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System.IO;
+
+namespace HtmlAgilityPack
+{
+ internal struct IOLibrary
+ {
+ #region Internal Methods
+
+ internal static void CopyAlways(string source, string target)
+ {
+ if (!File.Exists(source))
+ return;
+ Directory.CreateDirectory(Path.GetDirectoryName(target));
+ MakeWritable(target);
+ File.Copy(source, target, true);
+ }
+
+ internal static void MakeWritable(string path)
+ {
+ if (!File.Exists(path))
+ return;
+ File.SetAttributes(path, File.GetAttributes(path) & ~FileAttributes.ReadOnly);
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/LICENSE b/docs/HtmlAgilityPack/LICENSE
new file mode 100644
index 00000000000..79629b21e3a
--- /dev/null
+++ b/docs/HtmlAgilityPack/LICENSE
@@ -0,0 +1,27 @@
+Microsoft Permissive License (Ms-PL)
+
+ This license governs use of the accompanying software. If you use the software, you accept this license. If you do not accept the license, do not use the software.
+
+1. Definitions
+
+ The terms reproduce, reproduction, derivative works, and distribution have the same meaning here as under U.S. copyright law.
+ A contribution is the original software, or any additions or changes to the software.
+ A contributor is any person that distributes its contribution under this license.
+ Licensed patents are a contributors patent claims that read directly on its contribution.
+
+2. Grant of Rights
+
+ (A) Copyright Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free copyright license to reproduce its contribution, prepare derivative works of its contribution, and distribute its contribution or any derivative works that you create.
+ (B) Patent Grant- Subject to the terms of this license, including the license conditions and limitations in section 3, each contributor grants you a non-exclusive, worldwide, royalty-free license under its licensed patents to make, have made, use, sell, offer for sale, import, and/or otherwise dispose of its contribution in the software or derivative works of the contribution in the software.
+
+3. Conditions and Limitations
+
+ (A) No Trademark License- This license does not grant you rights to use any contributors name, logo, or trademarks.
+ (B) If you bring a patent claim against any contributor over patents that you claim are infringed by the software, your patent license from such contributor to the software ends automatically.
+ (C) If you distribute any portion of the software, you must retain all copyright, patent, trademark, and attribution notices that are present in the software.
+ (D) If you distribute any portion of the software in source code form, you may do so only under this license by including a complete copy of this license with your distribution. If you distribute any portion of the software in compiled or object code form, you may only do so under a license that complies with this license.
+ (E) The software is licensed as-is. You bear the risk of using it. The contributors give no express warranties, guarantees or conditions. You may have additional consumer rights under your local laws which this license cannot change. To the extent permitted under your local laws, the contributors exclude the implied warranties of merchantability, fitness for a particular purpose and non-infringement.
+ (F) If you distribute the software or derivative works with programs you develop, you agree to indemnify, defend, and hold harmless all contributors from any claims, including attorneys fees, related to the distribution or use of your programs. For clarity, you have no such obligations to a contributor for any claims based solely on the unmodified contributions of that contributor.
+ (G) If you make any additions or changes to the original software, you may only distribute them under a new namespace. In addition, you will clearly identify your changes or additions as your own.
+
+
diff --git a/docs/HtmlAgilityPack/MixedCodeDocument.cs b/docs/HtmlAgilityPack/MixedCodeDocument.cs
new file mode 100644
index 00000000000..f12ac4521bc
--- /dev/null
+++ b/docs/HtmlAgilityPack/MixedCodeDocument.cs
@@ -0,0 +1,453 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.IO;
+using System.Text;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a document with mixed code and text. ASP, ASPX, JSP, are good example of such documents.
+ /// </summary>
+ public class MixedCodeDocument
+ {
+ #region Fields
+
+ private int _c;
+ internal MixedCodeDocumentFragmentList _codefragments;
+ private MixedCodeDocumentFragment _currentfragment;
+ internal MixedCodeDocumentFragmentList _fragments;
+ private int _index;
+ private int _line;
+ private int _lineposition;
+ private ParseState _state;
+ private Encoding _streamencoding;
+ internal string _text;
+ internal MixedCodeDocumentFragmentList _textfragments;
+
+ /// <summary>
+ /// Gets or sets the token representing code end.
+ /// </summary>
+ public string TokenCodeEnd = "%>";
+
+ /// <summary>
+ /// Gets or sets the token representing code start.
+ /// </summary>
+ public string TokenCodeStart = "<%";
+
+ /// <summary>
+ /// Gets or sets the token representing code directive.
+ /// </summary>
+ public string TokenDirective = "@";
+
+ /// <summary>
+ /// Gets or sets the token representing response write directive.
+ /// </summary>
+ public string TokenResponseWrite = "Response.Write ";
+
+
+ private string TokenTextBlock = "TextBlock({0})";
+
+ #endregion
+
+ #region Constructors
+
+ /// <summary>
+ /// Creates a mixed code document instance.
+ /// </summary>
+ public MixedCodeDocument()
+ {
+ _codefragments = new MixedCodeDocumentFragmentList(this);
+ _textfragments = new MixedCodeDocumentFragmentList(this);
+ _fragments = new MixedCodeDocumentFragmentList(this);
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the code represented by the mixed code document seen as a template.
+ /// </summary>
+ public string Code
+ {
+ get
+ {
+ string s = "";
+ int i = 0;
+ foreach (MixedCodeDocumentFragment frag in _fragments)
+ {
+ switch (frag._type)
+ {
+ case MixedCodeDocumentFragmentType.Text:
+ s += TokenResponseWrite + string.Format(TokenTextBlock, i) + "\n";
+ i++;
+ break;
+
+ case MixedCodeDocumentFragmentType.Code:
+ s += ((MixedCodeDocumentCodeFragment) frag).Code + "\n";
+ break;
+ }
+ }
+ return s;
+ }
+ }
+
+ /// <summary>
+ /// Gets the list of code fragments in the document.
+ /// </summary>
+ public MixedCodeDocumentFragmentList CodeFragments
+ {
+ get { return _codefragments; }
+ }
+
+ /// <summary>
+ /// Gets the list of all fragments in the document.
+ /// </summary>
+ public MixedCodeDocumentFragmentList Fragments
+ {
+ get { return _fragments; }
+ }
+
+ /// <summary>
+ /// Gets the encoding of the stream used to read the document.
+ /// </summary>
+ public Encoding StreamEncoding
+ {
+ get { return _streamencoding; }
+ }
+
+ /// <summary>
+ /// Gets the list of text fragments in the document.
+ /// </summary>
+ public MixedCodeDocumentFragmentList TextFragments
+ {
+ get { return _textfragments; }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Create a code fragment instances.
+ /// </summary>
+ /// <returns>The newly created code fragment instance.</returns>
+ public MixedCodeDocumentCodeFragment CreateCodeFragment()
+ {
+ return (MixedCodeDocumentCodeFragment) CreateFragment(MixedCodeDocumentFragmentType.Code);
+ }
+
+ /// <summary>
+ /// Create a text fragment instances.
+ /// </summary>
+ /// <returns>The newly created text fragment instance.</returns>
+ public MixedCodeDocumentTextFragment CreateTextFragment()
+ {
+ return (MixedCodeDocumentTextFragment) CreateFragment(MixedCodeDocumentFragmentType.Text);
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ public void Load(Stream stream)
+ {
+ Load(new StreamReader(stream));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(Stream stream, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Load(Stream stream, Encoding encoding)
+ {
+ Load(new StreamReader(stream, encoding));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a stream.
+ /// </summary>
+ /// <param name="stream">The input stream.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(Stream stream, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ Load(new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks, buffersize));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ public void Load(string path)
+ {
+ Load(new StreamReader(path));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(path, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Load(string path, Encoding encoding)
+ {
+ Load(new StreamReader(path, encoding));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks)
+ {
+ Load(new StreamReader(path, encoding, detectEncodingFromByteOrderMarks));
+ }
+
+ /// <summary>
+ /// Loads a mixed code document from a file.
+ /// </summary>
+ /// <param name="path">The complete file path to be read.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ /// <param name="detectEncodingFromByteOrderMarks">Indicates whether to look for byte order marks at the beginning of the file.</param>
+ /// <param name="buffersize">The minimum buffer size.</param>
+ public void Load(string path, Encoding encoding, bool detectEncodingFromByteOrderMarks, int buffersize)
+ {
+ Load(new StreamReader(path, encoding, detectEncodingFromByteOrderMarks, buffersize));
+ }
+
+ /// <summary>
+ /// Loads the mixed code document from the specified TextReader.
+ /// </summary>
+ /// <param name="reader">The TextReader used to feed the HTML data into the document.</param>
+ public void Load(TextReader reader)
+ {
+ _codefragments.Clear();
+ _textfragments.Clear();
+
+ // all pseudo constructors get down to this one
+ StreamReader sr = reader as StreamReader;
+ if (sr != null)
+ {
+ _streamencoding = sr.CurrentEncoding;
+ }
+
+ _text = reader.ReadToEnd();
+ reader.Close();
+ Parse();
+ }
+
+ /// <summary>
+ /// Loads a mixed document from a text
+ /// </summary>
+ /// <param name="html">The text to load.</param>
+ public void LoadHtml(string html)
+ {
+ Load(new StringReader(html));
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save.</param>
+ public void Save(Stream outStream)
+ {
+ StreamWriter sw = new StreamWriter(outStream, GetOutEncoding());
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified stream.
+ /// </summary>
+ /// <param name="outStream">The stream to which you want to save.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Save(Stream outStream, Encoding encoding)
+ {
+ StreamWriter sw = new StreamWriter(outStream, encoding);
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document.</param>
+ public void Save(string filename)
+ {
+ StreamWriter sw = new StreamWriter(filename, false, GetOutEncoding());
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified file.
+ /// </summary>
+ /// <param name="filename">The location of the file where you want to save the document.</param>
+ /// <param name="encoding">The character encoding to use.</param>
+ public void Save(string filename, Encoding encoding)
+ {
+ StreamWriter sw = new StreamWriter(filename, false, encoding);
+ Save(sw);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified StreamWriter.
+ /// </summary>
+ /// <param name="writer">The StreamWriter to which you want to save.</param>
+ public void Save(StreamWriter writer)
+ {
+ Save((TextWriter) writer);
+ }
+
+ /// <summary>
+ /// Saves the mixed document to the specified TextWriter.
+ /// </summary>
+ /// <param name="writer">The TextWriter to which you want to save.</param>
+ public void Save(TextWriter writer)
+ {
+ writer.Flush();
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal MixedCodeDocumentFragment CreateFragment(MixedCodeDocumentFragmentType type)
+ {
+ switch (type)
+ {
+ case MixedCodeDocumentFragmentType.Text:
+ return new MixedCodeDocumentTextFragment(this);
+
+ case MixedCodeDocumentFragmentType.Code:
+ return new MixedCodeDocumentCodeFragment(this);
+
+ default:
+ throw new NotSupportedException();
+ }
+ }
+
+ internal Encoding GetOutEncoding()
+ {
+ if (_streamencoding != null)
+ return _streamencoding;
+ return Encoding.Default;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void IncrementPosition()
+ {
+ _index++;
+ if (_c == 10)
+ {
+ _lineposition = 1;
+ _line++;
+ }
+ else
+ _lineposition++;
+ }
+
+ private void Parse()
+ {
+ _state = ParseState.Text;
+ _index = 0;
+ _currentfragment = CreateFragment(MixedCodeDocumentFragmentType.Text);
+
+ while (_index < _text.Length)
+ {
+ _c = _text[_index];
+ IncrementPosition();
+
+ switch (_state)
+ {
+ case ParseState.Text:
+ if (_index + TokenCodeStart.Length < _text.Length)
+ {
+ if (_text.Substring(_index - 1, TokenCodeStart.Length) == TokenCodeStart)
+ {
+ _state = ParseState.Code;
+ _currentfragment.Length = _index - 1 - _currentfragment.Index;
+ _currentfragment = CreateFragment(MixedCodeDocumentFragmentType.Code);
+ SetPosition();
+ continue;
+ }
+ }
+ break;
+
+ case ParseState.Code:
+ if (_index + TokenCodeEnd.Length < _text.Length)
+ {
+ if (_text.Substring(_index - 1, TokenCodeEnd.Length) == TokenCodeEnd)
+ {
+ _state = ParseState.Text;
+ _currentfragment.Length = _index + TokenCodeEnd.Length - _currentfragment.Index;
+ _index += TokenCodeEnd.Length;
+ _lineposition += TokenCodeEnd.Length;
+ _currentfragment = CreateFragment(MixedCodeDocumentFragmentType.Text);
+ SetPosition();
+ continue;
+ }
+ }
+ break;
+ }
+ }
+
+ _currentfragment.Length = _index - _currentfragment.Index;
+ }
+
+ private void SetPosition()
+ {
+ _currentfragment.Line = _line;
+ _currentfragment._lineposition = _lineposition;
+ _currentfragment.Index = _index - 1;
+ _currentfragment.Length = 0;
+ }
+
+ #endregion
+
+ #region Nested type: ParseState
+
+ private enum ParseState
+ {
+ Text,
+ Code
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs b/docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs
new file mode 100644
index 00000000000..f74b2f3268e
--- /dev/null
+++ b/docs/HtmlAgilityPack/MixedCodeDocumentCodeFragment.cs
@@ -0,0 +1,51 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a fragment of code in a mixed code document.
+ /// </summary>
+ public class MixedCodeDocumentCodeFragment : MixedCodeDocumentFragment
+ {
+ #region Fields
+
+ private string _code;
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentCodeFragment(MixedCodeDocument doc)
+ :
+ base(doc, MixedCodeDocumentFragmentType.Code)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the fragment code text.
+ /// </summary>
+ public string Code
+ {
+ get
+ {
+ if (_code == null)
+ {
+ _code = FragmentText.Substring(Doc.TokenCodeStart.Length,
+ FragmentText.Length - Doc.TokenCodeEnd.Length -
+ Doc.TokenCodeStart.Length - 1).Trim();
+ if (_code.StartsWith("="))
+ {
+ _code = Doc.TokenResponseWrite + _code.Substring(1, _code.Length - 1);
+ }
+ }
+ return _code;
+ }
+ set { _code = value; }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs b/docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs
new file mode 100644
index 00000000000..cfd268e0795
--- /dev/null
+++ b/docs/HtmlAgilityPack/MixedCodeDocumentFragment.cs
@@ -0,0 +1,95 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a base class for fragments in a mixed code document.
+ /// </summary>
+ public abstract class MixedCodeDocumentFragment
+ {
+ #region Fields
+
+ internal MixedCodeDocument Doc;
+ private string _fragmentText;
+ internal int Index;
+ internal int Length;
+ private int _line;
+ internal int _lineposition;
+ internal MixedCodeDocumentFragmentType _type;
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentFragment(MixedCodeDocument doc, MixedCodeDocumentFragmentType type)
+ {
+ Doc = doc;
+ _type = type;
+ switch (type)
+ {
+ case MixedCodeDocumentFragmentType.Text:
+ Doc._textfragments.Append(this);
+ break;
+
+ case MixedCodeDocumentFragmentType.Code:
+ Doc._codefragments.Append(this);
+ break;
+ }
+ Doc._fragments.Append(this);
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the fragement text.
+ /// </summary>
+ public string FragmentText
+ {
+ get
+ {
+ if (_fragmentText == null)
+ {
+ _fragmentText = Doc._text.Substring(Index, Length);
+ }
+ return FragmentText;
+ }
+ internal set { _fragmentText = value; }
+ }
+
+ /// <summary>
+ /// Gets the type of fragment.
+ /// </summary>
+ public MixedCodeDocumentFragmentType FragmentType
+ {
+ get { return _type; }
+ }
+
+ /// <summary>
+ /// Gets the line number of the fragment.
+ /// </summary>
+ public int Line
+ {
+ get { return _line; }
+ internal set { _line = value; }
+ }
+
+ /// <summary>
+ /// Gets the line position (column) of the fragment.
+ /// </summary>
+ public int LinePosition
+ {
+ get { return _lineposition; }
+ }
+
+ /// <summary>
+ /// Gets the fragment position in the document's stream.
+ /// </summary>
+ public int StreamPosition
+ {
+ get { return Index; }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs
new file mode 100644
index 00000000000..4a4a41a2f08
--- /dev/null
+++ b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentList.cs
@@ -0,0 +1,236 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a list of mixed code fragments.
+ /// </summary>
+ public class MixedCodeDocumentFragmentList : IEnumerable
+ {
+ #region Fields
+
+ private MixedCodeDocument _doc;
+ private ArrayList _items = new ArrayList();
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentFragmentList(MixedCodeDocument doc)
+ {
+ _doc = doc;
+ }
+
+ #endregion
+
+ #region Properties
+
+ ///<summary>
+ /// Gets the Document
+ ///</summary>
+ public MixedCodeDocument Doc
+ {
+ get { return _doc; }
+ }
+
+ /// <summary>
+ /// Gets the number of fragments contained in the list.
+ /// </summary>
+ public int Count
+ {
+ get { return _items.Count; }
+ }
+
+ /// <summary>
+ /// Gets a fragment from the list using its index.
+ /// </summary>
+ public MixedCodeDocumentFragment this[int index]
+ {
+ get { return _items[index] as MixedCodeDocumentFragment; }
+ }
+
+ #endregion
+
+ #region IEnumerable Members
+
+ /// <summary>
+ /// Gets an enumerator that can iterate through the fragment list.
+ /// </summary>
+ IEnumerator IEnumerable.GetEnumerator()
+ {
+ return GetEnumerator();
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Appends a fragment to the list of fragments.
+ /// </summary>
+ /// <param name="newFragment">The fragment to append. May not be null.</param>
+ public void Append(MixedCodeDocumentFragment newFragment)
+ {
+ if (newFragment == null)
+ {
+ throw new ArgumentNullException("newFragment");
+ }
+ _items.Add(newFragment);
+ }
+
+ /// <summary>
+ /// Gets an enumerator that can iterate through the fragment list.
+ /// </summary>
+ public MixedCodeDocumentFragmentEnumerator GetEnumerator()
+ {
+ return new MixedCodeDocumentFragmentEnumerator(_items);
+ }
+
+ /// <summary>
+ /// Prepends a fragment to the list of fragments.
+ /// </summary>
+ /// <param name="newFragment">The fragment to append. May not be null.</param>
+ public void Prepend(MixedCodeDocumentFragment newFragment)
+ {
+ if (newFragment == null)
+ {
+ throw new ArgumentNullException("newFragment");
+ }
+ _items.Insert(0, newFragment);
+ }
+
+ /// <summary>
+ /// Remove a fragment from the list of fragments. If this fragment was not in the list, an exception will be raised.
+ /// </summary>
+ /// <param name="fragment">The fragment to remove. May not be null.</param>
+ public void Remove(MixedCodeDocumentFragment fragment)
+ {
+ if (fragment == null)
+ {
+ throw new ArgumentNullException("fragment");
+ }
+ int index = GetFragmentIndex(fragment);
+ if (index == -1)
+ {
+ throw new IndexOutOfRangeException();
+ }
+ RemoveAt(index);
+ }
+
+ /// <summary>
+ /// Remove all fragments from the list.
+ /// </summary>
+ public void RemoveAll()
+ {
+ _items.Clear();
+ }
+
+ /// <summary>
+ /// Remove a fragment from the list of fragments, using its index in the list.
+ /// </summary>
+ /// <param name="index">The index of the fragment to remove.</param>
+ public void RemoveAt(int index)
+ {
+ //MixedCodeDocumentFragment frag = (MixedCodeDocumentFragment) _items[index];
+ _items.RemoveAt(index);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal void Clear()
+ {
+ _items.Clear();
+ }
+
+ internal int GetFragmentIndex(MixedCodeDocumentFragment fragment)
+ {
+ if (fragment == null)
+ {
+ throw new ArgumentNullException("fragment");
+ }
+ for (int i = 0; i < _items.Count; i++)
+ {
+ if ((_items[i]) == fragment)
+ {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ #endregion
+
+ #region Nested type: MixedCodeDocumentFragmentEnumerator
+
+ /// <summary>
+ /// Represents a fragment enumerator.
+ /// </summary>
+ public class MixedCodeDocumentFragmentEnumerator : IEnumerator
+ {
+ #region Fields
+
+ private int _index;
+ private ArrayList _items;
+
+ #endregion
+
+ #region Constructors
+
+ internal MixedCodeDocumentFragmentEnumerator(ArrayList items)
+ {
+ _items = items;
+ _index = -1;
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the current element in the collection.
+ /// </summary>
+ public MixedCodeDocumentFragment Current
+ {
+ get { return (MixedCodeDocumentFragment) (_items[_index]); }
+ }
+
+ #endregion
+
+ #region IEnumerator Members
+
+ /// <summary>
+ /// Gets the current element in the collection.
+ /// </summary>
+ object IEnumerator.Current
+ {
+ get { return (Current); }
+ }
+
+ /// <summary>
+ /// Advances the enumerator to the next element of the collection.
+ /// </summary>
+ /// <returns>true if the enumerator was successfully advanced to the next element; false if the enumerator has passed the end of the collection.</returns>
+ public bool MoveNext()
+ {
+ _index++;
+ return (_index < _items.Count);
+ }
+
+ /// <summary>
+ /// Sets the enumerator to its initial position, which is before the first element in the collection.
+ /// </summary>
+ public void Reset()
+ {
+ _index = -1;
+ }
+
+ #endregion
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs
new file mode 100644
index 00000000000..28ca5421f88
--- /dev/null
+++ b/docs/HtmlAgilityPack/MixedCodeDocumentFragmentType.cs
@@ -0,0 +1,19 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents the type of fragment in a mixed code document.
+ /// </summary>
+ public enum MixedCodeDocumentFragmentType
+ {
+ /// <summary>
+ /// The fragment contains code.
+ /// </summary>
+ Code,
+
+ /// <summary>
+ /// The fragment contains text.
+ /// </summary>
+ Text,
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs b/docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs
new file mode 100644
index 00000000000..8aa3cdd91cc
--- /dev/null
+++ b/docs/HtmlAgilityPack/MixedCodeDocumentTextFragment.cs
@@ -0,0 +1,32 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// Represents a fragment of text in a mixed code document.
+ /// </summary>
+ public class MixedCodeDocumentTextFragment : MixedCodeDocumentFragment
+ {
+ #region Constructors
+
+ internal MixedCodeDocumentTextFragment(MixedCodeDocument doc)
+ :
+ base(doc, MixedCodeDocumentFragmentType.Text)
+ {
+ }
+
+ #endregion
+
+ #region Properties
+
+ /// <summary>
+ /// Gets the fragment text.
+ /// </summary>
+ public string Text
+ {
+ get { return FragmentText; }
+ set { FragmentText = value; }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/NameValuePair.cs b/docs/HtmlAgilityPack/NameValuePair.cs
new file mode 100644
index 00000000000..8b7036363ca
--- /dev/null
+++ b/docs/HtmlAgilityPack/NameValuePair.cs
@@ -0,0 +1,35 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ internal class NameValuePair
+ {
+ #region Fields
+
+ internal readonly string Name;
+ internal string Value;
+
+ #endregion
+
+ #region Constructors
+
+ internal NameValuePair()
+ {
+ }
+
+ internal NameValuePair(string name)
+ :
+ this()
+ {
+ Name = name;
+ }
+
+ internal NameValuePair(string name, string value)
+ :
+ this(name)
+ {
+ Value = value;
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/NameValuePairList.cs b/docs/HtmlAgilityPack/NameValuePairList.cs
new file mode 100644
index 00000000000..f4776e9c758
--- /dev/null
+++ b/docs/HtmlAgilityPack/NameValuePairList.cs
@@ -0,0 +1,101 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+using System;
+using System.Collections;
+
+namespace HtmlAgilityPack
+{
+ internal class NameValuePairList
+ {
+ #region Fields
+
+ internal readonly string Text;
+ private ArrayList _allPairs;
+ private Hashtable _pairsWithName;
+
+ #endregion
+
+ #region Constructors
+
+ internal NameValuePairList() :
+ this(null)
+ {
+ }
+
+ internal NameValuePairList(string text)
+ {
+ Text = text;
+ _allPairs = new ArrayList();
+ _pairsWithName = new Hashtable();
+
+ Parse(text);
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal static string GetNameValuePairsValue(string text, string name)
+ {
+ NameValuePairList l = new NameValuePairList(text);
+ return l.GetNameValuePairValue(name);
+ }
+
+ internal ArrayList GetNameValuePairs(string name)
+ {
+ if (name == null)
+ return _allPairs;
+ return _pairsWithName[name] as ArrayList;
+ }
+
+ internal string GetNameValuePairValue(string name)
+ {
+ if (name == null)
+ throw new ArgumentNullException();
+ ArrayList al = GetNameValuePairs(name);
+ if (al == null)
+ return null;
+
+ // return first item
+ NameValuePair nvp = al[0] as NameValuePair;
+ return nvp != null ? nvp.Value : string.Empty;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private void Parse(string text)
+ {
+ _allPairs.Clear();
+ _pairsWithName.Clear();
+ if (text == null)
+ return;
+
+ string[] p = text.Split(';');
+ foreach (string pv in p)
+ {
+ if (pv.Length == 0)
+ continue;
+ string[] onep = pv.Split(new char[] {'='}, 2);
+ if (onep.Length==0)
+ continue;
+ NameValuePair nvp = new NameValuePair(onep[0].Trim().ToLower());
+
+ nvp.Value = onep.Length < 2 ? "" : onep[1];
+
+ _allPairs.Add(nvp);
+
+ // index by name
+ ArrayList al = _pairsWithName[nvp.Name] as ArrayList;
+ if (al == null)
+ {
+ al = new ArrayList();
+ _pairsWithName[nvp.Name] = al;
+ }
+ al.Add(nvp);
+ }
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/HtmlAgilityPack/crc32.cs b/docs/HtmlAgilityPack/crc32.cs
new file mode 100644
index 00000000000..4cc627ba7fd
--- /dev/null
+++ b/docs/HtmlAgilityPack/crc32.cs
@@ -0,0 +1,156 @@
+// HtmlAgilityPack V1.0 - Simon Mourier <simon underscore mourier at hotmail dot com>
+namespace HtmlAgilityPack
+{
+ /// <summary>
+ /// A utility class to compute CRC32.
+ /// </summary>
+ public class Crc32
+ {
+ #region Fields
+
+ private uint _crc32;
+
+ #endregion
+
+ #region Static Members
+
+ private static uint[] crc_32_tab = // CRC polynomial 0xedb88320
+ {
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+ };
+
+ #endregion
+
+ #region Properties
+
+ internal uint CheckSum
+ {
+ get { return _crc32; }
+ set { _crc32 = value; }
+ }
+
+ #endregion
+
+ #region Public Methods
+
+ /// <summary>
+ /// Compute a checksum for a given array of bytes.
+ /// </summary>
+ /// <param name="bytes">The array of bytes to compute the checksum for.</param>
+ /// <returns>The computed checksum.</returns>
+ public static uint CRC32Bytes(byte[] bytes)
+ {
+ uint oldcrc32;
+ oldcrc32 = 0xFFFFFFFF;
+ int len = bytes.Length;
+
+ for (int i = 0; len > 0; i++)
+ {
+ --len;
+ oldcrc32 = UPDC32(bytes[len], oldcrc32);
+ }
+ return ~oldcrc32;
+ }
+
+ /// <summary>
+ /// Compute a checksum for a given string.
+ /// </summary>
+ /// <param name="text">The string to compute the checksum for.</param>
+ /// <returns>The computed checksum.</returns>
+ public static uint CRC32String(string text)
+ {
+ uint oldcrc32;
+ oldcrc32 = 0xFFFFFFFF;
+ int len = text.Length;
+ ushort uCharVal;
+ byte lowByte, hiByte;
+
+ for (int i = 0; len > 0; i++)
+ {
+ --len;
+ uCharVal = text[len];
+ unchecked
+ {
+ lowByte = (byte) (uCharVal & 0x00ff);
+ hiByte = (byte) (uCharVal >> 8);
+ }
+ oldcrc32 = UPDC32(hiByte, oldcrc32);
+ oldcrc32 = UPDC32(lowByte, oldcrc32);
+ }
+
+ return ~oldcrc32;
+ }
+
+ #endregion
+
+ #region Internal Methods
+
+ internal uint AddToCRC32(int c)
+ {
+ return AddToCRC32((ushort) c);
+ }
+
+ internal uint AddToCRC32(ushort c)
+ {
+ byte lowByte, hiByte;
+ lowByte = (byte) (c & 0x00ff);
+ hiByte = (byte) (c >> 8);
+ _crc32 = UPDC32(hiByte, _crc32);
+ _crc32 = UPDC32(lowByte, _crc32);
+ return ~_crc32;
+ }
+
+ #endregion
+
+ #region Private Methods
+
+ private static uint UPDC32(byte octet, uint crc)
+ {
+ return (crc_32_tab[((crc) ^ (octet)) & 0xff] ^ ((crc) >> 8));
+ }
+
+ #endregion
+ }
+} \ No newline at end of file
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 44bed21a9ab..639b7537d26 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -13,7 +13,6 @@ ASSEMBLED_DOCS = \
EXTRA_DIST = \
abc-removal.txt \
- AgilityPack.dll \
api-style.css \
assembly-bundle \
check-exports \
@@ -68,12 +67,14 @@ EXTRA_DIST = \
dist-hook:
$(mkdir_p) $(distdir)/sources
$(mkdir_p) $(distdir)/svgs
+ $(mkdir_p) $(distdir)/HtmlAgilityPack
cp sources/* $(distdir)/sources
cp svgs/* $(distdir)/svgs
+ cp HtmlAgilityPack/* $(distdir)/HtmlAgilityPack
clean-local:
-rm -Rf $(srcdir)/html
- -rm -f $(srcdir)/deploy/* $(srcdir)/convert.exe*
+ -rm -f $(srcdir)/deploy/* $(srcdir)/convert.exe* $(srcdir)/AgilityPack.dll*
-cd $(srcdir) && rm -f $(ASSEMBLED_DOCS)
monoapi.zip: monoapi.tree
@@ -101,5 +102,7 @@ $(srcdir)/deploy/.stamp: convert.exe Makefile.am
extract: $(srcdir)/deploy/.stamp
convert.exe: convert.cs AgilityPack.dll
- cd $(srcdir) && $(MAKE) PROFILE=net_1_1 -f docs.make topdir=$(mcs_topdir_from_srcdir) convert.exe
+ cd $(srcdir) && $(MAKE) PROFILE=net_2_0 -f docs.make topdir=$(mcs_topdir_from_srcdir) convert.exe
+AgilityPack.dll:
+ cd $(srcdir) && $(MAKE) PROFILE=net_2_0 -f docs.make topdir=$(mcs_topdir_from_srcdir) AgilityPack.dll
diff --git a/docs/README b/docs/README
index 956c1550bf8..862cd45ae0a 100644
--- a/docs/README
+++ b/docs/README
@@ -64,10 +64,8 @@ PROGRAMS
* convert.cs
Converts an HTML file into a valid XML document, uses the
- AgilityPack.dll. The sources to this DLL live in GNOME CVS
- module beagle/Filters/AgilityPack.
-
- A binary is shipped for our convenience.
+ AgilityPack.dll. The sources to this DLL live in the
+ HtmlAgilityPack folder, and are a prerequisite for convert.exe.
DATAFILES:
---------
diff --git a/docs/docs.make b/docs/docs.make
index 50a001f5f29..7129bcadfc4 100644
--- a/docs/docs.make
+++ b/docs/docs.make
@@ -10,6 +10,9 @@ ASSEMBLED_DOCS = \
convert.exe: convert.cs AgilityPack.dll
$(CSCOMPILE) -out:$@ $< -r:AgilityPack.dll
+AgilityPack.dll:
+ $(CSCOMPILE) -target:library -out:$@ HtmlAgilityPack/*.cs
+
monoapi.zip: monoapi.tree
@test -f $@ || { rm -f $< && $(MAKE) $<; }
monoapi.tree: toc.xml docs.make
diff --git a/mono-core.spec.in b/mono-core.spec.in
index ff7d37e18a9..8cbece9051f 100644
--- a/mono-core.spec.in
+++ b/mono-core.spec.in
@@ -498,6 +498,8 @@ Authors:
%_prefix/lib/mono/gac/RabbitMQ.Client
%_prefix/lib/mono/1.0/RabbitMQ.Client.dll
%_prefix/lib/mono/2.0/RabbitMQ.Client.dll
+%_prefix/lib/mono/1.0/RabbitMQ.Client.Apigen.exe*
+%_prefix/lib/mono/2.0/RabbitMQ.Client.Apigen.exe*
%_prefix/lib/mono/gac/System.Messaging
%_prefix/lib/mono/1.0/System.Messaging.dll
%_prefix/lib/mono/2.0/System.Messaging.dll
diff --git a/mono/metadata/ChangeLog b/mono/metadata/ChangeLog
index d2f843ba728..4c340be491b 100644
--- a/mono/metadata/ChangeLog
+++ b/mono/metadata/ChangeLog
@@ -1,3 +1,344 @@
+2010-01-25 Zoltan Varga <vargaz@gmail.com>
+
+ * icall.c (ves_icall_System_Array_SetValueImpl): Handle nullable types correctly.
+ Fixes #573322.
+
+2010-01-06 Atsushi Enomoto <atsushi@ximian.com>
+
+ * culture-info-table.h : regenerated.
+
+2010-01-21 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * reflection.c (typebuilder_setup_fields): Pretend field setup already
+ happened before starting to encode the actual fields. This avoid ciclic
+ dependencies and eventual crashes.
+
+ Fixes #572660.
+
+ Backport of r150008.
+
+2010-01-21 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * metadata-verify.c (parse_generic_inst): Fail a type signature if it
+ has a recursive reference to itself.
+
+ Fixes #571863.
+
+ Backport of r149969.
+
+2010-01-20 Gonzalo Paniagua Javier <gonzalo@novell.com>
+
+ * icall.c: don't raise AppDomain.TypeResolve when the type is loaded
+ from the current assembly or mscorlib. Fixes bug #322957.
+
+2010-01-19 Sebastien Pouliot <sebastien@ximian.com>
+
+ * security-core-clr.c (mono_security_core_clr_can_access_internals):
+ Handle the case where 'basedir' can be NULL (e.g. SRE assemblies)
+ [Backport r149823]
+
+2010-01-19 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * verify.c (store_local): Better error message.
+
+ Backport of r149845.
+
+2010-01-19 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * icall.c (ves_icall_MonoMethod_GetGenericMethodDefinition): Handle inflated generic methods
+ on a GTD.
+
+ Backport of r149808.
+
+2010-01-18 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * metadata-verify.c (parse_type): Fail a type signature if it has a recursive reference
+ to itself.
+
+ * metadata-verify.c (mono_verifier_verify_typespec_signature): Change signature to take
+ the token as parameter.
+
+ * verify-internals.h: Ditto.
+
+ * metadata.c (mono_type_create_from_typespec): Pass token to verifier.
+
+ Fixes #571460.
+
+ Backport of r149776.
+
+2010-01-18 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_class_from_typeref): Fail loading of self-referencing typeref tokens.
+
+ Fixes #569579.
+
+ Backport of r149760.
+
+2010-01-15 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_class_setup_fields): Guard against unfinished types. This
+ happens only on 2.6 and not trunk because trunk better deals with unfinished types.
+
+2010-01-14 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_type_has_exceptions): Check the generic instance. It can fail
+ independently of the GTD.
+
+ * class.c (mono_class_setup_fields): Fail if field has negative offset.
+
+ * class.c (mono_class_setup_fields): Fail if valuetype has zero size. Add sizeof(MonoObject)
+ to the upper limit since instance_size includes this amount.
+
+ * class.c (mono_class_layout_fields): Check if the types of the static fields have failed.
+
+ Fixes #569544.
+
+ Backport of r149575.
+
+2010-01-12 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_class_get_implemented_interfaces): Now take a MonoError argument.
+
+ * class.c:
+ * cominterop.c:
+ * icall.c:
+ * object.c:
+ * class-internals.h: Adjust for new signature of mono_class_get_implemented_interfaces.
+
+ Backport of r149414.
+
+2010-01-12 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_class_setup_interfaces): Now take a MonoError argument and
+ it can fail loading the type.
+
+ * class.c: Add mono_class_inflate_generic_class_checked.
+
+ * class.c:
+ * verify.c:
+ * class-internals.h: Adjust for new signature of mono_class_setup_interfaces.
+
+ Backport of r149413.
+
+2010-01-11 Zoltan Varga <vargaz@gmail.com>
+
+ * socket-io.c (AI_ADDRCONFIG): Applied patch from John Lightsey (jd@cpanel.net).
+ Fixes build on rh 7.3.
+
+2009-12-16 Zoltan Varga <vargaz@gmail.com>
+
+ * class.c (mono_bounded_array_class_get): Make these classes PUBLIC. Fixes
+ #565120.
+
+2009-12-26 Zoltan Varga <vargaz@gmail.com>
+
+ * monitor.c (ves_icall_System_Threading_Monitor_Monitor_wait): Don't close the
+ wait handle if the wait is interrupted, since it is still in mon->wait_list, and
+ we can't remove it from it since we don't hold the lock.
+ (mon_new): Free the orphaned events here when a mon structure is added to the
+ freelist. Fixes #561239. Thanks to Mike Rieker <wmrieker@nii.net> for tracking
+ this down.
+
+2009-12-26 Zoltan Varga <vargaz@gmail.com>
+
+ * generic-sharing.c (instantiate_other_info): Avoid creating jump trampolines since
+ they cannot be patched. Partly fixes #564408.
+
+2010-01-07 Gonzalo Paniagua Javier <gonzalo@novell.com>
+
+ * assembly.c: fix MONO_PATH debug output.
+
+2010-01-05 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * verify.c (mono_verifier_verify_class): Properly check for broken parent. Ignore
+ types that are meant to not have a parent.
+
+ Backport of r149053.
+
+2010-01-05 Sebastien Pouliot <sebastien@ximian.com>
+
+ * pedump.c: Backport earlier fixes from Rodrigo Kumpera since
+ they are useful for testing ML
+
+2010-01-04 Sebastien Pouliot <sebastien@ximian.com>
+
+ * verify.c (verify_valuetype_layout_with_target): Fix case
+ that can lead to infinite recursion. Fix bug #567861
+ [Backport r149042]
+
+2010-01-04 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (count_virtual_methods): Remove the assert and now
+ fail properly.
+
+ * class.c (setup_interface_offsets): This can fail now.
+
+ * class.c (mono_class_setup_vtable_general): Check for parent vtable
+ errors. Check setup_interface_offsets errors.
+
+ * class.c (setup_interface_offsets): Simplify the return error logic
+ and remove class_init_ok.
+
+ Fixes #560327.
+
+ Backport of r149031.
+
+2010-01-04 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_class_init): Do class verification at the beginning. Add
+ some asserts to avoid tripping into invalid memory.
+
+ * object.c (compute_class_bitmap): Replace a g_assert_not_reached with a
+ g_error and a decent message.
+
+ * verify.c (mono_verifier_verify_class): Verify for invalid super type.
+
+ Fixes #567548.
+
+ Backport of r149028.
+
+2010-01-03 Zoltan Varga <vargaz@gmail.com>
+
+ * marshal.c (mono_marshal_get_runtime_invoke): Fix a memory leak.
+
+2010-01-03 Zoltan Varga <vargaz@gmail.com>
+
+ * locales.c (construct_culture_from_specific_name): Applied patch from
+ José Antonio Sánchez Lázaro <jasl@darcysoft.es>. Fix a crash if a culture was
+ not found. Fixes #567900.
+
+2009-12-31 Sebastien Pouliot <sebastien@ximian.com>
+
+ * loader.c (mono_method_get_signature_full): Remove two asserts.
+ Return NULL instead so that the verifier can handle both cases
+ gracefully. Fix bug #564897
+ [Backport r148951]
+
+2009-12-30 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class.c (mono_class_setup_methods): Use checked version of mono_class_inflate_generic_method_full
+ so we can properly fail types instead of crashing.
+
+ Fixes #567676.
+
+ Backpor of r148948.
+
+2009-12-30 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * marshal.c (mono_mb_emit_restore_result): Properly handle generic enums.
+
+ Backport of r148941.
+
+2009-12-26 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * verify.c (init_stack_with_value_at_exception_boundary): Do stack overflow checking here
+ as max stack might be zero.
+
+ Fixes #562320.
+
+ Backport of r148911.
+
+2009-12-26 Rodrigo Kumpera <rkumpera@novell.com>
+
+ Rework all uses of mono_class_setup_methods to accept that it can fail now.
+
+ * class.c (mono_class_setup_methods): This function now can fail the class. Do so for generic
+ instances if the GTD did.
+
+ * class.c (mono_class_setup_properties): Ditto.
+
+ * class.c (mono_class_setup_events): Ditto.
+
+ * class.c (mono_class_setup_vtable): Fail early if the type is already broken.
+
+ * class.c (mono_class_setup_vtable_general): Add a few more missing broken type checks. Sanitize
+ error setting.
+
+ * class.c (mono_class_init): Fail if GTD did.
+
+ * cominterop.c:
+ * generic-sharing.c:
+ * icall.c:
+ * loader.c:
+ * object.c:
+ * verify.c: Properly handle failure of mono_class_setup_methods.
+
+ Backport of r148905.
+
+2009-12-26 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * class-internals.c: Add mono_class_inflate_generic_method_full_checked and make
+ mono_class_inflate_generic_method_full internal.
+
+ * class.c (inflate_generic_context): Now takes a MonoError argument.
+
+ * class.c (mono_class_inflate_generic_method_full): Now calls the _checked and abort on
+ errors.
+
+ Backport of r148904.
+
+2009-12-26 Zoltan Varga <vargaz@gmail.com>
+
+ * domain.c (mono_domain_free): Backport part of r143047. Free special static
+ fields earlier to avoid crashes if the types they refer to are freed. Fixes
+ #565923.
+
+2009-12-21 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * loader.c (mono_method_get_signature_full): Check if the returned signature is compatible
+ with the one from the original method.
+
+ * metadata-verify.c (mono_verifier_is_sig_compatible): New function to verify signature
+ compatibility.
+
+ * verify-internals.h: Add new function to the internal API.
+
+ Fixes #566295.
+
+ Backport of r148828.
+
+2009-12-18 Dimitar Dobrev <dpldobrev@yahoo.com>
+
+ * culture-info-tables.h: regenerated it to include the Georgian culture.
+
+2009-12-18 Zoltan Varga <vargaz@gmail.com>
+
+ * reflection.c (mono_reflection_get_type_internal_dynamic): Use assembly->domain
+ instead of the current domain, since the two might not match if this is called
+ from the debugger.
+
+ * metadata-internals.h (MonoDynamicAssembly): Add a 'domain' field to specify the
+ domain which created this assembly.
+
+2009-12-17 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * icall.c (ves_icall_Type_GetMethodsByName): Don't pin virtual methods if they are newslot.
+ A private virtual newslot method is used to implement an interface method without exposing
+ it to users. When querying for public instance methods, such method would hide a public one
+ on a parent type.
+
+ Fixes #564379.
+
+ Backport of r148694.
+
+2009-12-17 Zoltan Varga <vargaz@gmail.com>
+
+ * reflection.c (resolve_object): Fix the encoding of unmanaged calling
+ conventions.
+
+2009-12-16 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * reflection.c (mono_type_get_object): Guard against NULL generic param owner.
+
+2009-12-16 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * reflection.c (mono_type_get_object): If the type is VAR or MVAR check
+ if the owner class has not been finished before returning reflection_info.
+
+ Fixes #565127.
+
+ Backport of r148575.
+
2009-12-16 Zoltan Varga <vargaz@gmail.com>
* reflection.c (mono_custom_attrs_from_param): Avoid a crash if a dynamic
diff --git a/mono/metadata/assembly.c b/mono/metadata/assembly.c
index 1e7f733b28f..9cc4d6db3cb 100644
--- a/mono/metadata/assembly.c
+++ b/mono/metadata/assembly.c
@@ -186,6 +186,7 @@ check_path_env (void)
if (g_getenv ("MONO_DEBUG") == NULL)
return;
+ splitted = assemblies_path;
while (*splitted) {
if (**splitted && !g_file_test (*splitted, G_FILE_TEST_IS_DIR))
g_warning ("'%s' in MONO_PATH doesn't exist or has wrong permissions.", *splitted);
diff --git a/mono/metadata/class-internals.h b/mono/metadata/class-internals.h
index b864eceb8ed..b63fef5501e 100644
--- a/mono/metadata/class-internals.h
+++ b/mono/metadata/class-internals.h
@@ -847,7 +847,7 @@ MonoMethod*
mono_class_get_vtable_entry (MonoClass *class, int offset) MONO_INTERNAL;
GPtrArray*
-mono_class_get_implemented_interfaces (MonoClass *klass) MONO_INTERNAL;
+mono_class_get_implemented_interfaces (MonoClass *klass, MonoError *error) MONO_INTERNAL;
int
mono_class_get_vtable_size (MonoClass *klass) MONO_INTERNAL;
@@ -933,7 +933,10 @@ void
mono_method_set_generic_container (MonoMethod *method, MonoGenericContainer* container) MONO_INTERNAL;
MonoMethod*
-mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context);
+mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context) MONO_INTERNAL;
+
+MonoMethod*
+mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context, MonoError *error) MONO_INTERNAL;
MonoMethodInflated*
mono_method_inflated_lookup (MonoMethodInflated* method, gboolean cache) MONO_INTERNAL;
@@ -1244,7 +1247,7 @@ void
mono_class_alloc_ext (MonoClass *klass) MONO_INTERNAL;
void
-mono_class_setup_interfaces (MonoClass *klass) MONO_INTERNAL;
+mono_class_setup_interfaces (MonoClass *klass, MonoError *error) MONO_INTERNAL;
MonoClassField*
mono_class_get_field_from_name_full (MonoClass *klass, const char *name, MonoType *type) MONO_INTERNAL;
diff --git a/mono/metadata/class.c b/mono/metadata/class.c
index 3bf72c012e3..9bc7f4a28ca 100644
--- a/mono/metadata/class.c
+++ b/mono/metadata/class.c
@@ -122,9 +122,15 @@ mono_class_from_typeref (MonoImage *image, guint32 type_token)
return NULL;
}
case MONO_RESOLTION_SCOPE_TYPEREF: {
- MonoClass *enclosing = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | idx);
+ MonoClass *enclosing;
GList *tmp;
+ if (idx == mono_metadata_token_index (type_token)) {
+ mono_loader_set_error_bad_image (g_strdup_printf ("Image %s with self-referencing typeref token %08x.", image->name, type_token));
+ return NULL;
+ }
+
+ enclosing = mono_class_from_typeref (image, MONO_TOKEN_TYPE_REF | idx);
if (!enclosing)
return NULL;
@@ -762,6 +768,21 @@ mono_class_inflate_generic_type_no_copy (MonoImage *image, MonoType *type, MonoG
return inflated;
}
+static MonoClass*
+mono_class_inflate_generic_class_checked (MonoClass *gklass, MonoGenericContext *context, MonoError *error)
+{
+ MonoClass *res;
+ MonoType *inflated;
+
+ inflated = mono_class_inflate_generic_type_checked (&gklass->byval_arg, context, error);
+ if (!mono_error_ok (error))
+ return NULL;
+
+ res = mono_class_from_mono_type (inflated);
+ mono_metadata_free_type (inflated);
+
+ return res;
+}
/*
* mono_class_inflate_generic_class:
*
@@ -772,38 +793,39 @@ mono_class_inflate_generic_class (MonoClass *gklass, MonoGenericContext *context
{
MonoError error;
MonoClass *res;
- MonoType *inflated;
- inflated = mono_class_inflate_generic_type_checked (&gklass->byval_arg, context, &error);
+ res = mono_class_inflate_generic_class_checked (gklass, context, &error);
g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
- res = mono_class_from_mono_type (inflated);
- mono_metadata_free_type (inflated);
-
return res;
}
+
+
static MonoGenericContext
-inflate_generic_context (MonoGenericContext *context, MonoGenericContext *inflate_with)
+inflate_generic_context (MonoGenericContext *context, MonoGenericContext *inflate_with, MonoError *error)
{
- MonoError error;
MonoGenericInst *class_inst = NULL;
MonoGenericInst *method_inst = NULL;
- MonoGenericContext res;
+ MonoGenericContext res = { NULL, NULL };
+
+ mono_error_init (error);
if (context->class_inst) {
- class_inst = mono_metadata_inflate_generic_inst (context->class_inst, inflate_with, &error);
- g_assert (mono_error_ok (&error)); /*FIXME do proper error handling*/
+ class_inst = mono_metadata_inflate_generic_inst (context->class_inst, inflate_with, error);
+ if (!mono_error_ok (error))
+ goto fail;
}
if (context->method_inst) {
- method_inst = mono_metadata_inflate_generic_inst (context->method_inst, inflate_with, &error);
- g_assert (mono_error_ok (&error)); /*FIXME do proper error handling*/
+ method_inst = mono_metadata_inflate_generic_inst (context->method_inst, inflate_with, error);
+ if (!mono_error_ok (error))
+ goto fail;
}
res.class_inst = class_inst;
res.method_inst = method_inst;
-
+fail:
return res;
}
@@ -832,18 +854,38 @@ mono_class_inflate_generic_method (MonoMethod *method, MonoGenericContext *conte
MonoMethod*
mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context)
{
+ MonoError error;
+ MonoMethod *res = mono_class_inflate_generic_method_full_checked (method, klass_hint, context, &error);
+ if (!mono_error_ok (&error))
+ /*FIXME do proper error handling - on this case, kill this function. */
+ g_error ("Could not inflate generic method due to %s", mono_error_get_message (&error));
+
+ return res;
+}
+
+/**
+ * mono_class_inflate_generic_method_full_checked:
+ * Same as mono_class_inflate_generic_method_full but return failure using @error.
+ */
+MonoMethod*
+mono_class_inflate_generic_method_full_checked (MonoMethod *method, MonoClass *klass_hint, MonoGenericContext *context, MonoError *error)
+{
MonoMethod *result;
MonoMethodInflated *iresult, *cached;
MonoMethodSignature *sig;
MonoGenericContext tmp_context;
gboolean is_mb_open = FALSE;
+ mono_error_init (error);
+
/* The `method' has already been instantiated before => we need to peel out the instantiation and create a new context */
while (method->is_inflated) {
MonoGenericContext *method_context = mono_method_get_context (method);
MonoMethodInflated *imethod = (MonoMethodInflated *) method;
- tmp_context = inflate_generic_context (method_context, context);
+ tmp_context = inflate_generic_context (method_context, context, error);
+ if (!mono_error_ok (error))
+ return NULL;
context = &tmp_context;
if (mono_metadata_generic_context_equal (method_context, context))
@@ -918,6 +960,13 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin
inflated_methods_size += sizeof (MonoMethodInflated);
sig = mono_method_signature (method);
+ if (!sig) {
+ char *name = mono_type_get_full_name (method->klass);
+ mono_error_set_bad_image (error, method->klass->image, "Could not resolve signature of method %s:%s", name, method->name);
+ g_free (name);
+ goto fail;
+ }
+
if (sig->pinvoke) {
memcpy (&iresult->method.pinvoke, method, sizeof (MonoMethodPInvoke));
} else {
@@ -950,10 +999,9 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin
result->klass = klass_hint;
if (!result->klass) {
- MonoError error;
- MonoType *inflated = inflate_generic_type (NULL, &method->klass->byval_arg, context, &error);
-
- g_assert (mono_error_ok (&error)); /*FIXME proper error handling*/
+ MonoType *inflated = inflate_generic_type (NULL, &method->klass->byval_arg, context, error);
+ if (!mono_error_ok (error))
+ goto fail;
result->klass = inflated ? mono_class_from_mono_type (inflated) : method->klass;
if (inflated)
@@ -963,6 +1011,11 @@ mono_class_inflate_generic_method_full (MonoMethod *method, MonoClass *klass_hin
mono_method_inflated_lookup (iresult, TRUE);
mono_loader_unlock ();
return result;
+
+fail:
+ mono_loader_unlock ();
+ g_free (iresult);
+ return NULL;
}
/**
@@ -1117,7 +1170,6 @@ mono_class_find_enum_basetype (MonoClass *class)
/*
* Checks for MonoClass::exception_type without resolving all MonoType's into MonoClass'es
- * It doesn't resolve generic instances, only check the GTD.
*/
static gboolean
mono_type_has_exceptions (MonoType *type)
@@ -1130,11 +1182,42 @@ mono_type_has_exceptions (MonoType *type)
case MONO_TYPE_ARRAY:
return type->data.array->eklass->exception_type;
case MONO_TYPE_GENERICINST:
- return type->data.generic_class->container_class->exception_type;
+ return mono_generic_class_get_class (type->data.generic_class)->exception_type;
}
return FALSE;
}
+static gboolean
+mono_class_is_broken_valuetype (MonoClass *class)
+{
+ if (!class->valuetype)
+ return FALSE;
+ if (class->instance_size > (int)(0x100000 + sizeof (MonoObject)))
+ return TRUE;
+ if (class->instance_size > 0)
+ return FALSE;
+
+ /*We must ignore SRE unfinished types since they can have invalid sizes*/
+ if (class->image->dynamic && !class->wastypebuilder)
+ return FALSE;
+
+ if (class->generic_class && class->generic_class->container_class->image->dynamic && !class->generic_class->container_class->wastypebuilder)
+ return FALSE;
+
+ if (class->generic_class) {
+ int i;
+ MonoGenericInst *ginst = class->generic_class->context.class_inst;
+ for (i = 0; i < ginst->type_argc; ++i) {
+ MonoClass *arg = mono_class_from_mono_type (ginst->type_argv [i]);
+ if (arg->image->dynamic && !arg->wastypebuilder)
+ return FALSE;
+ if (arg->generic_class && arg->generic_class->container_class->image->dynamic && !arg->generic_class->container_class->wastypebuilder)
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
/**
* mono_class_setup_fields:
* @class: The class to initialize
@@ -1292,9 +1375,15 @@ mono_class_setup_fields (MonoClass *class)
guint32 offset;
mono_metadata_field_info (m, idx, &offset, NULL, NULL);
field->offset = offset;
- if (field->offset == (guint32)-1 && !(field->type->attrs & FIELD_ATTRIBUTE_STATIC))
- g_warning ("%s not initialized correctly (missing field layout info for %s)",
- class->name, mono_field_get_name (field));
+
+ if (field->offset == (guint32)-1 && !(field->type->attrs & FIELD_ATTRIBUTE_STATIC)) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Missing field layout info for %s", field->name));
+ break;
+ }
+ if (field->offset < -1) { /*-1 is used to encode special static fields */
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Invalid negative field offset %d for %s", field->offset, field->name));
+ break;
+ }
}
}
@@ -1351,8 +1440,8 @@ mono_class_setup_fields (MonoClass *class)
return;
mono_class_layout_fields (class);
- /*valuetypes can't be bigger than 1Mb.*/
- if (class->valuetype && class->instance_size > 0x100000)
+ /*valuetypes can't be neither bigger than 1Mb or empty. */
+ if (mono_class_is_broken_valuetype (class))
mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
}
@@ -1658,6 +1747,11 @@ mono_class_layout_fields (MonoClass *class)
if (mono_field_is_deleted (field))
continue;
+ if (mono_type_has_exceptions (field->type)) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
+ break;
+ }
+
size = mono_type_size (field->type, &align);
field->offset = class->sizes.class_size;
field->offset += align - 1;
@@ -1696,6 +1790,8 @@ create_array_method (MonoClass *class, const char *name, MonoMethodSignature *si
* of long-living MonoMethod structures.
* Methods belonging to an interface are assigned a sequential slot starting
* from 0.
+ *
+ * On failure this function sets class->exception_type
*/
void
mono_class_setup_methods (MonoClass *class)
@@ -1714,20 +1810,38 @@ mono_class_setup_methods (MonoClass *class)
}
if (class->generic_class) {
+ MonoError error;
MonoClass *gklass = class->generic_class->container_class;
mono_class_init (gklass);
- mono_class_setup_methods (gklass);
+ if (!gklass->exception_type)
+ mono_class_setup_methods (gklass);
+ if (gklass->exception_type) {
+ /*FIXME make exception_data less opaque so it's possible to dup it here*/
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load"));
+ mono_loader_unlock ();
+ return;
+ }
/* The + 1 makes this always non-NULL to pass the check in mono_class_setup_methods () */
class->method.count = gklass->method.count;
methods = g_new0 (MonoMethod *, class->method.count + 1);
for (i = 0; i < class->method.count; i++) {
- methods [i] = mono_class_inflate_generic_method_full (
- gklass->methods [i], class, mono_class_get_context (class));
+ methods [i] = mono_class_inflate_generic_method_full_checked (
+ gklass->methods [i], class, mono_class_get_context (class), &error);
+ if (!mono_error_ok (&error)) {
+ char *method = mono_method_full_name (gklass->methods [i], TRUE);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Could not inflate method %s due to %s", method, mono_error_get_message (&error)));
+
+ g_free (method);
+ mono_error_cleanup (&error);
+ mono_loader_unlock ();
+ return;
+ }
}
} else if (class->rank) {
+ MonoError error;
MonoMethod *amethod;
MonoMethodSignature *sig;
int count_generic = 0, first_generic = 0;
@@ -1735,7 +1849,8 @@ mono_class_setup_methods (MonoClass *class)
class->method.count = 3 + (class->rank > 1? 2: 1);
- mono_class_setup_interfaces (class);
+ mono_class_setup_interfaces (class, &error);
+ g_assert (mono_error_ok (&error)); /*FIXME can this fail for array types?*/
if (class->interface_count) {
count_generic = generic_array_methods (class);
@@ -1853,6 +1968,7 @@ mono_class_get_method_by_index (MonoClass *class, int index)
return m;
} else {
mono_class_setup_methods (class);
+ g_assert (!class->exception_type); /*FIXME do proper error handling*/
g_assert (index >= 0 && index < class->method.count);
return class->methods [index];
}
@@ -1870,7 +1986,11 @@ mono_class_get_inflated_method (MonoClass *class, MonoMethod *method)
MonoClass *gklass = class->generic_class->container_class;
int i;
+ g_assert (method->klass == gklass);
+
mono_class_setup_methods (gklass);
+ g_assert (!gklass->exception_type); /*FIXME do proper error handling*/
+
for (i = 0; i < gklass->method.count; ++i) {
if (gklass->methods [i] == method) {
if (class->methods)
@@ -1931,6 +2051,7 @@ mono_class_get_vtable_size (MonoClass *klass)
return klass->vtable_size;
}
+/*This method can fail the class.*/
static void
mono_class_setup_properties (MonoClass *class)
{
@@ -1957,6 +2078,11 @@ mono_class_setup_properties (MonoClass *class)
mono_class_init (gklass);
mono_class_setup_properties (gklass);
+ if (gklass->exception_type) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load"));
+ mono_loader_unlock ();
+ return;
+ }
class->ext->property = gklass->ext->property;
@@ -1977,18 +2103,25 @@ mono_class_setup_properties (MonoClass *class)
prop->parent = class;
}
} else {
- class->ext->property.first = mono_metadata_properties_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last);
- class->ext->property.count = last - class->ext->property.first;
+ int first = mono_metadata_properties_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last);
+ int count = last - first;
- if (class->ext->property.count)
+ if (count) {
mono_class_setup_methods (class);
+ if (class->exception_type) {
+ mono_loader_unlock ();
+ return;
+ }
+ }
- properties = mono_image_alloc0 (class->image, sizeof (MonoProperty) * class->ext->property.count);
- for (i = class->ext->property.first; i < last; ++i) {
+ class->ext->property.first = first;
+ class->ext->property.count = count;
+ properties = mono_image_alloc0 (class->image, sizeof (MonoProperty) * count);
+ for (i = first; i < last; ++i) {
mono_metadata_decode_table_row (class->image, MONO_TABLE_PROPERTY, i, cols, MONO_PROPERTY_SIZE);
- properties [i - class->ext->property.first].parent = class;
- properties [i - class->ext->property.first].attrs = cols [MONO_PROPERTY_FLAGS];
- properties [i - class->ext->property.first].name = mono_metadata_string_heap (class->image, cols [MONO_PROPERTY_NAME]);
+ properties [i - first].parent = class;
+ properties [i - first].attrs = cols [MONO_PROPERTY_FLAGS];
+ properties [i - first].name = mono_metadata_string_heap (class->image, cols [MONO_PROPERTY_NAME]);
startm = mono_metadata_methods_from_property (class->image, i, &endm);
for (j = startm; j < endm; ++j) {
@@ -2004,10 +2137,10 @@ mono_class_setup_properties (MonoClass *class)
switch (cols [MONO_METHOD_SEMA_SEMANTICS]) {
case METHOD_SEMANTIC_SETTER:
- properties [i - class->ext->property.first].set = method;
+ properties [i - first].set = method;
break;
case METHOD_SEMANTIC_GETTER:
- properties [i - class->ext->property.first].get = method;
+ properties [i - first].get = method;
break;
default:
break;
@@ -2041,9 +2174,11 @@ inflate_method_listz (MonoMethod **methods, MonoClass *class, MonoGenericContext
return retval;
}
+/*This method can fail the class.*/
static void
mono_class_setup_events (MonoClass *class)
{
+ int first, count;
guint startm, endm, i, j;
guint32 cols [MONO_EVENT_SIZE];
MonoTableInfo *msemt = &class->image->tables [MONO_TABLE_METHODSEMANTICS];
@@ -2067,8 +2202,13 @@ mono_class_setup_events (MonoClass *class)
MonoGenericContext *context;
mono_class_setup_events (gklass);
- class->ext->event = gklass->ext->event;
+ if (gklass->exception_type) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load"));
+ mono_loader_unlock ();
+ return;
+ }
+ class->ext->event = gklass->ext->event;
class->ext->events = g_new0 (MonoEvent, class->ext->event.count);
if (class->ext->event.count)
@@ -2091,15 +2231,22 @@ mono_class_setup_events (MonoClass *class)
return;
}
- class->ext->event.first = mono_metadata_events_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last);
- class->ext->event.count = last - class->ext->event.first;
+ first = mono_metadata_events_from_typedef (class->image, mono_metadata_token_index (class->type_token) - 1, &last);
+ count = last - first;
- if (class->ext->event.count)
+ if (count) {
mono_class_setup_methods (class);
-
+ if (class->exception_type) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Generic type definition failed to load"));
+ mono_loader_unlock ();
+ return;
+ }
+ }
+ class->ext->event.first = first;
+ class->ext->event.count = count;
events = mono_image_alloc0 (class->image, sizeof (MonoEvent) * class->ext->event.count);
- for (i = class->ext->event.first; i < last; ++i) {
- MonoEvent *event = &events [i - class->ext->event.first];
+ for (i = first; i < last; ++i) {
+ MonoEvent *event = &events [i - first];
mono_metadata_decode_table_row (class->image, MONO_TABLE_EVENT, i, cols, MONO_EVENT_SIZE);
event->parent = class;
@@ -2238,13 +2385,15 @@ mono_get_unique_iid (MonoClass *class)
}
static void
-collect_implemented_interfaces_aux (MonoClass *klass, GPtrArray **res)
+collect_implemented_interfaces_aux (MonoClass *klass, GPtrArray **res, MonoError *error)
{
int i;
MonoClass *ic;
- mono_class_setup_interfaces (klass);
-
+ mono_class_setup_interfaces (klass, error);
+ if (!mono_error_ok (error))
+ return;
+
for (i = 0; i < klass->interface_count; i++) {
ic = klass->interfaces [i];
@@ -2253,16 +2402,23 @@ collect_implemented_interfaces_aux (MonoClass *klass, GPtrArray **res)
g_ptr_array_add (*res, ic);
mono_class_init (ic);
- collect_implemented_interfaces_aux (ic, res);
+ collect_implemented_interfaces_aux (ic, res, error);
+ if (!mono_error_ok (error))
+ return;
}
}
GPtrArray*
-mono_class_get_implemented_interfaces (MonoClass *klass)
+mono_class_get_implemented_interfaces (MonoClass *klass, MonoError *error)
{
GPtrArray *res = NULL;
- collect_implemented_interfaces_aux (klass, &res);
+ collect_implemented_interfaces_aux (klass, &res, error);
+ if (!mono_error_ok (error)) {
+ if (res)
+ g_ptr_array_free (res, TRUE);
+ return NULL;
+ }
return res;
}
@@ -2291,6 +2447,7 @@ mono_class_interface_offset (MonoClass *klass, MonoClass *itf) {
static void
print_implemented_interfaces (MonoClass *klass) {
+ MonoError error;
GPtrArray *ifaces = NULL;
int i;
int ancestor_level = 0;
@@ -2316,8 +2473,11 @@ print_implemented_interfaces (MonoClass *klass) {
printf ("\n");
while (klass != NULL) {
printf ("[LEVEL %d] Implemented interfaces by class %s:\n", ancestor_level, klass->name);
- ifaces = mono_class_get_implemented_interfaces (klass);
- if (ifaces) {
+ ifaces = mono_class_get_implemented_interfaces (klass, &error);
+ if (!mono_error_ok (&error)) {
+ printf (" Type failed due to %s\n", mono_error_get_message (&error));
+ mono_error_cleanup (&error);
+ } else if (ifaces) {
for (i = 0; i < ifaces->len; i++) {
MonoClass *ic = g_ptr_array_index (ifaces, i);
printf (" [UIID %d] interface %s\n", ic->interface_id, ic->name);
@@ -2586,6 +2746,7 @@ find_array_interface (MonoClass *klass, const char *name)
/*
* Return the number of virtual methods.
* Even for interfaces we can't simply return the number of methods as all CLR types are allowed to have static methods.
+ * Return -1 on failure.
* FIXME It would be nice if this information could be cached somewhere.
*/
static int
@@ -2597,6 +2758,8 @@ count_virtual_methods (MonoClass *class)
if (class->methods || !MONO_CLASS_HAS_STATIC_METADATA (class)) {
mono_class_setup_methods (class);
+ if (class->exception_type)
+ return -1;
for (i = 0; i < class->method.count; ++i) {
flags = class->methods [i]->flags;
@@ -2616,17 +2779,19 @@ count_virtual_methods (MonoClass *class)
/*
* LOCKING: this is supposed to be called with the loader lock held.
+ * Return -1 on failure and set exception_type
*/
static int
setup_interface_offsets (MonoClass *class, int cur_slot)
{
+ MonoError error;
MonoClass *k, *ic;
int i, max_iid;
- MonoClass **interfaces_full;
- int *interface_offsets_full;
+ MonoClass **interfaces_full = NULL;
+ int *interface_offsets_full = NULL;
GPtrArray *ifaces;
int interface_offsets_count;
- MonoClass **array_interfaces;
+ MonoClass **array_interfaces = NULL;
int num_array_interfaces;
int is_enumerator = FALSE;
@@ -2649,7 +2814,14 @@ setup_interface_offsets (MonoClass *class, int cur_slot)
if (max_iid < ic->interface_id)
max_iid = ic->interface_id;
}
- ifaces = mono_class_get_implemented_interfaces (k);
+ ifaces = mono_class_get_implemented_interfaces (k, &error);
+ if (!mono_error_ok (&error)) {
+ char *name = mono_type_get_full_name (k);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Error getting the interfaces of %s due to %s", name, mono_error_get_message (&error)));
+ g_free (name);
+ mono_error_cleanup (&error);
+ goto fail;
+ }
if (ifaces) {
for (i = 0; i < ifaces->len; ++i) {
ic = g_ptr_array_index (ifaces, i);
@@ -2681,7 +2853,9 @@ setup_interface_offsets (MonoClass *class, int cur_slot)
}
for (k = class->parent; k ; k = k->parent) {
- ifaces = mono_class_get_implemented_interfaces (k);
+ ifaces = mono_class_get_implemented_interfaces (k, &error);
+ g_assert (mono_error_ok (&error));/*FIXME we perform the same thing above, so not failing there but here is VERY wrong.*/
+
if (ifaces) {
for (i = 0; i < ifaces->len; ++i) {
int io;
@@ -2698,15 +2872,29 @@ setup_interface_offsets (MonoClass *class, int cur_slot)
}
- ifaces = mono_class_get_implemented_interfaces (class);
- if (ifaces) {
+ ifaces = mono_class_get_implemented_interfaces (class, &error);
+ if (!mono_error_ok (&error)) {
+ char *name = mono_type_get_full_name (class);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Error getting the interfaces of %s due to %s", name, mono_error_get_message (&error)));
+ g_free (name);
+ mono_error_cleanup (&error);
+ goto fail;
+ } else if (ifaces) {
for (i = 0; i < ifaces->len; ++i) {
+ int count;
ic = g_ptr_array_index (ifaces, i);
if (interfaces_full [ic->interface_id] != NULL)
continue;
interfaces_full [ic->interface_id] = ic;
interface_offsets_full [ic->interface_id] = cur_slot;
- cur_slot += count_virtual_methods (ic);
+ count = count_virtual_methods (ic);
+ if (count == -1) {
+ char *name = mono_type_get_full_name (ic);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Error calculating interface offset of %s", name));
+ g_free (name);
+ goto fail;
+ }
+ cur_slot += count;
}
g_ptr_array_free (ifaces, TRUE);
}
@@ -2792,6 +2980,11 @@ setup_interface_offsets (MonoClass *class, int cur_slot)
//print_implemented_interfaces (class);
return cur_slot;
+fail:
+ g_free (interfaces_full);
+ g_free (interface_offsets_full);
+ g_free (array_interfaces);
+ return -1;
}
/*
@@ -2802,6 +2995,8 @@ setup_interface_offsets (MonoClass *class, int cur_slot)
* - class->interfaces_packed
* - class->interface_offsets_packed
* - class->interface_bitmap
+ *
+ * This function can fail @class.
*/
void
mono_class_setup_interface_offsets (MonoClass *class)
@@ -2848,6 +3043,9 @@ mono_class_setup_vtable (MonoClass *class)
return;
}
+ if (class->exception_type)
+ return;
+
mono_loader_lock ();
if (class->vtable) {
@@ -3214,6 +3412,12 @@ print_unimplemented_interface_method_info (MonoClass *class, MonoClass *ic, Mono
g_free (method_signature);
g_free (type_name);
mono_class_setup_methods (class);
+ if (class->exception_type) {
+ char *name = mono_type_get_full_name (class);
+ printf ("CLASS %s failed to resolve methods\n", name);
+ g_free (name);
+ return;
+ }
for (index = 0; index < class->method.count; ++index) {
MonoMethod *cm = class->methods [index];
method_signature = mono_signature_get_desc (mono_method_signature (cm), TRUE);
@@ -3266,6 +3470,7 @@ verify_class_overrides (MonoClass *class, MonoMethod **overrides, int onum)
void
mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int onum)
{
+ MonoError error;
MonoClass *k, *ic;
MonoMethod **vtable;
int i, max_vtsize = 0, max_iid, cur_slot = 0;
@@ -3277,7 +3482,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
#if (DEBUG_INTERFACE_VTABLE_CODE|TRACE_INTERFACE_VTABLE_CODE)
int first_non_interface_slot;
#endif
- GSList *virt_methods, *l;
+ GSList *virt_methods = NULL, *l;
if (class->vtable)
return;
@@ -3285,9 +3490,14 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
if (overrides && !verify_class_overrides (class, overrides, onum))
return;
- ifaces = mono_class_get_implemented_interfaces (class);
-
- if (ifaces) {
+ ifaces = mono_class_get_implemented_interfaces (class, &error);
+ if (!mono_error_ok (&error)) {
+ char *name = mono_type_get_full_name (class);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Could not resolve %s interfaces due to %s", name, mono_error_get_message (&error)));
+ g_free (name);
+ mono_error_cleanup (&error);
+ return;
+ } else if (ifaces) {
for (i = 0; i < ifaces->len; i++) {
MonoClass *ic = g_ptr_array_index (ifaces, i);
max_vtsize += ic->method.count;
@@ -3299,6 +3509,14 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
if (class->parent) {
mono_class_init (class->parent);
mono_class_setup_vtable (class->parent);
+
+ if (class->parent->exception_type) {
+ char *name = mono_type_get_full_name (class->parent);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Parent %s failed to load", name));
+ g_free (name);
+ return;
+ }
+
max_vtsize += class->parent->vtable_size;
cur_slot = class->parent->vtable_size;
}
@@ -3311,6 +3529,9 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
/* printf ("METAINIT %s.%s\n", class->name_space, class->name); */
cur_slot = setup_interface_offsets (class, cur_slot);
+ if (cur_slot == -1) /*setup_interface_offsets fails the type.*/
+ return;
+
max_iid = class->max_interface_id;
DEBUG_INTERFACE_VTABLE (first_non_interface_slot = cur_slot);
@@ -3366,9 +3587,9 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
int parent_interface_offset = mono_class_interface_offset (parent, parent_interface);
int j;
- mono_class_setup_methods (parent_interface);
+ mono_class_setup_methods (parent_interface); /*FIXME Just kill this whole chunk of dead code*/
TRACE_INTERFACE_VTABLE (printf (" +++ Inheriting interface %s.%s\n", parent_interface->name_space, parent_interface->name));
- for (j = 0; j < parent_interface->method.count; j++) {
+ for (j = 0; j < parent_interface->method.count && !class->exception_type; j++) {
vtable [interface_offset + j] = parent->vtable [parent_interface_offset + j];
TRACE_INTERFACE_VTABLE (printf (" --- Inheriting: [%03d][(%03d)+(%03d)] => [%03d][(%03d)+(%03d)]\n",
parent_interface_offset + j, parent_interface_offset, j,
@@ -3419,6 +3640,8 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
while ((cm = mono_class_get_virtual_methods (class, &iter))) {
virt_methods = g_slist_prepend (virt_methods, cm);
}
+ if (class->exception_type)
+ goto fail;
}
// Loop on all implemented interfaces...
@@ -3432,6 +3655,8 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
ic_offset = mono_class_interface_offset (class, ic);
mono_class_setup_methods (ic);
+ if (ic->exception_type)
+ goto fail;
// Check if this interface is explicitly implemented (instead of just inherited)
if (parent != NULL) {
@@ -3478,7 +3703,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
}
TRACE_INTERFACE_VTABLE (printf ("\n"));
if (class->exception_type) /*Might be set by check_interface_method_override*/
- return;
+ goto fail;
}
// If the slot is still empty, look in all the inherited virtual methods...
@@ -3499,7 +3724,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
break;
}
if (class->exception_type) /*Might be set by check_interface_method_override*/
- return;
+ goto fail;
TRACE_INTERFACE_VTABLE ((cm != NULL) && printf ("\n"));
}
}
@@ -3533,10 +3758,7 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
im_slot, ic->name_space, ic->name, im->name, (vtable [im_slot] == NULL)));
if (vtable [im_slot] == NULL) {
print_unimplemented_interface_method_info (class, ic, im, im_slot, overrides, onum);
- mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- if (override_map)
- g_hash_table_destroy (override_map);
- return;
+ goto fail;
}
}
}
@@ -3580,10 +3802,8 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
mono_security_core_clr_check_override (class, cm, m1);
slot = mono_method_get_vtable_slot (m1);
- if (slot == -1) {
- mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- return;
- }
+ if (slot == -1)
+ goto fail;
g_assert (cm->slot < max_vtsize);
if (!override_map)
@@ -3592,6 +3812,9 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
break;
}
}
+ if (k->exception_type)
+ goto fail;
+
if (slot >= 0)
break;
}
@@ -3639,9 +3862,11 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
}
g_hash_table_destroy (override_map);
+ override_map = NULL;
}
g_slist_free (virt_methods);
+ virt_methods = NULL;
/* Ensure that all vtable slots are filled with concrete instance methods */
if (!(class->flags & TYPE_ATTRIBUTE_ABSTRACT)) {
@@ -3728,6 +3953,18 @@ mono_class_setup_vtable_general (MonoClass *class, MonoMethod **overrides, int o
}
VERIFY_INTERFACE_VTABLE (mono_class_verify_vtable (class));
+ return;
+
+fail:
+ {
+ char *name = mono_type_get_full_name (class);
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("VTable setup of type %s failed", name));
+ g_free (name);
+ if (override_map)
+ g_hash_table_destroy (override_map);
+ if (virt_methods)
+ g_slist_free (virt_methods);
+ }
}
/*
@@ -3816,7 +4053,8 @@ generic_array_methods (MonoClass *class)
GList *list = NULL, *tmp;
if (generic_array_method_num)
return generic_array_method_num;
- mono_class_setup_methods (class->parent);
+ mono_class_setup_methods (class->parent); /*This is setting up System.Array*/
+ g_assert (!class->parent->exception_type); /*So hitting this assert is a huge problem*/
for (i = 0; i < class->parent->method.count; i++) {
MonoMethod *m = class->parent->methods [i];
if (!strncmp (m->name, "InternalArray__", 15)) {
@@ -3960,7 +4198,6 @@ mono_class_init (MonoClass *class)
int i;
MonoCachedClassInfo cached_info;
gboolean has_cached_info;
- int class_init_ok = TRUE;
g_assert (class);
@@ -3987,13 +4224,19 @@ mono_class_init (MonoClass *class)
class->init_pending = 1;
+ if (mono_verifier_is_enabled_for_class (class) && !mono_verifier_verify_class (class)) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, concat_two_strings_with_zero (class->image, class->name, class->image->assembly_name));
+ goto leave;
+ }
+
+
if (class->byval_arg.type == MONO_TYPE_ARRAY || class->byval_arg.type == MONO_TYPE_SZARRAY) {
MonoClass *element_class = class->element_class;
if (!element_class->inited)
mono_class_init (element_class);
if (element_class->exception_type != MONO_EXCEPTION_NONE) {
mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- goto fail;
+ goto leave;
}
}
@@ -4017,7 +4260,12 @@ mono_class_init (MonoClass *class)
mono_class_init (gklass);
// FIXME: Why is this needed ?
- mono_class_setup_methods (gklass);
+ if (!gklass->exception_type)
+ mono_class_setup_methods (gklass);
+ if (gklass->exception_type) {
+ mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, g_strdup_printf ("Generic Type Defintion failed to init"));
+ goto leave;
+ }
if (MONO_CLASS_IS_INTERFACE (class))
class->interface_id = mono_get_unique_iid (class);
@@ -4047,10 +4295,8 @@ mono_class_init (MonoClass *class)
else
if (!class->size_inited){
mono_class_setup_fields (class);
- if (class->exception_type || mono_loader_get_last_error ()){
- class_init_ok = FALSE;
+ if (class->exception_type || mono_loader_get_last_error ())
goto leave;
- }
}
/* Initialize arrays */
@@ -4100,7 +4346,7 @@ mono_class_init (MonoClass *class)
mono_class_setup_vtable (gklass);
if (gklass->exception_type) {
mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- goto fail;
+ goto leave;
}
class->vtable_size = gklass->vtable_size;
@@ -4132,7 +4378,7 @@ mono_class_init (MonoClass *class)
/* FIXME: Optimize this */
mono_class_setup_vtable (class);
if (class->exception_type || mono_loader_get_last_error ())
- goto fail;
+ goto leave;
cmethod = class->vtable [finalize_slot];
}
@@ -4140,11 +4386,14 @@ mono_class_init (MonoClass *class)
/* Check that this is really the finalizer method */
mono_class_setup_vtable (class);
if (class->exception_type || mono_loader_get_last_error ())
- goto fail;
+ goto leave;
+
+ g_assert (class->vtable_size > finalize_slot);
class->has_finalize = 0;
if (class->parent) {
cmethod = class->vtable [finalize_slot];
+ g_assert (cmethod);
if (cmethod->is_inflated)
cmethod = ((MonoMethodInflated*)cmethod)->declaring;
if (cmethod != default_finalize) {
@@ -4166,6 +4415,8 @@ mono_class_init (MonoClass *class)
class->has_cctor = 1;
} else {
mono_class_setup_methods (class);
+ if (class->exception_type)
+ goto leave;
for (i = 0; i < class->method.count; ++i) {
MonoMethod *method = class->methods [i];
@@ -4191,19 +4442,19 @@ mono_class_init (MonoClass *class)
mono_class_init (class->parent);
if (class->parent->exception_type) {
mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- goto fail;
+ goto leave;
}
if (mono_loader_get_last_error ())
- goto fail;
+ goto leave;
if (!class->parent->vtable_size) {
/* FIXME: Get rid of this somehow */
mono_class_setup_vtable (class->parent);
if (class->parent->exception_type) {
mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, NULL);
- goto fail;
+ goto leave;
}
if (mono_loader_get_last_error ())
- goto fail;
+ goto leave;
}
setup_interface_offsets (class, class->parent->vtable_size);
} else {
@@ -4216,16 +4467,8 @@ mono_class_init (MonoClass *class)
setup_interface_offsets (class, 0);
}
- if (mono_verifier_is_enabled_for_class (class) && !mono_verifier_verify_class (class)) {
- mono_class_set_failure (class, MONO_EXCEPTION_TYPE_LOAD, concat_two_strings_with_zero (class->image, class->name, class->image->assembly_name));
- class_init_ok = FALSE;
- }
-
goto leave;
- fail:
- class_init_ok = FALSE;
-
leave:
/* Because of the double-checking locking pattern */
mono_memory_barrier ();
@@ -4233,9 +4476,9 @@ mono_class_init (MonoClass *class)
class->init_pending = 0;
if (mono_loader_get_last_error ()) {
- if (class->exception_type == MONO_EXCEPTION_NONE)
+ if (class->exception_type == MONO_EXCEPTION_NONE) {
set_failure_from_loader_error (class, mono_loader_get_last_error ());
-
+ }
mono_loader_clear_error ();
}
@@ -4244,7 +4487,7 @@ mono_class_init (MonoClass *class)
if (mono_debugger_class_init_func)
mono_debugger_class_init_func (class);
- return class_init_ok;
+ return class->exception_type == MONO_EXCEPTION_NONE;
}
static gboolean
@@ -5317,8 +5560,7 @@ mono_bounded_array_class_get (MonoClass *eclass, guint32 rank, gboolean bounded)
class->type_token = 0;
/* all arrays are marked serializable and sealed, bug #42779 */
- class->flags = TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED |
- (eclass->flags & TYPE_ATTRIBUTE_VISIBILITY_MASK);
+ class->flags = TYPE_ATTRIBUTE_CLASS | TYPE_ATTRIBUTE_SERIALIZABLE | TYPE_ATTRIBUTE_SEALED | TYPE_ATTRIBUTE_PUBLIC;
class->parent = parent;
class->instance_size = mono_class_instance_size (class->parent);
@@ -6494,6 +6736,7 @@ mono_class_is_assignable_from (MonoClass *klass, MonoClass *oklass)
static gboolean
mono_class_implement_interface_slow (MonoClass *target, MonoClass *candidate)
{
+ MonoError error;
int i;
do {
@@ -6514,7 +6757,12 @@ mono_class_implement_interface_slow (MonoClass *target, MonoClass *candidate)
}
} else {
/*setup_interfaces don't mono_class_init anything*/
- mono_class_setup_interfaces (candidate);
+ mono_class_setup_interfaces (candidate, &error);
+ if (!mono_error_ok (&error)) {
+ mono_error_cleanup (&error);
+ return FALSE;
+ }
+
for (i = 0; i < candidate->interface_count; ++i) {
if (candidate->interfaces [i] == target || mono_class_implement_interface_slow (target, candidate->interfaces [i]))
return TRUE;
@@ -7108,6 +7356,13 @@ mono_class_get_methods (MonoClass* klass, gpointer *iter)
mono_class_init (klass);
if (!*iter) {
mono_class_setup_methods (klass);
+
+ /*
+ * We can't fail lookup of methods otherwise the runtime will burst in flames on all sort of places.
+ * FIXME we should better report this error to the caller
+ */
+ if (!klass->methods)
+ return NULL;
/* start from the first */
if (klass->method.count) {
*iter = &klass->methods [0];
@@ -7142,6 +7397,12 @@ mono_class_get_virtual_methods (MonoClass* klass, gpointer *iter)
if (klass->methods || !MONO_CLASS_HAS_STATIC_METADATA (klass) || mono_debug_using_mono_debugger ()) {
if (!*iter) {
mono_class_setup_methods (klass);
+ /*
+ * We can't fail lookup of methods otherwise the runtime will burst in flames on all sort of places.
+ * FIXME we should better report this error to the caller
+ */
+ if (!klass->methods)
+ return NULL;
/* start from the first */
method = &klass->methods [0];
} else {
@@ -7282,14 +7543,20 @@ mono_class_get_events (MonoClass* klass, gpointer *iter)
MonoClass*
mono_class_get_interfaces (MonoClass* klass, gpointer *iter)
{
+ MonoError error;
MonoClass** iface;
if (!iter)
return NULL;
if (!*iter) {
if (!klass->inited)
mono_class_init (klass);
- if (!klass->interfaces_inited)
- mono_class_setup_interfaces (klass);
+ if (!klass->interfaces_inited) {
+ mono_class_setup_interfaces (klass, &error);
+ if (!mono_error_ok (&error)) {
+ mono_error_cleanup (&error);
+ return NULL;
+ }
+ }
/* start from the first */
if (klass->interface_count) {
*iter = &klass->interfaces [0];
@@ -7693,6 +7960,13 @@ mono_class_get_method_from_name_flags (MonoClass *klass, const char *name, int p
if (klass->methods || !MONO_CLASS_HAS_STATIC_METADATA (klass)) {
mono_class_setup_methods (klass);
+ /*
+ We can't fail lookup of methods otherwise the runtime will burst in flames on all sort of places.
+ See mono/tests/array_load_exception.il
+ FIXME we should better report this error to the caller
+ */
+ if (!klass->methods)
+ return NULL;
for (i = 0; i < klass->method.count; ++i) {
MonoMethod *method = klass->methods [i];
@@ -8428,12 +8702,15 @@ mono_class_alloc_ext (MonoClass *klass)
*
* Initialize class->interfaces/interfaces_count.
* LOCKING: Acquires the loader lock.
+ * This function can fail the type.
*/
void
-mono_class_setup_interfaces (MonoClass *klass)
+mono_class_setup_interfaces (MonoClass *klass, MonoError *error)
{
int i;
+ mono_error_init (error);
+
if (klass->interfaces_inited)
return;
@@ -8459,8 +8736,15 @@ mono_class_setup_interfaces (MonoClass *klass)
klass->interface_count = gklass->interface_count;
klass->interfaces = g_new0 (MonoClass *, klass->interface_count);
- for (i = 0; i < klass->interface_count; i++)
- klass->interfaces [i] = mono_class_inflate_generic_class (gklass->interfaces [i], mono_generic_class_get_context (klass->generic_class));
+ for (i = 0; i < klass->interface_count; i++) {
+ klass->interfaces [i] = mono_class_inflate_generic_class_checked (gklass->interfaces [i], mono_generic_class_get_context (klass->generic_class), error);
+ if (!mono_error_ok (error)) {
+ mono_class_set_failure (klass, MONO_EXCEPTION_TYPE_LOAD, g_strdup ("Could not setup the interfaces"));
+ g_free (klass->interfaces);
+ klass->interfaces = NULL;
+ return;
+ }
+ }
}
mono_memory_barrier ();
diff --git a/mono/metadata/cominterop.c b/mono/metadata/cominterop.c
index 0758294ab55..155173596c7 100644
--- a/mono/metadata/cominterop.c
+++ b/mono/metadata/cominterop.c
@@ -277,11 +277,13 @@ cominterop_get_com_slot_begin (MonoClass* klass)
static MonoClass*
cominterop_get_method_interface (MonoMethod* method)
{
+ MonoError error;
MonoClass *ic = method->klass;
/* if method is on a class, we need to look up interface method exists on */
if (!MONO_CLASS_IS_INTERFACE(method->klass)) {
- GPtrArray *ifaces = mono_class_get_implemented_interfaces (method->klass);
+ GPtrArray *ifaces = mono_class_get_implemented_interfaces (method->klass, &error);
+ g_assert (mono_error_ok (&error));
if (ifaces) {
int i;
mono_class_setup_vtable (method->klass);
@@ -378,6 +380,7 @@ static gboolean
cominterop_com_visible (MonoClass* klass)
{
static MonoClass *ComVisibleAttribute = NULL;
+ MonoError error;
MonoCustomAttrInfo *cinfo;
GPtrArray *ifaces;
MonoBoolean visible = 0;
@@ -398,7 +401,8 @@ cominterop_com_visible (MonoClass* klass)
return TRUE;
}
- ifaces = mono_class_get_implemented_interfaces (klass);
+ ifaces = mono_class_get_implemented_interfaces (klass, &error);
+ g_assert (mono_error_ok (&error));
if (ifaces) {
int i;
for (i = 0; i < ifaces->len; ++i) {
@@ -856,6 +860,7 @@ mono_cominterop_get_native_wrapper (MonoMethod *method)
if (!method->klass->methods)
mono_class_setup_methods (method->klass);
+ g_assert (!method->klass->exception_type); /*FIXME do proper error handling*/
sig = mono_method_signature (method);
mb = mono_mb_new (method->klass, method->name, MONO_WRAPPER_COMINTEROP);
@@ -2315,6 +2320,7 @@ cominterop_ccw_getfreethreadedmarshaler (MonoCCW* ccw, MonoObject* object, gpoin
static int STDCALL
cominterop_ccw_queryinterface (MonoCCWInterface* ccwe, guint8* riid, gpointer* ppv)
{
+ MonoError error;
GPtrArray *ifaces;
MonoClass *itf = NULL;
int i;
@@ -2359,7 +2365,8 @@ cominterop_ccw_queryinterface (MonoCCWInterface* ccwe, guint8* riid, gpointer* p
#endif
klass_iter = klass;
while (klass_iter && klass_iter != mono_defaults.object_class) {
- ifaces = mono_class_get_implemented_interfaces (klass_iter);
+ ifaces = mono_class_get_implemented_interfaces (klass_iter, &error);
+ g_assert (mono_error_ok (&error));
if (ifaces) {
for (i = 0; i < ifaces->len; ++i) {
MonoClass *ic = NULL;
diff --git a/mono/metadata/culture-info-tables.h b/mono/metadata/culture-info-tables.h
index c50f575fbea..e52b3551484 100644
--- a/mono/metadata/culture-info-tables.h
+++ b/mono/metadata/culture-info-tables.h
@@ -4,1147 +4,1155 @@
#define MONO_METADATA_CULTURE_INFO_TABLES 1
-#define NUM_CULTURE_ENTRIES 164
+#define NUM_CULTURE_ENTRIES 166
#define NUM_REGION_ENTRIES 230
static const DateTimeFormatEntry datetime_format_entries [] = {
- {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37},{357,24},{370,56},{376,46}},
- {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 0, 344, 346, {348,844,422},{357,409},{370},{376,438}},
+ {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37},{357,24},{370,56},{376,46}},
+ {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 1, 344, 346, {348,844,422},{357,409},{370},{376,438}},
{853, 876, 888, 376, 370, 447, 457, 465, 468, {897, 906, 914, 922, 931, 938, 948}, {957, 961, 965, 969, 973, 977, 981}, {985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343}, {1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343}, 0, 0, 344, 346, {348,888},{357,876},{370},{376}},
{1112, 357, 348, 376, 370, 1136, 1146, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1356, 1379, 1392, 1399, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 0, 344, 346, {348,1392},{357,1379},{370,1409},{376,1399}},
- {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}},
- {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
- {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 0, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}},
+ {1356, 1379, 1392, 1399, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 1, 344, 346, {348,1392},{357,1379},{370,1409},{376,1399}},
+ {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}},
+ {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
+ {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 1, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}},
{2688, 2719, 2739, 2186, 2746, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739},{2719,2719,2912,2926,2946},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438}},
- {2990, 3024, 3046, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046},{357,3024},{370},{376,2970}},
- {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 0, 344, 346, {348,3314},{357,3297},{370},{376,2982}},
+ {2990, 3024, 3046, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046},{357,3024},{370},{376,2970}},
+ {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 1, 344, 346, {348,3314},{357,3297},{370},{376,2982}},
{3614, 3640, 888, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264},{357,876,3640},{370},{376,438}},
{3869, 876, 2665, 438, 370, 447, 74, 465, 468, {3890, 3908, 3922, 3940, 3958, 3976, 3992}, {3999, 4002, 4005, 4008, 4011, 4014, 4017}, {4020, 4031, 4044, 4051, 4062, 4069, 4078, 4087, 4100, 4113, 4128, 4141, 343}, {4152, 4159, 4044, 4166, 4062, 4173, 4180, 4187, 4194, 4201, 4208, 4215, 343}, 0, 0, 344, 346, {348,888,2665},{357,876},{370},{376,438}},
- {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 0, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}},
+ {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 1, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}},
{1907, 1379, 3314, 438, 370, 447, 1414, 465, 468, {4537, 4548, 4559, 4573, 4587, 4599, 4611}, {4623, 4627, 4632, 4637, 4642, 4646, 4651}, {4655, 4663, 3761, 4672, 4679, 4684, 4691, 4698, 1818, 4452, 4706, 4716, 343}, {1854, 1858, 1862, 1866, 4679, 4725, 4730, 4735, 1882, 1886, 4741, 4746, 343}, 0, 0, 344, 346, {348,3314},{357,1379},{370},{376,438}},
- {4750, 409, 888, 376, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 0, 344, 346, {348,888},{357,409},{370},{376}},
+ {4750, 409, 888, 376, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 1, 344, 346, {348,888},{357,409},{370},{376}},
{4954, 4984, 5006, 2982, 1409, 5017, 5033, 5046, 5053, {5060, 5070, 5080, 5090, 5100, 5110, 5120}, {1238, 5130, 5134, 5138, 5142, 5146, 5150}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,5260,5279,5296},{4984,4984,5315,5339,5366},{1409,1409,370,5395,5403},{2982,438,5412,5423}},
{5435, 5488, 5515, 5524, 5550, 5568, 5585, 5599, 5606, {5613, 5623, 5633, 5643, 5653, 5663, 5673}, {5683, 5687, 5691, 5695, 5699, 5703, 5707}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, 0, 0, 344, 346, {348,5515},{357,5488},{370,5550},{376,5524}},
- {5774, 876, 5796, 1399, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,1409},{376,1399}},
- {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}},
- {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 0, 344, 346, {348,5515,5996},{357,876},{370},{376,438}},
+ {5774, 876, 5796, 1399, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5796},{357,876},{370,1409},{376,1399}},
+ {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 1, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}},
+ {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 1, 344, 346, {348,5515,5996},{357,876},{370},{376,438}},
{6211, 3024, 1676, 376, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676},{357,3024},{370},{376}},
- {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,1929},{357,876},{370},{376,438}},
- {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 0, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}},
- {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 0, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}},
- {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}},
- {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 0, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}},
- {7640, 7668, 5996, 5944, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944}},
+ {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 1, 344, 346, {348,1929},{357,876},{370},{376,438}},
+ {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 1, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}},
+ {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 1, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}},
+ {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}},
+ {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 1, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}},
+ {7640, 7668, 5996, 5944, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944}},
{7742, 876, 37, 2982, 1409, 447, 74, 7763, 7794, {7825, 7856, 7884, 7912, 7931, 7965, 7990}, {8015, 8023, 8028, 8033, 8038, 8046, 8051}, {8056, 8075, 8106, 8125, 8144, 8166, 8191, 8213, 8235, 8257, 8276, 8304, 343}, {8326, 8335, 8344, 8356, 8368, 8377, 8389, 8398, 8407, 8416, 8425, 8434, 343}, 0, 0, 344, 346, {348,37},{357,876},{370,1409},{376,8443,2982}},
- {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 0, 344, 346, {348,1929},{357,8510},{370},{376,438}},
+ {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 1, 344, 346, {348,1929},{357,8510},{370},{376,438}},
{1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {8738, 8745, 8751, 8758, 8763, 8769, 8775}, {8781, 8785, 8789, 8793, 8797, 8801, 8805}, {8809, 8817, 8826, 2055, 8832, 2065, 2070, 8836, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 8853, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 0, 344, 346, {348,844,1929},{357,876},{370},{376,2982}},
- {9266, 876, 1392, 5944, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 0, 344, 346, {348,1392},{357,876},{370,5955},{376,5944}},
- {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}},
- {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 0, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}},
- {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 0, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}},
- {10238, 10271, 7256, 376, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 0, 344, 346, {348,7256},{357,10271},{370},{376}},
+ {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 1, 344, 346, {348,844,1929},{357,876},{370},{376,2982}},
+ {9266, 876, 1392, 5944, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 1, 344, 346, {348,1392},{357,876},{370,5955},{376,5944}},
+ {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}},
+ {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 1, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}},
+ {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 1, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}},
+ {10238, 10271, 7256, 376, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 1, 344, 346, {348,7256},{357,10271},{370},{376}},
{10582, 876, 10606, 2970, 370, 447, 74, 10615, 10622, {10629, 10645, 10658, 10674, 10691, 10709, 10718}, {10727, 10731, 10735, 10739, 10743, 10747, 10751}, {10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343}, {10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343}, 0, 0, 344, 346, {348,10951,10606},{357,876},{370},{376,10961,2970}},
- {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 0, 344, 346, {348,2665},{357,409},{370},{376,2186}},
- {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 11380, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {11554, 11571, 11588, 11597, 11608, 11619, 11632, 11645, 11660, 11679, 11698, 11715, 343}, {11734, 11741, 11748, 11755, 11762, 11769, 11776, 11783, 11790, 11797, 11804, 11811, 343}, 0, 0, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}},
+ {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 1, 344, 346, {348,2665},{357,409},{370},{376,2186}},
+ {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 11380, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {11554, 11571, 11588, 11597, 11608, 11619, 11632, 11645, 11660, 11679, 11698, 11715, 343}, {11734, 11741, 11748, 11755, 11762, 11769, 11776, 11783, 11790, 11797, 11804, 11811, 343}, 0, 1, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}},
{1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {11827, 11835, 11846, 11856, 11867, 11876, 11885}, {11895, 11898, 11901, 11904, 11907, 11910, 11913}, {11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343}, {12009, 12013, 1862, 12017, 3772, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 0, 344, 346, {348,12229,1929},{357,409},{370},{376,438}},
+ {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 1, 344, 346, {348,12229,1929},{357,409},{370},{376,438}},
{1112, 357, 348, 376, 370, 1136, 1146, 12237, 12240, {12243, 12250, 12258, 12266, 12275, 12285, 12292}, {2013, 6475, 2019, 12301, 2025, 12304, 2031}, {12307, 12316, 12326, 2055, 8832, 12332, 12338, 12344, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 2142, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {12353, 1664, 1898, 376, 370, 447, 457, 465, 468, {4537, 12376, 12387, 12397, 12407, 12417, 12431}, {4623, 4627, 12443, 12448, 12452, 12457, 12462}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898},{357,1664},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 12466, 12494, {12516, 12535, 12554, 12576, 12595, 12617, 12642}, {12661, 12671, 12681, 12694, 12704, 12717, 12733}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {12944, 12953, 12962, 12970, 12979, 12988, 12995}, {13004, 13008, 13012, 13016, 13020, 13024, 13028}, {8809, 8817, 13032, 13038, 8832, 2065, 13045, 13051, 13058, 13067, 13074, 13082, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13090, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 13094, 13136, {13178, 13197, 13216, 13238, 13257, 13279, 13304}, {13323, 13333, 13343, 13356, 13366, 13379, 13395}, {13405, 13433, 13461, 13477, 13496, 13503, 13513, 13529, 13545, 13573, 13595, 13617, 343}, {13642, 13661, 13461, 13477, 13496, 13503, 13513, 13529, 13680, 13696, 13712, 13722, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 13735, 13748, {13761, 13780, 13802, 13827, 13843, 13865, 13884}, {13894, 13901, 13908, 13915, 13922, 13929, 13936}, {13940, 13956, 13981, 14000, 14019, 14026, 14039, 14052, 14071, 14102, 14127, 14149, 343}, {14174, 14182, 14196, 14210, 14019, 14026, 14039, 14221, 14229, 14243, 14254, 14262, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 14273, 14301, {14323, 14345, 14367, 14392, 14414, 14439, 14467}, {14489, 14499, 14509, 14522, 14532, 14545, 14561}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 14805, 14833, {14855, 14874, 14893, 14915, 14934, 14956, 14981}, {15000, 15005, 15013, 15021, 15029, 15037, 15045}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 15290, 15302, {12516, 12535, 15314, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {15554, 15562, 15567, 15574, 15584, 15590, 15597}, {15605, 15609, 2900, 15613, 15618, 15622, 15626}, {15631, 15639, 15648, 15654, 15660, 15665, 15671, 15677, 15684, 15693, 15701, 15710, 343}, {15719, 2122, 2900, 15723, 2061, 15727, 15732, 13090, 15736, 15740, 2154, 2908, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1112, 357, 348, 376, 370, 1136, 1146, 15290, 15302, {15744, 12535, 15772, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15791, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
- {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37},{357,24},{370,56},{376,46}},
- {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 0, 344, 346, {348,844,422},{357,409},{370},{376,438}},
- {5975, 876, 2665, 438, 370, 447, 457, 465, 468, {897, 906, 914, 922, 931, 938, 948}, {957, 961, 965, 969, 973, 977, 981}, {985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343}, {1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343}, 0, 0, 344, 346, {348,888,2665},{357,876},{370},{376,438}},
- {15822, 4984, 5251, 15867, 15890, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,5251},{357,4984},{370,15890},{376,15867}},
- {7267, 1379, 3314, 2982, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 0, 344, 346, {348,1392,3314},{357,1379},{370,1409},{376,1399,2982}},
- {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}},
- {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
- {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 0, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}},
- {2688, 2719, 10606, 2186, 2746, 63, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {10606,10606,2739,2739,11818,3046,348,5996,15897},{2719,2719,2912,2926,2946},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438}},
- {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 0, 344, 346, {348,3314},{357,3297},{370},{376,2982}},
- {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}},
+ {12353, 12373, 348, 376, 370, 12382, 1146, 12389, 12405, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {348},{357,12373},{370},{376}},
+ {12427, 1664, 1898, 376, 370, 447, 457, 465, 468, {4537, 12450, 12461, 12471, 12481, 12491, 12505}, {4623, 4627, 12517, 12522, 12526, 12531, 12536}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898},{357,1664},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 12540, 12568, {12590, 12609, 12628, 12650, 12669, 12691, 12716}, {12735, 12745, 12755, 12768, 12778, 12791, 12807}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {13018, 13027, 13036, 13044, 13053, 13062, 13069}, {13078, 13082, 13086, 13090, 13094, 13098, 13102}, {8809, 8817, 13106, 13112, 8832, 2065, 13119, 13125, 13132, 13141, 13148, 13156, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13164, 2146, 2150, 2154, 8857, 343}, 0, 6, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 13168, 13210, {13252, 13271, 13290, 13312, 13331, 13353, 13378}, {13397, 13407, 13417, 13430, 13440, 13453, 13469}, {13479, 13507, 13535, 13551, 13570, 13577, 13587, 13603, 13619, 13647, 13669, 13691, 343}, {13716, 13735, 13535, 13551, 13570, 13577, 13587, 13603, 13754, 13770, 13786, 13796, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 13809, 13822, {13835, 13854, 13876, 13901, 13917, 13939, 13958}, {13968, 13975, 13982, 13989, 13996, 14003, 14010}, {14014, 14030, 14055, 14074, 14093, 14100, 14113, 14126, 14145, 14176, 14201, 14223, 343}, {14248, 14256, 14270, 14284, 14093, 14100, 14113, 14295, 14303, 14317, 14328, 14336, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 14347, 14375, {14397, 14419, 14441, 14466, 14488, 14513, 14541}, {14563, 14573, 14583, 14596, 14606, 14619, 14635}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 14879, 14907, {14929, 14948, 14967, 14989, 15008, 15030, 15055}, {15074, 15079, 15087, 15095, 15103, 15111, 15119}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 15364, 15376, {12590, 12609, 15388, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 465, 468, {15628, 15636, 15641, 15648, 15658, 15664, 15671}, {15679, 15683, 2900, 15687, 15692, 15696, 15700}, {15705, 15713, 15722, 15728, 15734, 15739, 15745, 15751, 15758, 15767, 15775, 15784, 343}, {15793, 2122, 2900, 15797, 2061, 15801, 15806, 13164, 15810, 15814, 2154, 2908, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1112, 357, 348, 376, 370, 1136, 1146, 15364, 15376, {15818, 12609, 15846, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15865, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348},{357},{370},{376}},
+ {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37},{357,24},{370,56},{376,46}},
+ {387, 409, 422, 438, 370, 447, 457, 465, 468, {471, 484, 505, 520, 531, 550, 561}, {574, 582, 590, 596, 602, 612, 620}, {628, 641, 658, 667, 678, 685, 692, 699, 712, 731, 748, 763, 343}, {780, 786, 658, 794, 678, 685, 692, 802, 810, 818, 826, 836, 343}, 0, 1, 344, 346, {348,844,422},{357,409},{370},{376,438}},
+ {5975, 876, 2665, 438, 370, 447, 457, 465, 468, {897, 906, 914, 922, 931, 938, 948}, {957, 961, 965, 969, 973, 977, 981}, {985, 991, 998, 1004, 1010, 1015, 1020, 1027, 1033, 1042, 1050, 1059, 343}, {1068, 1073, 998, 1078, 1010, 1015, 1083, 1088, 1092, 1097, 1102, 1107, 343}, 0, 1, 344, 346, {348,888,2665},{357,876},{370},{376,438}},
+ {15896, 4984, 5251, 15941, 15964, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,5251},{357,4984},{370,15964},{376,15941}},
+ {7267, 1379, 3314, 2982, 1409, 447, 1414, 1422, 1427, {1432, 1440, 1450, 1458, 1466, 1475, 1482}, {1489, 1492, 1495, 1499, 1502, 1506, 1510}, {1513, 1519, 1525, 1533, 1539, 1547, 1555, 1565, 1571, 1579, 1587, 1596, 343}, {1605, 1607, 1610, 1614, 1617, 1619, 1622, 1626, 1631, 1634, 1636, 1639, 343}, 0, 1, 344, 346, {348,1392,3314},{357,1379},{370,1409},{376,1399,2982}},
+ {1643, 1664, 1676, 438, 370, 447, 457, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {1740, 1745, 1749, 1753, 1757, 1761, 1765}, {1770, 1777, 1785, 1791, 1797, 1801, 1806, 1811, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,1898,1676},{357,1664},{370},{376,438}},
+ {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
+ {2162, 409, 37, 2186, 56, 447, 457, 2197, 2202, {2207, 2222, 2237, 2248, 2263, 2276, 2295}, {2310, 2317, 2324, 2331, 2338, 2345, 2352}, {2359, 2380, 2403, 2418, 2435, 2446, 2461, 2476, 2495, 2518, 2537, 2556, 343}, {2577, 2584, 2591, 2598, 2605, 2612, 2621, 2630, 2637, 2644, 2651, 2658, 343}, 0, 1, 344, 346, {348,2665,37},{357,409},{370,56},{376,2676,2186}},
+ {2688, 2719, 10606, 2186, 2746, 63, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {10606,10606,2739,2739,11818,3046,348,5996,15971},{2719,2719,2912,2926,2946},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438}},
+ {3272, 3297, 3314, 2982, 370, 3323, 3336, 465, 468, {3348, 3358, 3368, 3376, 3388, 3396, 3406}, {3415, 3418, 3421, 3424, 3427, 3430, 3433}, {3436, 3445, 3454, 3464, 3473, 3482, 3491, 3501, 3508, 3516, 3524, 3534, 343}, {3543, 3549, 3555, 3562, 3568, 3574, 3580, 3587, 3591, 3596, 3601, 3608, 343}, 0, 1, 344, 346, {348,3314},{357,3297},{370},{376,2982}},
+ {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}},
{3869, 876, 2665, 438, 370, 447, 74, 465, 468, {3890, 3908, 3922, 3940, 3958, 3976, 3992}, {3999, 4002, 4005, 4008, 4011, 4014, 4017}, {4020, 4031, 4044, 4051, 4062, 4069, 4078, 4087, 4100, 4113, 4128, 4141, 343}, {4152, 4159, 4044, 4166, 4062, 4173, 4180, 4187, 4194, 4201, 4208, 4215, 343}, 0, 0, 344, 346, {348,888,2665},{357,876},{370},{376,438}},
- {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 0, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}},
+ {4222, 4244, 4258, 2982, 1409, 4272, 4283, 4291, 4294, {4297, 4307, 4315, 4320, 4327, 4340, 4348}, {1617, 4356, 4358, 4360, 4364, 4367, 4369}, {4373, 4381, 4390, 4399, 4408, 4415, 4423, 4431, 4441, 4452, 1836, 1845, 343}, {4461, 4466, 4472, 4479, 4485, 4491, 4497, 4503, 4508, 4515, 1102, 4520, 343}, 0, 1, 344, 346, {348,4525,4258},{357,4244},{370,1409},{376,1399,2982}},
{1907, 1379, 3314, 438, 370, 447, 1414, 465, 468, {4537, 4548, 4559, 4573, 4587, 4599, 4611}, {4623, 4627, 4632, 4637, 4642, 4646, 4651}, {4655, 4663, 3761, 4672, 4679, 4684, 4691, 4698, 1818, 4452, 4706, 4716, 343}, {1854, 1858, 1862, 1866, 4679, 4725, 4730, 4735, 1882, 1886, 4741, 4746, 343}, 0, 0, 344, 346, {348,3314},{357,1379},{370},{376,438}},
- {15907, 409, 2665, 15928, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 0, 344, 346, {348,888,2665},{357,409},{370},{376,1399,15928}},
+ {15981, 409, 2665, 16002, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 1, 344, 346, {348,888,2665},{357,409},{370},{376,1399,16002}},
{4954, 4984, 5006, 2982, 1409, 5017, 5033, 5046, 5053, {5060, 5070, 5080, 5090, 5100, 5110, 5120}, {1238, 5130, 5134, 5138, 5142, 5146, 5150}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,5260,5279,5296},{4984,4984,5315,5339,5366},{1409,1409,370,5395,5403},{2982,438,5412,5423}},
- {15936, 15986, 5006, 16010, 5395, 5568, 5585, 5599, 5606, {5613, 5623, 5633, 5643, 5653, 5663, 5673}, {5683, 5687, 5691, 5695, 5699, 5703, 5707}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,16036,16049},{15986,15986,16060,16086,16108},{5395,1409,370,16132,16146,16161,5395,5403,16177,16194,16212},{16010,16010,16231,16253,2982,438,16277,16302,5412,5423}},
- {8861, 876, 16329, 2982, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5796,16329},{357,876},{370,1409},{376,1399,2982}},
- {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}},
- {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 0, 344, 346, {348,5515,5996},{357,876},{370},{376,438}},
- {16338, 3024, 37, 438, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676,888,37},{357,3024},{370},{376,16369,438}},
- {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,1929},{357,876},{370},{376,438}},
- {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 0, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}},
- {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 0, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}},
- {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}},
- {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 0, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}},
- {16386, 7668, 5996, 438, 370, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944,438}},
+ {16010, 16060, 5006, 16084, 5395, 5568, 5585, 5599, 5606, {5613, 5623, 5633, 5643, 5653, 5663, 5673}, {5683, 5687, 5691, 5695, 5699, 5703, 5707}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, {5711, 5716, 5721, 5726, 5731, 5736, 5741, 5746, 5751, 5756, 5762, 5768, 343}, 0, 0, 344, 346, {5006,5006,348,5244,5251,16110,16123},{16060,16060,16134,16160,16182},{5395,1409,370,16206,16220,16235,5395,5403,16251,16268,16286},{16084,16084,16305,16327,2982,438,16351,16376,5412,5423}},
+ {8861, 876, 16403, 2982, 1409, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5796,16403},{357,876},{370,1409},{376,1399,2982}},
+ {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 1, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}},
+ {5975, 876, 5996, 438, 370, 447, 74, 465, 468, {6007, 6017, 6031, 6038, 6045, 6054, 1482}, {6062, 6064, 6067, 6070, 6074, 6077, 2013}, {6080, 6089, 6094, 6101, 1797, 6111, 6120, 6127, 6137, 6147, 1587, 6160, 343}, {6170, 6174, 1862, 6178, 1797, 6182, 6186, 6190, 6194, 6198, 6203, 6207, 343}, 0, 1, 344, 346, {348,5515,5996},{357,876},{370},{376,438}},
+ {16412, 3024, 37, 438, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676,888,37},{357,3024},{370},{376,16443,438}},
+ {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {6418, 6428, 6433, 6440, 6449, 6453, 6460}, {6471, 6473, 6475, 2022, 6478, 1617, 6480}, {6482, 6491, 6501, 6508, 3772, 6516, 6522, 1811, 6528, 6539, 6549, 6559, 343}, {6569, 2122, 2900, 2130, 2061, 6573, 6577, 2142, 2146, 2904, 2154, 2908, 343}, 0, 1, 344, 346, {348,1929},{357,876},{370},{376,438}},
+ {6581, 6607, 1929, 2982, 1409, 6625, 74, 465, 468, {6641, 6664, 505, 6687, 6698, 6713, 6728}, {6743, 6748, 6753, 6758, 6763, 6768, 6773}, {6778, 6791, 6806, 6815, 6828, 6835, 6844, 6853, 6866, 6883, 6898, 6911, 343}, {6926, 6933, 6940, 6947, 678, 6954, 6961, 6968, 6975, 6982, 6989, 6996, 343}, 0, 1, 344, 346, {348,844,1929},{357,6607},{370,1409},{376,1399,2982}},
+ {7003, 7025, 3314, 2982, 370, 4272, 1146, 465, 468, {7039, 7048, 7060, 7067, 7075, 7085, 7091}, {7098, 7102, 7106, 7110, 7114, 7119, 7123}, {7127, 7137, 7146, 7154, 7162, 7170, 7177, 7184, 7192, 1587, 7198, 7206, 343}, {7215, 7219, 7223, 7228, 7232, 6186, 7236, 7240, 7244, 6203, 7248, 7252, 343}, 0, 1, 344, 346, {348,7256,3314},{357,7025},{370},{376,2982}},
+ {7267, 1379, 7288, 2982, 1409, 447, 1414, 465, 468, {7299, 7307, 7316, 7323, 7330, 7339, 7346}, {7353, 7356, 7359, 7362, 7365, 7369, 2013}, {4373, 4381, 7372, 4672, 7378, 4725, 4730, 1811, 1818, 4452, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 7378, 4725, 4730, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,3314,7288},{357,1379},{370,1409},{376,1399,2982}},
+ {7383, 409, 5996, 7407, 7418, 447, 457, 7425, 7428, {7431, 7438, 7447, 7456, 7468, 7476, 7485}, {7495, 7499, 2900, 7504, 7509, 7513, 7517}, {7521, 7527, 3761, 7534, 1797, 7540, 7548, 7555, 7561, 7569, 7575, 7583, 343}, {2118, 7591, 2900, 7595, 7599, 7603, 7607, 7611, 7517, 7615, 7619, 7624, 343}, 0, 1, 344, 346, {348,5515,5996},{357,409},{370,7418},{376,7628,7407}},
+ {16460, 7668, 5996, 438, 370, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5996},{357,7668},{370,5955},{376,5944,438}},
{7742, 876, 37, 2982, 1409, 447, 74, 7763, 7794, {7825, 7856, 7884, 7912, 7931, 7965, 7990}, {8015, 8023, 8028, 8033, 8038, 8046, 8051}, {8056, 8075, 8106, 8125, 8144, 8166, 8191, 8213, 8235, 8257, 8276, 8304, 343}, {8326, 8335, 8344, 8356, 8368, 8377, 8389, 8398, 8407, 8416, 8425, 8434, 343}, 0, 0, 344, 346, {348,37},{357,876},{370,1409},{376,8443,2982}},
- {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 0, 344, 346, {348,1929},{357,8510},{370},{376,438}},
- {16412, 409, 2665, 2982, 1409, 447, 457, 465, 468, {8738, 8745, 8751, 8758, 8763, 8769, 8775}, {8781, 8785, 8789, 8793, 8797, 8801, 8805}, {8809, 8817, 8826, 2055, 8832, 2065, 2070, 8836, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 8853, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,888,2665},{357,409},{370,1409},{376,2982}},
- {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 0, 344, 346, {348,844,1929},{357,876},{370},{376,2982}},
- {8861, 876, 1929, 2982, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 0, 344, 346, {348,1392,1929},{357,876},{370,5955},{376,5944,2982}},
- {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}},
- {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 0, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}},
- {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 0, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}},
- {16433, 10271, 7256, 438, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 0, 344, 346, {348,7256},{357,10271},{370},{376,438}},
- {10582, 876, 10606, 2970, 370, 447, 74, 10615, 10622, {10629, 10645, 10658, 10674, 10691, 10709, 10718}, {10727, 10731, 10735, 10739, 10743, 10747, 10751}, {10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343}, {10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343}, 0, 0, 344, 346, {348,10951,10606},{357,876},{370},{376,10961,2970}},
- {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 0, 344, 346, {348,2665},{357,409},{370},{376,2186}},
- {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 16464, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {16472, 16487, 11588, 11597, 11608, 16502, 16515, 11645, 11660, 11679, 11698, 11715, 343}, {16528, 16535, 11748, 11755, 11762, 16542, 16549, 11783, 11790, 11797, 11804, 11811, 343}, 0, 0, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}},
- {16556, 16595, 5006, 438, 370, 16625, 1146, 465, 468, {11827, 11835, 11846, 11856, 11867, 11876, 11885}, {11895, 11898, 11901, 11904, 11907, 11910, 11913}, {11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343}, {12009, 12013, 1862, 12017, 3772, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343}, 0, 0, 344, 346, {348,16640,5006},{357,16595},{370},{376,438}},
- {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 0, 344, 346, {348,12229,1929},{357,409},{370},{376,438}},
- {16653, 409, 5006, 2970, 56, 447, 457, 343, 343, {12243, 12250, 12258, 12266, 12275, 12285, 12292}, {2013, 6475, 2019, 12301, 2025, 12304, 2031}, {12307, 12316, 12326, 2055, 8832, 12332, 12338, 12344, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 2142, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,5006},{357,409},{370,56},{376,46,2970}},
- {16678, 1664, 1676, 16699, 370, 447, 457, 465, 468, {4537, 12376, 12387, 12397, 12407, 12417, 12431}, {4623, 4627, 12443, 12448, 12452, 12457, 12462}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,16699}},
- {5975, 876, 1676, 438, 56, 447, 74, 12466, 12494, {12516, 12535, 12554, 12576, 12595, 12617, 12642}, {12661, 12671, 12681, 12694, 12704, 12717, 12733}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, {12743, 12759, 12775, 12791, 12810, 12817, 12827, 12843, 12859, 12881, 12903, 12922, 343}, 0, 0, 344, 346, {348,5796,1676},{357,876},{370,56},{376,2676,438}},
- {16708, 357, 10606, 16732, 370, 1136, 1146, 465, 468, {12944, 12953, 12962, 12970, 12979, 12988, 12995}, {13004, 13008, 13012, 13016, 13020, 13024, 13028}, {8809, 8817, 13032, 13038, 8832, 2065, 13045, 13051, 13058, 13067, 13074, 13082, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13090, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,10606},{357},{370},{376,16732}},
- {16743, 876, 16768, 16776, 16789, 447, 74, 13094, 13136, {13178, 13197, 13216, 13238, 13257, 13279, 13304}, {13323, 13333, 13343, 13356, 13366, 13379, 13395}, {13405, 13433, 13461, 13477, 13496, 13503, 13513, 13529, 13545, 13573, 13595, 13617, 343}, {13642, 13661, 13461, 13477, 13496, 13503, 13513, 13529, 13680, 13696, 13712, 13722, 343}, 0, 0, 344, 346, {348,16768},{357,876},{370,16789},{376,16776}},
- {16797, 876, 5796, 2676, 56, 447, 74, 13735, 13748, {13761, 13780, 13802, 13827, 13843, 13865, 13884}, {13894, 13901, 13908, 13915, 13922, 13929, 13936}, {13940, 13956, 13981, 14000, 14019, 14026, 14039, 14052, 14071, 14102, 14127, 14149, 343}, {14174, 14182, 14196, 14210, 14019, 14026, 14039, 14221, 14229, 14243, 14254, 14262, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}},
- {16797, 876, 1898, 2676, 56, 447, 74, 14273, 14301, {14323, 14345, 14367, 14392, 14414, 14439, 14467}, {14489, 14499, 14509, 14522, 14532, 14545, 14561}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, {14571, 14587, 14612, 14631, 14653, 14660, 14673, 14686, 14705, 14736, 14761, 14780, 343}, 0, 0, 344, 346, {348,1898},{357,876},{370,56},{376,2676}},
- {16743, 876, 5796, 16776, 16789, 447, 74, 14805, 14833, {14855, 14874, 14893, 14915, 14934, 14956, 14981}, {15000, 15005, 15013, 15021, 15029, 15037, 15045}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, {15056, 15072, 15097, 15116, 15138, 15145, 15158, 15171, 15190, 15218, 15243, 15265, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,16789},{376,16776}},
- {16797, 876, 5796, 2676, 56, 447, 74, 15290, 15302, {12516, 12535, 15314, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}},
- {4750, 409, 888, 376, 370, 447, 457, 465, 468, {15554, 15562, 15567, 15574, 15584, 15590, 15597}, {15605, 15609, 2900, 15613, 15618, 15622, 15626}, {15631, 15639, 15648, 15654, 15660, 15665, 15671, 15677, 15684, 15693, 15701, 15710, 343}, {15719, 2122, 2900, 15723, 2061, 15727, 15732, 13090, 15736, 15740, 2154, 2908, 343}, 0, 0, 344, 346, {348,888},{357,409},{370},{376}},
- {16797, 876, 5796, 2676, 56, 447, 74, 15290, 15302, {15744, 12535, 15772, 12576, 12595, 12617, 12642}, {12661, 12671, 15336, 12694, 12704, 12717, 12733}, {15349, 15791, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, {15349, 15374, 12775, 15399, 15418, 12817, 15425, 15438, 15454, 15482, 15504, 15532, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}},
- {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37},{357,24},{370,56},{376,46}},
- {16821, 4984, 16866, 16873, 16896, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,16866},{357,4984},{370,16896},{376,16873}},
- {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
- {5975, 876, 2665, 438, 370, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,2665},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438,376}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264},{357,876,3640},{370},{376,438,2982}},
- {5975, 876, 1929, 438, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 0, 344, 346, {348,888,844,1929},{357,409,876},{370},{376,438}},
- {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5796,3264,3859},{357,876},{370,1409},{376,1399,2982}},
- {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}},
- {16902, 3024, 1676, 2982, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 0, 344, 346, {348,1676},{357,3024},{370},{376,2982}},
- {16386, 7668, 3314, 438, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 0, 344, 346, {348,5996,3314},{357,7668},{370,5955},{376,5944,438}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {16957, 5315, 17004, 15867, 16896, 17024, 17041, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17004},{357,5315},{370,16896},{376,15867}},
- {17056, 9685, 1929, 438, 370, 447, 9699, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {17079, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {17087, 2122, 17092, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379,9685},{370},{376,438}},
- {17097, 876, 3859, 2186, 56, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
- {17120, 17157, 2665, 2982, 1409, 17186, 457, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024,17157},{370,1409},{376,2970,2982}},
+ {8483, 8510, 1929, 438, 370, 447, 457, 465, 468, {8528, 8534, 8544, 8550, 8561, 8571, 8576}, {8586, 8590, 8594, 8598, 8603, 8607, 8611}, {8615, 8620, 8627, 8632, 8638, 8645, 8653, 8660, 8669, 8676, 8681, 8688, 343}, {8696, 8700, 2900, 8705, 2869, 8709, 8713, 8717, 8722, 8726, 8730, 8734, 343}, 0, 1, 344, 346, {348,1929},{357,8510},{370},{376,438}},
+ {16486, 409, 2665, 2982, 1409, 447, 457, 465, 468, {8738, 8745, 8751, 8758, 8763, 8769, 8775}, {8781, 8785, 8789, 8793, 8797, 8801, 8805}, {8809, 8817, 8826, 2055, 8832, 2065, 2070, 8836, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 8853, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,888,2665},{357,409},{370,1409},{376,2982}},
+ {8861, 876, 1929, 2982, 370, 8881, 74, 465, 468, {8897, 8910, 8929, 8946, 8959, 8972, 8988}, {9001, 6748, 6753, 6758, 6763, 6768, 6773}, {9006, 9017, 9030, 9045, 9058, 9071, 9084, 9095, 9108, 9123, 9136, 9155, 343}, {9168, 9175, 9182, 9189, 9198, 9207, 9216, 9223, 9232, 9239, 9248, 9257, 343}, 0, 1, 344, 346, {348,844,1929},{357,876},{370},{376,2982}},
+ {8861, 876, 1929, 2982, 5955, 447, 74, 465, 468, {9289, 9304, 9325, 9340, 9353, 9366, 9381}, {9394, 9399, 9404, 9409, 9414, 9419, 9424}, {9429, 9446, 9455, 9470, 678, 9487, 9502, 9515, 9530, 9547, 9568, 9585, 343}, {9600, 9175, 9607, 9614, 678, 9621, 9628, 9635, 9232, 9642, 9649, 9656, 343}, 0, 1, 344, 346, {348,1392,1929},{357,876},{370,5955},{376,5944,2982}},
+ {9663, 9685, 3314, 2982, 1409, 447, 9699, 465, 468, {9708, 9716, 9727, 9733, 9739, 9748, 1482}, {7098, 7102, 1757, 9754, 7114, 7119, 9758}, {1770, 1777, 7372, 1791, 1797, 9762, 9768, 9774, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 9781, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,9785,3314},{357,9685},{370,1409},{376,1399,2982}},
+ {8861, 876, 9792, 2982, 1409, 447, 9802, 465, 468, {9810, 9821, 9832, 9843, 9854, 9865, 9871}, {4367, 9880, 9882, 4358, 6062, 9884, 6473}, {9886, 9894, 9903, 9910, 3772, 9917, 9923, 1811, 1818, 9929, 1836, 9938, 343}, {9948, 9953, 9903, 1866, 3772, 9917, 9923, 1878, 9959, 1886, 1890, 9964, 343}, 0, 1, 344, 346, {348,844,9792},{357,876},{370,1409},{376,1399,2982}},
+ {9969, 9998, 4525, 2982, 370, 10019, 1414, 465, 468, {10037, 10048, 10058, 10067, 10078, 10090, 10101}, {10111, 4367, 10114, 9882, 10116, 10118, 6480}, {10121, 10131, 1785, 10142, 10151, 10157, 10165, 10173, 10181, 10192, 10201, 10211, 343}, {2118, 2122, 2900, 2130, 2061, 10221, 10226, 2142, 2146, 2150, 2154, 2908, 343}, 0, 1, 344, 346, {348,10231,4525},{357,9998},{370},{376,2982}},
+ {16507, 10271, 7256, 438, 370, 10293, 10308, 465, 468, {10320, 10332, 10344, 10356, 10370, 10385, 10398}, {10412, 10415, 10418, 10421, 10424, 6064, 7365}, {10427, 10434, 10442, 10447, 10458, 10468, 10478, 10485, 10497, 10506, 10513, 10524, 343}, {10534, 10538, 10542, 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574, 10578, 343}, 0, 1, 344, 346, {348,7256},{357,10271},{370},{376,438}},
+ {10582, 876, 10606, 2970, 370, 447, 74, 10615, 10622, {10629, 10645, 10658, 10674, 10691, 10709, 10718}, {10727, 10731, 10735, 10739, 10743, 10747, 10751}, {10755, 10768, 229, 10779, 10790, 10795, 10804, 10815, 10822, 10837, 10848, 10861, 343}, {10874, 10881, 10888, 10895, 10902, 10909, 10916, 10815, 10923, 10930, 10937, 10944, 343}, 0, 6, 344, 346, {348,10951,10606},{357,876},{370},{376,10961,2970}},
+ {10974, 409, 2665, 2186, 370, 447, 457, 10998, 11001, {11004, 11017, 11027, 11036, 11046, 11057, 11068}, {11080, 11083, 11088, 11093, 11098, 11103, 11108}, {11113, 11126, 11137, 11147, 11158, 11170, 11182, 11195, 11207, 11220, 11235, 11256, 343}, {11275, 11281, 11287, 11293, 11299, 11305, 11311, 11317, 11323, 11329, 11336, 11343, 343}, 0, 1, 344, 346, {348,2665},{357,409},{370},{376,2186}},
+ {11350, 2912, 1929, 2982, 370, 447, 2754, 11372, 16538, {11388, 11401, 11422, 11441, 11462, 11481, 11494}, {11505, 11512, 11519, 11526, 11533, 11540, 11547}, {16546, 16561, 11588, 11597, 11608, 16576, 16589, 11645, 11660, 11679, 11698, 11715, 343}, {16602, 16609, 11748, 11755, 11762, 16616, 16623, 11783, 11790, 11797, 11804, 11811, 343}, 0, 1, 344, 346, {348,11818,1929},{357,2912},{370},{376,2982}},
+ {16630, 16669, 5006, 438, 370, 16699, 1146, 465, 468, {11827, 11835, 11846, 11856, 11867, 11876, 11885}, {11895, 11898, 11901, 11904, 11907, 11910, 11913}, {11916, 11926, 11934, 11942, 11950, 11958, 11965, 11973, 11981, 11988, 11994, 12001, 343}, {12009, 12013, 1862, 12017, 3772, 12021, 12025, 12029, 12033, 12037, 12041, 12045, 343}, 0, 1, 344, 346, {348,16714,5006},{357,16669},{370},{376,438}},
+ {387, 409, 1929, 438, 370, 447, 457, 465, 468, {12049, 484, 505, 6687, 12062, 12079, 12090}, {574, 582, 590, 12103, 12111, 612, 12119}, {12127, 641, 658, 667, 12142, 12149, 12158, 699, 712, 731, 748, 763, 343}, {12167, 786, 12175, 794, 12183, 12191, 12199, 802, 12207, 818, 826, 12217, 343}, 0, 1, 344, 346, {348,12229,1929},{357,409},{370},{376,438}},
+ {16727, 409, 5006, 2970, 56, 447, 457, 343, 343, {12243, 12250, 12258, 12266, 12275, 12285, 12292}, {2013, 6475, 2019, 12301, 2025, 12304, 2031}, {12307, 12316, 12326, 2055, 8832, 12332, 12338, 12344, 2082, 2092, 2100, 8844, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 2142, 2146, 2150, 2154, 8857, 343}, 0, 0, 344, 346, {348,5006},{357,409},{370,56},{376,46,2970}},
+ {16752, 16792, 1929, 2982, 1409, 12382, 1146, 12389, 12405, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, {5217, 5219, 5221, 5223, 5225, 5227, 5229, 5231, 5233, 5235, 5238, 5241, 343}, 0, 0, 344, 346, {348,1929},{357,12373,16792},{370,1409},{376,2982}},
+ {16824, 1664, 1676, 16845, 370, 447, 457, 465, 468, {4537, 12450, 12461, 12471, 12481, 12491, 12505}, {4623, 4627, 12517, 12522, 12526, 12531, 12536}, {1770, 1777, 3761, 4672, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 0, 344, 346, {348,1898,1676},{357,1664},{370},{376,16845}},
+ {5975, 876, 1676, 438, 56, 447, 74, 12540, 12568, {12590, 12609, 12628, 12650, 12669, 12691, 12716}, {12735, 12745, 12755, 12768, 12778, 12791, 12807}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, {12817, 12833, 12849, 12865, 12884, 12891, 12901, 12917, 12933, 12955, 12977, 12996, 343}, 0, 0, 344, 346, {348,5796,1676},{357,876},{370,56},{376,2676,438}},
+ {16854, 357, 10606, 16878, 370, 1136, 1146, 465, 468, {13018, 13027, 13036, 13044, 13053, 13062, 13069}, {13078, 13082, 13086, 13090, 13094, 13098, 13102}, {8809, 8817, 13106, 13112, 8832, 2065, 13119, 13125, 13132, 13141, 13148, 13156, 343}, {2118, 2122, 2900, 2130, 8832, 2134, 2138, 13164, 2146, 2150, 2154, 8857, 343}, 0, 6, 344, 346, {348,10606},{357},{370},{376,16878}},
+ {16889, 876, 16914, 16922, 16935, 447, 74, 13168, 13210, {13252, 13271, 13290, 13312, 13331, 13353, 13378}, {13397, 13407, 13417, 13430, 13440, 13453, 13469}, {13479, 13507, 13535, 13551, 13570, 13577, 13587, 13603, 13619, 13647, 13669, 13691, 343}, {13716, 13735, 13535, 13551, 13570, 13577, 13587, 13603, 13754, 13770, 13786, 13796, 343}, 0, 0, 344, 346, {348,16914},{357,876},{370,16935},{376,16922}},
+ {16943, 876, 5796, 2676, 56, 447, 74, 13809, 13822, {13835, 13854, 13876, 13901, 13917, 13939, 13958}, {13968, 13975, 13982, 13989, 13996, 14003, 14010}, {14014, 14030, 14055, 14074, 14093, 14100, 14113, 14126, 14145, 14176, 14201, 14223, 343}, {14248, 14256, 14270, 14284, 14093, 14100, 14113, 14295, 14303, 14317, 14328, 14336, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}},
+ {16943, 876, 1898, 2676, 56, 447, 74, 14347, 14375, {14397, 14419, 14441, 14466, 14488, 14513, 14541}, {14563, 14573, 14583, 14596, 14606, 14619, 14635}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, {14645, 14661, 14686, 14705, 14727, 14734, 14747, 14760, 14779, 14810, 14835, 14854, 343}, 0, 0, 344, 346, {348,1898},{357,876},{370,56},{376,2676}},
+ {16889, 876, 5796, 16922, 16935, 447, 74, 14879, 14907, {14929, 14948, 14967, 14989, 15008, 15030, 15055}, {15074, 15079, 15087, 15095, 15103, 15111, 15119}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, {15130, 15146, 15171, 15190, 15212, 15219, 15232, 15245, 15264, 15292, 15317, 15339, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,16935},{376,16922}},
+ {16943, 876, 5796, 2676, 56, 447, 74, 15364, 15376, {12590, 12609, 15388, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}},
+ {4750, 409, 888, 376, 370, 447, 457, 465, 468, {15628, 15636, 15641, 15648, 15658, 15664, 15671}, {15679, 15683, 2900, 15687, 15692, 15696, 15700}, {15705, 15713, 15722, 15728, 15734, 15739, 15745, 15751, 15758, 15767, 15775, 15784, 343}, {15793, 2122, 2900, 15797, 2061, 15801, 15806, 13164, 15810, 15814, 2154, 2908, 343}, 0, 1, 344, 346, {348,888},{357,409},{370},{376}},
+ {16943, 876, 5796, 2676, 56, 447, 74, 15364, 15376, {15818, 12609, 15846, 12650, 12669, 12691, 12716}, {12735, 12745, 15410, 12768, 12778, 12791, 12807}, {15423, 15865, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, {15423, 15448, 12849, 15473, 15492, 12891, 15499, 15512, 15528, 15556, 15578, 15606, 343}, 0, 0, 344, 346, {348,5796},{357,876},{370,56},{376,2676}},
+ {1, 24, 37, 46, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37},{357,24},{370,56},{376,46}},
+ {16967, 4984, 17012, 17019, 17042, 5017, 5033, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,17012},{357,4984},{370,17042},{376,17019}},
+ {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
+ {5975, 876, 2665, 438, 370, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 1, 344, 346, {348,2739,2665},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438,376}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264},{357,876,3640},{370},{376,438,2982}},
+ {5975, 876, 1929, 438, 370, 447, 74, 4774, 4777, {4780, 4789, 4797, 4806, 4817, 4826, 4835}, {3139, 3143, 1862, 4842, 4846, 4850, 4854}, {4858, 4866, 3179, 4875, 4882, 4889, 4896, 3202, 4903, 4913, 1050, 4921, 343}, {4930, 1858, 1862, 1866, 4934, 4938, 4942, 3252, 4946, 4950, 1890, 3260, 343}, 0, 1, 344, 346, {348,888,844,1929},{357,409,876},{370},{376,438}},
+ {8861, 876, 3859, 2982, 370, 447, 74, 465, 468, {5803, 5810, 5818, 5826, 5835, 5845, 5853}, {5862, 3418, 5865, 5868, 5871, 5874, 5877}, {5880, 5888, 5897, 1791, 5903, 1801, 1806, 5907, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 5916, 1866, 5903, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5796,3264,3859},{357,876},{370,1409},{376,1399,2982}},
+ {5920, 1379, 844, 5944, 5955, 447, 1414, 465, 468, {1687, 1695, 1702, 1710, 1717, 1725, 1732}, {5961, 3418, 3421, 5965, 3427, 5968, 5971}, {1770, 1777, 3761, 1791, 3772, 1801, 1806, 1811, 1818, 1828, 1836, 4716, 343}, {1854, 1858, 1862, 1866, 3772, 1870, 1874, 1878, 1882, 1886, 1890, 4746, 343}, 0, 1, 344, 346, {348,844},{357,1379},{370,5955},{376,5944}},
+ {17048, 3024, 1676, 2982, 370, 3057, 3062, 465, 468, {3084, 6244, 6258, 6271, 6284, 6297, 3131}, {3139, 6309, 6313, 6317, 6321, 6325, 3160}, {6329, 6337, 6347, 1004, 6354, 6359, 6365, 3202, 6371, 6380, 6388, 6397, 343}, {1854, 6406, 1862, 3244, 3772, 1870, 1874, 3252, 4946, 6410, 1890, 6414, 343}, 0, 1, 344, 346, {348,1676},{357,3024},{370},{376,2982}},
+ {16460, 7668, 3314, 438, 5955, 447, 74, 7685, 7688, {7691, 7699, 7707, 1710, 1717, 1725, 7714}, {7722, 7726, 3421, 5965, 3427, 5968, 7730}, {5880, 5888, 3761, 1791, 1797, 1801, 1806, 7734, 1818, 1828, 1836, 1845, 343}, {1854, 1858, 1862, 1866, 1797, 1870, 1874, 1878, 1882, 1886, 1890, 1894, 343}, 0, 1, 344, 346, {348,5996,3314},{357,7668},{370,5955},{376,5944,438}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {17103, 5315, 17150, 15941, 17042, 17170, 17187, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17150},{357,5315},{370,17042},{376,15941}},
+ {17202, 9685, 1929, 438, 370, 447, 9699, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {17225, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {17233, 2122, 17238, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379,9685},{370},{376,438}},
+ {17243, 876, 3859, 2186, 56, 447, 74, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
+ {17266, 17303, 2665, 2982, 1409, 17332, 457, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024,17303},{370,1409},{376,2970,2982}},
{5975, 876, 5996, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,5515,5996},{357,876,3640},{370},{376,438}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {17201, 17224, 888, 17236, 17247, 447, 457, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,888},{357,17224},{370,17247},{376,17236}},
- {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 0, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
- {17255, 17279, 2665, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,888,2665},{2719,2719,2912,2926,2946,17279},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,2665},{357,3024},{370,16789},{376,2970,16776}},
- {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,844,1929},{357,876,3640},{370},{376,438}},
- {17292, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}},
- {16957, 5315, 17004, 15867, 16896, 17024, 17041, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17004},{357,5315},{370,16896},{376,15867}},
- {17097, 876, 3859, 2186, 56, 447, 74, 3074, 3079, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 0, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}},
- {17292, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {17347, 17370, 888, 17382, 17393, 447, 457, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348,888},{357,17370},{370,17393},{376,17382}},
+ {1907, 1379, 1929, 438, 370, 447, 1414, 1940, 1946, {1953, 1961, 1968, 1977, 1986, 1997, 2005}, {2013, 2016, 2019, 2022, 2025, 2028, 2031}, {2034, 2041, 2049, 2055, 2061, 2065, 2070, 2075, 2082, 2092, 2100, 2109, 343}, {2118, 2122, 2126, 2130, 2061, 2134, 2138, 2142, 2146, 2150, 2154, 2158, 343}, 0, 1, 344, 346, {348,844,1929},{357,1379},{370},{376,438}},
+ {17401, 17425, 2665, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,888,2665},{2719,2719,2912,2926,2946,17425},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {5975, 876, 1929, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264,844,1929},{357,876,3640},{370},{376,438}},
+ {17438, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}},
+ {17103, 5315, 17150, 15941, 17042, 17170, 17187, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {5154, 5159, 5164, 5169, 5174, 5179, 5184, 5189, 5194, 5199, 5205, 5211, 343}, 0, 0, 344, 346, {348,17150},{357,5315},{370,17042},{376,15941}},
+ {17243, 876, 3859, 2186, 56, 447, 74, 3074, 3079, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,3264,3859},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {3614, 3640, 2665, 438, 370, 447, 74, 465, 468, {3657, 3666, 3672, 3678, 3687, 3693, 3702}, {3709, 3714, 3719, 3724, 3729, 3734, 3739}, {3744, 3752, 3761, 3766, 3772, 3776, 3781, 3789, 3795, 3805, 1050, 3813, 343}, {3823, 3829, 3761, 3836, 3772, 3776, 3841, 3789, 3847, 1097, 1102, 3853, 343}, 0, 1, 344, 346, {888,3859,3264,2665},{357,876,3640},{370},{376,438}},
+ {17438, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}},
{5975, 876, 2665, 438, 370, 447, 74, 3074, 3079, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,2665},{2719,2719,2912,2926,2946,876},{2746,2746,2961,1409,370},{2186,2186,2970,2982,438,376}},
- {2990, 3024, 3046, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,11818},{357,3024},{370,16789},{376,2970,16776}},
- {17292, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}},
- {16653, 409, 5006, 2970, 56, 447, 457, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,5006},{2719,2719,2912,2926,2946,409},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,2665},{357,3024},{370,1409},{376,2970,1399}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17313, 17337, 17346, 17355, 17481, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, {17313, 17337, 17346, 17355, 17481, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370},{376,2970,1399}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, {17313, 17337, 17346, 17355, 17366, 17375, 17388, 17397, 17402, 17413, 17435, 17459, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 3046, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,11818},{357,3024},{370,16935},{376,2970,16922}},
+ {17438, 24, 1676, 2982, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,1676},{357,24},{370,56},{376,46,2982}},
+ {16727, 409, 5006, 2970, 56, 447, 457, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,5006},{2719,2719,2912,2926,2946,409},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,2665},{357,3024},{370,1409},{376,2970,1399}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, 0, 4, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17459, 17483, 17492, 17501, 17627, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, {17459, 17483, 17492, 17501, 17627, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 370, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370},{376,2970,1399}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, {17459, 17483, 17492, 17501, 17512, 17521, 17534, 17543, 17548, 17559, 17581, 17605, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
{2162, 409, 10606, 2186, 56, 447, 457, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,37,10606},{2719,2719,2912,2926,2946,409},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,46}},
- {16902, 3024, 2665, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,1409},{376,2970,1399,2982}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {17255, 17279, 10606, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,10606},{2719,2719,2912,2926,2946,17279},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}},
- {16902, 3024, 1676, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,1898,1676},{357,3024},{370,1409},{376,2970,1399,2982}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {16932, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 0, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {17490, 17525, 2665, 2970, 16789, 3057, 17548, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024,17525},{370,16789},{376,2970,16776}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16789},{376,2970,16776}},
- {2990, 3024, 2665, 2970, 16789, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 0, 344, 346, {348,3264,3046,11818,2665},{357,3024},{370,16789},{376,2970,16776}},
+ {17048, 3024, 2665, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,1409},{376,2970,1399,2982}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {17401, 17425, 10606, 2186, 56, 447, 2754, 465, 468, {2761, 2768, 2775, 2783, 2793, 2802, 2809}, {2818, 2822, 2826, 2830, 2834, 2838, 2842}, {2846, 2854, 2863, 2055, 2869, 2873, 2878, 2075, 2082, 2883, 2100, 2891, 343}, {2118, 2122, 2900, 2130, 2869, 2134, 2138, 2142, 2146, 2904, 2154, 2908, 343}, 0, 0, 344, 346, {348,2739,10606},{2719,2719,2912,2926,2946,17425},{2746,2746,2961,1409,370,56},{2186,2186,2970,2982,438,2676}},
+ {17048, 3024, 1676, 2982, 1409, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,1898,1676},{357,3024},{370,1409},{376,2970,1399,2982}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {184, 187, 190, 193, 196, 199, 202}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {17078, 24, 2665, 2970, 56, 63, 74, 81, 84, {87, 98, 113, 130, 147, 160, 173}, {87, 98, 113, 130, 147, 160, 173}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, {205, 216, 229, 238, 249, 258, 269, 280, 291, 304, 317, 330, 343}, 0, 6, 344, 346, {348,37,2665},{357,24},{370,56},{376,46,2970}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {17636, 17671, 2665, 2970, 16935, 3057, 17694, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024,17671},{370,16935},{376,2970,16922}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,888,2665},{357,3024},{370,16935},{376,2970,16922}},
+ {2990, 3024, 2665, 2970, 16935, 3057, 3062, 3074, 3079, {3084, 3092, 3098, 3105, 3116, 3123, 3131}, {3139, 3143, 1862, 3147, 3152, 3156, 3160}, {3165, 3171, 3179, 1004, 3185, 3190, 3196, 3202, 3209, 1042, 3220, 3230, 343}, {3240, 1858, 1862, 3244, 3248, 1870, 1874, 3252, 1882, 3256, 1890, 3260, 343}, 0, 1, 344, 346, {348,3264,3046,11818,2665},{357,3024},{370,16935},{376,2970,16922}},
{1112, 357, 348, 376, 370, 1136, 1146, 1154, 1161, {1168, 1178, 1188, 1198, 1208, 1218, 1228}, {1238, 1242, 1246, 1250, 1254, 1258, 1262}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, {1266, 1273, 1280, 1287, 1294, 1301, 1308, 1315, 1322, 1329, 1336, 1346, 343}, 0, 0, 344, 346, {348},{357},{370},{376}}
};
static const NumberFormatEntry number_format_entries [] = {
- {17561, 17564, 17561, 17564, 17561, 17564, 0, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 2, 2, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17623, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17633, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17643, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17647, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17656, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17660, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17663, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17667, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17669, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17673, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17677, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17681, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17685, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17689, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 10412, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17692, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17696, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17700, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17703, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17706, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17714, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17718, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17721, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {2, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17724, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 2, 2, 1, 0, 2, 2, {5, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17728, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 0, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17731, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 0, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 9884, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17742, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17746, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17753, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17760, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17735, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17768, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17778, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17782, 17598, 17782, 17598, 17782, 17784, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17789, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17782, 17598, 17782, 17598, 17782, 17784, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17651, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17792, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17802, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17593, 17591, 17593, 17591, 17593, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17806, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17816, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17819, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17782, 17598, 17782, 17598, 17782, 17821, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17826, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 4367, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17836, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17639, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17840, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17639, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17850, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17853, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 9884, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17863, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17867, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17877, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17880, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17890, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17900, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17903, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17913, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17923, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17926, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17930, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17940, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17654, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17944, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17954, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17958, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17968, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 12, 2, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17561, 17564, 17561, 17564, 17561, 17564, 17971, 17567, 17570, 17574, 17578, 17583, 17587, 17589, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17591, 17598, 17591, 17598, 17591, 17598, 17981, 17596, 17570, 17574, 17578, 17583, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17984, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17988, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17991, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 17654, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
- {17598, 17591, 17598, 17591, 17598, 17591, 0, 17596, 17600, 17574, 17604, 17614, 17587, 17589, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}
+ {17707, 17710, 17707, 17710, 17707, 17710, 0, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 2, 2, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17746, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17769, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17779, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17789, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17793, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17802, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17806, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17809, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17813, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17815, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 0, 0, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 0, 0, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17819, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17823, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17827, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17831, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 5, 1, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17835, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 10412, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17838, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17842, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17846, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17849, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17852, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17860, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17864, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17867, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {2, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17870, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 2, 2, 1, 0, 2, 2, {5, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17874, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17877, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 0, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 9884, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 0, 17742, 17746, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17888, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17892, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17899, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17906, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17881, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}, {2, 2, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17914, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17924, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17928, 17744, 17928, 17744, 17928, 17930, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17935, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17928, 17744, 17928, 17744, 17928, 17930, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17797, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17938, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17948, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17739, 17737, 17739, 17737, 17739, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17952, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17962, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17965, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17928, 17744, 17928, 17744, 17928, 17967, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17972, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 4367, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17982, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17785, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 8, 3, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17986, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17785, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17996, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 17999, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 9884, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18009, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18013, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 18023, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18026, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18036, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18046, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18049, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18059, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18069, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 1, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 18072, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18076, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 3, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18086, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 17800, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 2, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18090, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 18100, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18104, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 11, 2, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 18114, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 12, 2, 1, 1, 1, 0, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17707, 17710, 17707, 17710, 17707, 17710, 18117, 17713, 17716, 17720, 17724, 17729, 17733, 17735, 1, 0, 1, 1, 3, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17737, 17744, 17737, 17744, 17737, 17744, 18127, 17742, 17716, 17720, 17724, 17729, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18130, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18134, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 18137, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 17800, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 0, 0, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}},
+ {17744, 17737, 17744, 17737, 17744, 17737, 0, 17742, 17746, 17720, 17750, 17760, 17733, 17735, 9, 2, 1, 1, 1, 2, 2, 2, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}, {3, -1, -1, -1, -1}}
};
static const CultureInfoEntry culture_entries [] = {
- {0x0001, 0x007F, 0x0401, -1,17994, 17997, 17997, 17997, 18004, 18019, 18023, 17994, 0, {16777216, 0, 0, 0, 0}, 0, 0, { 1256, 20420, 10004, 720, ';' }},
- {0x0002, 0x007F, 0x0402, -1,18027, 18030, 18030, 18030, 18040, 18059, 18063, 18027, 0, {0, 0, 0, 0, 0}, 1, 1, { 1251, 20420, 10007, 866, ';' }},
- {0x0003, 0x007F, 0x0403, -1,18067, 18070, 18070, 18070, 18078, 18086, 18090, 18067, 0, {0, 0, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, ';' }},
- {0x0004, 0x007F, 0x0000, -1,18094, 18101, 18101, 18101, 18109, 18116, 18120, 18124, 0, {0, 0, 0, 0, 0}, 163, 163, { 936, 500, 10008, 936, ',' }},
- {0x0005, 0x007F, 0x0405, -1,18127, 18130, 18130, 18130, 18136, 18146, 18150, 18127, 0, {0, 0, 0, 0, 0}, 4, 4, { 1250, 500, 10029, 852, ';' }},
- {0x0006, 0x007F, 0x0406, -1,18154, 18157, 18157, 18157, 18164, 18170, 18174, 18154, 0, {0, 0, 0, 0, 0}, 5, 5, { 1252, 20277, 10000, 850, ';' }},
- {0x0007, 0x007F, 0x0407, -1,18178, 18181, 18181, 18181, 18188, 18196, 18200, 18178, 0, {0, 0, 0, 0, 0}, 6, 6, { 1252, 20273, 10000, 850, ';' }},
- {0x0008, 0x007F, 0x0408, -1,18204, 18207, 18207, 18207, 18213, 18230, 18234, 18204, 0, {0, 0, 0, 0, 0}, 7, 7, { 1253, 20273, 10006, 737, ';' }},
- {0x0009, 0x007F, 0x0409, -1,18238, 18241, 18241, 18241, 18241, 18249, 18253, 18238, 0, {0, 0, 0, 0, 0}, 8, 8, { 1252, 37, 10000, 437, ',' }},
- {0x000A, 0x007F, 0x0C0A, -1,18257, 18260, 18260, 18260, 18268, 18277, 18281, 18257, 0, {0, 0, 0, 0, 0}, 9, 9, { 1252, 20284, 10000, 850, ';' }},
- {0x000B, 0x007F, 0x040B, -1,18285, 18288, 18288, 18288, 18296, 18302, 18306, 18285, 0, {0, 0, 0, 0, 0}, 10, 10, { 1252, 20278, 10000, 850, ';' }},
- {0x000C, 0x007F, 0x040C, -1,5968, 18310, 18310, 18310, 18317, 18327, 18331, 5968, 0, {0, 0, 0, 0, 0}, 11, 11, { 1252, 20297, 10000, 850, ';' }},
- {0x000D, 0x007F, 0x040D, -1,18335, 18338, 18338, 18338, 18345, 18356, 18360, 18335, 0, {0, 0, 0, 0, 0}, 12, 12, { 1255, 500, 10005, 862, ',' }},
- {0x000E, 0x007F, 0x040E, -1,18364, 18367, 18367, 18367, 18377, 18384, 18388, 18364, 0, {0, 0, 0, 0, 0}, 13, 13, { 1250, 500, 10029, 852, ';' }},
- {0x000F, 0x007F, 0x040F, -1,18392, 18395, 18395, 18395, 18405, 18415, 18419, 18392, 0, {0, 0, 0, 0, 0}, 14, 14, { 1252, 20871, 10079, 850, ';' }},
- {0x0010, 0x007F, 0x0410, -1,18423, 18426, 18426, 18426, 18434, 18443, 18447, 18423, 0, {0, 0, 0, 0, 0}, 15, 15, { 1252, 20280, 10000, 850, ';' }},
- {0x0011, 0x007F, 0x0411, -1,18451, 18454, 18454, 18454, 18463, 18473, 18477, 18451, 0, {0, 0, 0, 0, 0}, 16, 16, { 932, 20290, 10001, 932, ',' }},
- {0x0012, 0x007F, 0x0412, -1,18481, 18484, 18484, 18484, 18491, 18501, 18505, 18481, 0, {0, 0, 0, 0, 0}, 17, 17, { 949, 20833, 10003, 949, ',' }},
- {0x0013, 0x007F, 0x0413, -1,18509, 18512, 18512, 18512, 18518, 18529, 18533, 18509, 0, {0, 0, 0, 0, 0}, 18, 18, { 1252, 500, 10000, 850, ';' }},
- {0x0014, 0x007F, 0x0414, -1,18537, 18540, 18540, 18540, 18550, 18556, 18560, 18537, 0, {0, 0, 0, 0, 0}, 19, 19, { 1252, 20277, 10000, 850, ';' }},
- {0x0015, 0x007F, 0x0415, -1,18564, 18567, 18567, 18567, 18574, 18581, 18585, 18564, 0, {0, 0, 0, 0, 0}, 20, 20, { 1250, 20880, 10029, 852, ';' }},
- {0x0016, 0x007F, 0x0416, -1,18589, 18592, 18592, 18592, 18603, 18614, 18618, 18589, 0, {0, 0, 0, 0, 0}, 21, 21, { 1252, 500, 10000, 850, ';' }},
- {0x0018, 0x007F, 0x0418, -1,18622, 18625, 18625, 18625, 18634, 18643, 18647, 18622, 0, {0, 0, 0, 0, 0}, 22, 22, { 1250, 20880, 10029, 852, ';' }},
- {0x0019, 0x007F, 0x0419, -1,18651, 18654, 18654, 18654, 18662, 18677, 18681, 18651, 0, {0, 0, 0, 0, 0}, 23, 23, { 1251, 20880, 10007, 866, ';' }},
- {0x001A, 0x007F, 0x041A, -1,18685, 18688, 18688, 18688, 18697, 18706, 18710, 18685, 0, {0, 0, 0, 0, 0}, 24, 24, { 1250, 500, 10082, 852, ';' }},
- {0x001B, 0x007F, 0x041B, -1,18714, 18717, 18717, 18717, 18724, 18735, 18739, 18714, 0, {0, 0, 0, 0, 0}, 25, 25, { 1250, 20880, 10029, 852, ';' }},
- {0x001C, 0x007F, 0x041C, -1,18743, 18746, 18746, 18746, 18755, 18762, 18766, 18743, 0, {0, 0, 0, 0, 0}, 26, 26, { 1250, 20880, 10029, 852, ';' }},
- {0x001D, 0x007F, 0x041D, -1,18770, 18773, 18773, 18773, 18781, 18789, 18793, 18770, 0, {0, 0, 0, 0, 0}, 27, 27, { 1252, 20278, 10000, 850, ';' }},
- {0x001E, 0x007F, 0x041E, -1,18797, 18800, 18800, 18800, 18805, 18815, 18819, 18797, 0, {0, 0, 0, 0, 0}, 28, 28, { 874, 20838, 10021, 874, ',' }},
- {0x001F, 0x007F, 0x041F, -1,18823, 18826, 18826, 18826, 18834, 18843, 18847, 18823, 0, {0, 0, 0, 0, 0}, 29, 29, { 1254, 20905, 10081, 857, ';' }},
- {0x0021, 0x007F, 0x0421, -1,18851, 18854, 18854, 18854, 18865, 18882, 18886, 18851, 0, {0, 0, 0, 0, 0}, 30, 30, { 1252, 500, 10000, 850, ';' }},
- {0x0022, 0x007F, 0x0422, -1,18890, 18893, 18893, 18893, 18903, 18924, 18928, 18890, 0, {0, 0, 0, 0, 0}, 31, 31, { 1251, 500, 10017, 866, ';' }},
- {0x0023, 0x007F, 0x0423, -1,18932, 18935, 18935, 18935, 18946, 18965, 18969, 18932, 0, {0, 0, 0, 0, 0}, 32, 32, { 1251, 500, 10007, 866, ';' }},
- {0x0024, 0x007F, 0x0424, -1,18973, 18976, 18976, 18976, 18986, 19000, 19004, 18973, 0, {0, 0, 0, 0, 0}, 33, 33, { 1250, 20880, 10029, 852, ';' }},
- {0x0025, 0x007F, 0x0425, -1,19008, 19011, 19011, 19011, 19020, 19026, 19030, 19008, 0, {0, 0, 0, 0, 0}, 34, 34, { 1257, 500, 10029, 775, ';' }},
- {0x0026, 0x007F, 0x0426, -1,19034, 19037, 19037, 19037, 19045, 19055, 19059, 19034, 0, {0, 0, 0, 0, 0}, 35, 35, { 1257, 500, 10029, 775, ';' }},
- {0x0027, 0x007F, 0x0427, -1,19063, 19066, 19066, 19066, 19077, 19087, 19091, 19063, 0, {0, 0, 0, 0, 0}, 36, 36, { 1257, 500, 10029, 775, ';' }},
- {0x0029, 0x007F, 0x0429, -1,19095, 19098, 19098, 19098, 19106, 19117, 19121, 19095, 0, {0, 0, 0, 0, 0}, 37, 37, { 1256, 20420, 10004, 720, ';' }},
- {0x002A, 0x007F, 0x042A, -1,19125, 19128, 19128, 19128, 19139, 19154, 3156, 19125, 0, {0, 0, 0, 0, 0}, 38, 38, { 1258, 500, 10000, 1258, ',' }},
- {0x002B, 0x007F, 0x042B, -1,19158, 19161, 19161, 19161, 19170, 19185, 19189, 19158, 0, {0, 0, 0, 0, 0}, 39, 39, { 0, 500, 2, 1, ',' }},
- {0x002D, 0x007F, 0x042D, -1,19193, 19196, 19196, 19196, 19203, 19211, 19215, 19193, 0, {0, 0, 0, 0, 0}, 40, 40, { 1252, 500, 10000, 850, ';' }},
- {0x002F, 0x007F, 0x042F, -1,19219, 19222, 19222, 19222, 19233, 19254, 19258, 19219, 0, {0, 0, 0, 0, 0}, 41, 41, { 1251, 500, 10007, 866, ';' }},
- {0x0036, 0x007F, 0x0436, -1,19262, 19265, 19265, 19265, 19275, 19286, 19290, 19262, 0, {0, 0, 0, 0, 0}, 42, 42, { 1252, 500, 10000, 850, ',' }},
- {0x0038, 0x007F, 0x0438, -1,19294, 19297, 19297, 19297, 19305, 19315, 19319, 19294, 0, {0, 0, 0, 0, 0}, 43, 43, { 1252, 20277, 10079, 850, ';' }},
- {0x0039, 0x007F, 0x0439, -1,19323, 19326, 19326, 19326, 19332, 19348, 19352, 19323, 0, {0, 0, 0, 0, 0}, 44, 44, { 0, 500, 2, 1, ',' }},
- {0x0041, 0x007F, 0x0441, -1,19356, 19359, 19359, 19359, 19367, 19377, 19381, 19356, 0, {0, 0, 0, 0, 0}, 45, 45, { 1252, 500, 10000, 437, ',' }},
- {0x0047, 0x007F, 0x0447, -1,19385, 19388, 19388, 19388, 19397, 19419, 19423, 19385, 0, {0, 0, 0, 0, 0}, 46, 46, { 0, 500, 2, 1, ',' }},
- {0x0049, 0x007F, 0x0449, -1,19427, 19430, 19430, 19430, 19436, 19452, 19456, 19427, 0, {0, 0, 0, 0, 0}, 47, 47, { 0, 500, 2, 1, ',' }},
- {0x004A, 0x007F, 0x044A, -1,19460, 19463, 19463, 19463, 19470, 19489, 19493, 19460, 0, {0, 0, 0, 0, 0}, 48, 48, { 0, 500, 2, 1, ',' }},
- {0x004B, 0x007F, 0x044B, -1,19497, 19500, 19500, 19500, 19508, 19524, 19528, 19497, 0, {0, 0, 0, 0, 0}, 49, 49, { 0, 500, 2, 1, ',' }},
- {0x004E, 0x007F, 0x044E, -1,19532, 19535, 19535, 19535, 19543, 19559, 1862, 19532, 0, {0, 0, 0, 0, 0}, 50, 50, { 0, 500, 2, 1, ',' }},
- {0x0056, 0x007F, 0x0456, -1,19563, 19566, 19566, 19566, 19575, 19582, 19586, 19563, 0, {0, 0, 0, 0, 0}, 51, 51, { 1252, 500, 10000, 850, ',' }},
- {0x0057, 0x007F, 0x0457, -1,19590, 19594, 19594, 19594, 19602, 19621, 19590, 19323, 0, {0, 0, 0, 0, 0}, 52, 52, { 0, 500, 2, 1, ',' }},
- {0x0401, 0x0001, 0x0401, 174,19625, 19631, 19631, 19631, 19653, 18019, 18023, 17994, 10998, {16777216, 0, 0, 0, 0}, 53, 53, { 1256, 20420, 10004, 720, ';' }},
- {0x0402, 0x0002, 0x0402, 19,19702, 19708, 19708, 19708, 19729, 18059, 18063, 18027, 19767, {0, 0, 0, 0, 0}, 54, 54, { 1251, 20420, 10007, 866, ';' }},
- {0x0403, 0x0003, 0x0403, 61,19770, 19776, 19776, 19776, 19792, 18086, 18090, 18067, 19810, {0, 0, 0, 0, 0}, 55, 55, { 1252, 500, 10000, 850, ';' }},
- {0x0404, 0x7C04, 0x0404, 207,19813, 19819, 19819, 19819, 19836, 19852, 18120, 18124, 19856, {0, 0, 0, 0, 0}, 56, 56, { 950, 500, 10002, 950, ',' }},
- {0x0405, 0x0005, 0x0405, 49,19859, 19865, 19865, 19865, 19888, 18146, 18150, 18127, 19918, {0, 0, 0, 0, 0}, 57, 57, { 1250, 500, 10029, 852, ';' }},
- {0x0406, 0x0006, 0x0406, 52,19921, 19927, 19927, 19927, 19944, 18170, 18174, 18154, 19960, {0, 0, 0, 0, 0}, 58, 58, { 1252, 20277, 10000, 850, ';' }},
- {0x0407, 0x0007, 0x0407, 50,19963, 19969, 19969, 19969, 19986, 18196, 18200, 18178, 4291, {0, 0, 0, 0, 0}, 59, 59, { 1252, 20273, 10000, 850, ';' }},
- {0x0408, 0x0008, 0x0408, 81,20008, 20014, 20014, 20014, 20029, 18230, 18234, 18204, 20061, {0, 0, 0, 0, 0}, 60, 60, { 1253, 20273, 10006, 737, ';' }},
- {0x0409, 0x0009, 0x0409, 212,20064, 20070, 20070, 20070, 20070, 18249, 18253, 18238, 20094, {0, 0, 0, 0, 0}, 61, 61, { 1252, 37, 10000, 437, ',' }},
- {0x040B, 0x000B, 0x040B, 63,20097, 20103, 20103, 20103, 20121, 18302, 18306, 18285, 20135, {0, 0, 0, 0, 0}, 62, 62, { 1252, 20278, 10000, 850, ';' }},
- {0x040C, 0x000C, 0x040C, 68,20138, 20144, 20144, 20144, 20160, 18327, 18331, 5968, 20179, {0, 0, 0, 0, 0}, 63, 63, { 1252, 20297, 10000, 850, ';' }},
- {0x040D, 0x000D, 0x040D, 92,20182, 20188, 20188, 20188, 20204, 18356, 18360, 18335, 20228, {0, 0, 0, 0, 0}, 64, 64, { 1255, 500, 10005, 862, ',' }},
- {0x040E, 0x000E, 0x040E, 89,20231, 20237, 20237, 20237, 20257, 18384, 18388, 18364, 20280, {0, 0, 0, 0, 0}, 65, 65, { 1250, 500, 10029, 852, ';' }},
- {0x040F, 0x000F, 0x040F, 97,20283, 20289, 20289, 20289, 20309, 18415, 18419, 18392, 20329, {0, 0, 0, 0, 0}, 66, 66, { 1252, 20871, 10079, 850, ';' }},
- {0x0410, 0x0010, 0x0410, 98,20332, 20338, 20338, 20338, 20354, 18443, 18447, 18423, 20372, {0, 0, 0, 0, 0}, 67, 67, { 1252, 20280, 10000, 850, ';' }},
- {0x0411, 0x0011, 0x0411, 101,20375, 20381, 20381, 20381, 20398, 18473, 18477, 18451, 20417, {0, 0, 0, 0, 0}, 68, 68, { 932, 20290, 10001, 932, ',' }},
- {0x0412, 0x0012, 0x0412, 109,20420, 20426, 20426, 20426, 20447, 18501, 18505, 18481, 20472, {0, 0, 0, 0, 0}, 69, 69, { 949, 20833, 10003, 949, ',' }},
- {0x0413, 0x0013, 0x0413, 149,20475, 20481, 20481, 20481, 20501, 18529, 18533, 18509, 20524, {0, 0, 0, 0, 0}, 70, 70, { 1252, 500, 10000, 850, ';' }},
- {0x0414, 0x0014, 0x0414, 150,20527, 20533, 20559, 20559, 20586, 18556, 20608, 20612, 20615, {0, 0, 0, 0, 0}, 71, 71, { 1252, 20277, 10000, 850, ';' }},
- {0x0415, 0x0015, 0x0415, 162,20618, 20624, 20624, 20624, 20640, 18581, 18585, 18564, 20656, {0, 0, 0, 0, 0}, 72, 72, { 1250, 20880, 10029, 852, ';' }},
- {0x0416, 0x0016, 0x0416, 26,20659, 20665, 20665, 20665, 20685, 18614, 18618, 18589, 20705, {0, 0, 0, 0, 0}, 73, 73, { 1252, 500, 10000, 850, ';' }},
- {0x0418, 0x0018, 0x0418, 171,20708, 20714, 20714, 20714, 20733, 18643, 18647, 18622, 20753, {0, 0, 0, 0, 0}, 74, 74, { 1250, 20880, 10029, 852, ';' }},
- {0x0419, 0x0019, 0x0419, 172,20756, 20762, 20762, 20762, 20779, 18677, 18681, 18651, 20809, {0, 0, 0, 0, 0}, 75, 75, { 1251, 20880, 10007, 866, ';' }},
- {0x041A, 0x001A, 0x041A, 88,20812, 20818, 20818, 20818, 20837, 18706, 18710, 18685, 20857, {0, 0, 0, 0, 0}, 76, 76, { 1250, 500, 10082, 852, ';' }},
- {0x041B, 0x001B, 0x041B, 183,20860, 20866, 20866, 20866, 20884, 18735, 18739, 18714, 20918, {0, 0, 0, 0, 0}, 77, 77, { 1250, 20880, 10029, 852, ';' }},
- {0x041C, 0x001C, 0x041C, 4,20921, 20927, 20927, 20927, 20946, 18762, 18766, 18743, 20966, {0, 0, 0, 0, 0}, 78, 78, { 1250, 20880, 10029, 852, ';' }},
- {0x041D, 0x001D, 0x041D, 178,20969, 20975, 20975, 20975, 20992, 18789, 18793, 18770, 21010, {0, 0, 0, 0, 0}, 79, 79, { 1252, 20278, 10000, 850, ';' }},
- {0x041E, 0x001E, 0x041E, 197,21013, 21019, 21019, 21019, 21035, 18815, 18819, 18797, 21075, {0, 0, 0, 0, 0}, 80, 80, { 874, 20838, 10021, 874, ',' }},
- {0x041F, 0x001F, 0x041F, 204,21078, 21084, 21084, 21084, 21101, 18843, 18847, 18823, 21121, {0, 0, 0, 0, 0}, 81, 81, { 1254, 20905, 10081, 857, ';' }},
- {0x0421, 0x0021, 0x0421, 90,21124, 21130, 21130, 21130, 21153, 18882, 18886, 18851, 21182, {0, 0, 0, 0, 0}, 82, 82, { 1252, 500, 10000, 850, ';' }},
- {0x0422, 0x0022, 0x0422, 209,21185, 21191, 21191, 21191, 21211, 18924, 18928, 18890, 21249, {0, 0, 0, 0, 0}, 83, 83, { 1251, 500, 10017, 866, ';' }},
- {0x0423, 0x0023, 0x0423, 30,21252, 21258, 21258, 21258, 21279, 18965, 18969, 18932, 21317, {0, 0, 0, 0, 0}, 84, 84, { 1251, 500, 10007, 866, ';' }},
- {0x0424, 0x0024, 0x0424, 181,21320, 21326, 21326, 21326, 21347, 19000, 19004, 18973, 21373, {0, 0, 0, 0, 0}, 85, 85, { 1250, 20880, 10029, 852, ';' }},
- {0x0425, 0x0025, 0x0425, 57,21376, 21382, 21382, 21382, 21401, 19026, 19030, 19008, 21415, {0, 0, 0, 0, 0}, 86, 86, { 1257, 500, 10029, 775, ';' }},
- {0x0426, 0x0026, 0x0426, 121,21418, 21424, 21424, 21424, 21441, 19055, 19059, 19034, 21461, {0, 0, 0, 0, 0}, 87, 87, { 1257, 500, 10029, 775, ';' }},
- {0x0427, 0x0027, 0x0427, 119,21464, 21470, 21470, 21470, 21493, 19087, 19091, 19063, 21513, {0, 0, 0, 0, 0}, 88, 88, { 1257, 500, 10029, 775, ';' }},
- {0x0429, 0x0029, 0x0429, 96,21516, 21522, 21522, 21522, 21537, 19117, 19121, 19095, 21561, {0, 0, 0, 0, 0}, 89, 89, { 1256, 20420, 10004, 720, ';' }},
- {0x042A, 0x002A, 0x042A, 220,21564, 21570, 21570, 21570, 21591, 19154, 3156, 19125, 21619, {0, 0, 0, 0, 0}, 90, 90, { 1258, 500, 10000, 1258, ',' }},
- {0x042B, 0x002B, 0x042B, 5,21622, 21628, 21628, 21628, 21647, 19185, 19189, 19158, 465, {0, 0, 0, 0, 0}, 91, 91, { 0, 500, 2, 1, ',' }},
- {0x042D, 0x002D, 0x042D, 61,21712, 21718, 21718, 21718, 21733, 19211, 19215, 19193, 19810, {0, 0, 0, 0, 0}, 92, 92, { 1252, 500, 10000, 850, ';' }},
- {0x042F, 0x002F, 0x042F, 128,21752, 21758, 21758, 21758, 21781, 19254, 19258, 19219, 21825, {0, 0, 0, 0, 0}, 93, 93, { 1251, 500, 10007, 866, ';' }},
- {0x0436, 0x0036, 0x0436, 227,21828, 21834, 21834, 21834, 21859, 19286, 19290, 19262, 21884, {0, 0, 0, 0, 0}, 94, 94, { 1252, 500, 10000, 850, ',' }},
- {0x0438, 0x0038, 0x0438, 67,21887, 21893, 21893, 21893, 21917, 19315, 19319, 19294, 21938, {0, 0, 0, 0, 0}, 95, 95, { 1252, 20277, 10079, 850, ';' }},
- {0x0439, 0x0039, 0x0439, 93,21941, 21947, 21947, 21947, 21961, 19348, 19352, 19323, 21992, {0, 0, 0, 0, 0}, 96, 96, { 0, 500, 2, 1, ',' }},
- {0x0441, 0x0041, 0x0441, 102,21995, 22001, 22001, 22001, 22017, 19377, 19381, 19356, 22035, {0, 0, 0, 0, 0}, 97, 97, { 1252, 500, 10000, 437, ',' }},
- {0x0447, 0x0047, 0x0447, 93,22038, 22044, 22044, 22044, 22061, 19419, 19423, 19385, 21992, {0, 0, 0, 0, 0}, 98, 98, { 0, 500, 2, 1, ',' }},
- {0x0449, 0x0049, 0x0449, 93,22098, 22104, 22104, 22104, 22118, 19452, 19456, 19427, 21992, {0, 0, 0, 0, 0}, 99, 99, { 0, 500, 2, 1, ',' }},
- {0x044A, 0x004A, 0x044A, 93,22158, 22164, 22164, 22164, 22179, 19489, 19493, 19460, 21992, {0, 0, 0, 0, 0}, 100, 100, { 0, 500, 2, 1, ',' }},
- {0x044B, 0x004B, 0x044B, 93,22226, 22232, 22232, 22232, 22248, 19524, 19528, 19497, 21992, {0, 0, 0, 0, 0}, 101, 101, { 0, 500, 2, 1, ',' }},
- {0x044E, 0x004E, 0x044E, 93,22279, 22285, 22285, 22285, 22301, 19559, 1862, 19532, 21992, {0, 0, 0, 0, 0}, 102, 102, { 0, 500, 2, 1, ',' }},
- {0x0456, 0x0056, 0x0456, 61,22332, 22338, 22338, 22338, 22355, 19582, 19586, 19563, 19810, {0, 0, 0, 0, 0}, 103, 103, { 1252, 500, 10000, 850, ',' }},
- {0x0457, 0x0057, 0x0457, 93,22372, 22379, 22379, 22379, 22395, 19621, 19590, 19590, 21992, {0, 0, 0, 0, 0}, 104, 104, { 0, 500, 2, 1, ',' }},
- {0x0801, 0x0001, 0x0801, 95,22429, 22435, 22435, 22435, 22449, 22479, 18023, 17994, 22483, {2, 1, 0, 0, 0}, 105, 105, { 1256, 20420, 10004, 720, ';' }},
- {0x0804, 0x0004, 0x0804, 42,22486, 22492, 22492, 22492, 22508, 18116, 18120, 18124, 11080, {0, 0, 0, 0, 0}, 106, 106, { 936, 500, 10008, 936, ',' }},
- {0x0807, 0x0007, 0x0807, 37,22524, 22530, 22530, 22530, 22551, 22569, 18200, 18178, 11001, {0, 0, 0, 0, 0}, 107, 107, { 1252, 20273, 10000, 850, ';' }},
- {0x0809, 0x0009, 0x0809, 70,22573, 22579, 22579, 22579, 22579, 22604, 18253, 18238, 22608, {0, 0, 0, 0, 0}, 108, 108, { 1252, 20285, 10000, 850, ',' }},
- {0x080A, 0x000A, 0x080A, 141,22611, 22617, 22617, 22617, 22634, 22653, 18281, 18257, 22657, {0, 0, 0, 0, 0}, 109, 109, { 1252, 20284, 10000, 850, ',' }},
- {0x080C, 0x000C, 0x080C, 17,22660, 22666, 22666, 22666, 22683, 22704, 18331, 5968, 22708, {0, 0, 0, 0, 0}, 110, 110, { 1252, 20297, 10000, 850, ';' }},
- {0x0810, 0x0010, 0x0810, 37,22711, 22717, 22717, 22717, 22739, 22759, 18447, 18423, 11001, {0, 0, 0, 0, 0}, 111, 111, { 1252, 500, 10000, 850, ';' }},
- {0x0813, 0x0013, 0x0813, 17,22763, 22769, 22769, 22769, 22785, 22806, 18533, 18509, 22708, {0, 0, 0, 0, 0}, 112, 112, { 1252, 500, 10000, 850, ';' }},
- {0x0814, 0x0014, 0x0814, 150,22810, 22816, 22816, 22816, 22843, 22865, 22869, 22873, 20615, {0, 0, 0, 0, 0}, 113, 113, { 1252, 20277, 10000, 850, ';' }},
- {0x0816, 0x0016, 0x0816, 166,22876, 22882, 22882, 22882, 22904, 22926, 18618, 18589, 22930, {0, 0, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, ';' }},
- {0x081D, 0x001D, 0x081D, 63,22933, 22939, 22939, 22939, 22957, 22975, 18793, 18770, 20135, {0, 0, 0, 0, 0}, 115, 115, { 1252, 20278, 10000, 850, ';' }},
- {0x0C01, 0x0001, 0x0C01, 58,22979, 22985, 22985, 22985, 23000, 23024, 18023, 17994, 23028, {16777216, 0, 0, 0, 0}, 116, 116, { 1256, 20420, 10004, 720, ';' }},
- {0x0C04, 0x7C04, 0x0C04, 85,23031, 23037, 23037, 23037, 23071, 23108, 18120, 18124, 23112, {0, 0, 0, 0, 0}, 117, 117, { 950, 500, 10002, 950, ',' }},
- {0x0C07, 0x0007, 0x0C07, 10,23115, 23121, 23121, 23121, 23138, 23160, 18200, 18178, 23164, {0, 0, 0, 0, 0}, 118, 118, { 1252, 20273, 10000, 850, ';' }},
- {0x0C09, 0x0009, 0x0C09, 11,23167, 23173, 23173, 23173, 23173, 23193, 18253, 18238, 23197, {0, 0, 0, 0, 0}, 119, 119, { 1252, 500, 10000, 850, ',' }},
- {0x0C0A, 0x000A, 0x0C0A, 61,23200, 23206, 23206, 23206, 23222, 23241, 18281, 18257, 19810, {0, 0, 0, 0, 0}, 120, 120, { 1252, 20284, 10000, 850, ';' }},
- {0x0C0C, 0x000C, 0x0C0C, 32,23245, 23251, 23251, 23251, 23267, 23286, 18331, 5968, 23290, {0, 0, 0, 0, 0}, 121, 121, { 1252, 20297, 10000, 850, ';' }},
- {0x1001, 0x0001, 0x1001, 122,23293, 23299, 23299, 23299, 23314, 23342, 18023, 17994, 23346, {16777216, 0, 0, 0, 0}, 122, 122, { 1256, 20420, 10004, 720, ';' }},
- {0x1004, 0x0004, 0x1004, 179,23349, 23355, 23355, 23355, 23375, 23394, 18120, 18124, 23398, {0, 0, 0, 0, 0}, 123, 123, { 936, 500, 10008, 936, ',' }},
- {0x1007, 0x0007, 0x1007, 120,23401, 23407, 23407, 23407, 23427, 23447, 18200, 18178, 23451, {0, 0, 0, 0, 0}, 124, 124, { 1252, 20273, 10000, 850, ';' }},
- {0x1009, 0x0009, 0x1009, 32,23454, 23460, 23460, 23460, 23460, 23477, 18253, 18238, 23290, {0, 0, 0, 0, 0}, 125, 125, { 1252, 37, 10000, 850, ',' }},
- {0x100A, 0x000A, 0x100A, 82,23481, 23487, 23487, 23487, 23507, 23528, 18281, 18257, 23532, {0, 0, 0, 0, 0}, 126, 126, { 1252, 20284, 10000, 850, ',' }},
- {0x100C, 0x000C, 0x100C, 37,23535, 23541, 23541, 23541, 23562, 23581, 18331, 5968, 11001, {0, 0, 0, 0, 0}, 127, 127, { 1252, 20297, 10000, 850, ';' }},
- {0x1401, 0x0001, 0x1401, 55,23585, 23591, 23591, 23591, 23608, 23640, 18023, 17994, 23644, {16777216, 0, 0, 0, 0}, 128, 128, { 1256, 20420, 10004, 720, ';' }},
- {0x1404, 0x0004, 0x1404, 132,23647, 23653, 23653, 23653, 23682, 23719, 18120, 18124, 23723, {0, 0, 0, 0, 0}, 129, 129, { 950, 500, 10002, 950, ',' }},
- {0x1409, 0x0009, 0x1409, 154,23726, 23732, 23732, 23732, 23732, 23754, 18253, 18238, 23758, {0, 0, 0, 0, 0}, 130, 130, { 1252, 500, 10000, 850, ',' }},
- {0x140A, 0x000A, 0x140A, 44,23761, 23767, 23767, 23767, 23788, 23810, 18281, 18257, 23814, {0, 0, 0, 0, 0}, 131, 131, { 1252, 20284, 10000, 850, ',' }},
- {0x140C, 0x000C, 0x140C, 120,23817, 23823, 23823, 23823, 23843, 23866, 18331, 5968, 23451, {0, 0, 0, 0, 0}, 132, 132, { 1252, 20297, 10000, 850, ';' }},
- {0x1801, 0x0001, 0x1801, 123,23870, 23876, 23876, 23876, 23893, 23923, 18023, 17994, 23927, {16777216, 0, 0, 0, 0}, 133, 133, { 1256, 20420, 10004, 720, ';' }},
- {0x1809, 0x0009, 0x1809, 91,23930, 23936, 23936, 23936, 23936, 23954, 18253, 18238, 23958, {0, 0, 0, 0, 0}, 134, 134, { 1252, 500, 10000, 850, ',' }},
- {0x180A, 0x000A, 0x180A, 156,23961, 23967, 23967, 23967, 23984, 24003, 18281, 18257, 24007, {0, 0, 0, 0, 0}, 135, 135, { 1252, 20284, 10000, 850, ',' }},
- {0x1C01, 0x0001, 0x1C01, 202,24010, 24016, 24016, 24016, 24033, 24059, 18023, 17994, 24063, {16777216, 0, 0, 0, 0}, 136, 136, { 1256, 20420, 10004, 720, ';' }},
- {0x1C09, 0x0009, 0x1C09, 227,24066, 24072, 24072, 24072, 24072, 24095, 18253, 18238, 21884, {0, 0, 0, 0, 0}, 137, 137, { 1252, 500, 10000, 437, ',' }},
- {0x1C0A, 0x000A, 0x1C0A, 54,24099, 24105, 24105, 24105, 24134, 24167, 18281, 18257, 24171, {0, 0, 0, 0, 0}, 138, 138, { 1252, 20284, 10000, 850, ',' }},
- {0x2001, 0x0001, 0x2001, 155,24174, 24180, 24180, 24180, 24194, 24220, 18023, 17994, 24224, {16777216, 0, 0, 0, 0}, 139, 139, { 1256, 20420, 10004, 720, ';' }},
- {0x200A, 0x000A, 0x200A, 217,24227, 24233, 24233, 24233, 24253, 24274, 18281, 18257, 24278, {0, 0, 0, 0, 0}, 140, 140, { 1252, 20284, 10000, 850, ',' }},
- {0x2401, 0x0001, 0x2401, 224,24281, 24287, 24287, 24287, 24302, 24330, 18023, 17994, 24334, {16777216, 0, 0, 0, 0}, 141, 141, { 1256, 20420, 10004, 720, ';' }},
- {0x240A, 0x000A, 0x240A, 43,24337, 24343, 24343, 24343, 24362, 24382, 18281, 18257, 24386, {0, 0, 0, 0, 0}, 142, 142, { 1252, 20284, 10000, 850, ',' }},
- {0x2801, 0x0001, 0x2801, 191,24389, 24395, 24395, 24395, 24410, 24438, 18023, 17994, 24442, {16777216, 0, 0, 0, 0}, 143, 143, { 1256, 20420, 10004, 720, ';' }},
- {0x280A, 0x000A, 0x280A, 157,24445, 24451, 24451, 24451, 24466, 24483, 18281, 18257, 24487, {0, 0, 0, 0, 0}, 144, 144, { 1252, 20284, 10000, 850, ',' }},
- {0x2C01, 0x0001, 0x2C01, 100,24490, 24496, 24496, 24496, 24512, 24542, 18023, 17994, 24546, {16777216, 0, 0, 0, 0}, 145, 145, { 1256, 20420, 10004, 720, ';' }},
- {0x2C0A, 0x000A, 0x2C0A, 8,24549, 24555, 24555, 24555, 24575, 24596, 18281, 18257, 24600, {0, 0, 0, 0, 0}, 146, 146, { 1252, 20284, 10000, 850, ',' }},
- {0x3001, 0x0001, 0x3001, 114,24603, 24609, 24609, 24609, 24626, 24654, 18023, 17994, 24658, {16777216, 0, 0, 0, 0}, 147, 147, { 1256, 20420, 10004, 720, ';' }},
- {0x3009, 0x0009, 0x3009, 229,24661, 24667, 24667, 24667, 24667, 24686, 18253, 18238, 24690, {0, 0, 0, 0, 0}, 148, 148, { 1252, 500, 10000, 437, ',' }},
- {0x300A, 0x000A, 0x300A, 56,24693, 24699, 24699, 24699, 24717, 24736, 18281, 18257, 24740, {0, 0, 0, 0, 0}, 149, 149, { 1252, 20284, 10000, 850, ',' }},
- {0x3401, 0x0001, 0x3401, 110,24743, 24749, 24749, 24749, 24765, 24795, 18023, 17994, 24799, {16777216, 0, 0, 0, 0}, 150, 150, { 1256, 20420, 10004, 720, ';' }},
- {0x3409, 0x0009, 0x3409, 160,24802, 24808, 24808, 24808, 24808, 24830, 18253, 18238, 24834, {0, 0, 0, 0, 0}, 151, 151, { 1252, 500, 10000, 437, ',' }},
- {0x340A, 0x000A, 0x340A, 40,24837, 24843, 24843, 24843, 24859, 24876, 18281, 18257, 24880, {0, 0, 0, 0, 0}, 152, 152, { 1252, 20284, 10000, 850, ',' }},
- {0x3801, 0x0001, 0x3801, 0,24883, 24889, 24889, 24889, 24919, 24983, 18023, 17994, 24987, {16777216, 0, 0, 0, 0}, 153, 153, { 1256, 20420, 10004, 720, ';' }},
- {0x380A, 0x000A, 0x380A, 213,24990, 24996, 24996, 24996, 25014, 25033, 18281, 18257, 25037, {0, 0, 0, 0, 0}, 154, 154, { 1252, 20284, 10000, 850, ',' }},
- {0x3C01, 0x0001, 0x3C01, 20,25040, 25046, 25046, 25046, 25063, 25095, 18023, 17994, 25099, {16777216, 0, 0, 0, 0}, 155, 155, { 1256, 20420, 10004, 720, ';' }},
- {0x3C0A, 0x000A, 0x3C0A, 168,25102, 25108, 25108, 25108, 25127, 25147, 18281, 18257, 25151, {0, 0, 0, 0, 0}, 156, 156, { 1252, 20284, 10000, 850, ',' }},
- {0x4001, 0x0001, 0x4001, 169,25154, 25160, 25160, 25160, 25175, 25199, 18023, 17994, 25203, {16777216, 0, 0, 0, 0}, 157, 157, { 1256, 20420, 10004, 720, ';' }},
- {0x400A, 0x000A, 0x400A, 25,25206, 25212, 25212, 25212, 25230, 25249, 18281, 18257, 25253, {0, 0, 0, 0, 0}, 158, 158, { 1252, 20284, 10000, 850, ',' }},
- {0x440A, 0x000A, 0x440A, 190,25256, 25262, 25262, 25262, 25284, 25307, 18281, 18257, 25311, {0, 0, 0, 0, 0}, 159, 159, { 1252, 20284, 10000, 850, ',' }},
- {0x480A, 0x000A, 0x480A, 87,25314, 25320, 25320, 25320, 25339, 25359, 18281, 18257, 25363, {0, 0, 0, 0, 0}, 160, 160, { 1252, 20284, 10000, 850, ',' }},
- {0x4C0A, 0x000A, 0x4C0A, 148,25366, 25372, 25372, 25372, 25392, 25413, 18281, 18257, 25417, {0, 0, 0, 0, 0}, 161, 161, { 1252, 20284, 10000, 850, ',' }},
- {0x500A, 0x000A, 0x500A, 165,25420, 25426, 25426, 25426, 25448, 25471, 18281, 18257, 25475, {0, 0, 0, 0, 0}, 162, 162, { 1252, 20284, 10000, 850, ',' }},
- {0x7C04, 0x007F, 0x0000, -1,25478, 19819, 18101, 18101, 18109, 19852, 18120, 18124, 0, {0, 0, 0, 0, 0}, 163, 163, { 950, 500, 10002, 950, ',' }}
+ {0x0001, 0x007F, 0x0401, -1,18140, 18143, 18143, 18143, 18150, 18165, 18169, 18140, 0, {16777216, 0, 0, 0, 0}, 0, 0, { 1256, 20420, 10004, 720, ';' }},
+ {0x0002, 0x007F, 0x0402, -1,18173, 18176, 18176, 18176, 18186, 18205, 18209, 18173, 0, {0, 0, 0, 0, 0}, 1, 1, { 1251, 20420, 10007, 866, ';' }},
+ {0x0003, 0x007F, 0x0403, -1,18213, 18216, 18216, 18216, 18224, 18232, 18236, 18213, 0, {0, 0, 0, 0, 0}, 2, 2, { 1252, 500, 10000, 850, ';' }},
+ {0x0004, 0x007F, 0x0000, -1,18240, 18247, 18247, 18247, 18255, 18262, 18266, 18270, 0, {0, 0, 0, 0, 0}, 165, 165, { 936, 500, 10008, 936, ',' }},
+ {0x0005, 0x007F, 0x0405, -1,18273, 18276, 18276, 18276, 18282, 18292, 18296, 18273, 0, {0, 0, 0, 0, 0}, 4, 4, { 1250, 500, 10029, 852, ';' }},
+ {0x0006, 0x007F, 0x0406, -1,18300, 18303, 18303, 18303, 18310, 18316, 18320, 18300, 0, {0, 0, 0, 0, 0}, 5, 5, { 1252, 20277, 10000, 850, ';' }},
+ {0x0007, 0x007F, 0x0407, -1,18324, 18327, 18327, 18327, 18334, 18342, 18346, 18324, 0, {0, 0, 0, 0, 0}, 6, 6, { 1252, 20273, 10000, 850, ';' }},
+ {0x0008, 0x007F, 0x0408, -1,18350, 18353, 18353, 18353, 18359, 18376, 18380, 18350, 0, {0, 0, 0, 0, 0}, 7, 7, { 1253, 20273, 10006, 737, ';' }},
+ {0x0009, 0x007F, 0x0409, -1,18384, 18387, 18387, 18387, 18387, 18395, 18399, 18384, 0, {0, 0, 0, 0, 0}, 8, 8, { 1252, 37, 10000, 437, ',' }},
+ {0x000A, 0x007F, 0x0C0A, -1,18403, 18406, 18406, 18406, 18414, 18423, 18427, 18403, 0, {0, 0, 0, 0, 0}, 9, 9, { 1252, 20284, 10000, 850, ';' }},
+ {0x000B, 0x007F, 0x040B, -1,18431, 18434, 18434, 18434, 18442, 18448, 18452, 18431, 0, {0, 0, 0, 0, 0}, 10, 10, { 1252, 20278, 10000, 850, ';' }},
+ {0x000C, 0x007F, 0x040C, -1,5968, 18456, 18456, 18456, 18463, 18473, 18477, 5968, 0, {0, 0, 0, 0, 0}, 11, 11, { 1252, 20297, 10000, 850, ';' }},
+ {0x000D, 0x007F, 0x040D, -1,18481, 18484, 18484, 18484, 18491, 18502, 18506, 18481, 0, {0, 0, 0, 0, 0}, 12, 12, { 1255, 500, 10005, 862, ',' }},
+ {0x000E, 0x007F, 0x040E, -1,18510, 18513, 18513, 18513, 18523, 18530, 18534, 18510, 0, {0, 0, 0, 0, 0}, 13, 13, { 1250, 500, 10029, 852, ';' }},
+ {0x000F, 0x007F, 0x040F, -1,18538, 18541, 18541, 18541, 18551, 18561, 18565, 18538, 0, {0, 0, 0, 0, 0}, 14, 14, { 1252, 20871, 10079, 850, ';' }},
+ {0x0010, 0x007F, 0x0410, -1,18569, 18572, 18572, 18572, 18580, 18589, 18593, 18569, 0, {0, 0, 0, 0, 0}, 15, 15, { 1252, 20280, 10000, 850, ';' }},
+ {0x0011, 0x007F, 0x0411, -1,18597, 18600, 18600, 18600, 18609, 18619, 18623, 18597, 0, {0, 0, 0, 0, 0}, 16, 16, { 932, 20290, 10001, 932, ',' }},
+ {0x0012, 0x007F, 0x0412, -1,18627, 18630, 18630, 18630, 18637, 18647, 18651, 18627, 0, {0, 0, 0, 0, 0}, 17, 17, { 949, 20833, 10003, 949, ',' }},
+ {0x0013, 0x007F, 0x0413, -1,18655, 18658, 18658, 18658, 18664, 18675, 18679, 18655, 0, {0, 0, 0, 0, 0}, 18, 18, { 1252, 500, 10000, 850, ';' }},
+ {0x0014, 0x007F, 0x0414, -1,18683, 18686, 18686, 18686, 18696, 18702, 18706, 18683, 0, {0, 0, 0, 0, 0}, 19, 19, { 1252, 20277, 10000, 850, ';' }},
+ {0x0015, 0x007F, 0x0415, -1,18710, 18713, 18713, 18713, 18720, 18727, 18731, 18710, 0, {0, 0, 0, 0, 0}, 20, 20, { 1250, 20880, 10029, 852, ';' }},
+ {0x0016, 0x007F, 0x0416, -1,18735, 18738, 18738, 18738, 18749, 18760, 18764, 18735, 0, {0, 0, 0, 0, 0}, 21, 21, { 1252, 500, 10000, 850, ';' }},
+ {0x0018, 0x007F, 0x0418, -1,18768, 18771, 18771, 18771, 18780, 18789, 18793, 18768, 0, {0, 0, 0, 0, 0}, 22, 22, { 1250, 20880, 10029, 852, ';' }},
+ {0x0019, 0x007F, 0x0419, -1,18797, 18800, 18800, 18800, 18808, 18823, 18827, 18797, 0, {0, 0, 0, 0, 0}, 23, 23, { 1251, 20880, 10007, 866, ';' }},
+ {0x001A, 0x007F, 0x041A, -1,18831, 18834, 18834, 18834, 18843, 18852, 18856, 18831, 0, {0, 0, 0, 0, 0}, 24, 24, { 1250, 500, 10082, 852, ';' }},
+ {0x001B, 0x007F, 0x041B, -1,18860, 18863, 18863, 18863, 18870, 18881, 18885, 18860, 0, {0, 0, 0, 0, 0}, 25, 25, { 1250, 20880, 10029, 852, ';' }},
+ {0x001C, 0x007F, 0x041C, -1,18889, 18892, 18892, 18892, 18901, 18908, 18912, 18889, 0, {0, 0, 0, 0, 0}, 26, 26, { 1250, 20880, 10029, 852, ';' }},
+ {0x001D, 0x007F, 0x041D, -1,18916, 18919, 18919, 18919, 18927, 18935, 18939, 18916, 0, {0, 0, 0, 0, 0}, 27, 27, { 1252, 20278, 10000, 850, ';' }},
+ {0x001E, 0x007F, 0x041E, -1,18943, 18946, 18946, 18946, 18951, 18961, 18965, 18943, 0, {0, 0, 0, 0, 0}, 28, 28, { 874, 20838, 10021, 874, ',' }},
+ {0x001F, 0x007F, 0x041F, -1,18969, 18972, 18972, 18972, 18980, 18989, 18993, 18969, 0, {0, 0, 0, 0, 0}, 29, 29, { 1254, 20905, 10081, 857, ';' }},
+ {0x0021, 0x007F, 0x0421, -1,18997, 19000, 19000, 19000, 19011, 19028, 19032, 18997, 0, {0, 0, 0, 0, 0}, 30, 30, { 1252, 500, 10000, 850, ';' }},
+ {0x0022, 0x007F, 0x0422, -1,19036, 19039, 19039, 19039, 19049, 19070, 19074, 19036, 0, {0, 0, 0, 0, 0}, 31, 31, { 1251, 500, 10017, 866, ';' }},
+ {0x0023, 0x007F, 0x0423, -1,19078, 19081, 19081, 19081, 19092, 19111, 19115, 19078, 0, {0, 0, 0, 0, 0}, 32, 32, { 1251, 500, 10007, 866, ';' }},
+ {0x0024, 0x007F, 0x0424, -1,19119, 19122, 19122, 19122, 19132, 19146, 19150, 19119, 0, {0, 0, 0, 0, 0}, 33, 33, { 1250, 20880, 10029, 852, ';' }},
+ {0x0025, 0x007F, 0x0425, -1,19154, 19157, 19157, 19157, 19166, 19172, 19176, 19154, 0, {0, 0, 0, 0, 0}, 34, 34, { 1257, 500, 10029, 775, ';' }},
+ {0x0026, 0x007F, 0x0426, -1,19180, 19183, 19183, 19183, 19191, 19201, 19205, 19180, 0, {0, 0, 0, 0, 0}, 35, 35, { 1257, 500, 10029, 775, ';' }},
+ {0x0027, 0x007F, 0x0427, -1,19209, 19212, 19212, 19212, 19223, 19233, 19237, 19209, 0, {0, 0, 0, 0, 0}, 36, 36, { 1257, 500, 10029, 775, ';' }},
+ {0x0029, 0x007F, 0x0429, -1,19241, 19244, 19244, 19244, 19252, 19263, 19267, 19241, 0, {0, 0, 0, 0, 0}, 37, 37, { 1256, 20420, 10004, 720, ';' }},
+ {0x002A, 0x007F, 0x042A, -1,19271, 19274, 19274, 19274, 19285, 19300, 3156, 19271, 0, {0, 0, 0, 0, 0}, 38, 38, { 1258, 500, 10000, 1258, ',' }},
+ {0x002B, 0x007F, 0x042B, -1,19304, 19307, 19307, 19307, 19316, 19331, 19335, 19304, 0, {0, 0, 0, 0, 0}, 39, 39, { 0, 500, 2, 1, ',' }},
+ {0x002D, 0x007F, 0x042D, -1,19339, 19342, 19342, 19342, 19349, 19357, 19361, 19339, 0, {0, 0, 0, 0, 0}, 40, 40, { 1252, 500, 10000, 850, ';' }},
+ {0x002F, 0x007F, 0x042F, -1,19365, 19368, 19368, 19368, 19379, 19400, 19404, 19365, 0, {0, 0, 0, 0, 0}, 41, 41, { 1251, 500, 10007, 866, ';' }},
+ {0x0036, 0x007F, 0x0436, -1,19408, 19411, 19411, 19411, 19421, 19432, 19436, 19408, 0, {0, 0, 0, 0, 0}, 42, 42, { 1252, 500, 10000, 850, ',' }},
+ {0x0037, 0x007F, 0x0437, -1,19440, 19443, 19443, 19443, 19452, 19474, 19478, 19440, 0, {0, 0, 0, 0, 0}, 43, 43, { 0, 500, 2, 1, ';' }},
+ {0x0038, 0x007F, 0x0438, -1,19482, 19485, 19485, 19485, 19493, 19503, 19507, 19482, 0, {0, 0, 0, 0, 0}, 44, 44, { 1252, 20277, 10079, 850, ';' }},
+ {0x0039, 0x007F, 0x0439, -1,19511, 19514, 19514, 19514, 19520, 19536, 19540, 19511, 0, {0, 0, 0, 0, 0}, 45, 45, { 0, 500, 2, 1, ',' }},
+ {0x0041, 0x007F, 0x0441, -1,19544, 19547, 19547, 19547, 19555, 19565, 19569, 19544, 0, {0, 0, 0, 0, 0}, 46, 46, { 1252, 500, 10000, 437, ',' }},
+ {0x0047, 0x007F, 0x0447, -1,19573, 19576, 19576, 19576, 19585, 19607, 19611, 19573, 0, {0, 0, 0, 0, 0}, 47, 47, { 0, 500, 2, 1, ',' }},
+ {0x0049, 0x007F, 0x0449, -1,19615, 19618, 19618, 19618, 19624, 19640, 19644, 19615, 0, {0, 0, 0, 0, 0}, 48, 48, { 0, 500, 2, 1, ',' }},
+ {0x004A, 0x007F, 0x044A, -1,19648, 19651, 19651, 19651, 19658, 19677, 19681, 19648, 0, {0, 0, 0, 0, 0}, 49, 49, { 0, 500, 2, 1, ',' }},
+ {0x004B, 0x007F, 0x044B, -1,19685, 19688, 19688, 19688, 19696, 19712, 19716, 19685, 0, {0, 0, 0, 0, 0}, 50, 50, { 0, 500, 2, 1, ',' }},
+ {0x004E, 0x007F, 0x044E, -1,19720, 19723, 19723, 19723, 19731, 19747, 1862, 19720, 0, {0, 0, 0, 0, 0}, 51, 51, { 0, 500, 2, 1, ',' }},
+ {0x0056, 0x007F, 0x0456, -1,19751, 19754, 19754, 19754, 19763, 19770, 19774, 19751, 0, {0, 0, 0, 0, 0}, 52, 52, { 1252, 500, 10000, 850, ',' }},
+ {0x0057, 0x007F, 0x0457, -1,19778, 19782, 19782, 19782, 19790, 19809, 19778, 19511, 0, {0, 0, 0, 0, 0}, 53, 53, { 0, 500, 2, 1, ',' }},
+ {0x0401, 0x0001, 0x0401, 174,19813, 19819, 19819, 19819, 19841, 18165, 18169, 18140, 10998, {16777216, 0, 0, 0, 0}, 54, 54, { 1256, 20420, 10004, 720, ';' }},
+ {0x0402, 0x0002, 0x0402, 19,19890, 19896, 19896, 19896, 19917, 18205, 18209, 18173, 19955, {0, 0, 0, 0, 0}, 55, 55, { 1251, 20420, 10007, 866, ';' }},
+ {0x0403, 0x0003, 0x0403, 61,19958, 19964, 19964, 19964, 19980, 18232, 18236, 18213, 19998, {0, 0, 0, 0, 0}, 56, 56, { 1252, 500, 10000, 850, ';' }},
+ {0x0404, 0x7C04, 0x0404, 207,20001, 20007, 20007, 20007, 20024, 20040, 18266, 18270, 20044, {0, 0, 0, 0, 0}, 57, 57, { 950, 500, 10002, 950, ',' }},
+ {0x0405, 0x0005, 0x0405, 49,20047, 20053, 20053, 20053, 20076, 18292, 18296, 18273, 20106, {0, 0, 0, 0, 0}, 58, 58, { 1250, 500, 10029, 852, ';' }},
+ {0x0406, 0x0006, 0x0406, 52,20109, 20115, 20115, 20115, 20132, 18316, 18320, 18300, 20148, {0, 0, 0, 0, 0}, 59, 59, { 1252, 20277, 10000, 850, ';' }},
+ {0x0407, 0x0007, 0x0407, 50,20151, 20157, 20157, 20157, 20174, 18342, 18346, 18324, 4291, {0, 0, 0, 0, 0}, 60, 60, { 1252, 20273, 10000, 850, ';' }},
+ {0x0408, 0x0008, 0x0408, 81,20196, 20202, 20202, 20202, 20217, 18376, 18380, 18350, 20249, {0, 0, 0, 0, 0}, 61, 61, { 1253, 20273, 10006, 737, ';' }},
+ {0x0409, 0x0009, 0x0409, 212,20252, 20258, 20258, 20258, 20258, 18395, 18399, 18384, 20282, {0, 0, 0, 0, 0}, 62, 62, { 1252, 37, 10000, 437, ',' }},
+ {0x040B, 0x000B, 0x040B, 63,20285, 20291, 20291, 20291, 20309, 18448, 18452, 18431, 20323, {0, 0, 0, 0, 0}, 63, 63, { 1252, 20278, 10000, 850, ';' }},
+ {0x040C, 0x000C, 0x040C, 68,20326, 20332, 20332, 20332, 20348, 18473, 18477, 5968, 20367, {0, 0, 0, 0, 0}, 64, 64, { 1252, 20297, 10000, 850, ';' }},
+ {0x040D, 0x000D, 0x040D, 92,20370, 20376, 20376, 20376, 20392, 18502, 18506, 18481, 20416, {0, 0, 0, 0, 0}, 65, 65, { 1255, 500, 10005, 862, ',' }},
+ {0x040E, 0x000E, 0x040E, 89,20419, 20425, 20425, 20425, 20445, 18530, 18534, 18510, 20468, {0, 0, 0, 0, 0}, 66, 66, { 1250, 500, 10029, 852, ';' }},
+ {0x040F, 0x000F, 0x040F, 97,20471, 20477, 20477, 20477, 20497, 18561, 18565, 18538, 20517, {0, 0, 0, 0, 0}, 67, 67, { 1252, 20871, 10079, 850, ';' }},
+ {0x0410, 0x0010, 0x0410, 98,20520, 20526, 20526, 20526, 20542, 18589, 18593, 18569, 20560, {0, 0, 0, 0, 0}, 68, 68, { 1252, 20280, 10000, 850, ';' }},
+ {0x0411, 0x0011, 0x0411, 101,20563, 20569, 20569, 20569, 20586, 18619, 18623, 18597, 20605, {0, 0, 0, 0, 0}, 69, 69, { 932, 20290, 10001, 932, ',' }},
+ {0x0412, 0x0012, 0x0412, 109,20608, 20614, 20614, 20614, 20635, 18647, 18651, 18627, 20660, {0, 0, 0, 0, 0}, 70, 70, { 949, 20833, 10003, 949, ',' }},
+ {0x0413, 0x0013, 0x0413, 149,20663, 20669, 20669, 20669, 20689, 18675, 18679, 18655, 20712, {0, 0, 0, 0, 0}, 71, 71, { 1252, 500, 10000, 850, ';' }},
+ {0x0414, 0x0014, 0x0414, 150,20715, 20721, 20747, 20747, 20774, 18702, 20796, 20800, 20803, {0, 0, 0, 0, 0}, 72, 72, { 1252, 20277, 10000, 850, ';' }},
+ {0x0415, 0x0015, 0x0415, 162,20806, 20812, 20812, 20812, 20828, 18727, 18731, 18710, 20844, {0, 0, 0, 0, 0}, 73, 73, { 1250, 20880, 10029, 852, ';' }},
+ {0x0416, 0x0016, 0x0416, 26,20847, 20853, 20853, 20853, 20873, 18760, 18764, 18735, 20893, {0, 0, 0, 0, 0}, 74, 74, { 1252, 500, 10000, 850, ';' }},
+ {0x0418, 0x0018, 0x0418, 171,20896, 20902, 20902, 20902, 20921, 18789, 18793, 18768, 20941, {0, 0, 0, 0, 0}, 75, 75, { 1250, 20880, 10029, 852, ';' }},
+ {0x0419, 0x0019, 0x0419, 172,20944, 20950, 20950, 20950, 20967, 18823, 18827, 18797, 20997, {0, 0, 0, 0, 0}, 76, 76, { 1251, 20880, 10007, 866, ';' }},
+ {0x041A, 0x001A, 0x041A, 88,21000, 21006, 21006, 21006, 21025, 18852, 18856, 18831, 21045, {0, 0, 0, 0, 0}, 77, 77, { 1250, 500, 10082, 852, ';' }},
+ {0x041B, 0x001B, 0x041B, 183,21048, 21054, 21054, 21054, 21072, 18881, 18885, 18860, 21106, {0, 0, 0, 0, 0}, 78, 78, { 1250, 20880, 10029, 852, ';' }},
+ {0x041C, 0x001C, 0x041C, 4,21109, 21115, 21115, 21115, 21134, 18908, 18912, 18889, 21154, {0, 0, 0, 0, 0}, 79, 79, { 1250, 20880, 10029, 852, ';' }},
+ {0x041D, 0x001D, 0x041D, 178,21157, 21163, 21163, 21163, 21180, 18935, 18939, 18916, 21198, {0, 0, 0, 0, 0}, 80, 80, { 1252, 20278, 10000, 850, ';' }},
+ {0x041E, 0x001E, 0x041E, 197,21201, 21207, 21207, 21207, 21223, 18961, 18965, 18943, 21263, {0, 0, 0, 0, 0}, 81, 81, { 874, 20838, 10021, 874, ',' }},
+ {0x041F, 0x001F, 0x041F, 204,21266, 21272, 21272, 21272, 21289, 18989, 18993, 18969, 21309, {0, 0, 0, 0, 0}, 82, 82, { 1254, 20905, 10081, 857, ';' }},
+ {0x0421, 0x0021, 0x0421, 90,21312, 21318, 21318, 21318, 21341, 19028, 19032, 18997, 21370, {0, 0, 0, 0, 0}, 83, 83, { 1252, 500, 10000, 850, ';' }},
+ {0x0422, 0x0022, 0x0422, 209,21373, 21379, 21379, 21379, 21399, 19070, 19074, 19036, 21437, {0, 0, 0, 0, 0}, 84, 84, { 1251, 500, 10017, 866, ';' }},
+ {0x0423, 0x0023, 0x0423, 30,21440, 21446, 21446, 21446, 21467, 19111, 19115, 19078, 21505, {0, 0, 0, 0, 0}, 85, 85, { 1251, 500, 10007, 866, ';' }},
+ {0x0424, 0x0024, 0x0424, 181,21508, 21514, 21514, 21514, 21535, 19146, 19150, 19119, 21561, {0, 0, 0, 0, 0}, 86, 86, { 1250, 20880, 10029, 852, ';' }},
+ {0x0425, 0x0025, 0x0425, 57,21564, 21570, 21570, 21570, 21589, 19172, 19176, 19154, 21603, {0, 0, 0, 0, 0}, 87, 87, { 1257, 500, 10029, 775, ';' }},
+ {0x0426, 0x0026, 0x0426, 121,21606, 21612, 21612, 21612, 21629, 19201, 19205, 19180, 21649, {0, 0, 0, 0, 0}, 88, 88, { 1257, 500, 10029, 775, ';' }},
+ {0x0427, 0x0027, 0x0427, 119,21652, 21658, 21658, 21658, 21681, 19233, 19237, 19209, 21701, {0, 0, 0, 0, 0}, 89, 89, { 1257, 500, 10029, 775, ';' }},
+ {0x0429, 0x0029, 0x0429, 96,21704, 21710, 21710, 21710, 21725, 19263, 19267, 19241, 21749, {0, 0, 0, 0, 0}, 90, 90, { 1256, 20420, 10004, 720, ';' }},
+ {0x042A, 0x002A, 0x042A, 220,21752, 21758, 21758, 21758, 21779, 19300, 3156, 19271, 21807, {0, 0, 0, 0, 0}, 91, 91, { 1258, 500, 10000, 1258, ',' }},
+ {0x042B, 0x002B, 0x042B, 5,21810, 21816, 21816, 21816, 21835, 19331, 19335, 19304, 465, {0, 0, 0, 0, 0}, 92, 92, { 0, 500, 2, 1, ',' }},
+ {0x042D, 0x002D, 0x042D, 61,21900, 21906, 21906, 21906, 21921, 19357, 19361, 19339, 19998, {0, 0, 0, 0, 0}, 93, 93, { 1252, 500, 10000, 850, ';' }},
+ {0x042F, 0x002F, 0x042F, 128,21940, 21946, 21946, 21946, 21969, 19400, 19404, 19365, 22013, {0, 0, 0, 0, 0}, 94, 94, { 1251, 500, 10007, 866, ';' }},
+ {0x0436, 0x0036, 0x0436, 227,22016, 22022, 22022, 22022, 22047, 19432, 19436, 19408, 22072, {0, 0, 0, 0, 0}, 95, 95, { 1252, 500, 10000, 850, ',' }},
+ {0x0437, 0x0037, 0x0437, 72,22075, 22081, 22081, 22081, 22100, 19474, 19478, 19440, 22155, {0, 0, 0, 0, 0}, 96, 96, { 0, 500, 2, 1, ';' }},
+ {0x0438, 0x0038, 0x0438, 67,22158, 22164, 22164, 22164, 22188, 19503, 19507, 19482, 22209, {0, 0, 0, 0, 0}, 97, 97, { 1252, 20277, 10079, 850, ';' }},
+ {0x0439, 0x0039, 0x0439, 93,22212, 22218, 22218, 22218, 22232, 19536, 19540, 19511, 22263, {0, 0, 0, 0, 0}, 98, 98, { 0, 500, 2, 1, ',' }},
+ {0x0441, 0x0041, 0x0441, 102,22266, 22272, 22272, 22272, 22288, 19565, 19569, 19544, 22306, {0, 0, 0, 0, 0}, 99, 99, { 1252, 500, 10000, 437, ',' }},
+ {0x0447, 0x0047, 0x0447, 93,22309, 22315, 22315, 22315, 22332, 19607, 19611, 19573, 22263, {0, 0, 0, 0, 0}, 100, 100, { 0, 500, 2, 1, ',' }},
+ {0x0449, 0x0049, 0x0449, 93,22369, 22375, 22375, 22375, 22389, 19640, 19644, 19615, 22263, {0, 0, 0, 0, 0}, 101, 101, { 0, 500, 2, 1, ',' }},
+ {0x044A, 0x004A, 0x044A, 93,22429, 22435, 22435, 22435, 22450, 19677, 19681, 19648, 22263, {0, 0, 0, 0, 0}, 102, 102, { 0, 500, 2, 1, ',' }},
+ {0x044B, 0x004B, 0x044B, 93,22497, 22503, 22503, 22503, 22519, 19712, 19716, 19685, 22263, {0, 0, 0, 0, 0}, 103, 103, { 0, 500, 2, 1, ',' }},
+ {0x044E, 0x004E, 0x044E, 93,22550, 22556, 22556, 22556, 22572, 19747, 1862, 19720, 22263, {0, 0, 0, 0, 0}, 104, 104, { 0, 500, 2, 1, ',' }},
+ {0x0456, 0x0056, 0x0456, 61,22603, 22609, 22609, 22609, 22626, 19770, 19774, 19751, 19998, {0, 0, 0, 0, 0}, 105, 105, { 1252, 500, 10000, 850, ',' }},
+ {0x0457, 0x0057, 0x0457, 93,22643, 22650, 22650, 22650, 22666, 19809, 19778, 19778, 22263, {0, 0, 0, 0, 0}, 106, 106, { 0, 500, 2, 1, ',' }},
+ {0x0801, 0x0001, 0x0801, 95,22700, 22706, 22706, 22706, 22720, 22750, 18169, 18140, 22754, {2, 1, 0, 0, 0}, 107, 107, { 1256, 20420, 10004, 720, ';' }},
+ {0x0804, 0x0004, 0x0804, 42,22757, 22763, 22763, 22763, 22779, 18262, 18266, 18270, 11080, {0, 0, 0, 0, 0}, 108, 108, { 936, 500, 10008, 936, ',' }},
+ {0x0807, 0x0007, 0x0807, 37,22795, 22801, 22801, 22801, 22822, 22840, 18346, 18324, 11001, {0, 0, 0, 0, 0}, 109, 109, { 1252, 20273, 10000, 850, ';' }},
+ {0x0809, 0x0009, 0x0809, 70,22844, 22850, 22850, 22850, 22850, 22875, 18399, 18384, 22879, {0, 0, 0, 0, 0}, 110, 110, { 1252, 20285, 10000, 850, ',' }},
+ {0x080A, 0x000A, 0x080A, 141,22882, 22888, 22888, 22888, 22905, 22924, 18427, 18403, 22928, {0, 0, 0, 0, 0}, 111, 111, { 1252, 20284, 10000, 850, ',' }},
+ {0x080C, 0x000C, 0x080C, 17,22931, 22937, 22937, 22937, 22954, 22975, 18477, 5968, 22979, {0, 0, 0, 0, 0}, 112, 112, { 1252, 20297, 10000, 850, ';' }},
+ {0x0810, 0x0010, 0x0810, 37,22982, 22988, 22988, 22988, 23010, 23030, 18593, 18569, 11001, {0, 0, 0, 0, 0}, 113, 113, { 1252, 500, 10000, 850, ';' }},
+ {0x0813, 0x0013, 0x0813, 17,23034, 23040, 23040, 23040, 23056, 23077, 18679, 18655, 22979, {0, 0, 0, 0, 0}, 114, 114, { 1252, 500, 10000, 850, ';' }},
+ {0x0814, 0x0014, 0x0814, 150,23081, 23087, 23087, 23087, 23114, 23136, 23140, 23144, 20803, {0, 0, 0, 0, 0}, 115, 115, { 1252, 20277, 10000, 850, ';' }},
+ {0x0816, 0x0016, 0x0816, 166,23147, 23153, 23153, 23153, 23175, 23197, 18764, 18735, 23201, {0, 0, 0, 0, 0}, 116, 116, { 1252, 500, 10000, 850, ';' }},
+ {0x081D, 0x001D, 0x081D, 63,23204, 23210, 23210, 23210, 23228, 23246, 18939, 18916, 20323, {0, 0, 0, 0, 0}, 117, 117, { 1252, 20278, 10000, 850, ';' }},
+ {0x0C01, 0x0001, 0x0C01, 58,23250, 23256, 23256, 23256, 23271, 23295, 18169, 18140, 23299, {16777216, 0, 0, 0, 0}, 118, 118, { 1256, 20420, 10004, 720, ';' }},
+ {0x0C04, 0x7C04, 0x0C04, 85,23302, 23308, 23308, 23308, 23342, 23379, 18266, 18270, 23383, {0, 0, 0, 0, 0}, 119, 119, { 950, 500, 10002, 950, ',' }},
+ {0x0C07, 0x0007, 0x0C07, 10,23386, 23392, 23392, 23392, 23409, 23431, 18346, 18324, 23435, {0, 0, 0, 0, 0}, 120, 120, { 1252, 20273, 10000, 850, ';' }},
+ {0x0C09, 0x0009, 0x0C09, 11,23438, 23444, 23444, 23444, 23444, 23464, 18399, 18384, 23468, {0, 0, 0, 0, 0}, 121, 121, { 1252, 500, 10000, 850, ',' }},
+ {0x0C0A, 0x000A, 0x0C0A, 61,23471, 23477, 23477, 23477, 23493, 23512, 18427, 18403, 19998, {0, 0, 0, 0, 0}, 122, 122, { 1252, 20284, 10000, 850, ';' }},
+ {0x0C0C, 0x000C, 0x0C0C, 32,23516, 23522, 23522, 23522, 23538, 23557, 18477, 5968, 23561, {0, 0, 0, 0, 0}, 123, 123, { 1252, 20297, 10000, 850, ';' }},
+ {0x1001, 0x0001, 0x1001, 122,23564, 23570, 23570, 23570, 23585, 23613, 18169, 18140, 23617, {16777216, 0, 0, 0, 0}, 124, 124, { 1256, 20420, 10004, 720, ';' }},
+ {0x1004, 0x0004, 0x1004, 179,23620, 23626, 23626, 23626, 23646, 23665, 18266, 18270, 23669, {0, 0, 0, 0, 0}, 125, 125, { 936, 500, 10008, 936, ',' }},
+ {0x1007, 0x0007, 0x1007, 120,23672, 23678, 23678, 23678, 23698, 23718, 18346, 18324, 23722, {0, 0, 0, 0, 0}, 126, 126, { 1252, 20273, 10000, 850, ';' }},
+ {0x1009, 0x0009, 0x1009, 32,23725, 23731, 23731, 23731, 23731, 23748, 18399, 18384, 23561, {0, 0, 0, 0, 0}, 127, 127, { 1252, 37, 10000, 850, ',' }},
+ {0x100A, 0x000A, 0x100A, 82,23752, 23758, 23758, 23758, 23778, 23799, 18427, 18403, 23803, {0, 0, 0, 0, 0}, 128, 128, { 1252, 20284, 10000, 850, ',' }},
+ {0x100C, 0x000C, 0x100C, 37,23806, 23812, 23812, 23812, 23833, 23852, 18477, 5968, 11001, {0, 0, 0, 0, 0}, 129, 129, { 1252, 20297, 10000, 850, ';' }},
+ {0x1401, 0x0001, 0x1401, 55,23856, 23862, 23862, 23862, 23879, 23911, 18169, 18140, 23915, {16777216, 0, 0, 0, 0}, 130, 130, { 1256, 20420, 10004, 720, ';' }},
+ {0x1404, 0x0004, 0x1404, 132,23918, 23924, 23924, 23924, 23953, 23990, 18266, 18270, 23994, {0, 0, 0, 0, 0}, 131, 131, { 950, 500, 10002, 950, ',' }},
+ {0x1409, 0x0009, 0x1409, 154,23997, 24003, 24003, 24003, 24003, 24025, 18399, 18384, 24029, {0, 0, 0, 0, 0}, 132, 132, { 1252, 500, 10000, 850, ',' }},
+ {0x140A, 0x000A, 0x140A, 44,24032, 24038, 24038, 24038, 24059, 24081, 18427, 18403, 24085, {0, 0, 0, 0, 0}, 133, 133, { 1252, 20284, 10000, 850, ',' }},
+ {0x140C, 0x000C, 0x140C, 120,24088, 24094, 24094, 24094, 24114, 24137, 18477, 5968, 23722, {0, 0, 0, 0, 0}, 134, 134, { 1252, 20297, 10000, 850, ';' }},
+ {0x1801, 0x0001, 0x1801, 123,24141, 24147, 24147, 24147, 24164, 24194, 18169, 18140, 24198, {16777216, 0, 0, 0, 0}, 135, 135, { 1256, 20420, 10004, 720, ';' }},
+ {0x1809, 0x0009, 0x1809, 91,24201, 24207, 24207, 24207, 24207, 24225, 18399, 18384, 24229, {0, 0, 0, 0, 0}, 136, 136, { 1252, 500, 10000, 850, ',' }},
+ {0x180A, 0x000A, 0x180A, 156,24232, 24238, 24238, 24238, 24255, 24274, 18427, 18403, 24278, {0, 0, 0, 0, 0}, 137, 137, { 1252, 20284, 10000, 850, ',' }},
+ {0x1C01, 0x0001, 0x1C01, 202,24281, 24287, 24287, 24287, 24304, 24330, 18169, 18140, 24334, {16777216, 0, 0, 0, 0}, 138, 138, { 1256, 20420, 10004, 720, ';' }},
+ {0x1C09, 0x0009, 0x1C09, 227,24337, 24343, 24343, 24343, 24343, 24366, 18399, 18384, 22072, {0, 0, 0, 0, 0}, 139, 139, { 1252, 500, 10000, 437, ',' }},
+ {0x1C0A, 0x000A, 0x1C0A, 54,24370, 24376, 24376, 24376, 24405, 24438, 18427, 18403, 24442, {0, 0, 0, 0, 0}, 140, 140, { 1252, 20284, 10000, 850, ',' }},
+ {0x2001, 0x0001, 0x2001, 155,24445, 24451, 24451, 24451, 24465, 24491, 18169, 18140, 24495, {16777216, 0, 0, 0, 0}, 141, 141, { 1256, 20420, 10004, 720, ';' }},
+ {0x200A, 0x000A, 0x200A, 217,24498, 24504, 24504, 24504, 24524, 24545, 18427, 18403, 24549, {0, 0, 0, 0, 0}, 142, 142, { 1252, 20284, 10000, 850, ',' }},
+ {0x2401, 0x0001, 0x2401, 224,24552, 24558, 24558, 24558, 24573, 24601, 18169, 18140, 24605, {16777216, 0, 0, 0, 0}, 143, 143, { 1256, 20420, 10004, 720, ';' }},
+ {0x240A, 0x000A, 0x240A, 43,24608, 24614, 24614, 24614, 24633, 24653, 18427, 18403, 24657, {0, 0, 0, 0, 0}, 144, 144, { 1252, 20284, 10000, 850, ',' }},
+ {0x2801, 0x0001, 0x2801, 191,24660, 24666, 24666, 24666, 24681, 24709, 18169, 18140, 24713, {16777216, 0, 0, 0, 0}, 145, 145, { 1256, 20420, 10004, 720, ';' }},
+ {0x280A, 0x000A, 0x280A, 157,24716, 24722, 24722, 24722, 24737, 24754, 18427, 18403, 24758, {0, 0, 0, 0, 0}, 146, 146, { 1252, 20284, 10000, 850, ',' }},
+ {0x2C01, 0x0001, 0x2C01, 100,24761, 24767, 24767, 24767, 24783, 24813, 18169, 18140, 24817, {16777216, 0, 0, 0, 0}, 147, 147, { 1256, 20420, 10004, 720, ';' }},
+ {0x2C0A, 0x000A, 0x2C0A, 8,24820, 24826, 24826, 24826, 24846, 24867, 18427, 18403, 24871, {0, 0, 0, 0, 0}, 148, 148, { 1252, 20284, 10000, 850, ',' }},
+ {0x3001, 0x0001, 0x3001, 114,24874, 24880, 24880, 24880, 24897, 24925, 18169, 18140, 24929, {16777216, 0, 0, 0, 0}, 149, 149, { 1256, 20420, 10004, 720, ';' }},
+ {0x3009, 0x0009, 0x3009, 229,24932, 24938, 24938, 24938, 24938, 24957, 18399, 18384, 24961, {0, 0, 0, 0, 0}, 150, 150, { 1252, 500, 10000, 437, ',' }},
+ {0x300A, 0x000A, 0x300A, 56,24964, 24970, 24970, 24970, 24988, 25007, 18427, 18403, 25011, {0, 0, 0, 0, 0}, 151, 151, { 1252, 20284, 10000, 850, ',' }},
+ {0x3401, 0x0001, 0x3401, 110,25014, 25020, 25020, 25020, 25036, 25066, 18169, 18140, 25070, {16777216, 0, 0, 0, 0}, 152, 152, { 1256, 20420, 10004, 720, ';' }},
+ {0x3409, 0x0009, 0x3409, 160,25073, 25079, 25079, 25079, 25079, 25101, 18399, 18384, 25105, {0, 0, 0, 0, 0}, 153, 153, { 1252, 500, 10000, 437, ',' }},
+ {0x340A, 0x000A, 0x340A, 40,25108, 25114, 25114, 25114, 25130, 25147, 18427, 18403, 25151, {0, 0, 0, 0, 0}, 154, 154, { 1252, 20284, 10000, 850, ',' }},
+ {0x3801, 0x0001, 0x3801, 0,25154, 25160, 25160, 25160, 25190, 25254, 18169, 18140, 25258, {16777216, 0, 0, 0, 0}, 155, 155, { 1256, 20420, 10004, 720, ';' }},
+ {0x380A, 0x000A, 0x380A, 213,25261, 25267, 25267, 25267, 25285, 25304, 18427, 18403, 25308, {0, 0, 0, 0, 0}, 156, 156, { 1252, 20284, 10000, 850, ',' }},
+ {0x3C01, 0x0001, 0x3C01, 20,25311, 25317, 25317, 25317, 25334, 25366, 18169, 18140, 25370, {16777216, 0, 0, 0, 0}, 157, 157, { 1256, 20420, 10004, 720, ';' }},
+ {0x3C0A, 0x000A, 0x3C0A, 168,25373, 25379, 25379, 25379, 25398, 25418, 18427, 18403, 25422, {0, 0, 0, 0, 0}, 158, 158, { 1252, 20284, 10000, 850, ',' }},
+ {0x4001, 0x0001, 0x4001, 169,25425, 25431, 25431, 25431, 25446, 25470, 18169, 18140, 25474, {16777216, 0, 0, 0, 0}, 159, 159, { 1256, 20420, 10004, 720, ';' }},
+ {0x400A, 0x000A, 0x400A, 25,25477, 25483, 25483, 25483, 25501, 25520, 18427, 18403, 25524, {0, 0, 0, 0, 0}, 160, 160, { 1252, 20284, 10000, 850, ',' }},
+ {0x440A, 0x000A, 0x440A, 190,25527, 25533, 25533, 25533, 25555, 25578, 18427, 18403, 25582, {0, 0, 0, 0, 0}, 161, 161, { 1252, 20284, 10000, 850, ',' }},
+ {0x480A, 0x000A, 0x480A, 87,25585, 25591, 25591, 25591, 25610, 25630, 18427, 18403, 25634, {0, 0, 0, 0, 0}, 162, 162, { 1252, 20284, 10000, 850, ',' }},
+ {0x4C0A, 0x000A, 0x4C0A, 148,25637, 25643, 25643, 25643, 25663, 25684, 18427, 18403, 25688, {0, 0, 0, 0, 0}, 163, 163, { 1252, 20284, 10000, 850, ',' }},
+ {0x500A, 0x000A, 0x500A, 165,25691, 25697, 25697, 25697, 25719, 25742, 18427, 18403, 25746, {0, 0, 0, 0, 0}, 164, 164, { 1252, 20284, 10000, 850, ',' }},
+ {0x7C04, 0x007F, 0x0000, -1,25749, 20007, 18247, 18247, 18255, 20040, 18266, 18270, 0, {0, 0, 0, 0, 0}, 165, 165, { 950, 500, 10002, 950, ',' }}
};
static const CultureInfoNameEntry culture_name_entries [] = {
- {19262, 42},
- {25485, 94},
- {17994, 0},
- {25491, 153},
- {25497, 155},
- {25503, 128},
- {25509, 116},
- {25515, 105},
- {25521, 145},
- {25527, 150},
- {25533, 147},
- {25539, 122},
- {25545, 133},
- {25551, 139},
- {25557, 157},
- {25563, 53},
- {25569, 143},
- {25575, 136},
- {25581, 141},
- {18932, 32},
- {25587, 84},
- {18027, 1},
- {25593, 54},
- {18067, 2},
- {25599, 55},
- {18127, 4},
- {25605, 57},
- {18154, 5},
- {25611, 58},
- {18178, 6},
- {25617, 118},
- {25623, 107},
- {25629, 59},
- {25635, 124},
- {18204, 7},
- {25641, 60},
- {18238, 8},
- {25647, 119},
- {25653, 125},
- {25659, 108},
- {25665, 134},
- {25671, 130},
- {25677, 151},
- {25683, 61},
- {25689, 137},
- {25695, 148},
- {18257, 9},
- {25701, 146},
- {25707, 158},
- {25713, 152},
- {25719, 142},
- {25725, 131},
- {25731, 138},
- {25737, 149},
- {25743, 120},
- {25749, 126},
- {25755, 160},
- {25761, 109},
- {25767, 161},
- {25773, 135},
- {25779, 144},
- {25785, 162},
- {25791, 156},
- {25797, 159},
- {25803, 154},
- {25809, 140},
- {19008, 34},
- {25815, 86},
- {19193, 40},
- {25821, 92},
- {19095, 37},
- {25827, 89},
- {18285, 10},
- {25833, 62},
- {19294, 43},
- {25839, 95},
+ {19408, 42},
+ {25756, 95},
+ {18140, 0},
+ {25762, 155},
+ {25768, 157},
+ {25774, 130},
+ {25780, 118},
+ {25786, 107},
+ {25792, 147},
+ {25798, 152},
+ {25804, 149},
+ {25810, 124},
+ {25816, 135},
+ {25822, 141},
+ {25828, 159},
+ {25834, 54},
+ {25840, 145},
+ {25846, 138},
+ {25852, 143},
+ {19078, 32},
+ {25858, 85},
+ {18173, 1},
+ {25864, 55},
+ {18213, 2},
+ {25870, 56},
+ {18273, 4},
+ {25876, 58},
+ {18300, 5},
+ {25882, 59},
+ {18324, 6},
+ {25888, 120},
+ {25894, 109},
+ {25900, 60},
+ {25906, 126},
+ {18350, 7},
+ {25912, 61},
+ {18384, 8},
+ {25918, 121},
+ {25924, 127},
+ {25930, 110},
+ {25936, 136},
+ {25942, 132},
+ {25948, 153},
+ {25954, 62},
+ {25960, 139},
+ {25966, 150},
+ {18403, 9},
+ {25972, 148},
+ {25978, 160},
+ {25984, 154},
+ {25990, 144},
+ {25996, 133},
+ {26002, 140},
+ {26008, 151},
+ {26014, 122},
+ {26020, 128},
+ {26026, 162},
+ {26032, 111},
+ {26038, 163},
+ {26044, 137},
+ {26050, 146},
+ {26056, 164},
+ {26062, 158},
+ {26068, 161},
+ {26074, 156},
+ {26080, 142},
+ {19154, 34},
+ {26086, 87},
+ {19339, 40},
+ {26092, 93},
+ {19241, 37},
+ {26098, 90},
+ {18431, 10},
+ {26104, 63},
+ {19482, 44},
+ {26110, 97},
{5968, 11},
- {25845, 110},
- {25851, 121},
- {25857, 127},
- {25863, 63},
- {25869, 132},
- {19563, 51},
- {25875, 103},
- {19385, 46},
- {25881, 98},
- {18335, 12},
- {25887, 64},
- {19323, 44},
- {25893, 96},
- {18685, 24},
- {25899, 76},
- {18364, 13},
- {25905, 65},
- {19158, 39},
- {25911, 91},
- {18851, 30},
- {25917, 82},
- {18392, 14},
- {25923, 66},
- {18423, 15},
- {25929, 111},
- {25935, 67},
- {18451, 16},
- {25941, 68},
- {19497, 49},
- {25947, 101},
- {18481, 17},
- {25953, 69},
- {19590, 52},
- {25959, 104},
- {19063, 36},
- {25966, 88},
- {19034, 35},
- {25972, 87},
- {19219, 41},
- {25978, 93},
- {19532, 50},
- {25984, 102},
- {25990, 71},
- {18509, 18},
- {25996, 112},
- {26002, 70},
- {26008, 113},
- {18537, 19},
- {18564, 20},
- {26014, 72},
- {18589, 21},
- {26020, 73},
- {26026, 114},
- {18622, 22},
- {26032, 74},
- {18651, 23},
- {26038, 75},
- {18714, 25},
- {26044, 77},
- {18973, 33},
- {26050, 85},
- {18743, 26},
- {26056, 78},
- {18770, 27},
- {26062, 115},
- {26068, 79},
- {19356, 45},
- {26074, 97},
- {19427, 47},
- {26080, 99},
- {19460, 48},
- {26086, 100},
- {18797, 28},
- {26092, 80},
- {18823, 29},
- {26098, 81},
- {18890, 31},
- {26104, 83},
- {19125, 38},
- {26110, 90},
- {26116, 3},
- {26123, 163},
- {26130, 106},
- {26136, 117},
- {26142, 129},
- {26148, 123},
- {26154, 56}
+ {26116, 112},
+ {26122, 123},
+ {26128, 129},
+ {26134, 64},
+ {26140, 134},
+ {19751, 52},
+ {26146, 105},
+ {19573, 47},
+ {26152, 100},
+ {18481, 12},
+ {26158, 65},
+ {19511, 45},
+ {26164, 98},
+ {18831, 24},
+ {26170, 77},
+ {18510, 13},
+ {26176, 66},
+ {19304, 39},
+ {26182, 92},
+ {18997, 30},
+ {26188, 83},
+ {18538, 14},
+ {26194, 67},
+ {18569, 15},
+ {26200, 113},
+ {26206, 68},
+ {18597, 16},
+ {26212, 69},
+ {19440, 43},
+ {26218, 96},
+ {19685, 50},
+ {26224, 103},
+ {18627, 17},
+ {26230, 70},
+ {19778, 53},
+ {26236, 106},
+ {19209, 36},
+ {26243, 89},
+ {19180, 35},
+ {26249, 88},
+ {19365, 41},
+ {26255, 94},
+ {19720, 51},
+ {26261, 104},
+ {26267, 72},
+ {18655, 18},
+ {26273, 114},
+ {26279, 71},
+ {26285, 115},
+ {18683, 19},
+ {18710, 20},
+ {26291, 73},
+ {18735, 21},
+ {26297, 74},
+ {26303, 116},
+ {18768, 22},
+ {26309, 75},
+ {18797, 23},
+ {26315, 76},
+ {18860, 25},
+ {26321, 78},
+ {19119, 33},
+ {26327, 86},
+ {18889, 26},
+ {26333, 79},
+ {18916, 27},
+ {26339, 117},
+ {26345, 80},
+ {19544, 46},
+ {26351, 99},
+ {19615, 48},
+ {26357, 101},
+ {19648, 49},
+ {26363, 102},
+ {18943, 28},
+ {26369, 81},
+ {18969, 29},
+ {26375, 82},
+ {19036, 31},
+ {26381, 84},
+ {19271, 38},
+ {26387, 91},
+ {26393, 3},
+ {26400, 165},
+ {26407, 108},
+ {26413, 119},
+ {26419, 131},
+ {26425, 125},
+ {26431, 57}
};
static const RegionInfoEntry region_entries [] = {
- { 0, 0,24987,343,343,26160,343,26181,26185},
- { 0, 1,26213,343,343,26216,343,26228,26232},
- { 0, 2,26240,343,343,26243,343,26263,26267},
- { 0, 3,26289,343,343,26292,343,26263,26267},
- { 0, 4,20966,343,343,26301,343,26309,26313},
- { 0, 5,465,343,343,26326,343,26334,26338},
- { 0, 6,26352,343,343,26355,343,26376,26380},
- { 0, 7,26409,343,343,26412,343,26419,26423},
- { 0, 8,24600,343,343,26438,343,24438,26448},
- { 0, 9,26463,343,343,26466,343,26481,26485},
- { 0, 10,23164,343,343,26495,343,26503,26507},
- { 0, 11,23197,343,343,26512,343,26522,26526},
- { 0, 12,26544,343,343,26547,343,26553,26557},
- { 0, 13,26572,343,343,26575,343,26586,26590},
- { 0, 14,26610,343,343,26613,343,26636,26640},
- { 0, 15,26676,343,343,26679,343,26688,26692},
- { 0, 16,26708,343,343,26711,343,26722,26726},
- { 0, 17,22708,343,343,26742,343,26503,26507},
- { 0, 18,26750,343,343,26753,343,26766,26770},
- { 0, 19,19767,343,343,26786,343,26795,26799},
- { 0, 20,25099,343,343,26817,343,26825,26829},
- { 0, 21,26844,343,343,26847,343,26855,26859},
- { 0, 22,26873,343,343,26876,343,26766,26770},
- { 0, 23,26882,343,343,26885,343,26893,26897},
- { 0, 24,26913,343,343,26916,343,26923,26927},
- { 0, 25,25253,343,343,26941,343,26949,26953},
- { 0, 26,20705,343,343,26963,343,26970,26974},
- { 0, 27,26989,343,343,26992,343,27000,27004},
- { 0, 28,27020,343,343,27023,343,27037,27041},
- { 0, 29,27057,343,343,27060,343,27069,27073},
- { 0, 30,21317,343,343,27088,343,27096,27100},
- { 0, 31,27118,343,343,27121,343,27128,27132},
- { 0, 32,23290,343,343,27146,343,27153,27157},
- { 0, 33,27173,343,343,27176,343,26522,26526},
- { 0, 34,27190,343,343,27193,343,27226,27230},
- { 0, 35,27256,343,343,27259,343,27284,27288},
- { 0, 36,27303,343,343,27306,343,27284,27288},
- { 0, 37,11001,343,343,27312,343,27324,27328},
- { 0, 38,27340,343,343,27343,343,26766,26770},
- { 0, 39,27358,343,343,27361,343,27374,27378},
- { 0, 40,24880,343,343,27397,343,27403,27407},
- { 0, 41,27420,343,343,27423,343,27284,27288},
- { 0, 42,11080,343,343,27432,343,27438,27442},
- { 0, 43,24386,343,343,27464,343,27473,27477},
- { 0, 44,23814,343,343,27492,343,17836,27503},
- { 0, 45,27521,343,343,27524,343,27529,27533},
- { 0, 46,27544,343,343,27547,343,27558,27562},
- { 0, 47,27580,343,343,27583,343,26522,26526},
- { 0, 48,27600,343,343,27603,343,27610,27614},
- { 0, 49,19918,343,343,27627,343,27642,27646},
- { 0, 50,4291,343,343,27668,343,26503,26507},
- { 0, 51,27676,343,343,27679,343,27688,27692},
- { 0, 52,19960,343,343,27707,343,27715,27719},
- { 0, 53,27732,343,343,27735,343,26263,26267},
- { 0, 54,24171,343,343,27744,343,27763,27767},
- { 0, 55,23644,343,343,27782,343,27790,27794},
- { 0, 56,24740,343,343,27809,343,27817,27821},
- { 0, 57,21415,343,343,27835,343,27843,27847},
- { 0, 58,23028,343,343,27862,343,27868,27872},
- { 0, 59,27887,343,343,27890,343,27905,27909},
- { 0, 60,27925,343,343,27928,343,27936,27940},
- { 0, 61,19810,343,343,27955,343,26503,26507},
- { 0, 62,27961,343,343,27964,343,27973,27977},
- { 0, 63,20135,343,343,27992,343,26503,26507},
- { 0, 64,28000,343,343,28003,343,28008,28012},
- { 0, 65,28024,343,343,28027,343,28044,28048},
- { 0, 66,28071,343,343,28074,343,26481,26485},
- { 0, 67,21938,343,343,28085,343,27715,27719},
- { 0, 68,20179,343,343,28099,343,26503,26507},
- { 0, 69,28106,343,343,28109,343,27284,27288},
- { 0, 70,22608,343,343,28115,343,28130,28134},
- { 0, 71,28157,343,343,28160,343,26263,26267},
- { 0, 72,28168,343,343,28171,343,28179,28183},
- { 0, 73,28197,343,343,28200,343,26503,26507},
- { 0, 74,28214,343,343,28217,343,28223,28227},
- { 0, 75,28238,343,343,28241,343,28251,28255},
- { 0, 76,28271,343,343,28274,343,27715,27719},
- { 0, 77,28284,343,343,28287,343,28294,28298},
- { 0, 78,28312,343,343,28315,343,28322,28326},
- { 0, 79,28339,343,343,28342,343,26503,26507},
- { 0, 80,28353,343,343,28356,343,27284,27288},
- { 0, 81,20061,343,343,28374,343,26503,26507},
- { 0, 82,23532,343,343,28381,343,28391,28395},
- { 0, 83,28413,343,343,28416,343,26481,26485},
- { 0, 84,28421,343,343,28424,343,28431,28435},
- { 0, 85,23112,343,343,28449,343,28473,28477},
- { 0, 86,28494,343,343,28497,343,26522,26526},
- { 0, 87,25363,343,343,28531,343,28540,28544},
- { 0, 88,20857,343,343,28560,343,28568,28572},
- { 0, 89,20280,343,343,28586,343,28594,28598},
- { 0, 90,21182,343,343,28615,343,28625,28629},
- { 0, 91,23958,343,343,28647,343,26503,26507},
- { 0, 92,20228,343,343,28655,343,28662,28666},
- { 0, 93,21992,343,343,28685,343,28691,28695},
- { 0, 94,28708,343,343,28711,343,26481,26485},
- { 0, 95,22483,343,343,28742,343,28747,28751},
- { 0, 96,21561,343,343,28763,343,28768,28772},
- { 0, 97,20329,343,343,28785,343,28793,28797},
- { 0, 98,20372,343,343,28813,343,26503,26507},
- { 0, 99,28819,343,343,28822,343,28830,28834},
- { 0, 100,24546,343,343,28850,343,28857,28861},
- { 0, 101,20417,343,343,28877,343,28883,28887},
- { 0, 102,22035,343,343,28900,343,28906,28910},
- { 0, 103,28926,343,343,28929,343,28940,28944},
- { 0, 104,28958,343,343,28961,343,28970,28974},
- { 0, 105,28989,343,343,28992,343,26522,26526},
- { 0, 106,29001,343,343,29004,343,29012,29016},
- { 0, 107,29029,343,343,29032,343,26263,26267},
- { 0, 108,29054,343,343,29057,343,29069,29073},
- { 0, 109,20472,343,343,29090,343,29102,29106},
- { 0, 110,24799,343,343,29123,343,29130,29134},
- { 0, 111,29148,343,343,29151,343,29166,29170},
- { 0, 112,29192,343,343,29195,343,29206,29210},
- { 0, 113,29227,343,343,29230,343,29235,29239},
- { 0, 114,24658,343,343,29251,343,29259,29263},
- { 0, 115,29278,343,343,29281,343,26263,26267},
- { 0, 116,29293,343,343,29296,343,27324,27328},
- { 0, 117,29310,343,343,29313,343,29323,29327},
- { 0, 118,29343,343,343,29346,343,29354,29358},
- { 0, 119,21513,343,343,29374,343,29384,29388},
- { 0, 120,23451,343,343,29404,343,26503,26507},
- { 0, 121,21461,343,343,29415,343,29422,29426},
- { 0, 122,23346,343,343,29439,343,29445,29449},
- { 0, 123,23927,343,343,29462,343,27905,27909},
- { 0, 124,29470,343,343,29473,343,26503,26507},
- { 0, 125,7428,343,343,29480,343,29488,29492},
- { 0, 126,29505,343,343,29508,343,29519,29523},
- { 0, 127,29540,343,343,29543,343,26481,26485},
- { 0, 128,21825,343,343,29560,343,29570,29574},
- { 0, 129,29591,343,343,29594,343,26766,26770},
- { 0, 130,29599,343,343,29602,343,29610,29614},
- { 0, 131,29627,343,343,29630,343,29639,29643},
- { 0, 132,23723,343,343,29660,343,29679,29683},
- { 0, 133,29696,343,343,29699,343,26481,26485},
- { 0, 134,29724,343,343,29727,343,26503,26507},
- { 0, 135,29738,343,343,29741,343,29752,29756},
- { 0, 136,29775,343,343,29778,343,26263,26267},
- { 0, 137,29789,343,343,29792,343,29798,29802},
- { 0, 138,29815,343,343,29818,343,29828,29832},
- { 0, 139,29848,343,343,29851,343,29860,29864},
- { 0, 140,29888,343,343,29891,343,29898,29902},
- { 0, 141,22657,343,343,29916,343,29923,29927},
- { 0, 142,29940,343,343,29943,343,29952,29956},
- { 0, 143,29974,343,343,29977,343,29988,29992},
- { 0, 144,30011,343,343,30014,343,30028,30032},
- { 0, 145,30042,343,343,30045,343,26766,26770},
- { 0, 146,30051,343,343,30054,343,26522,26526},
- { 0, 147,30069,343,343,30072,343,30080,30084},
- { 0, 148,25417,343,343,30099,343,30109,30113},
- { 0, 149,20524,343,343,30136,343,26503,26507},
- { 0, 150,20615,343,343,30148,343,27037,27041},
- { 0, 151,30155,343,343,30158,343,30164,30168},
- { 0, 152,30183,343,343,30186,343,26522,26526},
- { 0, 153,30192,343,343,30195,343,27374,27378},
- { 0, 154,23758,343,343,30200,343,27374,27378},
- { 0, 155,24224,343,343,30212,343,30217,30221},
- { 0, 156,24007,343,343,30231,343,30238,30242},
- { 0, 157,24487,343,343,30260,343,30265,30269},
- { 0, 158,30288,343,343,30291,343,30028,30032},
- { 0, 159,30308,343,343,30311,343,30328,30332},
- { 0, 160,24834,343,343,30354,343,17940,30366},
- { 0, 161,30382,343,343,30385,343,30394,30398},
- { 0, 162,20656,343,343,30413,343,30420,30424},
- { 0, 163,468,343,343,30437,343,26503,26507},
- { 0, 164,30463,343,343,30466,343,27374,27378},
- { 0, 165,25475,343,343,30475,343,26481,26485},
- { 0, 166,22930,343,343,30487,343,26503,26507},
- { 0, 167,30496,343,343,30499,343,26481,26485},
- { 0, 168,25151,343,343,30505,343,30514,30518},
- { 0, 169,25203,343,343,30535,343,30541,30545},
- { 0, 170,30557,343,343,30560,343,26503,26507},
- { 0, 171,20753,343,343,30569,343,30577,30581},
- { 0, 172,20809,343,343,30594,343,30601,30605},
- { 0, 173,30631,343,343,30634,343,30641,30645},
- { 0, 174,10998,343,343,30659,343,30672,30676},
- { 0, 175,30688,343,343,30691,343,30707,30711},
- { 0, 176,30734,343,343,30737,343,30748,30752},
- { 0, 177,30769,343,343,30772,343,30778,30782},
- { 0, 178,21010,343,343,30797,343,30804,30808},
- { 0, 179,23398,343,343,30822,343,30832,30836},
- { 0, 180,30853,343,343,30856,343,30869,30873},
- { 0, 181,21373,343,343,30892,343,17714,30901},
- { 0, 182,30916,343,343,30919,343,27037,27041},
- { 0, 183,20918,343,343,30942,343,30951,30955},
- { 0, 184,30969,343,343,30972,343,30985,30989},
- { 0, 185,31008,343,343,31011,343,26503,26507},
- { 0, 186,31022,343,343,31025,343,26766,26770},
- { 0, 187,31033,343,343,31036,343,31044,31048},
- { 0, 188,31064,343,343,31067,343,31076,31080},
- { 0, 189,31097,343,343,31100,343,31122,31126},
- { 0, 190,25311,343,343,31154,343,17984,31166},
- { 0, 191,24442,343,343,31184,343,31190,31194},
- { 0, 192,31207,343,343,31210,343,31220,31224},
- { 0, 193,31244,343,343,31247,343,26481,26485},
- { 0, 194,31272,343,343,31275,343,27284,27288},
- { 0, 195,31280,343,343,31283,343,26503,26507},
- { 0, 196,31311,343,343,31314,343,26766,26770},
- { 0, 197,21075,343,343,31319,343,31328,31332},
- { 0, 198,31342,343,343,31345,343,31356,31360},
- { 0, 199,31378,343,343,31381,343,27374,27378},
- { 0, 200,17700,343,343,31389,343,26481,26485},
- { 0, 201,31401,343,343,31404,343,31417,31421},
- { 0, 202,24063,343,343,31440,343,31448,31452},
- { 0, 203,31467,343,343,31470,343,31476,31480},
- { 0, 204,21121,343,343,31495,343,31502,31506},
- { 0, 205,31519,343,343,31522,343,31542,31546},
- { 0, 206,31573,343,343,31576,343,26522,26526},
- { 0, 207,19856,343,343,31583,343,31590,31594},
- { 0, 208,31612,343,343,31615,343,31624,31628},
- { 0, 209,21249,343,343,31647,343,31655,31659},
- { 0, 210,31677,343,343,31680,343,31687,31691},
- { 0, 211,31708,343,343,31711,343,26481,26485},
- { 0, 212,20094,343,343,31748,343,26481,26485},
- { 0, 213,25037,343,343,31762,343,31770,31774},
- { 0, 214,31796,343,343,31799,343,31810,31814},
- { 0, 215,31829,343,343,31832,343,26503,26507},
- { 0, 216,31840,343,343,31843,343,26263,26267},
- { 0, 217,24278,343,343,31876,343,31886,31890},
- { 0, 218,31909,343,343,31912,343,26481,26485},
- { 0, 219,1619,343,343,31935,343,26481,26485},
- { 0, 220,21619,343,343,31955,343,31963,31967},
- { 0, 221,31983,343,343,31986,343,31994,31998},
- { 0, 222,32011,343,343,32014,343,30028,30032},
- { 0, 223,32032,343,343,32035,343,32041,32045},
- { 0, 224,24334,343,343,32064,343,32070,32074},
- { 0, 225,32086,343,343,32089,343,26503,26507},
- { 0, 226,32097,343,343,32100,343,32111,32115},
- { 0, 227,21884,343,343,32139,343,32152,32156},
- { 0, 228,32175,343,343,32178,343,32185,32189},
- { 0, 229,24690,343,343,32204,343,32213,32217}
+ { 0, 0,25258,343,343,26437,343,26458,26462},
+ { 0, 1,26490,343,343,26493,343,26505,26509},
+ { 0, 2,26517,343,343,26520,343,26540,26544},
+ { 0, 3,26566,343,343,26569,343,26540,26544},
+ { 0, 4,21154,343,343,26578,343,26586,26590},
+ { 0, 5,465,343,343,26603,343,26611,26615},
+ { 0, 6,26629,343,343,26632,343,26653,26657},
+ { 0, 7,26686,343,343,26689,343,26696,26700},
+ { 0, 8,24871,343,343,26715,343,24709,26725},
+ { 0, 9,26740,343,343,26743,343,26758,26762},
+ { 0, 10,23435,343,343,26772,343,26780,26784},
+ { 0, 11,23468,343,343,26789,343,26799,26803},
+ { 0, 12,26821,343,343,26824,343,26830,26834},
+ { 0, 13,26849,343,343,26852,343,26863,26867},
+ { 0, 14,26887,343,343,26890,343,26913,26917},
+ { 0, 15,26953,343,343,26956,343,26965,26969},
+ { 0, 16,26985,343,343,26988,343,26999,27003},
+ { 0, 17,22979,343,343,27019,343,26780,26784},
+ { 0, 18,27027,343,343,27030,343,27043,27047},
+ { 0, 19,19955,343,343,27063,343,27072,27076},
+ { 0, 20,25370,343,343,27094,343,27102,27106},
+ { 0, 21,27121,343,343,27124,343,27132,27136},
+ { 0, 22,27150,343,343,27153,343,27043,27047},
+ { 0, 23,27159,343,343,27162,343,27170,27174},
+ { 0, 24,27190,343,343,27193,343,27200,27204},
+ { 0, 25,25524,343,343,27218,343,27226,27230},
+ { 0, 26,20893,343,343,27240,343,27247,27251},
+ { 0, 27,27266,343,343,27269,343,27277,27281},
+ { 0, 28,27297,343,343,27300,343,27314,27318},
+ { 0, 29,27334,343,343,27337,343,27346,27350},
+ { 0, 30,21505,343,343,27365,343,27373,27377},
+ { 0, 31,27395,343,343,27398,343,27405,27409},
+ { 0, 32,23561,343,343,27423,343,27430,27434},
+ { 0, 33,27450,343,343,27453,343,26799,26803},
+ { 0, 34,27467,343,343,27470,343,27503,27507},
+ { 0, 35,27533,343,343,27536,343,27561,27565},
+ { 0, 36,27580,343,343,27583,343,27561,27565},
+ { 0, 37,11001,343,343,27589,343,27601,27605},
+ { 0, 38,27617,343,343,27620,343,27043,27047},
+ { 0, 39,27635,343,343,27638,343,27651,27655},
+ { 0, 40,25151,343,343,27674,343,27680,27684},
+ { 0, 41,27697,343,343,27700,343,27561,27565},
+ { 0, 42,11080,343,343,27709,343,27715,27719},
+ { 0, 43,24657,343,343,27741,343,27750,27754},
+ { 0, 44,24085,343,343,27769,343,17982,27780},
+ { 0, 45,27798,343,343,27801,343,27806,27810},
+ { 0, 46,27821,343,343,27824,343,27835,27839},
+ { 0, 47,27857,343,343,27860,343,26799,26803},
+ { 0, 48,27877,343,343,27880,343,27887,27891},
+ { 0, 49,20106,343,343,27904,343,27919,27923},
+ { 0, 50,4291,343,343,27945,343,26780,26784},
+ { 0, 51,27953,343,343,27956,343,27965,27969},
+ { 0, 52,20148,343,343,27984,343,27992,27996},
+ { 0, 53,28009,343,343,28012,343,26540,26544},
+ { 0, 54,24442,343,343,28021,343,28040,28044},
+ { 0, 55,23915,343,343,28059,343,28067,28071},
+ { 0, 56,25011,343,343,28086,343,28094,28098},
+ { 0, 57,21603,343,343,28112,343,28120,28124},
+ { 0, 58,23299,343,343,28139,343,28145,28149},
+ { 0, 59,28164,343,343,28167,343,28182,28186},
+ { 0, 60,28202,343,343,28205,343,28213,28217},
+ { 0, 61,19998,343,343,28232,343,26780,26784},
+ { 0, 62,28238,343,343,28241,343,28250,28254},
+ { 0, 63,20323,343,343,28269,343,26780,26784},
+ { 0, 64,28277,343,343,28280,343,28285,28289},
+ { 0, 65,28301,343,343,28304,343,28321,28325},
+ { 0, 66,28348,343,343,28351,343,26758,26762},
+ { 0, 67,22209,343,343,28362,343,27992,27996},
+ { 0, 68,20367,343,343,28376,343,26780,26784},
+ { 0, 69,28383,343,343,28386,343,27561,27565},
+ { 0, 70,22879,343,343,28392,343,28407,28411},
+ { 0, 71,28434,343,343,28437,343,26540,26544},
+ { 0, 72,22155,343,343,28445,343,28453,28457},
+ { 0, 73,28471,343,343,28474,343,26780,26784},
+ { 0, 74,28488,343,343,28491,343,28497,28501},
+ { 0, 75,28512,343,343,28515,343,28525,28529},
+ { 0, 76,28545,343,343,28548,343,27992,27996},
+ { 0, 77,28558,343,343,28561,343,28568,28572},
+ { 0, 78,28586,343,343,28589,343,28596,28600},
+ { 0, 79,28613,343,343,28616,343,26780,26784},
+ { 0, 80,28627,343,343,28630,343,27561,27565},
+ { 0, 81,20249,343,343,28648,343,26780,26784},
+ { 0, 82,23803,343,343,28655,343,28665,28669},
+ { 0, 83,28687,343,343,28690,343,26758,26762},
+ { 0, 84,28695,343,343,28698,343,28705,28709},
+ { 0, 85,23383,343,343,28723,343,28747,28751},
+ { 0, 86,28768,343,343,28771,343,26799,26803},
+ { 0, 87,25634,343,343,28805,343,28814,28818},
+ { 0, 88,21045,343,343,28834,343,28842,28846},
+ { 0, 89,20468,343,343,28860,343,28868,28872},
+ { 0, 90,21370,343,343,28889,343,28899,28903},
+ { 0, 91,24229,343,343,28921,343,26780,26784},
+ { 0, 92,20416,343,343,28929,343,28936,28940},
+ { 0, 93,22263,343,343,28959,343,28965,28969},
+ { 0, 94,28982,343,343,28985,343,26758,26762},
+ { 0, 95,22754,343,343,29016,343,29021,29025},
+ { 0, 96,21749,343,343,29037,343,29042,29046},
+ { 0, 97,20517,343,343,29059,343,29067,29071},
+ { 0, 98,20560,343,343,29087,343,26780,26784},
+ { 0, 99,29093,343,343,29096,343,29104,29108},
+ { 0, 100,24817,343,343,29124,343,29131,29135},
+ { 0, 101,20605,343,343,29151,343,29157,29161},
+ { 0, 102,22306,343,343,29174,343,29180,29184},
+ { 0, 103,29200,343,343,29203,343,29214,29218},
+ { 0, 104,29232,343,343,29235,343,29244,29248},
+ { 0, 105,29263,343,343,29266,343,26799,26803},
+ { 0, 106,29275,343,343,29278,343,29286,29290},
+ { 0, 107,29303,343,343,29306,343,26540,26544},
+ { 0, 108,29328,343,343,29331,343,29343,29347},
+ { 0, 109,20660,343,343,29364,343,29376,29380},
+ { 0, 110,25070,343,343,29397,343,29404,29408},
+ { 0, 111,29422,343,343,29425,343,29440,29444},
+ { 0, 112,29466,343,343,29469,343,29480,29484},
+ { 0, 113,29501,343,343,29504,343,29509,29513},
+ { 0, 114,24929,343,343,29525,343,29533,29537},
+ { 0, 115,29552,343,343,29555,343,26540,26544},
+ { 0, 116,29567,343,343,29570,343,27601,27605},
+ { 0, 117,29584,343,343,29587,343,29597,29601},
+ { 0, 118,29617,343,343,29620,343,29628,29632},
+ { 0, 119,21701,343,343,29648,343,29658,29662},
+ { 0, 120,23722,343,343,29678,343,26780,26784},
+ { 0, 121,21649,343,343,29689,343,29696,29700},
+ { 0, 122,23617,343,343,29713,343,29719,29723},
+ { 0, 123,24198,343,343,29736,343,28182,28186},
+ { 0, 124,29744,343,343,29747,343,26780,26784},
+ { 0, 125,7428,343,343,29754,343,29762,29766},
+ { 0, 126,29779,343,343,29782,343,29793,29797},
+ { 0, 127,29814,343,343,29817,343,26758,26762},
+ { 0, 128,22013,343,343,29834,343,29844,29848},
+ { 0, 129,29865,343,343,29868,343,27043,27047},
+ { 0, 130,29873,343,343,29876,343,29884,29888},
+ { 0, 131,29901,343,343,29904,343,29913,29917},
+ { 0, 132,23994,343,343,29934,343,29953,29957},
+ { 0, 133,29970,343,343,29973,343,26758,26762},
+ { 0, 134,29998,343,343,30001,343,26780,26784},
+ { 0, 135,30012,343,343,30015,343,30026,30030},
+ { 0, 136,30049,343,343,30052,343,26540,26544},
+ { 0, 137,30063,343,343,30066,343,30072,30076},
+ { 0, 138,30089,343,343,30092,343,30102,30106},
+ { 0, 139,30122,343,343,30125,343,30134,30138},
+ { 0, 140,30162,343,343,30165,343,30172,30176},
+ { 0, 141,22928,343,343,30190,343,30197,30201},
+ { 0, 142,30214,343,343,30217,343,30226,30230},
+ { 0, 143,30248,343,343,30251,343,30262,30266},
+ { 0, 144,30285,343,343,30288,343,30302,30306},
+ { 0, 145,30316,343,343,30319,343,27043,27047},
+ { 0, 146,30325,343,343,30328,343,26799,26803},
+ { 0, 147,30343,343,343,30346,343,30354,30358},
+ { 0, 148,25688,343,343,30373,343,30383,30387},
+ { 0, 149,20712,343,343,30410,343,26780,26784},
+ { 0, 150,20803,343,343,30422,343,27314,27318},
+ { 0, 151,30429,343,343,30432,343,30438,30442},
+ { 0, 152,30457,343,343,30460,343,26799,26803},
+ { 0, 153,30466,343,343,30469,343,27651,27655},
+ { 0, 154,24029,343,343,30474,343,27651,27655},
+ { 0, 155,24495,343,343,30486,343,30491,30495},
+ { 0, 156,24278,343,343,30505,343,30512,30516},
+ { 0, 157,24758,343,343,30534,343,30539,30543},
+ { 0, 158,30562,343,343,30565,343,30302,30306},
+ { 0, 159,30582,343,343,30585,343,30602,30606},
+ { 0, 160,25105,343,343,30628,343,18086,30640},
+ { 0, 161,30656,343,343,30659,343,30668,30672},
+ { 0, 162,20844,343,343,30687,343,30694,30698},
+ { 0, 163,468,343,343,30711,343,26780,26784},
+ { 0, 164,30737,343,343,30740,343,27651,27655},
+ { 0, 165,25746,343,343,30749,343,26758,26762},
+ { 0, 166,23201,343,343,30761,343,26780,26784},
+ { 0, 167,30770,343,343,30773,343,26758,26762},
+ { 0, 168,25422,343,343,30779,343,30788,30792},
+ { 0, 169,25474,343,343,30809,343,30815,30819},
+ { 0, 170,30831,343,343,30834,343,26780,26784},
+ { 0, 171,20941,343,343,30843,343,30851,30855},
+ { 0, 172,20997,343,343,30868,343,30875,30879},
+ { 0, 173,30905,343,343,30908,343,30915,30919},
+ { 0, 174,10998,343,343,30933,343,30946,30950},
+ { 0, 175,30962,343,343,30965,343,30981,30985},
+ { 0, 176,31008,343,343,31011,343,31022,31026},
+ { 0, 177,31043,343,343,31046,343,31052,31056},
+ { 0, 178,21198,343,343,31071,343,31078,31082},
+ { 0, 179,23669,343,343,31096,343,31106,31110},
+ { 0, 180,31127,343,343,31130,343,31143,31147},
+ { 0, 181,21561,343,343,31166,343,17860,31175},
+ { 0, 182,31190,343,343,31193,343,27314,27318},
+ { 0, 183,21106,343,343,31216,343,31225,31229},
+ { 0, 184,31243,343,343,31246,343,31259,31263},
+ { 0, 185,31282,343,343,31285,343,26780,26784},
+ { 0, 186,31296,343,343,31299,343,27043,27047},
+ { 0, 187,31307,343,343,31310,343,31318,31322},
+ { 0, 188,31338,343,343,31341,343,31350,31354},
+ { 0, 189,31371,343,343,31374,343,31396,31400},
+ { 0, 190,25582,343,343,31428,343,18130,31440},
+ { 0, 191,24713,343,343,31458,343,31464,31468},
+ { 0, 192,31481,343,343,31484,343,31494,31498},
+ { 0, 193,31518,343,343,31521,343,26758,26762},
+ { 0, 194,31546,343,343,31549,343,27561,27565},
+ { 0, 195,31554,343,343,31557,343,26780,26784},
+ { 0, 196,31585,343,343,31588,343,27043,27047},
+ { 0, 197,21263,343,343,31593,343,31602,31606},
+ { 0, 198,31616,343,343,31619,343,31630,31634},
+ { 0, 199,31652,343,343,31655,343,27651,27655},
+ { 0, 200,17846,343,343,31663,343,26758,26762},
+ { 0, 201,31675,343,343,31678,343,31691,31695},
+ { 0, 202,24334,343,343,31714,343,31722,31726},
+ { 0, 203,31741,343,343,31744,343,31750,31754},
+ { 0, 204,21309,343,343,31769,343,31776,31780},
+ { 0, 205,31793,343,343,31796,343,31816,31820},
+ { 0, 206,31847,343,343,31850,343,26799,26803},
+ { 0, 207,20044,343,343,31857,343,31864,31868},
+ { 0, 208,31886,343,343,31889,343,31898,31902},
+ { 0, 209,21437,343,343,31921,343,31929,31933},
+ { 0, 210,31951,343,343,31954,343,31961,31965},
+ { 0, 211,31982,343,343,31985,343,26758,26762},
+ { 0, 212,20282,343,343,32022,343,26758,26762},
+ { 0, 213,25308,343,343,32036,343,32044,32048},
+ { 0, 214,32070,343,343,32073,343,32084,32088},
+ { 0, 215,32103,343,343,32106,343,26780,26784},
+ { 0, 216,32114,343,343,32117,343,26540,26544},
+ { 0, 217,24549,343,343,32150,343,32160,32164},
+ { 0, 218,32183,343,343,32186,343,26758,26762},
+ { 0, 219,1619,343,343,32209,343,26758,26762},
+ { 0, 220,21807,343,343,32229,343,32237,32241},
+ { 0, 221,32257,343,343,32260,343,32268,32272},
+ { 0, 222,32285,343,343,32288,343,30302,30306},
+ { 0, 223,32306,343,343,32309,343,32315,32319},
+ { 0, 224,24605,343,343,32338,343,32344,32348},
+ { 0, 225,32360,343,343,32363,343,26780,26784},
+ { 0, 226,32371,343,343,32374,343,32385,32389},
+ { 0, 227,22072,343,343,32413,343,32426,32430},
+ { 0, 228,32449,343,343,32452,343,32459,32463},
+ { 0, 229,24961,343,343,32478,343,32487,32491}
};
static const RegionInfoNameEntry region_name_entries [] = {
- {24987, 0},
- {26213, 1},
- {26240, 2},
- {26289, 3},
- {20966, 4},
+ {25258, 0},
+ {26490, 1},
+ {26517, 2},
+ {26566, 3},
+ {21154, 4},
{465, 5},
- {26352, 6},
- {26409, 7},
- {24600, 8},
- {26463, 9},
- {23164, 10},
- {23197, 11},
- {26544, 12},
- {26572, 13},
- {26610, 14},
- {26676, 15},
- {26708, 16},
- {22708, 17},
- {26750, 18},
- {19767, 19},
- {25099, 20},
- {26844, 21},
- {26873, 22},
- {26882, 23},
- {26913, 24},
- {25253, 25},
- {20705, 26},
- {26989, 27},
- {27020, 28},
- {27057, 29},
- {21317, 30},
- {27118, 31},
- {23290, 32},
- {27173, 33},
- {27190, 34},
- {27256, 35},
- {27303, 36},
+ {26629, 6},
+ {26686, 7},
+ {24871, 8},
+ {26740, 9},
+ {23435, 10},
+ {23468, 11},
+ {26821, 12},
+ {26849, 13},
+ {26887, 14},
+ {26953, 15},
+ {26985, 16},
+ {22979, 17},
+ {27027, 18},
+ {19955, 19},
+ {25370, 20},
+ {27121, 21},
+ {27150, 22},
+ {27159, 23},
+ {27190, 24},
+ {25524, 25},
+ {20893, 26},
+ {27266, 27},
+ {27297, 28},
+ {27334, 29},
+ {21505, 30},
+ {27395, 31},
+ {23561, 32},
+ {27450, 33},
+ {27467, 34},
+ {27533, 35},
+ {27580, 36},
{11001, 37},
- {27340, 38},
- {27358, 39},
- {24880, 40},
- {27420, 41},
+ {27617, 38},
+ {27635, 39},
+ {25151, 40},
+ {27697, 41},
{11080, 42},
- {24386, 43},
- {23814, 44},
- {27521, 45},
- {27544, 46},
- {27580, 47},
- {27600, 48},
- {19918, 49},
+ {24657, 43},
+ {24085, 44},
+ {27798, 45},
+ {27821, 46},
+ {27857, 47},
+ {27877, 48},
+ {20106, 49},
{4291, 50},
- {27676, 51},
- {19960, 52},
- {27732, 53},
- {24171, 54},
- {23644, 55},
- {24740, 56},
- {21415, 57},
- {23028, 58},
- {27887, 59},
- {27925, 60},
- {19810, 61},
- {27961, 62},
- {20135, 63},
- {28000, 64},
- {28024, 65},
- {28071, 66},
- {21938, 67},
- {20179, 68},
- {28106, 69},
- {22608, 70},
- {28157, 71},
- {28168, 72},
- {28197, 73},
- {28214, 74},
- {28238, 75},
- {28271, 76},
- {28284, 77},
- {28312, 78},
- {28339, 79},
- {28353, 80},
- {20061, 81},
- {23532, 82},
- {28413, 83},
- {28421, 84},
- {23112, 85},
- {28494, 86},
- {25363, 87},
- {20857, 88},
- {20280, 89},
- {21182, 90},
- {23958, 91},
- {20228, 92},
- {21992, 93},
- {28708, 94},
- {22483, 95},
- {21561, 96},
- {20329, 97},
- {20372, 98},
- {28819, 99},
- {24546, 100},
- {20417, 101},
- {22035, 102},
- {28926, 103},
- {28958, 104},
- {28989, 105},
- {29001, 106},
- {29029, 107},
- {29054, 108},
- {20472, 109},
- {24799, 110},
- {29148, 111},
- {29192, 112},
- {29227, 113},
- {24658, 114},
- {29278, 115},
- {29293, 116},
- {29310, 117},
- {29343, 118},
- {21513, 119},
- {23451, 120},
- {21461, 121},
- {23346, 122},
- {23927, 123},
- {29470, 124},
+ {27953, 51},
+ {20148, 52},
+ {28009, 53},
+ {24442, 54},
+ {23915, 55},
+ {25011, 56},
+ {21603, 57},
+ {23299, 58},
+ {28164, 59},
+ {28202, 60},
+ {19998, 61},
+ {28238, 62},
+ {20323, 63},
+ {28277, 64},
+ {28301, 65},
+ {28348, 66},
+ {22209, 67},
+ {20367, 68},
+ {28383, 69},
+ {22879, 70},
+ {28434, 71},
+ {22155, 72},
+ {28471, 73},
+ {28488, 74},
+ {28512, 75},
+ {28545, 76},
+ {28558, 77},
+ {28586, 78},
+ {28613, 79},
+ {28627, 80},
+ {20249, 81},
+ {23803, 82},
+ {28687, 83},
+ {28695, 84},
+ {23383, 85},
+ {28768, 86},
+ {25634, 87},
+ {21045, 88},
+ {20468, 89},
+ {21370, 90},
+ {24229, 91},
+ {20416, 92},
+ {22263, 93},
+ {28982, 94},
+ {22754, 95},
+ {21749, 96},
+ {20517, 97},
+ {20560, 98},
+ {29093, 99},
+ {24817, 100},
+ {20605, 101},
+ {22306, 102},
+ {29200, 103},
+ {29232, 104},
+ {29263, 105},
+ {29275, 106},
+ {29303, 107},
+ {29328, 108},
+ {20660, 109},
+ {25070, 110},
+ {29422, 111},
+ {29466, 112},
+ {29501, 113},
+ {24929, 114},
+ {29552, 115},
+ {29567, 116},
+ {29584, 117},
+ {29617, 118},
+ {21701, 119},
+ {23722, 120},
+ {21649, 121},
+ {23617, 122},
+ {24198, 123},
+ {29744, 124},
{7428, 125},
- {29505, 126},
- {29540, 127},
- {21825, 128},
- {29591, 129},
- {29599, 130},
- {29627, 131},
- {23723, 132},
- {29696, 133},
- {29724, 134},
- {29738, 135},
- {29775, 136},
- {29789, 137},
- {29815, 138},
- {29848, 139},
- {29888, 140},
- {22657, 141},
- {29940, 142},
- {29974, 143},
- {30011, 144},
- {30042, 145},
- {30051, 146},
- {30069, 147},
- {25417, 148},
- {20524, 149},
- {20615, 150},
- {30155, 151},
- {30183, 152},
- {30192, 153},
- {23758, 154},
- {24224, 155},
- {24007, 156},
- {24487, 157},
- {30288, 158},
- {30308, 159},
- {24834, 160},
- {30382, 161},
- {20656, 162},
+ {29779, 126},
+ {29814, 127},
+ {22013, 128},
+ {29865, 129},
+ {29873, 130},
+ {29901, 131},
+ {23994, 132},
+ {29970, 133},
+ {29998, 134},
+ {30012, 135},
+ {30049, 136},
+ {30063, 137},
+ {30089, 138},
+ {30122, 139},
+ {30162, 140},
+ {22928, 141},
+ {30214, 142},
+ {30248, 143},
+ {30285, 144},
+ {30316, 145},
+ {30325, 146},
+ {30343, 147},
+ {25688, 148},
+ {20712, 149},
+ {20803, 150},
+ {30429, 151},
+ {30457, 152},
+ {30466, 153},
+ {24029, 154},
+ {24495, 155},
+ {24278, 156},
+ {24758, 157},
+ {30562, 158},
+ {30582, 159},
+ {25105, 160},
+ {30656, 161},
+ {20844, 162},
{468, 163},
- {30463, 164},
- {25475, 165},
- {22930, 166},
- {30496, 167},
- {25151, 168},
- {25203, 169},
- {30557, 170},
- {20753, 171},
- {20809, 172},
- {30631, 173},
+ {30737, 164},
+ {25746, 165},
+ {23201, 166},
+ {30770, 167},
+ {25422, 168},
+ {25474, 169},
+ {30831, 170},
+ {20941, 171},
+ {20997, 172},
+ {30905, 173},
{10998, 174},
- {30688, 175},
- {30734, 176},
- {30769, 177},
- {21010, 178},
- {23398, 179},
- {30853, 180},
- {21373, 181},
- {30916, 182},
- {20918, 183},
- {30969, 184},
- {31008, 185},
- {31022, 186},
- {31033, 187},
- {31064, 188},
- {31097, 189},
- {25311, 190},
- {24442, 191},
- {31207, 192},
- {31244, 193},
- {31272, 194},
- {31280, 195},
- {31311, 196},
- {21075, 197},
- {31342, 198},
- {31378, 199},
- {17700, 200},
- {31401, 201},
- {24063, 202},
- {31467, 203},
- {21121, 204},
- {31519, 205},
- {31573, 206},
- {19856, 207},
- {31612, 208},
- {21249, 209},
- {31677, 210},
- {31708, 211},
- {20094, 212},
- {25037, 213},
- {31796, 214},
- {31829, 215},
- {31840, 216},
- {24278, 217},
- {31909, 218},
+ {30962, 175},
+ {31008, 176},
+ {31043, 177},
+ {21198, 178},
+ {23669, 179},
+ {31127, 180},
+ {21561, 181},
+ {31190, 182},
+ {21106, 183},
+ {31243, 184},
+ {31282, 185},
+ {31296, 186},
+ {31307, 187},
+ {31338, 188},
+ {31371, 189},
+ {25582, 190},
+ {24713, 191},
+ {31481, 192},
+ {31518, 193},
+ {31546, 194},
+ {31554, 195},
+ {31585, 196},
+ {21263, 197},
+ {31616, 198},
+ {31652, 199},
+ {17846, 200},
+ {31675, 201},
+ {24334, 202},
+ {31741, 203},
+ {21309, 204},
+ {31793, 205},
+ {31847, 206},
+ {20044, 207},
+ {31886, 208},
+ {21437, 209},
+ {31951, 210},
+ {31982, 211},
+ {20282, 212},
+ {25308, 213},
+ {32070, 214},
+ {32103, 215},
+ {32114, 216},
+ {24549, 217},
+ {32183, 218},
{1619, 219},
- {21619, 220},
- {31983, 221},
- {32011, 222},
- {32032, 223},
- {24334, 224},
- {32086, 225},
- {32097, 226},
- {21884, 227},
- {32175, 228},
- {24690, 229}
+ {21807, 220},
+ {32257, 221},
+ {32285, 222},
+ {32306, 223},
+ {24605, 224},
+ {32360, 225},
+ {32371, 226},
+ {22072, 227},
+ {32449, 228},
+ {24961, 229}
};
@@ -2584,6 +2592,11 @@ static const char locale_strings [] = {
"Junie\0"
"Julie\0"
"Augustus\0"
+ "y MMMM d HH:mm:ss z\0"
+ "y MMMM d\0"
+ "y MMMM\0"
+ "\xe1\x83\x93\xe1\x83\x98\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1\0"
+ "\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa6\xe1\x83\x90\xe1\x83\x9b\xe1\x83\x9d\xe1\x83\xa1\0"
"d. MMM yyyy HH:mm:ss z\0"
"m\xc3\xa1nadagur\0"
"t\xc3\xbdsdagur\0"
@@ -2866,6 +2879,8 @@ static const char locale_strings [] = {
"yyyy'eko' MMMM\0"
"yy'-'MM'-'dd\0"
"dd MMMM yyyy hh:mm:ss tt\0"
+ "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd H:mm:ss\0"
+ "yyyy '\xe1\x83\xac\xe1\x83\x9a\xe1\x83\x98\xe1\x83\xa1' dd MM, dddd\0"
"d. MMM yyyy HH.mm.ss\0"
"HH.mm.ss\0"
"yyyy MMMM d h.mm.ss tt\0"
@@ -3215,6 +3230,11 @@ static const char locale_strings [] = {
"Afrikaanse\0"
"AFK\0"
"afr\0"
+ "ka\0"
+ "Georgian\0"
+ "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98\0"
+ "KAT\0"
+ "kat\0"
"fo\0"
"Faroese\0"
"f\xc3\xb8royskt\0"
@@ -3430,6 +3450,10 @@ static const char locale_strings [] = {
"Afrikaans (South Africa)\0"
"Afrikaanse (Suid-Afrika)\0"
"ZA\0"
+ "ka-GE\0"
+ "Georgian (Georgia)\0"
+ "\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\xa3\xe1\x83\x9a\xe1\x83\x98 (\xe1\x83\xa1\xe1\x83\x90\xe1\x83\xa5\xe1\x83\x90\xe1\x83\xa0\xe1\x83\x97\xe1\x83\x95\xe1\x83\x94\xe1\x83\x9a\xe1\x83\x9d)\0"
+ "GE\0"
"fo-FO\0"
"Faroese (Faroe Islands)\0"
"f\xc3\xb8royskt (F\xc3\xb8royar)\0"
@@ -3813,6 +3837,7 @@ static const char locale_strings [] = {
"it-ch\0"
"it-it\0"
"ja-jp\0"
+ "ka-ge\0"
"kn-in\0"
"ko-kr\0"
"kok-in\0"
@@ -4069,7 +4094,6 @@ static const char locale_strings [] = {
"British Pound Sterling\0"
"GD\0"
"Grenada\0"
- "GE\0"
"Georgia\0"
"GEL\0"
"Georgian Lari\0"
diff --git a/mono/metadata/domain.c b/mono/metadata/domain.c
index b221c6d31f3..239d42e7c7c 100644
--- a/mono/metadata/domain.c
+++ b/mono/metadata/domain.c
@@ -1883,6 +1883,13 @@ mono_domain_free (MonoDomain *domain, gboolean force)
appdomains_list [domain->domain_id] = NULL;
mono_appdomains_unlock ();
+ /* must do this early as it accesses fields and types */
+ if (domain->special_static_fields) {
+ mono_alloc_special_static_data_free (domain->special_static_fields);
+ g_hash_table_destroy (domain->special_static_fields);
+ domain->special_static_fields = NULL;
+ }
+
/*
* We must destroy all these hash tables here because they
* contain references to managed objects belonging to the
@@ -1929,12 +1936,6 @@ mono_domain_free (MonoDomain *domain, gboolean force)
domain->null_reference_ex = NULL;
domain->stack_overflow_ex = NULL;
domain->entry_assembly = NULL;
- /* must do this early as it accesses fields and types */
- if (domain->special_static_fields) {
- mono_alloc_special_static_data_free (domain->special_static_fields);
- g_hash_table_destroy (domain->special_static_fields);
- domain->special_static_fields = NULL;
- }
g_free (domain->friendly_name);
domain->friendly_name = NULL;
diff --git a/mono/metadata/generic-sharing.c b/mono/metadata/generic-sharing.c
index e4e49539ee4..250bad56e63 100644
--- a/mono/metadata/generic-sharing.c
+++ b/mono/metadata/generic-sharing.c
@@ -460,6 +460,8 @@ mono_class_get_method_generic (MonoClass *klass, MonoMethod *method)
if (!m) {
mono_class_setup_methods (klass);
+ if (klass->exception_type)
+ return NULL;
for (i = 0; i < klass->method.count; ++i) {
m = klass->methods [i];
if (m == declaring)
@@ -794,12 +796,12 @@ instantiate_other_info (MonoDomain *domain, MonoRuntimeGenericContextOtherInfoTe
case MONO_RGCTX_INFO_METHOD:
return data;
case MONO_RGCTX_INFO_GENERIC_METHOD_CODE:
- return mono_create_ftnptr (mono_domain_get (),
- mono_runtime_create_jump_trampoline (mono_domain_get (), data, TRUE));
+ /*
+ * We can't create a jump trampoline here, as it cannot be patched.
+ */
+ return mono_create_ftnptr (mono_domain_get (), mono_compile_method (data));
case MONO_RGCTX_INFO_REMOTING_INVOKE_WITH_CHECK:
- return mono_create_ftnptr (mono_domain_get (),
- mono_runtime_create_jump_trampoline (mono_domain_get (),
- mono_marshal_get_remoting_invoke_with_check (data), TRUE));
+ return mono_create_ftnptr (mono_domain_get (), mono_compile_method (mono_marshal_get_remoting_invoke_with_check (data)));
case MONO_RGCTX_INFO_CLASS_FIELD:
return data;
case MONO_RGCTX_INFO_METHOD_RGCTX: {
diff --git a/mono/metadata/icall.c b/mono/metadata/icall.c
index 57ee94daefd..c35c871c817 100644
--- a/mono/metadata/icall.c
+++ b/mono/metadata/icall.c
@@ -260,6 +260,11 @@ ves_icall_System_Array_SetValueImpl (MonoArray *this, MonoObject *value, guint32
ea = (gpointer*)((char*)this->vector + (pos * esize));
va = (gpointer*)((char*)value + sizeof (MonoObject));
+ if (mono_class_is_nullable (ec)) {
+ mono_nullable_init ((guint8*)ea, value, ec);
+ return;
+ }
+
if (!value) {
memset (ea, 0, esize);
return;
@@ -1318,19 +1323,27 @@ type_from_name (const char *str, MonoBoolean ignoreCase)
* Dec 10, 2005 - Martin.
*/
- if (dest)
+ if (dest) {
assembly = dest->klass->image->assembly;
- else {
+ type_resolve = TRUE;
+ } else {
g_warning (G_STRLOC);
}
}
- if (assembly)
+ if (assembly) {
+ /* When loading from the current assembly, AppDomain.TypeResolve will not be called yet */
type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);
-
+ }
+
if (!info.assembly.name && !type) /* try mscorlib */
type = mono_reflection_get_type (NULL, &info, ignoreCase, &type_resolve);
+ if (assembly && !type && type_resolve) {
+ type_resolve = FALSE; /* This will invoke TypeResolve if not done in the first 'if' */
+ type = mono_reflection_get_type (assembly->image, &info, ignoreCase, &type_resolve);
+ }
+
mono_reflection_free_type_info (&info);
g_free (temp_str);
@@ -2060,6 +2073,7 @@ ves_icall_get_event_info (MonoReflectionMonoEvent *event, MonoEventInfo *info)
static MonoArray*
ves_icall_Type_GetInterfaces (MonoReflectionType* type)
{
+ MonoError error;
MonoDomain *domain = mono_object_domain (type);
MonoArray *intf;
GPtrArray *ifaces = NULL;
@@ -2081,8 +2095,12 @@ ves_icall_Type_GetInterfaces (MonoReflectionType* type)
slots = mono_bitset_new (class->max_interface_id + 1, 0);
for (parent = class; parent; parent = parent->parent) {
- GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent);
- if (tmp_ifaces) {
+ GPtrArray *tmp_ifaces = mono_class_get_implemented_interfaces (parent, &error);
+ if (!mono_error_ok (&error)) {
+ mono_bitset_free (slots);
+ mono_error_raise_exception (&error);
+ return NULL;
+ } else if (tmp_ifaces) {
for (i = 0; i < tmp_ifaces->len; ++i) {
MonoClass *ic = g_ptr_array_index (tmp_ifaces, i);
@@ -2687,7 +2705,9 @@ ves_icall_MonoMethod_GetGenericMethodDefinition (MonoReflectionMethod *method)
if (imethod->context.class_inst) {
MonoClass *klass = ((MonoMethod *) imethod)->klass;
- result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass));
+ /*Generic methods gets the context of the GTD.*/
+ if (mono_class_get_context (klass))
+ result = mono_class_inflate_generic_method_full (result, klass, mono_class_get_context (klass));
}
return mono_method_get_object (mono_object_domain (method), result, NULL);
@@ -3475,7 +3495,8 @@ handle_parent:
g_assert (method->slot < nslots);
if (method_slots [method->slot >> 5] & (1 << (method->slot & 0x1f)))
continue;
- method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
+ if (!(method->flags & METHOD_ATTRIBUTE_NEW_SLOT))
+ method_slots [method->slot >> 5] |= 1 << (method->slot & 0x1f);
}
if (method->name [0] == '.' && (strcmp (method->name, ".ctor") == 0 || strcmp (method->name, ".cctor") == 0))
@@ -4728,6 +4749,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)
}
mono_class_setup_methods (method->klass);
+ if (method->klass->exception_type)
+ return NULL;
for (i = 0; i < method->klass->method.count; ++i) {
if (method->klass->methods [i] == method) {
offset = i;
@@ -4735,6 +4758,8 @@ mono_method_get_equivalent_method (MonoMethod *method, MonoClass *klass)
}
}
mono_class_setup_methods (klass);
+ if (klass->exception_type)
+ return NULL;
g_assert (offset >= 0 && offset < klass->method.count);
return klass->methods [offset];
}
@@ -4747,8 +4772,11 @@ ves_icall_System_Reflection_MethodBase_GetMethodFromHandleInternalType (MonoMeth
klass = mono_class_from_mono_type (type);
if (mono_class_get_generic_type_definition (method->klass) != mono_class_get_generic_type_definition (klass))
return NULL;
- if (method->klass != klass)
+ if (method->klass != klass) {
method = mono_method_get_equivalent_method (method, klass);
+ if (!method)
+ return NULL;
+ }
} else
klass = method->klass;
return mono_method_get_object (mono_domain_get (), method, klass);
diff --git a/mono/metadata/loader.c b/mono/metadata/loader.c
index 6ed5732b950..f36a2a00eea 100644
--- a/mono/metadata/loader.c
+++ b/mono/metadata/loader.c
@@ -604,6 +604,13 @@ find_method_in_class (MonoClass *klass, const char *name, const char *qname, con
}
mono_class_setup_methods (klass);
+ /*
+ We can't fail lookup of methods otherwise the runtime will fail with MissingMethodException instead of TypeLoadException.
+ See mono/tests/generic-type-load-exception.2.il
+ FIXME we should better report this error to the caller
+ */
+ if (!klass->methods)
+ return NULL;
for (i = 0; i < klass->method.count; ++i) {
MonoMethod *m = klass->methods [i];
MonoMethodSignature *msig;
@@ -772,9 +779,9 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to
return mono_method_signature (method);
if (table == MONO_TABLE_METHODSPEC) {
- g_assert (!(method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) &&
- mono_method_signature (method));
- g_assert (method->is_inflated);
+ /* the verifier (do_invoke_method) will turn the NULL into a verifier error */
+ if ((method->flags & METHOD_ATTRIBUTE_PINVOKE_IMPL) || !method->is_inflated)
+ return NULL;
return mono_method_signature (method);
}
@@ -807,6 +814,14 @@ mono_method_get_signature_full (MonoMethod *method, MonoImage *image, guint32 to
sig = cache_memberref_sig (image, sig_idx, sig);
}
+ if (!mono_verifier_is_sig_compatible (image, method, sig)) {
+ guint32 class = cols [MONO_MEMBERREF_CLASS] & MONO_MEMBERREF_PARENT_MASK;
+ const char *fname = mono_metadata_string_heap (image, cols [MONO_MEMBERREF_NAME]);
+
+ mono_loader_set_error_bad_image (g_strdup_printf ("Incompatible method signature class token 0x%08x field name %s token 0x%08x on image %s", class, fname, token, image->name));
+ return NULL;
+ }
+
if (context) {
MonoMethodSignature *cached;
@@ -836,7 +851,7 @@ mono_method_search_in_array_class (MonoClass *klass, const char *name, MonoMetho
int i;
mono_class_setup_methods (klass);
-
+ g_assert (!klass->exception_type); /*FIXME this should not fail, right?*/
for (i = 0; i < klass->method.count; ++i) {
MonoMethod *method = klass->methods [i];
if (strcmp (method->name, name) == 0 && sig->param_count == method->signature->param_count)
@@ -2294,6 +2309,8 @@ mono_method_get_index (MonoMethod *method) {
return mono_metadata_token_index (method->token);
mono_class_setup_methods (klass);
+ if (klass->exception_type)
+ return 0;
for (i = 0; i < klass->method.count; ++i) {
if (method == klass->methods [i]) {
if (klass->image->uncompressed_metadata)
diff --git a/mono/metadata/locales.c b/mono/metadata/locales.c
index 2ac87eb9980..d76e17de24c 100644
--- a/mono/metadata/locales.c
+++ b/mono/metadata/locales.c
@@ -303,7 +303,10 @@ construct_culture_from_specific_name (MonoCultureInfo *ci, gchar *name)
if (entry->lcid != entry->specific_lcid)
entry = culture_info_entry_from_lcid (entry->specific_lcid);
- return construct_culture (ci, entry);
+ if (entry)
+ return construct_culture (ci, entry);
+ else
+ return FALSE;
}
static const CultureInfoEntry*
diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c
index b9725d6e6ee..ad00697e97d 100644
--- a/mono/metadata/marshal.c
+++ b/mono/metadata/marshal.c
@@ -2460,6 +2460,12 @@ mono_marshal_method_from_wrapper (MonoMethod *wrapper)
return res;
}
+gpointer
+mono_marshal_wrapper_info_from_wrapper (MonoMethod *wrapper)
+{
+ return mono_method_get_wrapper_data (wrapper, 1);
+}
+
MonoMethod *
mono_marshal_get_delegate_begin_invoke (MonoMethod *method)
{
@@ -2607,7 +2613,7 @@ mono_mb_emit_restore_result (MonoMethodBuilder *mb, MonoType *return_type)
mono_mb_emit_byte (mb, mono_type_to_ldind (return_type));
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (return_type))
+ if (!mono_type_generic_inst_is_valuetype (t))
break;
/* fall through */
case MONO_TYPE_VALUETYPE: {
@@ -4308,6 +4314,7 @@ mono_marshal_get_runtime_invoke (MonoMethod *method, gboolean virtual)
continue;
}
+ /*FIXME 'this doesn't handle generic enums. Shouldn't we?*/
type = sig->params [i]->type;
handle_enum:
switch (type) {
@@ -4484,6 +4491,8 @@ handle_enum:
mono_mb_emit_ldloc (mb, 0);
mono_mb_emit_byte (mb, CEE_RET);
+ g_free (tmp_nullable_locals);
+
if (need_direct_wrapper) {
mb->skip_visibility = 1;
res = mono_mb_create_and_cache (cache, method, mb, csig, sig->param_count + 16);
@@ -9506,6 +9515,8 @@ mono_marshal_get_array_address (int rank, int elem_size)
}
}
if (!cached) {
+ ElementAddrWrapperInfo *info;
+
if (elem_addr_cache_next >= elem_addr_cache_size) {
int new_size = elem_addr_cache_size + 4;
ArrayElemAddr *new_array = g_new0 (ArrayElemAddr, new_size);
@@ -9517,6 +9528,12 @@ mono_marshal_get_array_address (int rank, int elem_size)
elem_addr_cache [elem_addr_cache_next].rank = rank;
elem_addr_cache [elem_addr_cache_next].elem_size = elem_size;
elem_addr_cache [elem_addr_cache_next].method = ret;
+
+ info = mono_image_alloc0 (mono_defaults.corlib, sizeof (ElementAddrWrapperInfo));
+ info->rank = rank;
+ info->elem_size = elem_size;
+
+ mono_marshal_method_set_wrapper_data (ret, info);
}
mono_marshal_unlock ();
return ret;
diff --git a/mono/metadata/marshal.h b/mono/metadata/marshal.h
index e637291f56e..fba45763cc1 100644
--- a/mono/metadata/marshal.h
+++ b/mono/metadata/marshal.h
@@ -76,6 +76,10 @@ typedef enum {
MARSHAL_ACTION_MANAGED_CONV_RESULT
} MarshalAction;
+typedef struct {
+ guint32 rank, elem_size;
+} ElementAddrWrapperInfo;
+
G_BEGIN_DECLS
/*type of the function pointer of methods returned by mono_marshal_get_runtime_invoke*/
@@ -165,6 +169,9 @@ mono_type_to_stind (MonoType *type) MONO_INTERNAL;
MonoMethod *
mono_marshal_method_from_wrapper (MonoMethod *wrapper) MONO_INTERNAL;
+gpointer
+mono_marshal_wrapper_info_from_wrapper (MonoMethod *wrapper) MONO_INTERNAL;
+
MonoMethod *
mono_marshal_get_remoting_invoke (MonoMethod *method) MONO_INTERNAL;
diff --git a/mono/metadata/metadata-internals.h b/mono/metadata/metadata-internals.h
index ddefb4246aa..f41c1458030 100644
--- a/mono/metadata/metadata-internals.h
+++ b/mono/metadata/metadata-internals.h
@@ -294,6 +294,7 @@ struct _MonoDynamicAssembly {
guint32 strong_name_size;
guint8 run;
guint8 save;
+ MonoDomain *domain;
};
struct _MonoDynamicImage {
diff --git a/mono/metadata/metadata-verify.c b/mono/metadata/metadata-verify.c
index 42954faa8d6..28dca574648 100644
--- a/mono/metadata/metadata-verify.c
+++ b/mono/metadata/metadata-verify.c
@@ -217,7 +217,7 @@ typedef struct {
typedef struct {
const char *data;
- guint32 size;
+ guint32 size, token;
GSList *errors;
int valid;
MonoImage *image;
@@ -1267,6 +1267,12 @@ parse_generic_inst (VerifyContext *ctx, const char **_ptr, const char *end)
if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, token))
FAIL (ctx, g_strdup_printf ("GenericInst: invalid TypeDefOrRef token %x", token));
+ if (ctx->token) {
+ if (mono_metadata_token_index (ctx->token) == get_coded_index_token (TYPEDEF_OR_REF_DESC, token) &&
+ mono_metadata_token_table (ctx->token) == get_coded_index_table (TYPEDEF_OR_REF_DESC, token))
+ FAIL (ctx, g_strdup_printf ("Type: Recurside generic instance specification (%x). A type signature can't reference itself", ctx->token));
+ }
+
if (!safe_read_cint (count, ptr, end))
FAIL (ctx, g_strdup ("GenericInst: Not enough room for argument count"));
@@ -1319,6 +1325,11 @@ parse_type (VerifyContext *ctx, const char **_ptr, const char *end)
if (!is_valid_coded_index (ctx, TYPEDEF_OR_REF_DESC, token))
FAIL (ctx, g_strdup_printf ("Type: invalid TypeDefOrRef token %x", token));
+ if (ctx->token) {
+ if (mono_metadata_token_index (ctx->token) == get_coded_index_token (TYPEDEF_OR_REF_DESC, token) &&
+ mono_metadata_token_table (ctx->token) == get_coded_index_table (TYPEDEF_OR_REF_DESC, token))
+ FAIL (ctx, g_strdup_printf ("Type: Recurside type specification (%x). A type signature can't reference itself", ctx->token));
+ }
break;
case MONO_TYPE_VAR:
@@ -2901,10 +2912,11 @@ verify_typespec_table_full (VerifyContext *ctx)
for (i = 0; i < table->rows; ++i) {
mono_metadata_decode_row (table, i, data, MONO_TYPESPEC_SIZE);
-
+ ctx->token = (i + 1) | MONO_TOKEN_TYPE_SPEC;
if (!is_valid_typespec_blob (ctx, data [MONO_TYPESPEC_SIGNATURE]))
ADD_ERROR (ctx, g_strdup_printf ("Invalid TypeSpec row %d Signature field %08x", i, data [MONO_TYPESPEC_SIGNATURE]));
}
+ ctx->token = 0;
}
#define INVALID_IMPLMAP_FLAGS_BITS ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 6) | (1 << 8) | (1 << 9) | (1 << 10))
@@ -3642,7 +3654,7 @@ mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSL
}
gboolean
-mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list)
+mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list)
{
VerifyContext ctx;
@@ -3651,6 +3663,7 @@ mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSLis
init_verify_context (&ctx, image, error_list);
ctx.stage = STAGE_TABLES;
+ ctx.token = token;
is_valid_typespec_blob (&ctx, offset);
return cleanup_context (&ctx, error_list);
@@ -3708,6 +3721,33 @@ mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList
return cleanup_context (&ctx, error_list);
}
+gboolean
+mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature)
+{
+ MonoMethodSignature *original_sig;
+ if (!mono_verifier_is_enabled_for_image (image))
+ return TRUE;
+
+ original_sig = mono_method_signature (method);
+ if (original_sig->call_convention == MONO_CALL_VARARG) {
+ if (original_sig->hasthis != signature->hasthis)
+ return FALSE;
+ if (original_sig->call_convention != signature->call_convention)
+ return FALSE;
+ if (original_sig->explicit_this != signature->explicit_this)
+ return FALSE;
+ if (original_sig->call_convention != signature->call_convention)
+ return FALSE;
+ if (original_sig->pinvoke != signature->pinvoke)
+ return FALSE;
+ if (original_sig->sentinelpos != signature->sentinelpos)
+ return FALSE;
+ } else if (!mono_metadata_signature_equal (signature, original_sig)) {
+ return FALSE;
+ }
+
+ return TRUE;
+}
#else
gboolean
@@ -3765,7 +3805,7 @@ mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSL
}
gboolean
-mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list)
+mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list)
{
return TRUE;
}
@@ -3782,5 +3822,11 @@ mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList
return TRUE;
}
+gboolean
+mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature)
+{
+ return TRUE;
+}
+
#endif /* DISABLE_VERIFIER */
diff --git a/mono/metadata/metadata.c b/mono/metadata/metadata.c
index 65fcc3528e9..72ba8f8af85 100644
--- a/mono/metadata/metadata.c
+++ b/mono/metadata/metadata.c
@@ -4699,7 +4699,7 @@ mono_type_create_from_typespec (MonoImage *image, guint32 type_spec)
mono_metadata_decode_row (t, idx-1, cols, MONO_TYPESPEC_SIZE);
ptr = mono_metadata_blob_heap (image, cols [MONO_TYPESPEC_SIGNATURE]);
- if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], NULL)) {
+ if (!mono_verifier_verify_typespec_signature (image, cols [MONO_TYPESPEC_SIGNATURE], type_spec, NULL)) {
mono_loader_unlock ();
return NULL;
}
diff --git a/mono/metadata/monitor.c b/mono/metadata/monitor.c
index 29182194ceb..dc9dfb03b65 100644
--- a/mono/metadata/monitor.c
+++ b/mono/metadata/monitor.c
@@ -237,6 +237,14 @@ mon_new (gsize id)
for (i = 0; i < marray->num_monitors; ++i) {
if (marray->monitors [i].data == NULL) {
new = &marray->monitors [i];
+ if (new->wait_list) {
+ /* Orphaned events left by aborted threads */
+ while (new->wait_list) {
+ LOCK_DEBUG (g_message (G_GNUC_PRETTY_FUNCTION ": (%d): Closing orphaned event %d", GetCurrentThreadId (), new->wait_list->data));
+ CloseHandle (new->wait_list->data);
+ new->wait_list = g_slist_remove (new->wait_list, new->wait_list->data);
+ }
+ }
new->data = monitor_freelist;
monitor_freelist = new;
}
@@ -1339,7 +1347,14 @@ ves_icall_System_Threading_Monitor_Monitor_wait (MonoObject *obj, guint32 ms)
mono_thread_clr_state (thread, ThreadState_WaitSleepJoin);
if (mono_thread_interruption_requested ()) {
- CloseHandle (event);
+ /*
+ * Can't remove the event from wait_list, since the monitor is not locked by
+ * us. So leave it there, mon_new () will delete it when the mon structure
+ * is placed on the free list.
+ * FIXME: The caller expects to hold the lock after the wait returns, but it
+ * doesn't happen in this case:
+ * http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=97268
+ */
return FALSE;
}
diff --git a/mono/metadata/object.c b/mono/metadata/object.c
index 6bde288dce6..b39ec079f1f 100644
--- a/mono/metadata/object.c
+++ b/mono/metadata/object.c
@@ -712,7 +712,7 @@ compute_class_bitmap (MonoClass *class, gsize *bitmap, int size, int offset, int
case MONO_TYPE_CHAR:
break;
default:
- g_assert_not_reached ();
+ g_error ("compute_class_bitmap: Invalid type %x for field %s:%s\n", type->type, mono_type_get_full_name (field->parent), field->name);
break;
}
}
@@ -2028,6 +2028,7 @@ mono_class_create_runtime_vtable (MonoDomain *domain, MonoClass *class, gboolean
static MonoVTable *
mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, MonoRemotingTarget target_type)
{
+ MonoError error;
MonoVTable *vt, *pvt;
int i, j, vtsize, max_interface_id, extra_interface_vtsize = 0;
MonoClass *k;
@@ -2054,7 +2055,8 @@ mono_class_proxy_vtable (MonoDomain *domain, MonoRemoteClass *remote_class, Mono
method_count = mono_class_num_methods (iclass);
- ifaces = mono_class_get_implemented_interfaces (iclass);
+ ifaces = mono_class_get_implemented_interfaces (iclass, &error);
+ g_assert (mono_error_ok (&error)); /*FIXME do proper error handling*/
if (ifaces) {
for (i = 0; i < ifaces->len; ++i) {
MonoClass *ic = g_ptr_array_index (ifaces, i);
@@ -3140,7 +3142,8 @@ mono_get_delegate_invoke (MonoClass *klass)
/* This is called at runtime, so avoid the slower search in metadata */
mono_class_setup_methods (klass);
-
+ if (klass->exception_type)
+ return NULL;
im = mono_class_get_method_from_name (klass, "Invoke", -1);
g_assert (im);
diff --git a/mono/metadata/pedump.c b/mono/metadata/pedump.c
index dda3efe0db6..0f63928c870 100644
--- a/mono/metadata/pedump.c
+++ b/mono/metadata/pedump.c
@@ -37,6 +37,7 @@ gboolean dump_data = TRUE;
gboolean verify_pe = FALSE;
gboolean verify_metadata = FALSE;
gboolean verify_code = FALSE;
+gboolean verify_partial_md = FALSE;
/* unused
static void
@@ -454,10 +455,9 @@ verify_image_file (const char *fname)
mono_image_load_names (image);
- if (!mono_verifier_verify_full_table_data (image, &errors))
+ if (!verify_partial_md && !mono_verifier_verify_full_table_data (image, &errors))
goto invalid_image;
-
/*fake an assembly for class loading to work*/
assembly = g_new0 (MonoAssembly, 1);
assembly->in_gac = FALSE;
@@ -480,7 +480,7 @@ verify_image_file (const char *fname)
}
}
if (count)
- return 1;
+ return 5;
return 0;
invalid_image:
@@ -601,16 +601,18 @@ pedump_assembly_search_hook (MonoAssemblyName *aname, gpointer user_data)
#define VALID_ONLY_FLAG 0x08000000
#define VERIFY_CODE_ONLY MONO_VERIFY_ALL + 1
#define VERIFY_METADATA_ONLY VERIFY_CODE_ONLY + 1
+#define VERIFY_PARTIAL_METADATA VERIFY_CODE_ONLY + 2
int
main (int argc, char *argv [])
{
+ int image_result = 0;
MonoImage *image;
char *file = NULL;
char *flags = NULL;
MiniVerifierMode verifier_mode = MONO_VERIFIER_MODE_VERIFIABLE;
- const char *flag_desc [] = {"error", "warn", "cls", "all", "code", "fail-on-verifiable", "non-strict", "valid-only", "metadata", NULL};
- guint flag_vals [] = {MONO_VERIFY_ERROR, MONO_VERIFY_WARNING, MONO_VERIFY_CLS, MONO_VERIFY_ALL, VERIFY_CODE_ONLY, MONO_VERIFY_FAIL_FAST, MONO_VERIFY_NON_STRICT, VALID_ONLY_FLAG, VERIFY_METADATA_ONLY, 0};
+ const char *flag_desc [] = {"error", "warn", "cls", "all", "code", "fail-on-verifiable", "non-strict", "valid-only", "metadata", "partial-md", NULL};
+ guint flag_vals [] = {MONO_VERIFY_ERROR, MONO_VERIFY_WARNING, MONO_VERIFY_CLS, MONO_VERIFY_ALL, VERIFY_CODE_ONLY, MONO_VERIFY_FAIL_FAST, MONO_VERIFY_NON_STRICT, VALID_ONLY_FLAG, VERIFY_METADATA_ONLY, VERIFY_PARTIAL_METADATA, 0};
int i, verify_flags = MONO_VERIFY_REPORT_ALL_ERRORS, run_new_metadata_verifier = 0;
for (i = 1; i < argc; i++){
@@ -656,6 +658,8 @@ main (int argc, char *argv [])
} else if(flag_vals [i] == VERIFY_METADATA_ONLY) {
verify_metadata = 0;
run_new_metadata_verifier = 1;
+ } else if(flag_vals [i] == VERIFY_PARTIAL_METADATA) {
+ verify_partial_md = 1;
}
if (flag_vals [i] == VALID_ONLY_FLAG)
verifier_mode = MONO_VERIFIER_MODE_VALID;
@@ -686,12 +690,11 @@ main (int argc, char *argv [])
}
if (run_new_metadata_verifier) {
- int res;
mono_verifier_set_mode (MONO_VERIFIER_MODE_VERIFIABLE);
- res = verify_image_file (file);
- if (res || !verify_code)
- return res;
+ image_result = verify_image_file (file);
+ if (image_result == 1 || !verify_code)
+ return image_result;
}
image = mono_image_open (file, NULL);
@@ -706,6 +709,7 @@ main (int argc, char *argv [])
MonoAssembly *assembly;
MonoImage *image;
MonoImageOpenStatus status;
+ int code_result;
mono_verifier_set_mode (verifier_mode);
@@ -723,7 +727,8 @@ main (int argc, char *argv [])
return 4;
}
- return dump_verify_info (assembly->image, verify_flags);
+ code_result = dump_verify_info (assembly->image, verify_flags);
+ return code_result ? code_result : image_result;
} else
mono_image_close (image);
diff --git a/mono/metadata/reflection.c b/mono/metadata/reflection.c
index d83771c7983..6465ffbad9a 100644
--- a/mono/metadata/reflection.c
+++ b/mono/metadata/reflection.c
@@ -5053,6 +5053,7 @@ mono_image_basic_init (MonoReflectionAssemblyBuilder *assemblyb)
assembly->run = assemblyb->access != 2;
assembly->save = assemblyb->access != 1;
+ assembly->domain = domain;
image = create_dynamic_mono_image (assembly, mono_string_to_utf8 (assemblyb->name), g_strdup ("RefEmit_YouForgotToDefineAModule"));
image->initial_image = TRUE;
@@ -6303,9 +6304,28 @@ mono_type_get_object (MonoDomain *domain, MonoType *type)
}
if (klass->reflection_info && !klass->wastypebuilder) {
+ gboolean is_type_done = TRUE;
+ /* Generic parameters have reflection_info set but they are not finished together with their enclosing type.
+ * We must ensure that once a type is finished we don't return a GenericTypeParameterBuilder.
+ * We can't simply close the types as this will interfere with other parts of the generics machinery.
+ */
+ if (klass->byval_arg.type == MONO_TYPE_MVAR || klass->byval_arg.type == MONO_TYPE_VAR) {
+ MonoGenericParam *gparam = klass->byval_arg.data.generic_param;
+
+ if (gparam->owner && gparam->owner->is_method) {
+ MonoMethod *method = gparam->owner->owner.method;
+ if (method && mono_class_get_generic_type_definition (method->klass)->wastypebuilder)
+ is_type_done = FALSE;
+ } else if (gparam->owner && !gparam->owner->is_method) {
+ MonoClass *klass = gparam->owner->owner.klass;
+ if (klass && mono_class_get_generic_type_definition (klass)->wastypebuilder)
+ is_type_done = FALSE;
+ }
+ }
+
/* g_assert_not_reached (); */
/* should this be considered an error condition? */
- if (!type->byref) {
+ if (is_type_done && !type->byref) {
mono_domain_unlock (domain);
mono_loader_unlock ();
return klass->reflection_info;
@@ -7333,11 +7353,12 @@ mono_reflection_get_type (MonoImage* image, MonoTypeNameParse *info, gboolean ig
static MonoType*
mono_reflection_get_type_internal_dynamic (MonoImage *rootimage, MonoAssembly *assembly, MonoTypeNameParse *info, gboolean ignorecase)
{
- MonoReflectionAssemblyBuilder *abuilder = (MonoReflectionAssemblyBuilder*)mono_assembly_get_object (mono_domain_get (), assembly);
+ MonoReflectionAssemblyBuilder *abuilder;
MonoType *type;
int i;
g_assert (assembly->dynamic);
+ abuilder = (MonoReflectionAssemblyBuilder*)mono_assembly_get_object (((MonoDynamicAssembly*)assembly)->domain, assembly);
/* Enumerate all modules */
@@ -10421,6 +10442,14 @@ typebuilder_setup_fields (MonoClass *klass, MonoError *error)
klass->fields = image_g_new0 (image, MonoClassField, klass->field.count);
mono_class_alloc_ext (klass);
klass->ext->field_def_values = image_g_new0 (image, MonoFieldDefaultValue, klass->field.count);
+ /*
+ This is, guess what, a hack.
+ The issue is that the runtime doesn't know how to setup the fields of a typebuider and crash.
+ On the static path no field class is resolved, only types are built. This is the right thing to do
+ but we suck.
+ Setting size_inited is harmless because we're doing the same job as mono_class_setup_fields anyway.
+ */
+ klass->size_inited = 1;
for (i = 0; i < klass->field.count; ++i) {
fb = mono_array_get (tb->fields, gpointer, i);
@@ -11187,13 +11216,14 @@ resolve_object (MonoImage *image, MonoObject *obj, MonoClass **handle_class, Mon
sig->explicit_this = helper->call_conv & 64 ? 1 : 0;
sig->hasthis = helper->call_conv & 32 ? 1 : 0;
- if (helper->call_conv == 0) /* unmanaged */
+ if (helper->unmanaged_call_conv) { /* unmanaged */
sig->call_convention = helper->unmanaged_call_conv - 1;
- else
- if (helper->call_conv & 0x02)
- sig->call_convention = MONO_CALL_VARARG;
- else
+ sig->pinvoke = TRUE;
+ } else if (helper->call_conv & 0x02) {
+ sig->call_convention = MONO_CALL_VARARG;
+ } else {
sig->call_convention = MONO_CALL_DEFAULT;
+ }
sig->param_count = nargs;
/* TODO: Copy type ? */
diff --git a/mono/metadata/security-core-clr.c b/mono/metadata/security-core-clr.c
index f30d5f18433..50e0d84eafa 100644
--- a/mono/metadata/security-core-clr.c
+++ b/mono/metadata/security-core-clr.c
@@ -418,6 +418,8 @@ mono_security_core_clr_can_access_internals (MonoImage *accessing, MonoImage* ac
* Promoting it to platform code would create another issue since (both Mono/Moonlight or MS version of)
* System.Xml.Linq.dll (an SDK, not platform, assembly) needs access to System.Xml.dll internals (either ).
* The solution is to trust, even transparent code, in the plugin directory to access platform code internals */
+ if (!accessed->assembly->basedir || !accessing->assembly->basedir)
+ return FALSE;
return (strcmp (accessed->assembly->basedir, accessing->assembly->basedir) == 0);
}
diff --git a/mono/metadata/socket-io.c b/mono/metadata/socket-io.c
index 550beb92402..b9bb5a7ca28 100644
--- a/mono/metadata/socket-io.c
+++ b/mono/metadata/socket-io.c
@@ -87,6 +87,14 @@
#define LOGDEBUG(...)
/* define LOGDEBUG(...) g_message(__VA_ARGS__) */
+/*
+ * Some older versions of libc provide IPV6 support without defining the AI_ADDRCONFIG
+ * flag for getaddrinfo.
+ */
+#ifndef AI_ADDRCONFIG
+#define AI_ADDRCONFIG 0
+#endif
+
static gint32 convert_family(MonoAddressFamily mono_family)
{
gint32 family=-1;
diff --git a/mono/metadata/verify-internals.h b/mono/metadata/verify-internals.h
index 1fa726bff1a..6019b3184fb 100644
--- a/mono/metadata/verify-internals.h
+++ b/mono/metadata/verify-internals.h
@@ -37,9 +37,10 @@ gboolean mono_verifier_verify_method_header (MonoImage *image, guint32 offset, G
gboolean mono_verifier_verify_method_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
gboolean mono_verifier_verify_memberref_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
gboolean mono_verifier_verify_standalone_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
-gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
+gboolean mono_verifier_verify_typespec_signature (MonoImage *image, guint32 offset, guint32 token, GSList **error_list) MONO_INTERNAL;
gboolean mono_verifier_verify_methodspec_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
gboolean mono_verifier_verify_string_signature (MonoImage *image, guint32 offset, GSList **error_list) MONO_INTERNAL;
+gboolean mono_verifier_is_sig_compatible (MonoImage *image, MonoMethod *method, MonoMethodSignature *signature) MONO_INTERNAL;
G_END_DECLS
diff --git a/mono/metadata/verify.c b/mono/metadata/verify.c
index 495537a7ab3..52bd1508dba 100644
--- a/mono/metadata/verify.c
+++ b/mono/metadata/verify.c
@@ -409,6 +409,8 @@ mono_class_has_default_constructor (MonoClass *klass)
int i;
mono_class_setup_methods (klass);
+ if (klass->exception_type)
+ return FALSE;
for (i = 0; i < klass->method.count; ++i) {
method = klass->methods [i];
@@ -424,11 +426,17 @@ mono_class_has_default_constructor (MonoClass *klass)
static gboolean
mono_class_interface_implements_interface (MonoClass *candidate, MonoClass *iface)
{
+ MonoError error;
int i;
do {
if (candidate == iface)
return TRUE;
- mono_class_setup_interfaces (candidate);
+ mono_class_setup_interfaces (candidate, &error);
+ if (!mono_error_ok (&error)) {
+ mono_error_cleanup (&error);
+ return FALSE;
+ }
+
for (i = 0; i < candidate->interface_count; ++i) {
if (candidate->interfaces [i] == iface || mono_class_interface_implements_interface (candidate->interfaces [i], iface))
return TRUE;
@@ -2497,6 +2505,11 @@ init_stack_with_value_at_exception_boundary (VerifyContext *ctx, ILCodeDesc *cod
return;
}
+ if (!ctx->max_stack) {
+ ADD_VERIFY_ERROR (ctx, g_strdup_printf ("Stack overflow at 0x%04x", ctx->ip_offset));
+ return;
+ }
+
stack_init (ctx, code);
set_stack_value (ctx, code->stack, type, FALSE);
ctx->exception_types = g_slist_prepend (ctx->exception_types, type);
@@ -3111,10 +3124,15 @@ store_local (VerifyContext *ctx, guint32 arg)
if (check_underflow (ctx, 1)) {
value = stack_pop(ctx);
if (!verify_stack_type_compatibility (ctx, ctx->locals [arg], value)) {
- CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Incompatible type [%s], type [%s] was expected in local store at 0x%04x",
- stack_slot_get_name (value),
- mono_type_get_stack_name (ctx->locals [arg]),
- ctx->ip_offset));
+ char *expected = mono_type_full_name (ctx->locals [arg]);
+ char *found = stack_slot_full_name (value);
+ CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Incompatible type '%s' on stack cannot be stored to local %d with type '%s' at 0x%04x",
+ found,
+ arg,
+ expected,
+ ctx->ip_offset));
+ g_free (expected);
+ g_free (found);
}
}
}
@@ -4698,6 +4716,7 @@ do_ckfinite (VerifyContext *ctx)
static void
merge_stacks (VerifyContext *ctx, ILCodeDesc *from, ILCodeDesc *to, gboolean start, gboolean external)
{
+ MonoError error;
int i, j, k;
stack_init (ctx, to);
@@ -4764,7 +4783,12 @@ merge_stacks (VerifyContext *ctx, ILCodeDesc *from, ILCodeDesc *to, gboolean sta
}
}
- mono_class_setup_interfaces (old_class);
+ mono_class_setup_interfaces (old_class, &error);
+ if (!mono_error_ok (&error)) {
+ CODE_NOT_VERIFIABLE (ctx, g_strdup_printf ("Cannot merge stacks due to a TypeLoadException %s at 0x%04x", mono_error_get_message (&error), ctx->ip_offset));
+ mono_error_cleanup (&error);
+ goto end_verify;
+ }
for (j = 0; j < old_class->interface_count; ++j) {
for (k = 0; k < new_class->interface_count; ++k) {
if (mono_metadata_type_equal (&old_class->interfaces [j]->byval_arg, &new_class->interfaces [k]->byval_arg)) {
@@ -6198,7 +6222,7 @@ verify_valuetype_layout_with_target (MonoClass *class, MonoClass *target_class)
field_class = mono_class_get_generic_type_definition (mono_class_from_mono_type (field->type));
- if (field_class == target_class || !verify_valuetype_layout_with_target (field_class, target_class))
+ if (field_class == target_class || class == field_class || !verify_valuetype_layout_with_target (field_class, target_class))
return FALSE;
}
@@ -6225,6 +6249,14 @@ verify_valuetype_layout (MonoClass *class)
gboolean
mono_verifier_verify_class (MonoClass *class)
{
+ /*Neither <Module>, object or ifaces have parent.*/
+ if (!class->parent &&
+ class != mono_defaults.object_class &&
+ !MONO_CLASS_IS_INTERFACE (class) &&
+ (!class->image->dynamic && class->type_token != 0x2000001)) /*<Module> is the first type in the assembly*/
+ return FALSE;
+ if (class->parent && MONO_CLASS_IS_INTERFACE (class->parent))
+ return FALSE;
if (class->generic_container && (class->flags & TYPE_ATTRIBUTE_LAYOUT_MASK) == TYPE_ATTRIBUTE_EXPLICIT_LAYOUT)
return FALSE;
if (!verify_class_for_overlapping_reference_fields (class))
diff --git a/mono/mini/ChangeLog b/mono/mini/ChangeLog
index 308132a7f4c..c17cc9a48bb 100644
--- a/mono/mini/ChangeLog
+++ b/mono/mini/ChangeLog
@@ -1,3 +1,194 @@
+2010-01-21 Zoltan Varga <vargaz@gmail.com>
+
+ * exceptions-amd64.c (mono_arch_notify_pending_exc): Avoid a crash if the
+ thread has not fully started yet.
+
+2010-01-21 Zoltan Varga <vargaz@gmail.com>
+
+ * aot-compiler.c (can_marshal_struct): Allow marshalling enums.
+
+2010-01-20 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-posix.c (SIG_HANDLER_SIGNATURE): Avoid
+ "Thread (nil) may have been prematurely finalized" messages if this is called
+ on a thread not registered with the runtime.
+
+ * mini-exceptions.c (mono_handle_native_sigsegv): Ditto.
+
+2010-01-19 Zoltan Varga <vargaz@gmail.com>
+
+ * jit-icalls.c (mono_array_new_3): New jit icall.
+
+ * aot-compiler.c aot-runtime.c: Add support for ElementAddr wrappers.
+
+ * arrays.cs: Add a test for 3 dimensional arrays.
+
+2010-01-18 Zoltan Varga <vargaz@gmail.com>
+
+ * mini.h (MonoCompile): Add 'disable_out_of_line_bblocks' flag.
+
+ * branch-opts.c (mono_optimize_branches): Honor the new flag.
+
+ * mini.c (mini_method_compile): Set the new flag when running under the
+ debugger.
+
+2010-01-18 Zoltan Varga <vargaz@gmail.com>
+
+ * mini.c (mono_jit_compile_method_inner): Avoid reading cfg->prof_options
+ after cfg has been freed.
+
+2010-01-17 Zoltan Varga <vargaz@gmail.com>
+
+ * branch-opts.c (mono_branch_optimize_exception_target): Stop the optimization
+ if a clause is skipped because it uses the exception object, since it could
+ have caught the exception.
+
+ * exceptions.cs: Add a test.
+
+2010-01-16 Zoltan Varga <vargaz@gmail.com>
+
+ * debugger-agent.c (decode_value): Fix the decoding of I/U/PTR.
+
+2010-01-16 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-amd64.c (emit_call_body): Always use near calls when AOTing even if
+ NOMAP32BIT or optimize_for_xen is set.
+
+
+Wed Jan 13 15:54:53 CET 2010 Paolo Molaro <lupus@ximian.com>
+
+ * jit.h, method-to-ir.c: added ability to set the policy for
+ inserting breakpoints from the break IL instruction or the
+ Debugger.Break () API call.
+
+2010-01-11 Zoltan Varga <vargaz@gmail.com>
+
+ * debugger-agent.c (mono_debugger_agent_parse_options): Allow onthrow without
+ an argument which matches any exception.
+
+2010-01-10 Zoltan Varga <vargaz@gmail.com>
+
+ * method-to-ir.c (mono_emit_method_call_full): Avoid the virt->nonvirt
+ optimization if the called method is gshared and marshalbyref, since gshared
+ methods can' have wrappers. Fixes #569390.
+
+ * generics.cs: Add a test.
+
+2010-01-10 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-exceptions.c (mono_print_thread_dump_from_ctx): New helper function
+ callable from gdb.
+
+2010-01-10 Zoltan Varga <vargaz@gmail.com>
+
+ * mini.c (mono_print_method_from_ip): Fix the lookup of trampolines.
+
+2010-01-09 Zoltan Varga <vargaz@gmail.com>
+
+ * debugger-agent.c (transport_connect): comment out freeaddrinfo calls under win32,
+ since it is not supported in win2000.
+
+2010-01-07 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-llvm-cpp.cpp (mono_llvm_create_ee): Add an ugly hack to fix #564695.
+ If LLVM decides to set the code model to Large, reset it to Default.
+
+2010-01-07 Zoltan Varga <vargaz@gmail.com>
+
+ * aot-compiler.c (mono_xdebug_flush): Export it so it is present in
+ stripped binaries as well.
+
+2010-01-05 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * mini.c (mono_compile_is_broken): Skip methods from serialization's
+ internal assembly.
+
+ Backport of r149053.
+
+2010-01-04 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-trampolines.c (mono_convert_imt_slot_to_vtable_slot): Call
+ mono_method_get_vtable_slot () instead of accessing imt_method->slot directly,
+ to fix an AOT case.
+
+2009-01-04 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * mini.c (mini_method_compile): Verify the method before calling
+ mono_compile_create_vars as this might crash since it uses method
+ information.
+
+ Fixes #560196.
+
+ Backport of r149045.
+
+2009-12-30 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * mini.c:
+ * method-to.ir.c:
+ * mini-*.c: Properly handle generic enums.
+
+ Fixes #566294
+
+ Backport of r148941.
+
+2009-12-28 Zoltan Varga <vargaz@gmail.com>
+
+ * method-to-ir.c (mono_method_to_ir): Handle the failure of mono_class_vtable ()
+ in a few more places.
+
+2009-12-27 Zoltan Varga <vargaz@gmail.com>
+
+ * aot-compiler.c (add_wrappers): Don't use dyn runtime invoke for methods with
+ nullable parameters. Fixes #567351.
+
+2009-12-26 Rodrigo Kumpera <rkumpera@novell.com>
+
+ * mini-trampolines.c (common_call_trampoline): Add assert for NULL resolved generic method.
+
+ Backport of r148905.
+
+2009-12-24 Sebastien Pouliot <sebastien@ximian.com>
+
+ * method-to-ir.c (mono_method_to_ir): Avoid SIGSEGV when
+ mono_method_get_signature returns NULL. Fix #567084
+ [Backport r148889]
+
+2009-12-23 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-trampolines.c (mono_create_llvm_imt_trampoline): Fix the LLVM build on
+ platforms without mono_arch_get_llvm_imt_trampoline ().
+
+2009-12-22 Zoltan Varga <vargaz@gmail.com>
+
+ * aot-runtime.c (decode_klass_ref): Avoid a crash if a decode_klass_ref () call
+ fails. Fixes #566689.
+
+2009-12-21 Zoltan Varga <vargaz@gmail.com>
+
+ * Makefile.am (AM_CFLAGS): Include LLVM_CFLAGS.
+
+ * mini-llvm.c: Avoid defining the __STDC_... macros if already defined.
+
+2009-12-18 Zoltan Varga <vargaz@gmail.com>
+
+ * mini-x86.c (mono_arch_get_argument_info): Allocate memory for CallInfo using
+ alloca as g_malloc is not signal safe.
+
+2009-12-17 Marek Habersack <mhabersack@novell.com>
+
+ * mini.c (mono_get_runtime_build_info): include Mono version in
+ the returned value.
+
+ * driver.c (mono_main): VERSION is now included in the string
+ returned from mono_get_runtime_build_info()
+
+2009-12-17 Zoltan Varga <vargaz@gmail.com>
+
+ * method-to-ir.c (mono_method_to_ir): Add support for CALLI with unmanaged
+ signatures. Fixes #565143.
+
+ * jit-icalls.c (mono_get_native_calli_wrapper): New JIT icall.
+
2009-12-16 Rodrigo Kumpera <rkumpera@novell.com>
* mini-x86.h: Forgot to add a 0x to MONO_ARCH_MAX_FRAME_SIZE define
diff --git a/mono/mini/Makefile.am b/mono/mini/Makefile.am
index 714d155e0df..075c99d7d60 100644
--- a/mono/mini/Makefile.am
+++ b/mono/mini/Makefile.am
@@ -37,6 +37,7 @@ AM_CFLAGS = \
-I$(top_srcdir) \
$(LIBGC_CFLAGS) \
$(GLIB_CFLAGS) \
+ $(LLVM_CFLAGS) \
$(PLATFORM_CFLAGS) $(ARCH_CFLAGS)
AM_CXXFLAGS = $(LLVM_CXXFLAGS) $(GLIB_CFLAGS)
diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c
index 45f33a6f76b..4b245370d8f 100644
--- a/mono/mini/aot-compiler.c
+++ b/mono/mini/aot-compiler.c
@@ -1442,6 +1442,18 @@ encode_method_ref (MonoAotCompile *acfg, MonoMethod *method, guint8 *buf, guint8
encode_method_ref (acfg, m, p, &p);
break;
}
+ case MONO_WRAPPER_MANAGED_TO_MANAGED:
+ if (!strcmp (method->name, "ElementAddr")) {
+ ElementAddrWrapperInfo *info = mono_marshal_wrapper_info_from_wrapper (method);
+
+ g_assert (info);
+ encode_value (MONO_AOT_WRAPPER_ELEMENT_ADDR, p, &p);
+ encode_value (info->rank, p, &p);
+ encode_value (info->elem_size, p, &p);
+ } else {
+ g_assert_not_reached ();
+ }
+ break;
default:
g_assert_not_reached ();
}
@@ -1755,7 +1767,7 @@ can_marshal_struct (MonoClass *klass)
case MONO_TYPE_STRING:
break;
case MONO_TYPE_VALUETYPE:
- if (!can_marshal_struct (mono_class_from_mono_type (field->type)))
+ if (!mono_class_from_mono_type (field->type)->enumtype && can_marshal_struct (mono_class_from_mono_type (field->type)))
can_marshal = FALSE;
break;
default:
@@ -1820,8 +1832,14 @@ add_wrappers (MonoAotCompile *acfg)
#ifdef MONO_ARCH_DYN_CALL_SUPPORTED
if (!method->klass->contextbound) {
MonoDynCallInfo *info = mono_arch_dyn_call_prepare (sig);
+ gboolean has_nullable = FALSE;
+
+ for (j = 0; j < sig->param_count; j++) {
+ if (sig->params [j]->type == MONO_TYPE_GENERICINST && mono_class_is_nullable (mono_class_from_mono_type (sig->params [j])))
+ has_nullable = TRUE;
+ }
- if (info) {
+ if (info && !has_nullable) {
/* Supported by the dynamic runtime-invoke wrapper */
skip = TRUE;
g_free (info);
@@ -3553,6 +3571,11 @@ can_encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info)
case MONO_WRAPPER_REMOTING_INVOKE:
case MONO_WRAPPER_UNKNOWN:
break;
+ case MONO_WRAPPER_MANAGED_TO_MANAGED:
+ if (!strcmp (method->name, "ElementAddr"))
+ return TRUE;
+ else
+ return FALSE;
default:
//printf ("Skip (wrapper call): %d -> %s\n", patch_info->type, mono_method_full_name (patch_info->data.method, TRUE));
return FALSE;
@@ -3756,6 +3779,8 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method)
}
add_generic_class (acfg, m->klass);
}
+ if (m->wrapper_type == MONO_WRAPPER_MANAGED_TO_MANAGED && !strcmp (m->name, "ElementAddr"))
+ add_extra_method_with_depth (acfg, m, depth + 1);
break;
}
case MONO_PATCH_INFO_VTABLE: {
@@ -5817,7 +5842,7 @@ xdebug_end_emit (MonoImageWriter *w, MonoDwarfWriter *dw, MonoMethod *method)
* This could be called from inside gdb to flush the debugging information not yet
* registered with gdb.
*/
-static void
+void
mono_xdebug_flush (void)
{
if (xdebug_w)
diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c
index 8c09add30f3..9a7a5a6ff32 100644
--- a/mono/mini/aot-runtime.c
+++ b/mono/mini/aot-runtime.c
@@ -314,6 +314,8 @@ decode_klass_ref (MonoAotModule *module, guint8 *buf, guint8 **endbuf)
MonoType *type;
gclass = decode_klass_ref (module, p, &p);
+ if (!gclass)
+ return NULL;
g_assert (gclass->generic_container);
memset (&ctx, 0, sizeof (ctx));
@@ -563,6 +565,19 @@ decode_method_ref (MonoAotModule *module, guint32 *token, MonoMethod **method, g
*method = mono_marshal_get_runtime_invoke (m, FALSE);
break;
}
+ case MONO_WRAPPER_MANAGED_TO_MANAGED: {
+ int subtype = decode_value (p, &p);
+
+ if (subtype == MONO_AOT_WRAPPER_ELEMENT_ADDR) {
+ int rank = decode_value (p, &p);
+ int elem_size = decode_value (p, &p);
+
+ *method = mono_marshal_get_array_address (rank, elem_size);
+ } else {
+ g_assert_not_reached ();
+ }
+ break;
+ }
default:
g_assert_not_reached ();
}
diff --git a/mono/mini/arrays.cs b/mono/mini/arrays.cs
index 0bd8bb300fa..464dfa565cc 100644
--- a/mono/mini/arrays.cs
+++ b/mono/mini/arrays.cs
@@ -437,6 +437,13 @@ class Tests {
return 0;
}
+ public static int test_100_3_dimensional_arrays () {
+ int[,,] test = new int[10, 10, 10];
+
+ test [1, 1, 1] = 100;
+ return test [1, 1, 1];
+ }
+
public static int test_0_bug_71454 () {
int[,] a = new int[4,4];
int[,] b = new int[4,4];
diff --git a/mono/mini/branch-opts.c b/mono/mini/branch-opts.c
index bfd3b15483c..b5245c59b02 100644
--- a/mono/mini/branch-opts.c
+++ b/mono/mini/branch-opts.c
@@ -95,6 +95,9 @@ mono_branch_optimize_exception_target (MonoCompile *cfg, MonoBasicBlock *bb, con
}
return NULL;
+ } else {
+ /* Branching to an outer clause could skip inner clauses */
+ return NULL;
}
} else {
/* Branching to an outer clause could skip inner clauses */
@@ -1420,7 +1423,7 @@ mono_optimize_branches (MonoCompile *cfg)
}
if (bb->last_ins && MONO_IS_COND_BRANCH_NOFP (bb->last_ins)) {
- if (bb->last_ins->inst_false_bb && bb->last_ins->inst_false_bb->out_of_line && (bb->region == bb->last_ins->inst_false_bb->region)) {
+ if (bb->last_ins->inst_false_bb && bb->last_ins->inst_false_bb->out_of_line && (bb->region == bb->last_ins->inst_false_bb->region) && !cfg->disable_out_of_line_bblocks) {
/* Reverse the branch */
bb->last_ins->opcode = mono_reverse_branch_op (bb->last_ins->opcode);
bbn = bb->last_ins->inst_false_bb;
diff --git a/mono/mini/debugger-agent.c b/mono/mini/debugger-agent.c
index 534c5e06f97..26be3d2a505 100644
--- a/mono/mini/debugger-agent.c
+++ b/mono/mini/debugger-agent.c
@@ -666,6 +666,8 @@ mono_debugger_agent_parse_options (char *options)
} else if (strncmp (arg, "onthrow=", 8) == 0) {
/* We support multiple onthrow= options */
agent_config.onthrow = g_slist_append (agent_config.onthrow, g_strdup (arg + 8));
+ } else if (strncmp (arg, "onthrow", 7) == 0) {
+ agent_config.onthrow = g_slist_append (agent_config.onthrow, g_strdup (""));
} else if (strncmp (arg, "help", 4) == 0) {
print_usage ();
exit (0);
@@ -673,8 +675,8 @@ mono_debugger_agent_parse_options (char *options)
agent_config.timeout = atoi (arg + 8);
} else if (strncmp (arg, "launch=", 7) == 0) {
agent_config.launch = g_strdup (arg + 7);
- } else if (strncmp (arg, "embedding=", 9) == 0) {
- agent_config.embedding = atoi (arg + 9) == 1;
+ } else if (strncmp (arg, "embedding=", 10) == 0) {
+ agent_config.embedding = atoi (arg + 10) == 1;
} else {
print_usage ();
exit (1);
@@ -959,7 +961,15 @@ transport_connect (const char *host, int port)
break;
}
+#ifndef PLATFORM_WIN32
+ /*
+ * this function is not present on win2000 which we still support, and the
+ * workaround described here:
+ * http://msdn.microsoft.com/en-us/library/ms737931(VS.85).aspx
+ * only works with MSVC.
+ */
freeaddrinfo (result);
+#endif
}
DEBUG (1, fprintf (log_file, "Listening on %s:%d (timeout=%d ms)...\n", host, port, agent_config.timeout));
@@ -1003,7 +1013,10 @@ transport_connect (const char *host, int port)
conn_fd = sfd;
+#ifndef PLATFORM_WIN32
+ /* See the comment above */
freeaddrinfo (result);
+#endif
if (rp == 0) {
fprintf (stderr, "debugger-agent: Unable to connect to %s:%d\n", host, port);
@@ -3637,7 +3650,7 @@ mono_debugger_agent_handle_exception (MonoException *exc, MonoContext *ctx)
char *ex_type = l->data;
char *f = mono_type_full_name (&exc->object.vtable->klass->byval_arg);
- if (!strcmp (ex_type, f))
+ if (!strcmp (ex_type, "") || !strcmp (ex_type, f))
found = TRUE;
g_free (f);
@@ -3846,8 +3859,11 @@ decode_value (MonoType *t, MonoDomain *domain, guint8 *addr, guint8 *buf, guint8
int err;
int type = decode_byte (buf, &buf, limit);
- if (type != t->type && !MONO_TYPE_IS_REFERENCE (t)) {
- DEBUG(1, fprintf (log_file, "Expected value of type %d, got %d.\n", t->type, type));
+ if (type != t->type && !MONO_TYPE_IS_REFERENCE (t) &&
+ !(t->type == MONO_TYPE_I && type == MONO_TYPE_VALUETYPE) &&
+ !(t->type == MONO_TYPE_U && type == MONO_TYPE_VALUETYPE) &&
+ !(t->type == MONO_TYPE_PTR && type == MONO_TYPE_I8)) {
+ DEBUG(1, fprintf (log_file, "[%p] Expected value of type 0x%0x, got 0x%0x.\n", (gpointer)GetCurrentThreadId (), t->type, type));
return ERR_INVALID_ARGUMENT;
}
@@ -3888,6 +3904,16 @@ decode_value (MonoType *t, MonoDomain *domain, guint8 *addr, guint8 *buf, guint8
case MONO_TYPE_R8:
*(guint64*)addr = decode_long (buf, &buf, limit);
break;
+ case MONO_TYPE_PTR:
+ /* We send these as I8, so we get them back as such */
+ g_assert (type == MONO_TYPE_I8);
+ *(gssize*)addr = decode_long (buf, &buf, limit);
+ break;
+ case MONO_TYPE_I:
+ case MONO_TYPE_U:
+ /* We send these as vtypes, so we get them back as such */
+ g_assert (type == MONO_TYPE_VALUETYPE);
+ /* Fall through */
case MONO_TYPE_VALUETYPE: {
gboolean is_enum = decode_byte (buf, &buf, limit);
MonoClass *klass;
diff --git a/mono/mini/driver.c b/mono/mini/driver.c
index d80d65f8dd8..e9068d9278e 100644
--- a/mono/mini/driver.c
+++ b/mono/mini/driver.c
@@ -1333,7 +1333,7 @@ mono_main (int argc, char* argv[])
mini_verbose++;
} else if (strcmp (argv [i], "--version") == 0 || strcmp (argv [i], "-V") == 0) {
char *build = mono_get_runtime_build_info ();
- g_print ("Mono JIT compiler version %s (%s)\nCopyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com\n", VERSION, build);
+ g_print ("Mono JIT compiler version %s\nCopyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com\n", build);
g_free (build);
g_print (info);
if (mini_verbose) {
diff --git a/mono/mini/exceptions-amd64.c b/mono/mini/exceptions-amd64.c
index 30d3244bdc4..983e7d27353 100644
--- a/mono/mini/exceptions-amd64.c
+++ b/mono/mini/exceptions-amd64.c
@@ -1039,6 +1039,10 @@ mono_arch_notify_pending_exc (void)
{
MonoLMF *lmf = mono_get_lmf ();
+ if (!lmf)
+ /* Not yet started */
+ return;
+
if (lmf->rsp == 0)
/* Initial LMF */
return;
diff --git a/mono/mini/exceptions.cs b/mono/mini/exceptions.cs
index 22cffb1711a..cf7dc613c04 100644
--- a/mono/mini/exceptions.cs
+++ b/mono/mini/exceptions.cs
@@ -2551,5 +2551,22 @@ class Tests {
}
return 0;
}
+
+ public static int test_0_except_opt_two_clauses () {
+ int size;
+ size = -1;
+ uint ui = (uint)size;
+ try {
+ checked {
+ uint v = ui * (uint)4;
+ }
+ } catch (OverflowException e) {
+ return 0;
+ } catch (Exception) {
+ return 1;
+ }
+
+ return 2;
+ }
}
diff --git a/mono/mini/generics.cs b/mono/mini/generics.cs
index 762eac2ec58..98109586a54 100644
--- a/mono/mini/generics.cs
+++ b/mono/mini/generics.cs
@@ -528,6 +528,28 @@ class Tests {
return cctor_count;
}
+ public static int test_0_marshalbyref_call_from_gshared_virt_elim () {
+ /* Calling a virtual method from gshared code which is changed to a nonvirt call */
+ Class1<object> o = new Class1<object> ();
+ o.Do (new Class2<object> ());
+ return 0;
+ }
+
+ public class Class1<T> {
+ public virtual void Do (Class2<T> t) {
+ t.Foo ();
+ }
+ }
+
+ public interface IFace1<T> {
+ void Foo ();
+ }
+
+ public class Class2<T> : MarshalByRefObject, IFace1<T> {
+ public void Foo () {
+ }
+ }
+
public static void VirtualInterfaceCallFromGenericMethod <T> (IFoo f) {
f.Bar <T> ();
}
diff --git a/mono/mini/jit-icalls.c b/mono/mini/jit-icalls.c
index 6accfcbe0fd..54c8010d0b6 100644
--- a/mono/mini/jit-icalls.c
+++ b/mono/mini/jit-icalls.c
@@ -731,6 +731,36 @@ mono_array_new_2 (MonoMethod *cm, guint32 length1, guint32 length2)
return mono_array_new_full (domain, cm->klass, lengths, lower_bounds);
}
+MonoArray *
+mono_array_new_3 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 length3)
+{
+ MonoDomain *domain = mono_domain_get ();
+ guint32 lengths [3];
+ guint32 *lower_bounds;
+ int pcount;
+ int rank;
+
+ MONO_ARCH_SAVE_REGS;
+
+ pcount = mono_method_signature (cm)->param_count;
+ rank = cm->klass->rank;
+
+ lengths [0] = length1;
+ lengths [1] = length2;
+ lengths [2] = length3;
+
+ g_assert (rank == pcount);
+
+ if (cm->klass->byval_arg.type == MONO_TYPE_ARRAY) {
+ lower_bounds = alloca (sizeof (guint32) * rank);
+ memset (lower_bounds, 0, sizeof (guint32) * rank);
+ } else {
+ lower_bounds = NULL;
+ }
+
+ return mono_array_new_full (domain, cm->klass, lengths, lower_bounds);
+}
+
gpointer
mono_class_static_field_address (MonoDomain *domain, MonoClassField *field)
{
@@ -990,3 +1020,18 @@ mono_object_castclass (MonoObject *obj, MonoClass *klass)
return NULL;
}
+
+gpointer
+mono_get_native_calli_wrapper (MonoImage *image, MonoMethodSignature *sig, gpointer func)
+{
+ MonoMarshalSpec **mspecs;
+ MonoMethodPInvoke piinfo;
+ MonoMethod *m;
+
+ mspecs = g_new0 (MonoMarshalSpec*, sig->param_count + 1);
+ memset (&piinfo, 0, sizeof (piinfo));
+
+ m = mono_marshal_get_native_func_wrapper (image, sig, &piinfo, mspecs, func);
+
+ return mono_compile_method (m);
+}
diff --git a/mono/mini/jit-icalls.h b/mono/mini/jit-icalls.h
index 05585345b52..194a5d91c89 100644
--- a/mono/mini/jit-icalls.h
+++ b/mono/mini/jit-icalls.h
@@ -55,6 +55,8 @@ MonoArray *mono_array_new_1 (MonoMethod *cm, guint32 length) MONO_INTERNAL;
MonoArray *mono_array_new_2 (MonoMethod *cm, guint32 length1, guint32 length2) MONO_INTERNAL;
+MonoArray *mono_array_new_3 (MonoMethod *cm, guint32 length1, guint32 length2, guint32 length3) MONO_INTERNAL;
+
gpointer mono_class_static_field_address (MonoDomain *domain, MonoClassField *field) MONO_INTERNAL;
gpointer mono_ldtoken_wrapper (MonoImage *image, int token, MonoGenericContext *context) MONO_INTERNAL;
@@ -159,5 +161,7 @@ MonoException *mono_create_corlib_exception_2 (guint32 token, MonoString *arg1,
MonoObject* mono_object_castclass (MonoObject *obj, MonoClass *klass) MONO_INTERNAL;
+gpointer mono_get_native_calli_wrapper (MonoImage *image, MonoMethodSignature *sig, gpointer func) MONO_INTERNAL;
+
#endif /* __MONO_JIT_ICALLS_H__ */
diff --git a/mono/mini/jit.h b/mono/mini/jit.h
index f78dd119de8..f5440ad895c 100644
--- a/mono/mini/jit.h
+++ b/mono/mini/jit.h
@@ -33,6 +33,25 @@ mono_set_signal_chaining (gboolean chain_signals);
void
mono_jit_set_aot_only (gboolean aot_only);
+/* Allow embedders to decide wherther to actually obey breakpoint instructions
+ * in specific methods (works for both break IL instructions and Debugger.Break ()
+ * method calls).
+ */
+typedef enum {
+ /* the default is to always obey the breakpoint */
+ MONO_BREAK_POLICY_ALWAYS,
+ /* a nop is inserted instead of a breakpoint */
+ MONO_BREAK_POLICY_NEVER,
+ /* the breakpoint is executed only if the program has ben started under
+ * the debugger (that is if a debugger was attached at the time the method
+ * was compiled).
+ */
+ MONO_BREAK_POLICY_ON_DBG
+} MonoBreakPolicy;
+
+typedef MonoBreakPolicy (*MonoBreakPolicyFunc) (MonoMethod *method);
+void mono_set_break_policy (MonoBreakPolicyFunc policy_callback);
+
void
mono_jit_parse_options (int argc, char * argv[]);
diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c
index d1d94047e46..675f13aff5f 100644
--- a/mono/mini/method-to-ir.c
+++ b/mono/mini/method-to-ir.c
@@ -57,6 +57,7 @@
#include "ir-emit.h"
#include "jit-icalls.h"
+#include "jit.h"
#include "debugger-agent.h"
#define BRANCH_COST 100
@@ -1097,7 +1098,8 @@ type_from_stack_type (MonoInst *ins) {
static G_GNUC_UNUSED int
type_to_stack_type (MonoType *t)
{
- switch (mono_type_get_underlying_type (t)->type) {
+ t = mono_type_get_underlying_type (t);
+ switch (t->type) {
case MONO_TYPE_I1:
case MONO_TYPE_U1:
case MONO_TYPE_BOOLEAN:
@@ -2304,12 +2306,17 @@ mono_emit_method_call_full (MonoCompile *cfg, MonoMethod *method, MonoMethodSign
if ((!cfg->compile_aot || enable_for_aot) &&
(!(method->flags & METHOD_ATTRIBUTE_VIRTUAL) ||
(MONO_METHOD_IS_FINAL (method) &&
- method->wrapper_type != MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK))) {
+ method->wrapper_type != MONO_WRAPPER_REMOTING_INVOKE_WITH_CHECK)) &&
+ !(method->klass->marshalbyref && context_used)) {
/*
* the method is not virtual, we just need to ensure this is not null
* and then we can call the method directly.
*/
if (method->klass->marshalbyref || method->klass == mono_defaults.object_class) {
+ /*
+ * The check above ensures method is not gshared, this is needed since
+ * gshared methods can't have wrappers.
+ */
method = call->method = mono_marshal_get_remoting_invoke_with_check (method);
}
@@ -3766,6 +3773,53 @@ mini_emit_ldelema_ins (MonoCompile *cfg, MonoMethod *cmethod, MonoInst **sp, uns
return addr;
}
+static MonoBreakPolicy
+always_insert_breakpoint (MonoMethod *method)
+{
+ return MONO_BREAK_POLICY_ALWAYS;
+}
+
+static MonoBreakPolicyFunc break_policy_func = always_insert_breakpoint;
+
+/**
+ * mono_set_break_policy:
+ * policy_callback: the new callback function
+ *
+ * Allow embedders to decide wherther to actually obey breakpoint instructions
+ * (both break IL instructions and Debugger.Break () method calls), for example
+ * to not allow an app to be aborted by a perfectly valid IL opcode when executing
+ * untrusted or semi-trusted code.
+ *
+ * @policy_callback will be called every time a break point instruction needs to
+ * be inserted with the method argument being the method that calls Debugger.Break()
+ * or has the IL break instruction. The callback should return #MONO_BREAK_POLICY_NEVER
+ * if it wants the breakpoint to not be effective in the given method.
+ * #MONO_BREAK_POLICY_ALWAYS is the default.
+ */
+void
+mono_set_break_policy (MonoBreakPolicyFunc policy_callback)
+{
+ if (policy_callback)
+ break_policy_func = policy_callback;
+ else
+ break_policy_func = always_insert_breakpoint;
+}
+
+static gboolean
+should_insert_brekpoint (MonoMethod *method) {
+ switch (break_policy_func (method)) {
+ case MONO_BREAK_POLICY_ALWAYS:
+ return TRUE;
+ case MONO_BREAK_POLICY_NEVER:
+ return FALSE;
+ case MONO_BREAK_POLICY_ON_DBG:
+ return mono_debug_using_mono_debugger ();
+ default:
+ g_warning ("Incorrect value returned from break policy callback");
+ return FALSE;
+ }
+}
+
static MonoInst*
mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSignature *fsig, MonoInst **args)
{
@@ -4124,7 +4178,10 @@ mini_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMethodSign
} else if (cmethod->klass->image == mono_defaults.corlib) {
if (cmethod->name [0] == 'B' && strcmp (cmethod->name, "Break") == 0
&& strcmp (cmethod->klass->name, "Debugger") == 0) {
- MONO_INST_NEW (cfg, ins, OP_BREAK);
+ if (should_insert_brekpoint (cfg->method))
+ MONO_INST_NEW (cfg, ins, OP_BREAK);
+ else
+ MONO_INST_NEW (cfg, ins, OP_NOP);
MONO_ADD_INS (cfg->cbb, ins);
return ins;
}
@@ -5836,7 +5893,10 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
MONO_ADD_INS (bblock, ins);
break;
case CEE_BREAK:
- MONO_INST_NEW (cfg, ins, OP_BREAK);
+ if (should_insert_brekpoint (cfg->method))
+ MONO_INST_NEW (cfg, ins, OP_BREAK);
+ else
+ MONO_INST_NEW (cfg, ins, OP_NOP);
ip++;
MONO_ADD_INS (bblock, ins);
break;
@@ -6189,6 +6249,21 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
fsig = mono_metadata_parse_signature (image, token);
n = fsig->param_count + fsig->hasthis;
+
+ if (method->dynamic && fsig->pinvoke) {
+ MonoInst *args [3];
+
+ /*
+ * This is a call through a function pointer using a pinvoke
+ * signature. Have to create a wrapper and call that instead.
+ * FIXME: This is very slow, need to create a wrapper at JIT time
+ * instead based on the signature.
+ */
+ EMIT_NEW_IMAGECONST (cfg, args [0], method->klass->image);
+ EMIT_NEW_PCONST (cfg, args [1], fsig);
+ args [2] = addr;
+ addr = mono_emit_jit_icall (cfg, mono_get_native_calli_wrapper, args);
+ }
} else {
MonoMethod *cil_method;
@@ -6398,6 +6473,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (context_used) {
vtable_arg = emit_get_rgctx_method (cfg, context_used, cmethod, MONO_RGCTX_INFO_METHOD_RGCTX);
} else {
+ mono_class_vtable (cfg->domain, cmethod->klass);
+ CHECK_TYPELOAD (cmethod->klass);
+
EMIT_NEW_METHOD_RGCTX_CONST (cfg, vtable_arg, cmethod);
}
@@ -7474,6 +7552,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
if (!cmethod)
goto load_error;
fsig = mono_method_get_signature (cmethod, image, token);
+ if (!fsig)
+ goto load_error;
mono_save_token_info (cfg, image, token, cmethod);
@@ -7498,6 +7578,9 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
vtable_arg = emit_get_rgctx_method (cfg, context_used,
cmethod, MONO_RGCTX_INFO_METHOD_RGCTX);
} else {
+ mono_class_vtable (cfg->domain, cmethod->klass);
+ CHECK_TYPELOAD (cmethod->klass);
+
EMIT_NEW_METHOD_RGCTX_CONST (cfg, vtable_arg, cmethod);
}
} else {
@@ -7582,6 +7665,8 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b
alloc = mono_emit_jit_icall (cfg, mono_array_new_1, sp);
else if (fsig->param_count == 2)
alloc = mono_emit_jit_icall (cfg, mono_array_new_2, sp);
+ else if (fsig->param_count == 3)
+ alloc = mono_emit_jit_icall (cfg, mono_array_new_3, sp);
else
alloc = handle_array_new (cfg, fsig->param_count, sp, ip);
} else if (cmethod->string_ctor) {
diff --git a/mono/mini/mini-alpha.c b/mono/mini/mini-alpha.c
index c696fb68393..6ef1b6f101f 100644
--- a/mono/mini/mini-alpha.c
+++ b/mono/mini/mini-alpha.c
@@ -4422,7 +4422,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gbool
cinfo->ret.reg = alpha_f0;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret))
+ if (!mono_type_generic_inst_is_valuetype (ret_type))
{
cinfo->ret.storage = ArgInIReg;
cinfo->ret.reg = alpha_r0;
@@ -4525,7 +4525,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, gbool
add_general (pgr, &stack_size, ainfo);
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i]))
+ if (!mono_type_generic_inst_is_valuetype (ptype))
{
add_general (pgr, &stack_size, ainfo);
break;
diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c
index 9bacb1b7555..faa64a45420 100644
--- a/mono/mini/mini-amd64.c
+++ b/mono/mini/mini-amd64.c
@@ -676,7 +676,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
cinfo->ret.reg = AMD64_XMM0;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
cinfo->ret.storage = ArgInIReg;
cinfo->ret.reg = AMD64_RAX;
break;
@@ -2558,11 +2558,6 @@ emit_call_body (MonoCompile *cfg, guint8 *code, guint32 patch_type, gconstpointe
/* These methods are allocated using malloc */
near_call = FALSE;
- if (cfg->compile_aot) {
- near_call = TRUE;
- no_patch = TRUE;
- }
-
#ifdef MONO_ARCH_NOMAP32BIT
near_call = FALSE;
#endif
@@ -2571,6 +2566,11 @@ emit_call_body (MonoCompile *cfg, guint8 *code, guint32 patch_type, gconstpointe
if (optimize_for_xen)
near_call = FALSE;
+ if (cfg->compile_aot) {
+ near_call = TRUE;
+ no_patch = TRUE;
+ }
+
if (near_call) {
/*
* Align the call displacement to an address divisible by 4 so it does
@@ -6543,9 +6543,9 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
guchar *code = p;
int save_mode = SAVE_NONE;
MonoMethod *method = cfg->method;
- int rtype = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret)->type;
+ MonoType *ret_type = mini_type_get_underlying_type (NULL, mono_method_signature (method)->ret);
- switch (rtype) {
+ switch (ret_type->type) {
case MONO_TYPE_VOID:
/* special case string .ctor icall */
if (strcmp (".ctor", method->name) && method->klass == mono_defaults.string_class)
@@ -6562,7 +6562,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
save_mode = SAVE_XMM;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
save_mode = SAVE_EAX;
break;
}
diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c
index c1701635378..4d27e2fd0e1 100644
--- a/mono/mini/mini-arm.c
+++ b/mono/mini/mini-arm.c
@@ -870,7 +870,7 @@ get_call_info (MonoMethodSignature *sig, gboolean is_pinvoke)
n++;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (simpletype)) {
cinfo->args [n].size = sizeof (gpointer);
add_general (&gr, &stack_size, cinfo->args + n, TRUE);
n++;
@@ -974,7 +974,7 @@ get_call_info (MonoMethodSignature *sig, gboolean is_pinvoke)
cinfo->ret.regtype = RegTypeFP;*/
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (simpletype)) {
cinfo->ret.regtype = RegTypeGeneral;
cinfo->ret.reg = ARMREG_R0;
break;
diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c
index d5f280f1c74..7bd99c0cc39 100644
--- a/mono/mini/mini-exceptions.c
+++ b/mono/mini/mini-exceptions.c
@@ -1741,7 +1741,7 @@ mono_handle_native_sigsegv (int signal, void *ctx)
handling_sigsegv = TRUE;
/* !jit_tls means the thread was not registered with the runtime */
- if (jit_tls) {
+ if (jit_tls && mono_thread_current ()) {
fprintf (stderr, "Stacktrace:\n\n");
mono_jit_walk_stack (print_stack_frame, TRUE, stderr);
@@ -1847,14 +1847,8 @@ mono_handle_native_sigsegv (int signal, void *ctx)
abort ();
}
-/*
- * mono_print_thread_dump:
- *
- * Print information about the current thread to stdout.
- * SIGCTX can be NULL, allowing this to be called from gdb.
- */
-void
-mono_print_thread_dump (void *sigctx)
+static void
+mono_print_thread_dump_internal (void *sigctx, MonoContext *start_ctx)
{
MonoThread *thread = mono_thread_current ();
#if defined(__i386__) || defined(__x86_64__)
@@ -1882,7 +1876,9 @@ mono_print_thread_dump (void *sigctx)
#endif
#ifdef MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX
- if (!sigctx)
+ if (start_ctx) {
+ memcpy (&ctx, start_ctx, sizeof (MonoContext));
+ } else if (!sigctx)
MONO_INIT_CONTEXT_FROM_FUNC (&ctx, mono_print_thread_dump);
else
mono_arch_sigctx_to_monoctx (sigctx, &ctx);
@@ -1896,3 +1892,21 @@ mono_print_thread_dump (void *sigctx)
g_string_free (text, TRUE);
fflush (stdout);
}
+
+/*
+ * mono_print_thread_dump:
+ *
+ * Print information about the current thread to stdout.
+ * SIGCTX can be NULL, allowing this to be called from gdb.
+ */
+void
+mono_print_thread_dump (void *sigctx)
+{
+ mono_print_thread_dump_internal (sigctx, NULL);
+}
+
+void
+mono_print_thread_dump_from_ctx (MonoContext *ctx)
+{
+ mono_print_thread_dump_internal (NULL, ctx);
+}
diff --git a/mono/mini/mini-ia64.c b/mono/mini/mini-ia64.c
index e2a92592d7b..03692984d59 100644
--- a/mono/mini/mini-ia64.c
+++ b/mono/mini/mini-ia64.c
@@ -401,7 +401,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
cinfo->ret.reg = 8;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
cinfo->ret.storage = ArgInIReg;
cinfo->ret.reg = IA64_R8;
break;
@@ -494,7 +494,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
add_general (&gr, &stack_size, ainfo);
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (ptype)) {
add_general (&gr, &stack_size, ainfo);
break;
}
diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp
index f379b20c666..227b84b2346 100644
--- a/mono/mini/mini-llvm-cpp.cpp
+++ b/mono/mini/mini-llvm-cpp.cpp
@@ -25,6 +25,7 @@
#include <llvm/PassManager.h>
#include <llvm/ExecutionEngine/ExecutionEngine.h>
#include <llvm/ExecutionEngine/JITMemoryManager.h>
+#include <llvm/ExecutionEngine/JITEventListener.h>
#include <llvm/Target/TargetOptions.h>
#include <llvm/Target/TargetData.h>
#include <llvm/Analysis/Verifier.h>
@@ -34,6 +35,7 @@
#include "llvm/Support/PrettyStackTrace.h"
#include <llvm/CodeGen/Passes.h>
#include <llvm/CodeGen/MachineFunctionPass.h>
+#include <llvm/CodeGen/MachineFunction.h>
//#include <llvm/LinkAllPasses.h>
#include "llvm-c/Core.h"
@@ -223,6 +225,32 @@ mono_llvm_build_volatile_load (LLVMBuilderRef builder, LLVMValueRef PointerVal,
static cl::list<const PassInfo*, bool, PassNameParser>
PassList(cl::desc("Optimizations available:"));
+class MonoJITEventListener : public JITEventListener {
+ virtual void NotifyFunctionEmitted(const Function &F,
+ void *Code, size_t Size,
+ const EmittedFunctionDetails &Details) {
+ /*
+ * X86TargetMachine::setCodeModelForJIT() sets the code model to Large on amd64,
+ * which means the JIT will generate calls of the form
+ * mov reg, <imm>
+ * call *reg
+ * Our trampoline code can't patch this. Passing CodeModel::Small to createJIT
+ * doesn't seem to work, we need Default. A discussion is here:
+ * http://lists.cs.uiuc.edu/pipermail/llvmdev/2009-December/027999.html
+ * There seems to no way to get the TargeMachine used by an EE either, so we
+ * install a profiler hook and reset the code model here.
+ * This should be inside an ifdef, but we can't include our config.h either,
+ * since its definitions conflict with LLVM's config.h.
+ *
+ */
+ //#if defined(TARGET_X86) || defined(TARGET_AMD64)
+ if (Details.MF->getTarget ().getCodeModel () == CodeModel::Large) {
+ Details.MF->getTarget ().setCodeModel (CodeModel::Default);
+ }
+ //#endif
+ }
+};
+
LLVMExecutionEngineRef
mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, FunctionEmittedCb *emitted_cb, ExceptionTableCb *exception_cb)
{
@@ -247,6 +275,7 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
g_assert_not_reached ();
}
EE->InstallExceptionTableRegister (exception_cb);
+ EE->RegisterJITEventListener (new MonoJITEventListener ());
fpm = new FunctionPassManager (unwrap (MP));
diff --git a/mono/mini/mini-llvm.c b/mono/mini/mini-llvm.c
index 43ca05f5251..304e1e31186 100644
--- a/mono/mini/mini-llvm.c
+++ b/mono/mini/mini-llvm.c
@@ -8,8 +8,12 @@
#include <mono/metadata/debug-helpers.h>
#include <mono/metadata/mempool-internals.h>
+#ifndef __STDC_LIMIT_MACROS
#define __STDC_LIMIT_MACROS
+#endif
+#ifndef __STDC_CONSTANT_MACROS
#define __STDC_CONSTANT_MACROS
+#endif
#include "llvm-c/Core.h"
#include "llvm-c/ExecutionEngine.h"
diff --git a/mono/mini/mini-mips.c b/mono/mini/mini-mips.c
index 5a9a010f3de..6dd289c6bb2 100644
--- a/mono/mini/mini-mips.c
+++ b/mono/mini/mini-mips.c
@@ -897,7 +897,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
{
guint i;
int n = sig->hasthis + sig->param_count;
- guint32 simpletype;
+ MonoType* simpletype;
CallInfo *cinfo = g_malloc0 (sizeof (CallInfo) + sizeof (ArgInfo) * n);
cinfo->fr = MIPS_FIRST_FPARG_REG;
@@ -933,8 +933,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
n++;
continue;
}
- simpletype = mono_type_get_underlying_type (sig->params [i])->type;
- switch (simpletype) {
+ simpletype = mono_type_get_underlying_type (sig->params [i]);
+ switch (simpletype->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
case MONO_TYPE_U1:
@@ -972,7 +972,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
n++;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (simpletype)) {
cinfo->args [n].size = sizeof (gpointer);
add_int32_arg (cinfo, &cinfo->args[n]);
n++;
@@ -1096,8 +1096,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
}
{
- simpletype = mono_type_get_underlying_type (sig->ret)->type;
- switch (simpletype) {
+ simpletype = mono_type_get_underlying_type (sig->ret);
+ switch (simpletype->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
case MONO_TYPE_U1:
@@ -1127,7 +1127,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
cinfo->ret.regtype = RegTypeFP;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (simpletype)) {
cinfo->ret.reg = mips_v0;
break;
}
diff --git a/mono/mini/mini-posix.c b/mono/mini/mini-posix.c
index 249c4b4ae71..b0a027fc591 100644
--- a/mono/mini/mini-posix.c
+++ b/mono/mini/mini-posix.c
@@ -144,10 +144,11 @@ SIG_HANDLER_SIGNATURE (mono_chain_signal)
static void
SIG_HANDLER_SIGNATURE (sigabrt_signal_handler)
{
- MonoJitInfo *ji;
+ MonoJitInfo *ji = NULL;
GET_CONTEXT;
- ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx));
+ if (mono_thread_current ())
+ ji = mono_jit_info_table_find (mono_domain_get (), mono_arch_ip_from_context(ctx));
if (!ji) {
if (mono_chain_signal (SIG_HANDLER_PARAMS))
return;
diff --git a/mono/mini/mini-ppc.c b/mono/mini/mini-ppc.c
index ca673ef563b..69ddbc9c87c 100644
--- a/mono/mini/mini-ppc.c
+++ b/mono/mini/mini-ppc.c
@@ -985,7 +985,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
{
guint i, fr, gr;
int n = sig->hasthis + sig->param_count;
- guint32 simpletype;
+ MonoType *simpletype;
guint32 stack_size = 0;
CallInfo *cinfo = g_malloc0 (sizeof (CallInfo) + sizeof (ArgInfo) * n);
@@ -1020,8 +1020,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
n++;
continue;
}
- simpletype = mini_type_get_underlying_type (NULL, sig->params [i])->type;
- switch (simpletype) {
+ simpletype = mini_type_get_underlying_type (NULL, sig->params [i]);
+ switch (simpletype->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
case MONO_TYPE_U1:
@@ -1056,7 +1056,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
n++;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (simpletype)) {
cinfo->args [n].size = sizeof (gpointer);
add_general (&gr, &stack_size, cinfo->args + n, TRUE);
n++;
@@ -1230,8 +1230,8 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
}
{
- simpletype = mini_type_get_underlying_type (NULL, sig->ret)->type;
- switch (simpletype) {
+ simpletype = mini_type_get_underlying_type (NULL, sig->ret);
+ switch (simpletype->type) {
case MONO_TYPE_BOOLEAN:
case MONO_TYPE_I1:
case MONO_TYPE_U1:
@@ -1261,7 +1261,7 @@ calculate_sizes (MonoMethodSignature *sig, gboolean is_pinvoke)
cinfo->ret.regtype = RegTypeFP;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (simpletype)) {
cinfo->ret.reg = ppc_r3;
break;
}
diff --git a/mono/mini/mini-s390.c b/mono/mini/mini-s390.c
index d36cded9fed..90655bb0921 100644
--- a/mono/mini/mini-s390.c
+++ b/mono/mini/mini-s390.c
@@ -1436,7 +1436,7 @@ enum_retvalue:
sz->code_size += 4;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
cinfo->ret.reg = s390_r2;
sz->code_size += 4;
break;
@@ -1560,7 +1560,7 @@ enum_retvalue:
nParm++;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (ptype)) {
cinfo->args[nParm].size = sizeof(gpointer);
add_general (&gr, sz, cinfo->args+nParm, TRUE);
nParm++;
diff --git a/mono/mini/mini-sparc.c b/mono/mini/mini-sparc.c
index f98bf48e9e6..0dba7db712f 100644
--- a/mono/mini/mini-sparc.c
+++ b/mono/mini/mini-sparc.c
@@ -571,7 +571,7 @@ get_call_info (MonoCompile *cfg, MonoMethodSignature *sig, gboolean is_pinvoke)
add_general (&gr, &stack_size, ainfo, FALSE);
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (ptype)) {
add_general (&gr, &stack_size, ainfo, FALSE);
break;
}
@@ -670,7 +670,7 @@ get_call_info (MonoCompile *cfg, MonoMethodSignature *sig, gboolean is_pinvoke)
cinfo->ret.reg = sparc_f0;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
cinfo->ret.storage = ArgInIReg;
cinfo->ret.reg = sparc_i0;
if (gr < 1)
diff --git a/mono/mini/mini-trampolines.c b/mono/mini/mini-trampolines.c
index 0752b2404fc..df6a7a5907b 100644
--- a/mono/mini/mini-trampolines.c
+++ b/mono/mini/mini-trampolines.c
@@ -202,7 +202,7 @@ mono_convert_imt_slot_to_vtable_slot (gpointer* slot, mgreg_t *regs, guint8 *cod
context.method_inst = ((MonoMethodInflated*)imt_method)->context.method_inst;
impl = mono_class_inflate_generic_method (impl, &context);
} else {
- impl = mono_class_get_vtable_entry (vt->klass, interface_offset + imt_method->slot);
+ impl = mono_class_get_vtable_entry (vt->klass, interface_offset + mono_method_get_vtable_slot (imt_method));
}
if (mono_method_needs_static_rgctx_invoke (impl, FALSE))
@@ -446,6 +446,7 @@ mono_magic_trampoline (mgreg_t *regs, guint8 *code, gpointer arg, guint8* tramp)
}
g_assert (klass);
+ g_assert (actual_method);
g_assert (actual_method->klass == klass);
if (actual_method->is_inflated)
@@ -1374,7 +1375,12 @@ mono_create_llvm_vcall_trampoline (MonoMethod *method)
gpointer
mono_create_llvm_imt_trampoline (MonoDomain *domain, MonoMethod *m, int vt_offset)
{
+#ifdef MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE
return mono_arch_get_llvm_imt_trampoline (domain, m, vt_offset);
+#else
+ g_assert_not_reached ();
+ return NULL;
+#endif
}
#endif
diff --git a/mono/mini/mini-x86.c b/mono/mini/mini-x86.c
index 541819f40c1..9e7aa4c42c8 100644
--- a/mono/mini/mini-x86.c
+++ b/mono/mini/mini-x86.c
@@ -297,18 +297,12 @@ add_valuetype (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, ArgIn
* For x86 win32, see ???.
*/
static CallInfo*
-get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
+get_call_info_internal (MonoGenericSharingContext *gsctx, CallInfo *cinfo, MonoMethodSignature *sig, gboolean is_pinvoke)
{
guint32 i, gr, fr;
MonoType *ret_type;
int n = sig->hasthis + sig->param_count;
guint32 stack_size = 0;
- CallInfo *cinfo;
-
- if (mp)
- cinfo = mono_mempool_alloc0 (mp, sizeof (CallInfo) + (sizeof (ArgInfo) * n));
- else
- cinfo = g_malloc0 (sizeof (CallInfo) + (sizeof (ArgInfo) * n));
gr = 0;
fr = 0;
@@ -349,7 +343,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
cinfo->ret.storage = ArgOnDoubleFpStack;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
cinfo->ret.storage = ArgInIReg;
cinfo->ret.reg = X86_EAX;
break;
@@ -438,7 +432,7 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
add_general (&gr, &stack_size, ainfo);
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+ if (!mono_type_generic_inst_is_valuetype (ptype)) {
add_general (&gr, &stack_size, ainfo);
break;
}
@@ -486,6 +480,20 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
return cinfo;
}
+static CallInfo*
+get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
+{
+ int n = sig->hasthis + sig->param_count;
+ CallInfo *cinfo;
+
+ if (mp)
+ cinfo = mono_mempool_alloc0 (mp, sizeof (CallInfo) + (sizeof (ArgInfo) * n));
+ else
+ cinfo = g_malloc0 (sizeof (CallInfo) + (sizeof (ArgInfo) * n));
+
+ return get_call_info_internal (gsctx, cinfo, sig, is_pinvoke);
+}
+
/*
* mono_arch_get_argument_info:
* @csig: a method signature
@@ -496,6 +504,9 @@ get_call_info (MonoGenericSharingContext *gsctx, MonoMemPool *mp, MonoMethodSign
* padding. arg_info should be large enought to hold param_count + 1 entries.
*
* Returns the size of the argument area on the stack.
+ * This should be signal safe, since it is called from
+ * mono_arch_find_jit_info_ext ().
+ * FIXME: The metadata calls might not be signal safe.
*/
int
mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info)
@@ -506,7 +517,10 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit
int offset = 8;
CallInfo *cinfo;
- cinfo = get_call_info (NULL, NULL, csig, FALSE);
+ /* Avoid g_malloc as it is not signal safe */
+ cinfo = (CallInfo*)g_newa (guint8*, sizeof (CallInfo) + (sizeof (ArgInfo) * (csig->param_count + 1)));
+
+ cinfo = get_call_info_internal (NULL, cinfo, csig, FALSE);
if (MONO_TYPE_ISSTRUCT (csig->ret) && (cinfo->ret.storage == ArgOnStack)) {
args_size += sizeof (gpointer);
@@ -545,8 +559,6 @@ mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJit
args_size += pad = (align - (args_size & (align - 1))) & (align - 1);
arg_info [k].pad = pad;
- g_free (cinfo);
-
return args_size;
}
@@ -1481,8 +1493,9 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
guchar *code = p;
int arg_size = 0, stack_usage = 0, save_mode = SAVE_NONE;
MonoMethod *method = cfg->method;
-
- switch (mini_type_get_underlying_type (cfg->generic_sharing_context, mono_method_signature (method)->ret)->type) {
+ MonoType *ret_type = mini_type_get_underlying_type (cfg->generic_sharing_context, mono_method_signature (method)->ret);
+
+ switch (ret_type->type) {
case MONO_TYPE_VOID:
/* special case string .ctor icall */
if (strcmp (".ctor", method->name) && method->klass == mono_defaults.string_class) {
@@ -1502,7 +1515,7 @@ mono_arch_instrument_epilog_full (MonoCompile *cfg, void *func, void *p, gboolea
stack_usage = enable_arguments ? 16 : 8;
break;
case MONO_TYPE_GENERICINST:
- if (!mono_type_generic_inst_is_valuetype (mono_method_signature (method)->ret)) {
+ if (!mono_type_generic_inst_is_valuetype (ret_type)) {
save_mode = SAVE_EAX;
stack_usage = enable_arguments ? 8 : 4;
break;
diff --git a/mono/mini/mini.c b/mono/mini/mini.c
index bc481d92ea7..d1a8ad9e246 100644
--- a/mono/mini/mini.c
+++ b/mono/mini/mini.c
@@ -248,9 +248,10 @@ mono_print_method_from_ip (void *ip)
char *method;
MonoDebugSourceLocation *source;
MonoDomain *domain = mono_domain_get ();
+ MonoDomain *target_domain = mono_domain_get ();
FindTrampUserData user_data;
- ji = mini_jit_info_table_find (domain, ip, &domain);
+ ji = mini_jit_info_table_find (domain, ip, &target_domain);
if (!ji) {
user_data.ip = ip;
user_data.method = NULL;
@@ -267,9 +268,9 @@ mono_print_method_from_ip (void *ip)
return;
}
method = mono_method_full_name (ji->method, TRUE);
- source = mono_debug_lookup_source_location (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), domain);
+ source = mono_debug_lookup_source_location (ji->method, (guint32)((guint8*)ip - (guint8*)ji->code_start), target_domain);
- g_print ("IP %p at offset 0x%x of method %s (%p %p)[domain %p - %s]\n", ip, (int)((char*)ip - (char*)ji->code_start), method, ji->code_start, (char*)ji->code_start + ji->code_size, domain, domain->friendly_name);
+ g_print ("IP %p at offset 0x%x of method %s (%p %p)[domain %p - %s]\n", ip, (int)((char*)ip - (char*)ji->code_start), method, ji->code_start, (char*)ji->code_start + ji->code_size, target_domain, target_domain->friendly_name);
if (source)
g_print ("%s:%d\n", source->source_file, source->row);
@@ -629,7 +630,9 @@ mono_type_to_load_membase (MonoCompile *cfg, MonoType *type)
if (type->byref)
return OP_LOAD_MEMBASE;
- switch (mono_type_get_underlying_type (type)->type) {
+ type = mono_type_get_underlying_type (type);
+
+ switch (type->type) {
case MONO_TYPE_I1:
return OP_LOADI1_MEMBASE;
case MONO_TYPE_U1:
@@ -1276,6 +1279,23 @@ mini_method_verify (MonoCompile *cfg, MonoMethod *method)
return FALSE;
}
+/*Returns true is something went wrong*/
+static gboolean
+mono_compile_is_broken (MonoCompile *cfg)
+{
+ MonoMethod *method = cfg->method;
+ MonoMethod *method_definition = method;
+ gboolean dont_verify = mini_assembly_can_skip_verification (cfg->domain, method);
+ dont_verify |= method->klass->image->assembly->corlib_internal;
+
+ while (method_definition->is_inflated) {
+ MonoMethodInflated *imethod = (MonoMethodInflated *) method_definition;
+ method_definition = imethod->declaring;
+ }
+
+ return !dont_verify && mini_method_verify (cfg, method_definition);
+}
+
static void
create_helper_signature (void)
{
@@ -3275,6 +3295,9 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
cfg->opt &= ~MONO_OPT_COPYPROP;
cfg->opt &= ~MONO_OPT_CONSPROP;
cfg->opt &= ~MONO_OPT_GSHARED;
+
+ /* This is needed for the soft debugger, which doesn't like code after the epilog */
+ cfg->disable_out_of_line_bblocks = TRUE;
}
if (mono_using_xdebug) {
@@ -3390,6 +3413,10 @@ mini_method_compile (MonoMethod *method, guint32 opts, MonoDomain *domain, gbool
*/
//cfg->enable_extended_bblocks = TRUE;
+ /*We must verify the method before doing any IR generation as mono_compile_create_vars can assert.*/
+ if (mono_compile_is_broken (cfg))
+ return cfg;
+
/*
* create MonoInst* which represents arguments and local variables
*/
@@ -4215,12 +4242,12 @@ mono_jit_compile_method_inner (MonoMethod *method, MonoDomain *target_domain, in
}
if (ex) {
- mono_destroy_compile (cfg);
- *jit_ex = ex;
-
if (cfg->prof_options & MONO_PROFILE_JIT_COMPILATION)
mono_profiler_method_end_jit (method, NULL, MONO_PROFILE_FAILED);
+ mono_destroy_compile (cfg);
+ *jit_ex = ex;
+
return NULL;
}
@@ -5381,6 +5408,8 @@ mini_init (const char *filename, const char *runtime_version)
register_icall (mono_create_corlib_exception_2, "mono_create_corlib_exception_2", "object int object object", TRUE);
register_icall (mono_array_new_1, "mono_array_new_1", "object ptr int", FALSE);
register_icall (mono_array_new_2, "mono_array_new_2", "object ptr int int", FALSE);
+ register_icall (mono_array_new_3, "mono_array_new_3", "object ptr int int int", FALSE);
+ register_icall (mono_get_native_calli_wrapper, "mono_get_native_calli_wrapper", "ptr ptr ptr ptr", FALSE);
#endif
mono_generic_sharing_init ();
@@ -5592,9 +5621,9 @@ char*
mono_get_runtime_build_info (void)
{
if (mono_build_date)
- return g_strdup_printf ("%s %s", FULL_VERSION, mono_build_date);
+ return g_strdup_printf ("%s (%s %s)", VERSION, FULL_VERSION, mono_build_date);
else
- return g_strdup_printf ("%s", FULL_VERSION);
+ return g_strdup_printf ("%s (%s)", VERSION, FULL_VERSION);
}
static void
diff --git a/mono/mini/mini.h b/mono/mini/mini.h
index f0ecb951da8..b8aa756f8c4 100644
--- a/mono/mini/mini.h
+++ b/mono/mini/mini.h
@@ -1019,6 +1019,7 @@ typedef struct {
guint disable_omit_fp : 1;
guint disable_vreg_to_lvreg : 1;
guint disable_deadce_vars : 1;
+ guint disable_out_of_line_bblocks : 1;
guint extend_live_ranges : 1;
guint has_got_slots : 1;
guint uses_rgctx_reg : 1;
@@ -1501,7 +1502,7 @@ void mono_xdebug_init (char *xdebug_opts) MONO_INTERNAL;
void mono_save_xdebug_info (MonoCompile *cfg) MONO_INTERNAL;
void mono_save_trampoline_xdebug_info (const char *tramp_name, guint8 *code, guint32 code_size, GSList *unwind_info) MONO_INTERNAL;
/* This is an exported function */
-void mono_xdebug_emit (void) MONO_INTERNAL;
+void mono_xdebug_flush (void) MONO_INTERNAL;
/* LLVM backend */
void mono_llvm_init (void) MONO_INTERNAL;
@@ -1748,6 +1749,7 @@ gboolean mono_handle_exception (MonoContext *ctx, gpointer obj,
gpointer original_ip, gboolean test_only) MONO_INTERNAL;
void mono_handle_native_sigsegv (int signal, void *sigctx) MONO_INTERNAL;
void mono_print_thread_dump (void *sigctx);
+void mono_print_thread_dump_from_ctx (MonoContext *ctx);
void mono_jit_walk_stack (MonoStackWalk func, gboolean do_il_offset, gpointer user_data) MONO_INTERNAL;
void mono_jit_walk_stack_from_ctx (MonoStackWalk func, MonoContext *ctx, gboolean do_il_offset, gpointer user_data) MONO_INTERNAL;
void mono_jit_walk_stack_from_ctx_in_thread (MonoJitStackWalk func, MonoDomain *domain, MonoContext *start_ctx, gboolean do_il_offset, MonoThread *thread, MonoLMF *lmf, gpointer user_data) MONO_INTERNAL;
@@ -1974,10 +1976,11 @@ void SIG_HANDLER_SIGNATURE (mono_sigsegv_signal_handler) MONO_INTERNAL;
void SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler) MONO_INTERNAL;
gboolean SIG_HANDLER_SIGNATURE (mono_chain_signal) MONO_INTERNAL;
-/* for MONO_WRAPPER_UNKNOWN subtypes */
+/* for MONO_WRAPPER_UNKNOWN/MANAGED_TO_MANAGED subtypes */
enum {
MONO_AOT_WRAPPER_MONO_ENTER,
MONO_AOT_WRAPPER_MONO_EXIT,
+ MONO_AOT_WRAPPER_ELEMENT_ADDR,
MONO_AOT_WRAPPER_LAST
};
diff --git a/mono/profiler/ChangeLog b/mono/profiler/ChangeLog
index 1a31fbce2b6..25544b0f8a5 100644
--- a/mono/profiler/ChangeLog
+++ b/mono/profiler/ChangeLog
@@ -1,3 +1,8 @@
+2010-01-11 Zoltan Varga <vargaz@gmail.com>
+
+ * mono-profiler-logging.c (_ProfilerFileWriteBuffer): Use MONO_ZERO_LEN_ARRAY.
+ Fixes #569806.
+
2009-09-14 Massimiliano Mantione <massi@ximian.com>
* mono-profiler-logging.c: Removed the use of signals to control the
profiler and extended the socket based interface to control also
diff --git a/mono/profiler/mono-profiler-logging.c b/mono/profiler/mono-profiler-logging.c
index 05ac38c8ad6..93a4f3abbb0 100644
--- a/mono/profiler/mono-profiler-logging.c
+++ b/mono/profiler/mono-profiler-logging.c
@@ -840,7 +840,7 @@ static __thread ProfilerPerThreadData * tls_profiler_per_thread_data;
#define PROFILER_FILE_WRITE_BUFFER_SIZE (profiler->write_buffer_size)
typedef struct _ProfilerFileWriteBuffer {
struct _ProfilerFileWriteBuffer *next;
- guint8 buffer [];
+ guint8 buffer [MONO_ZERO_LEN_ARRAY];
} ProfilerFileWriteBuffer;
#define CHECK_PROFILER_ENABLED() do {\
diff --git a/mono/tests/ChangeLog b/mono/tests/ChangeLog
index ca041d7eb1f..e1e40040f48 100644
--- a/mono/tests/ChangeLog
+++ b/mono/tests/ChangeLog
@@ -1,3 +1,7 @@
+2009-12-17 Zoltan Varga <vargaz@gmail.com>
+
+ * libtest.c pinvoke2.cs: Add a test for calling pinvoke methods using calli.
+
2009-11-20 Zoltan Varga <vargaz@gmail.com>
* libtest.c (mono_test_marshal_bool_in): Use 'short' as the type of the
diff --git a/mono/tests/libtest.c b/mono/tests/libtest.c
index 4af3cb8d439..c54445aa4e1 100644
--- a/mono/tests/libtest.c
+++ b/mono/tests/libtest.c
@@ -3214,6 +3214,12 @@ lookup_mono_symbol (const char *symbol_name)
return NULL;
}
+gpointer
+mono_test_marshal_lookup_symbol (const char *symbol_name)
+{
+ return lookup_mono_symbol (symbol_name);
+}
+
/**
* test_method_thunk:
*
diff --git a/mono/tests/pinvoke2.cs b/mono/tests/pinvoke2.cs
index 1ca7c06d3a9..704032d38e9 100644
--- a/mono/tests/pinvoke2.cs
+++ b/mono/tests/pinvoke2.cs
@@ -2,6 +2,7 @@ using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Runtime.CompilerServices;
+using System.Reflection.Emit;
public class Tests {
@@ -1549,5 +1550,46 @@ public class Tests {
double d2 = mono_test_marshal_date_time (new DateTime (2009, 12, 6));
return (d2 == 40153.0) ? 0 : 1;
}
+
+ /*
+ * Calling pinvoke functions dynamically using calli
+ */
+
+ [DllImport("libtest")]
+ private static extern IntPtr mono_test_marshal_lookup_symbol (string fileName);
+
+ delegate void CalliDel (IntPtr a, int[] f);
+
+ public static int test_0_calli_dynamic () {
+ IntPtr func = mono_test_marshal_lookup_symbol ("mono_test_marshal_inout_array");
+
+ DynamicMethod dm = new DynamicMethod ("calli", typeof (void), new Type [] { typeof (IntPtr), typeof (int[]) });
+
+ var il = dm.GetILGenerator ();
+ var signature = SignatureHelper.GetMethodSigHelper (CallingConvention.Cdecl, typeof (void));
+
+ il.Emit (OpCodes.Ldarg, 1);
+ signature.AddArgument (typeof (byte[]));
+
+ il.Emit (OpCodes.Ldarg_0);
+
+ il.Emit (OpCodes.Calli, signature);
+ il.Emit (OpCodes.Ret);
+
+ var f = (CalliDel)dm.CreateDelegate (typeof (CalliDel));
+
+ int[] arr = new int [1000];
+ for (int i = 0; i < 50; ++i)
+ arr [i] = (int)i;
+ f (func, arr);
+ if (arr.Length != 1000)
+ return 1;
+ for (int i = 0; i < 50; ++i)
+ if (arr [i] != 50 - i)
+ return 2;
+
+ return 0;
+ }
+
}
diff --git a/mono/utils/ChangeLog b/mono/utils/ChangeLog
index fa641b89af9..139dc4bd30e 100644
--- a/mono/utils/ChangeLog
+++ b/mono/utils/ChangeLog
@@ -1,3 +1,13 @@
+2010-01-18 Sebastien Pouliot <sebastien@ximian.com>
+
+ * mono-error.c: Call va_end/va_start before reusing 'args'.
+ [Backport r149765]
+
+2010-01-03 Zoltan Varga <vargaz@gmail.com>
+
+ * mono-path.c (mono_path_resolve_symlinks): Use g_strfreev () to free the
+ result of g_strplit.
+
2009-11-26 Zoltan Varga <vargaz@gmail.com>
* mono-ehash.c (mono_g_hash_table_find): Add this for eglib too.
diff --git a/mono/utils/mono-error.c b/mono/utils/mono-error.c
index 7f4cdc7e5d0..9ba165b517e 100644
--- a/mono/utils/mono-error.c
+++ b/mono/utils/mono-error.c
@@ -20,6 +20,8 @@
va_list args; \
va_start (args, msg_format); \
if (g_vsnprintf (error->message, sizeof (error->message), msg_format, args) >= sizeof (error->message)) {\
+ va_end (args); \
+ va_start (args, msg_format); \
if (!(error->full_message = g_strdup_vprintf (msg_format, args))) \
error->flags |= MONO_ERROR_INCOMPLETE; \
} \
diff --git a/mono/utils/mono-path.c b/mono/utils/mono-path.c
index 591c5dc39c4..2b6f9f96734 100644
--- a/mono/utils/mono-path.c
+++ b/mono/utils/mono-path.c
@@ -150,7 +150,7 @@ mono_path_resolve_symlinks (const char *path)
}
}
- g_free (split);
+ g_strfreev (split);
return p;
#endif
}
diff --git a/support/ChangeLog b/support/ChangeLog
index 0e8d2246c3d..8bd5c406e78 100644
--- a/support/ChangeLog
+++ b/support/ChangeLog
@@ -1,3 +1,11 @@
+2009-12-16 Gonzalo Paniagua Javier <gonzalo@novell.com>
+
+ * zlib-helper.c: when finishing uncompressing a buffer, we might need
+ more than one call to deflate with Z_FINISH since the uncompressed
+ data can take more space than the allocated buffer.
+
+ Fixes the IPY+Chiron test case.
+
2009-10-24 Gonzalo Paniagua Javier <gonzalo@novell.com>
* zlib-helper.c: stop trying to decompress when we get Z_STREAM_END.
diff --git a/support/zlib-helper.c b/support/zlib-helper.c
index 5e11cb341eb..1d61c3d35fb 100644
--- a/support/zlib-helper.c
+++ b/support/zlib-helper.c
@@ -104,9 +104,11 @@ CloseZStream (ZStream *zstream)
status = 0;
if (zstream->compress) {
if (zstream->stream->total_out) {
- status = deflate (zstream->stream, Z_FINISH);
- flush_status = Flush (zstream);
- if (status == Z_OK || status == Z_STREAM_END)
+ do {
+ status = deflate (zstream->stream, Z_FINISH);
+ flush_status = Flush (zstream);
+ } while (status == Z_OK); /* We want Z_STREAM_END or error here here */
+ if (status == Z_STREAM_END)
status = flush_status;
}
deflateEnd (zstream->stream);
diff --git a/tools/locale-builder/ChangeLog b/tools/locale-builder/ChangeLog
index bbe196359bb..1acdafabfab 100644
--- a/tools/locale-builder/ChangeLog
+++ b/tools/locale-builder/ChangeLog
@@ -1,3 +1,23 @@
+2010-01-06 Atsushi Enomoto <atsushi@ximian.com>
+
+ * Driver.cs : support FirstDayOfWeek. Fixed bug #567944.
+ Patch by Jose Antonio Sanchez Lazaro.
+
+2009-12-18 Dimitar Dobrev <dpldobrev@yahoo.com>
+
+ * langs/ka.xml: added a file with the settings of the neutral
+ Georgian culture
+ * locales/ka-GE.xml: added a file with the settings of the
+ specific Georgian culture
+ * supp/ka-GE.xml: added a file with the date and time formats
+ of the Georgian culture
+ * lcids.xml: added entries for the neutral and specific
+ Georgian culture
+ * Makefile.am: included supp/ka-GE.xml in the build and dist the new
+ we're not downloading from primates.ximian.com.
+
+ [Fixes bug 564910].
+
2009-11-05 Rolf Bjarne Kvinge <RKvinge@novell.com>
* Driver.cs: Generate locale data for neutral cultures too. Moonlight
diff --git a/tools/locale-builder/Driver.cs b/tools/locale-builder/Driver.cs
index a867f82a268..7bd2520421f 100644
--- a/tools/locale-builder/Driver.cs
+++ b/tools/locale-builder/Driver.cs
@@ -665,6 +665,34 @@ namespace Mono.Tools.LocaleBuilder {
if (pm != String.Empty)
df.PMDesignator = pm;
*/
+ ni2 = (XPathNodeIterator) ni.Current.Evaluate
+("week/firstDay");
+ if (ni2.MoveNext ()) {
+ XPathNavigator weekday_nav = ni2.Current;
+ switch (weekday_nav.GetAttribute ("day", String.Empty)) {
+ case "sun":
+ df.FirstDayOfWeek = 0;
+ break;
+ case "mon":
+ df.FirstDayOfWeek = 1;
+ break;
+ case "tue":
+ df.FirstDayOfWeek = 2;
+ break;
+ case "wed":
+ df.FirstDayOfWeek = 3;
+ break;
+ case "thu":
+ df.FirstDayOfWeek = 4;
+ break;
+ case "fri":
+ df.FirstDayOfWeek = 5;
+ break;
+ case "sat":
+ df.FirstDayOfWeek = 6;
+ break;
+ }
+ }
}
string date_sep = (string) nav.Evaluate ("string(ldml/dates/symbols/dateSeparator)");
diff --git a/tools/locale-builder/Makefile.am b/tools/locale-builder/Makefile.am
index 95726fd414c..ba50bf668c3 100644
--- a/tools/locale-builder/Makefile.am
+++ b/tools/locale-builder/Makefile.am
@@ -106,6 +106,7 @@ supp_data_files = \
supp/it_CH.xml \
supp/it_IT.xml \
supp/ja.xml \
+ supp/ka_GE.xml \
supp/ko_KR.xml \
supp/lt_LT.xml \
supp/lv.xml \
@@ -130,7 +131,15 @@ supp_data_files = \
supp/uk.xml \
supp/vi.xml
-EXTRA_DIST = $(locale_builder_sources) $(supp_data_files) lcids.xml supplementalData.xml textinfo.xml
+extra_langs = \
+ langs/ka.xml
+
+extra_locales = \
+ locales/ka_GE.xml
+
+EXTRA_DIST = $(locale_builder_sources) $(supp_data_files) lcids.xml supplementalData.xml textinfo.xml \
+ $(extra_langs) $(extra_locales)
+
locale-builder.exe: $(locale_builder_sources)
$(MCS) $(MCSFLAGS) /out:$@ $^
diff --git a/tools/locale-builder/langs/ka.xml b/tools/locale-builder/langs/ka.xml
new file mode 100644
index 00000000000..4656ceea5f3
--- /dev/null
+++ b/tools/locale-builder/langs/ka.xml
@@ -0,0 +1,2159 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.66 $"/>
+ <generation date="$Date: 2009/05/05 23:06:37 $"/>
+ <language type="ka"/>
+ </identity>
+ <localeDisplayNames>
+ <localeDisplayPattern>
+ <localePattern draft="contributed">{0} ({1})</localePattern>
+ <localeSeparator draft="contributed">, </localeSeparator>
+ </localeDisplayPattern>
+ <languages>
+ <language type="ab">აფხაზური</language>
+ <language type="ady">ადიღეური</language>
+ <language type="ae" draft="contributed">ავესტა</language>
+ <language type="af">აფრიკული</language>
+ <language type="ain" draft="contributed">აინუ</language>
+ <language type="ale" draft="contributed">ალეუტური</language>
+ <language type="ang">ძველი ინგლისური</language>
+ <language type="ar">არაბული</language>
+ <language type="arc">არამეული</language>
+ <language type="art" draft="contributed">ხელოვნური სხვა</language>
+ <language type="as" draft="contributed">ასამური</language>
+ <language type="ast">ავსტრიული</language>
+ <language type="az">აზერბაიჯანული</language>
+ <language type="be" draft="contributed">ბელორუსული</language>
+ <language type="bg">ბულგარული</language>
+ <language type="bh" draft="contributed">ბიჰარი</language>
+ <language type="bo">ტიბეტური</language>
+ <language type="br" draft="contributed">ბრეტონული</language>
+ <language type="bs">ბოსნიური</language>
+ <language type="bua" draft="contributed">ბურიატული</language>
+ <language type="ca" draft="contributed">კატალანური</language>
+ <language type="cau" draft="contributed">კავკასიური სხვა</language>
+ <language type="ce">ჩეჩნური</language>
+ <language type="cel" draft="contributed">კელტური სხვა</language>
+ <language type="cs">ჩეხური</language>
+ <language type="cu">საეკლესიო სლავური</language>
+ <language type="cy" draft="contributed">უელსური</language>
+ <language type="da">დანიური</language>
+ <language type="de">გერმანული</language>
+ <language type="de_AT">ავსტრიული გერმანული</language>
+ <language type="de_CH" draft="contributed">შვეიცარიული მაღალი გერმანული</language>
+ <language type="egy" draft="contributed">ეგვიპტური</language>
+ <language type="el">ბერძნული</language>
+ <language type="en">ინგლისური</language>
+ <language type="en_AU">ავსტრალიური ინგლისური</language>
+ <language type="en_CA">კანადური ინგლისური</language>
+ <language type="en_GB">ბრიტანული ინგლისური</language>
+ <language type="en_US">ამერიკული ინგლისური</language>
+ <language type="eo">ესპერანტო</language>
+ <language type="es">ესპანური</language>
+ <language type="es_419" draft="contributed">ლათინურ ამერიკული ესპანური</language>
+ <language type="es_ES" draft="contributed">იბერიული ესპანური</language>
+ <language type="et">ესტონური</language>
+ <language type="eu">ბასკური</language>
+ <language type="fa">სპარსული</language>
+ <language type="fi">ფინური</language>
+ <language type="fil">ფილიპინური</language>
+ <language type="fr">ფრანგული</language>
+ <language type="fr_CA">კანადური ფრანგული</language>
+ <language type="fr_CH">შვეიცარიული ფრანგული</language>
+ <language type="fro">ძველი ფრანგული</language>
+ <language type="ga">ირლანდიური</language>
+ <language type="gd">შოტლანდიურ-გალური</language>
+ <language type="gl">გალური</language>
+ <language type="gn" draft="contributed">გუარანი</language>
+ <language type="goh">ძველი გერმანული</language>
+ <language type="grc">ძველი ბერძნული</language>
+ <language type="gsw">შვეიცარიული გერმანული</language>
+ <language type="gu" draft="contributed">გუჯარათი</language>
+ <language type="he">ებრაული</language>
+ <language type="hi" draft="contributed">ჰინდი</language>
+ <language type="hr">ხორვატიული</language>
+ <language type="hu">უნგრული</language>
+ <language type="hy">სომხური</language>
+ <language type="ia" draft="contributed">ინტერლინგუალური</language>
+ <language type="id">ინდონეზიური</language>
+ <language type="ie" draft="contributed">ინტერლინგი</language>
+ <language type="ine" draft="contributed">ინდო-ევროპული სხვა</language>
+ <language type="is">ისლანდიური</language>
+ <language type="it">იტალიური</language>
+ <language type="ja">იაპონური</language>
+ <language type="jv" draft="contributed">იავანური</language>
+ <language type="ka">ქართული</language>
+ <language type="kg" draft="contributed">კონგო</language>
+ <language type="kk" draft="contributed">ყაზახური</language>
+ <language type="km">კამბოჯიური</language>
+ <language type="ko">კორეული</language>
+ <language type="ku" draft="contributed">ქურთული</language>
+ <language type="ky">ყირგიზული</language>
+ <language type="la">ლათინური</language>
+ <language type="lb">ლუქსემბურგული</language>
+ <language type="ln" draft="contributed">ლინგალა</language>
+ <language type="lo">ლაოსური</language>
+ <language type="lt">ლიტვური</language>
+ <language type="lv">ლატვიური</language>
+ <language type="mk">მაკედონიური</language>
+ <language type="mn" draft="contributed">მონღოლური</language>
+ <language type="mo" draft="contributed">მოლდოვური</language>
+ <language type="ms">მალაიზიური</language>
+ <language type="myn" draft="contributed">მაიას ენები</language>
+ <language type="nap" draft="contributed">ნეაპოლიტანური</language>
+ <language type="ne">ნეპალური</language>
+ <language type="nl">ჰოლანდიური</language>
+ <language type="nl_BE" draft="contributed">ფლომანდიური</language>
+ <language type="nn">ნორვეგიული ნინორსკი</language>
+ <language type="no">ნორვეგიული</language>
+ <language type="nv">ნავახო</language>
+ <language type="oc" draft="contributed">ოციტანური</language>
+ <language type="or" draft="contributed">ორიული</language>
+ <language type="os">ოსური</language>
+ <language type="peo">ძველი სპარსული</language>
+ <language type="pl">პოლონური</language>
+ <language type="pra" draft="contributed">პრაკრიტის ენები</language>
+ <language type="ps" draft="contributed">პუშტუ</language>
+ <language type="pt">პორტუგალიური</language>
+ <language type="pt_BR" draft="contributed">ბრაზილიური პორტუგალიური</language>
+ <language type="pt_PT">იბერიულ-პორტუგალიური</language>
+ <language type="ro">რუმინული</language>
+ <language type="ru">რუსული</language>
+ <language type="sa" draft="contributed">სანსკრიტი</language>
+ <language type="sc">სარდინიული</language>
+ <language type="scn">სიცილიური</language>
+ <language type="sd" draft="contributed">სინდური</language>
+ <language type="sga">ძველი ირლანდიური</language>
+ <language type="sh" draft="contributed">სერბულ-ხორვატული</language>
+ <language type="si" draft="contributed">სინჰალური</language>
+ <language type="sk">სლოვაკური</language>
+ <language type="sl">სლოვენური</language>
+ <language type="sla" draft="contributed">სლავური სხვა</language>
+ <language type="so">სომალიური</language>
+ <language type="sq">ალბანური</language>
+ <language type="sr" draft="contributed">სერბული</language>
+ <language type="st" draft="contributed">სამხრეთ სოთოს ენა</language>
+ <language type="sux">შუმერული</language>
+ <language type="sv">შვედური</language>
+ <language type="sw" draft="contributed">სუაჰილი</language>
+ <language type="tg">ტაჯიკური</language>
+ <language type="th">ტაილანდური</language>
+ <language type="tk">თურქმენული</language>
+ <language type="tlh" draft="contributed">კლინგონი</language>
+ <language type="tn" draft="contributed">ტსვანა</language>
+ <language type="tr">თურქული</language>
+ <language type="tw" draft="contributed">თუი</language>
+ <language type="udm" draft="contributed">უდმურტიული</language>
+ <language type="ug" draft="contributed">უიგურული</language>
+ <language type="uk">უკრაინული</language>
+ <language type="und">უცნობი ან არასწორი ენა</language>
+ <language type="ur" draft="contributed">ურდუ</language>
+ <language type="uz">უზბეკური</language>
+ <language type="vi">ვიეტნამური</language>
+ <language type="xh" draft="contributed">ქსოზა</language>
+ <language type="yi" draft="contributed">იდიში</language>
+ <language type="zh">ჩინური</language>
+ <language type="zh_Hans" draft="contributed">გამარტივებული ჩინური</language>
+ <language type="zh_Hant" draft="contributed">ტრადიციული ჩინური</language>
+ <language type="zu" draft="contributed">ზულუ</language>
+ </languages>
+ <scripts>
+ <script type="Arab">არაბული</script>
+ <script type="Armn">სომხური</script>
+ <script type="Bali" draft="contributed">ბალი</script>
+ <script type="Batk" draft="contributed">ბატაკი</script>
+ <script type="Beng">ბენგალური</script>
+ <script type="Brai">ბრაილი</script>
+ <script type="Copt" draft="contributed">კოპტური</script>
+ <script type="Cprt" draft="contributed">კვიპროსული</script>
+ <script type="Cyrl">კირილიცა</script>
+ <script type="Cyrs">ძველი საეკლესიო კირილიცა</script>
+ <script type="Deva" draft="contributed">დევანაგარი</script>
+ <script type="Egyd" draft="contributed">ეგვიპტური დემოტიკური</script>
+ <script type="Egyh" draft="contributed">ეგვიპტური ჰიერატიკული</script>
+ <script type="Egyp" draft="contributed">ეგვიპტური იეროგლიფური</script>
+ <script type="Ethi">ეთიოპური</script>
+ <script type="Geok">ხუცური</script>
+ <script type="Geor">ქართული</script>
+ <script type="Glag" draft="contributed">გლაგოლიცა</script>
+ <script type="Goth">გოთური</script>
+ <script type="Grek">ბერძნული</script>
+ <script type="Gujr" draft="contributed">გუჯარათული</script>
+ <script type="Guru" draft="contributed">გურმუხული</script>
+ <script type="Hani" draft="contributed">ჰანი</script>
+ <script type="Hans" draft="contributed">გამარტივებული ჰანი</script>
+ <script type="Hant">ტრადიციული ჰანი</script>
+ <script type="Hebr">ებრაული</script>
+ <script type="Hira">ჰირაგანა</script>
+ <script type="Hrkt">კატაკანა ან ჰირაგანა</script>
+ <script type="Hung">ძველი უნგრული</script>
+ <script type="Jpan">იაპონური</script>
+ <script type="Kana">კატაკანა</script>
+ <script type="Khmr" draft="contributed">ქჰმერული</script>
+ <script type="Laoo" draft="contributed">ლაოსური</script>
+ <script type="Latn">ლათინური</script>
+ <script type="Lina" draft="contributed">წრფივი A</script>
+ <script type="Linb" draft="contributed">წრფივი B</script>
+ <script type="Maya">მაიას იეროგლიფები</script>
+ <script type="Mong">მონღოლური</script>
+ <script type="Phnx" draft="contributed">ფინიკიური</script>
+ <script type="Runr" draft="contributed">რუნული</script>
+ <script type="Syrc">სირიული</script>
+ <script type="Syre" draft="contributed">ესტრანჯელოსეული სირიული</script>
+ <script type="Syrj" draft="contributed">დასავლეთი სირიული</script>
+ <script type="Syrn" draft="contributed">აღმოსავლეთი სირიული</script>
+ <script type="Taml">ტამილური</script>
+ <script type="Thai">ტაილანდური</script>
+ <script type="Tibt">ტიბეტური</script>
+ <script type="Xpeo">ძველი სპარსული</script>
+ <script type="Xsux" draft="contributed">შუმერულ-აქადური ლურსმნული</script>
+ <script type="Zxxx">დაუწერელი</script>
+ <script type="Zzzz">უცნობი ან არასწორი დამწერლობა</script>
+ </scripts>
+ <territories>
+ <territory type="001">მსოფლიო</territory>
+ <territory type="002">აფრიკა</territory>
+ <territory type="003">ჩრდილოეთ ამერიკა</territory>
+ <territory type="005">სამხრეთი ამერიკა</territory>
+ <territory type="009" draft="contributed">ოკეანეთი</territory>
+ <territory type="011">დასავლეთი აფრიკა</territory>
+ <territory type="013">ცენტრალური ამერიკა</territory>
+ <territory type="014">აღმოსავლეთი აფრიკა</territory>
+ <territory type="015">ჩრდილოეთი აფრიკა</territory>
+ <territory type="017">შუა აფრიკა</territory>
+ <territory type="018">სამხრეთი აფრიკა</territory>
+ <territory type="019">ამერიკები</territory>
+ <territory type="021">ჩრდილოეთი ამერიკა</territory>
+ <territory type="029" draft="contributed">კარიბი</territory>
+ <territory type="030">აღმოსავლეთი აზია</territory>
+ <territory type="034">სამხრეთი აზია</territory>
+ <territory type="035">სამხრეთ-აღმოსავლეთი აზია</territory>
+ <territory type="039">სამხრეთი ევროპა</territory>
+ <territory type="053">ავსტრალია და ახალი ზელანდია</territory>
+ <territory type="054" draft="contributed">მელანეზია</territory>
+ <territory type="057" draft="contributed">მირონეზია</territory>
+ <territory type="061">პოლინეზია</territory>
+ <territory type="062">სამხრეთ-ცენტრალური აზია</territory>
+ <territory type="142">აზია</territory>
+ <territory type="143">ცენტრალური აზია</territory>
+ <territory type="145">დასავლეთი აზია</territory>
+ <territory type="150">ევროპა</territory>
+ <territory type="151">აღმოსავლეთი ევროპა</territory>
+ <territory type="154">ჩრდილოეთი ევროპა</territory>
+ <territory type="155">დასავლეთი ევროპა</territory>
+ <territory type="172">დამოუკიდებელ სახელმწიფოთა თანამეგობრობა</territory>
+ <territory type="419" draft="contributed">ლათინური ამერიკა და კარიბი</territory>
+ <territory type="AD">ანდორა</territory>
+ <territory type="AE">არაბეთის გაერთიანებული ემირატები</territory>
+ <territory type="AF">ავღანეთი</territory>
+ <territory type="AG">ანტიგუა და ბარბუდა</territory>
+ <territory type="AI">ანგვილა</territory>
+ <territory type="AL">ალბანეთი</territory>
+ <territory type="AM">სომხეთი</territory>
+ <territory type="AN" draft="contributed">ნიდერლანდების ანტილები</territory>
+ <territory type="AO">ანგოლა</territory>
+ <territory type="AQ">ანტარქტიკა</territory>
+ <territory type="AR">არგენტინა</territory>
+ <territory type="AS">ამერიკული სამოა</territory>
+ <territory type="AT">ავსტრია</territory>
+ <territory type="AU">ავსტრალია</territory>
+ <territory type="AW">არუბა</territory>
+ <territory type="AX">ალანდის კუნძულები</territory>
+ <territory type="AZ">აზერბაიჯანი</territory>
+ <territory type="BA">ბოსნია და ჰერცეგოვინა</territory>
+ <territory type="BB">ბარბადოსი</territory>
+ <territory type="BD">ბანგლადეში</territory>
+ <territory type="BE">ბელგია</territory>
+ <territory type="BF">ბურკინა-ფასო</territory>
+ <territory type="BG">ბულგარეთი</territory>
+ <territory type="BH">ბაჰრეინი</territory>
+ <territory type="BI">ბურუნდი</territory>
+ <territory type="BJ">ბენინი</territory>
+ <territory type="BM">ბერმუდა</territory>
+ <territory type="BN">ბრუნეი</territory>
+ <territory type="BO">ბოლივია</territory>
+ <territory type="BR">ბრაზილია</territory>
+ <territory type="BS">ბაჰამის კუნძულები</territory>
+ <territory type="BT">ბუტანი</territory>
+ <territory type="BV" draft="contributed">ბუვეს კუნძული</territory>
+ <territory type="BW">ბოტსვანა</territory>
+ <territory type="BY">ბელორუსია</territory>
+ <territory type="BZ">ბელიზი</territory>
+ <territory type="CA">კანადა</territory>
+ <territory type="CD" draft="contributed">კონგო - კინშასა</territory>
+ <territory type="CF">ცენტრალური აფრიკის რესპუბლიკა</territory>
+ <territory type="CG">კონგო</territory>
+ <territory type="CH">შვეიცარია</territory>
+ <territory type="CI">სპილოს ძვლის სანაპირო</territory>
+ <territory type="CK">კუკის კუნძულები</territory>
+ <territory type="CL">ჩილე</territory>
+ <territory type="CM">კამერუნი</territory>
+ <territory type="CN">ჩინეთი</territory>
+ <territory type="CO">კოლუმბია</territory>
+ <territory type="CR">კოსტა-რიკა</territory>
+ <territory type="CS">სერბია და მონტენეგრო</territory>
+ <territory type="CU">კუბა</territory>
+ <territory type="CV">კაბო-ვერდე</territory>
+ <territory type="CX">შობის კუნძული</territory>
+ <territory type="CY">კვიპროსი</territory>
+ <territory type="CZ">ჩეხეთის რესპუბლიკა</territory>
+ <territory type="DE">გერმანია</territory>
+ <territory type="DJ">ჯიბუტი</territory>
+ <territory type="DK">დანია</territory>
+ <territory type="DM">დომინიკა</territory>
+ <territory type="DO">დომინიკანის რესპუბლიკა</territory>
+ <territory type="DZ">ალჟირი</territory>
+ <territory type="EC">ეკვადორი</territory>
+ <territory type="EE">ესტონეთი</territory>
+ <territory type="EG">ეგვიპტე</territory>
+ <territory type="EH">დასავლეთი საჰარა</territory>
+ <territory type="ER">ერიტრეა</territory>
+ <territory type="ES">ესპანეთი</territory>
+ <territory type="ET">ეთიოპია</territory>
+ <territory type="FI">ფინეთი</territory>
+ <territory type="FJ">ფიჯი</territory>
+ <territory type="FK">ფალკლენდის კუნძულები</territory>
+ <territory type="FM">მიკრონეზია</territory>
+ <territory type="FO">ფაროს კუნძულები</territory>
+ <territory type="FR">საფრანგეთი</territory>
+ <territory type="GA">გაბონი</territory>
+ <territory type="GB">დიდი ბრიტანეთი</territory>
+ <territory type="GD">გრენადა</territory>
+ <territory type="GE">საქართველო</territory>
+ <territory type="GH">განა</territory>
+ <territory type="GI">გიბრალტარი</territory>
+ <territory type="GL">გრენლანდია</territory>
+ <territory type="GM">გამბია</territory>
+ <territory type="GN">გვინეა</territory>
+ <territory type="GP" draft="contributed">გვადელუპე</territory>
+ <territory type="GQ">ეკვატორული გვინეა</territory>
+ <territory type="GR">საბერძნეთი</territory>
+ <territory type="GS" draft="contributed">სამხრეთი ჯორჯია და სამხრეთ სენდვიჩის კუნძულები</territory>
+ <territory type="GT">გვატემალა</territory>
+ <territory type="GU" draft="contributed">გუამი</territory>
+ <territory type="GW">გვინეა-ბისაუ</territory>
+ <territory type="GY">გაიანა</territory>
+ <territory type="HK" draft="contributed">ჰონგ კონგი</territory>
+ <territory type="HK" alt="short">ჰონგ კონგი</territory>
+ <territory type="HM" draft="contributed">ჰერდის კუნძული და მაკდონალდის კუნძულები</territory>
+ <territory type="HN">ჰონდურასი</territory>
+ <territory type="HR">ჰორვატია</territory>
+ <territory type="HT">ჰაიტი</territory>
+ <territory type="HU">უნგრეთი</territory>
+ <territory type="ID">ინდონეზია</territory>
+ <territory type="IE">ირლანდია</territory>
+ <territory type="IL">ისრაელი</territory>
+ <territory type="IM" draft="contributed">მანის კუნძული</territory>
+ <territory type="IN">ინდოეთი</territory>
+ <territory type="IO">ბრიტანული ტერიტორია ინდოეთის ოკეანეში</territory>
+ <territory type="IQ">ერაყი</territory>
+ <territory type="IR">ირანი</territory>
+ <territory type="IS">ისლანდია</territory>
+ <territory type="IT">იტალია</territory>
+ <territory type="JE" draft="contributed">ჯერსი</territory>
+ <territory type="JM">იამაიკა</territory>
+ <territory type="JO">იორდანია</territory>
+ <territory type="JP">იაპონია</territory>
+ <territory type="KE">კენია</territory>
+ <territory type="KG">ყირგიზეთი</territory>
+ <territory type="KH">კამბოჯა</territory>
+ <territory type="KI">კირიბატი</territory>
+ <territory type="KM">კომორის კუნძულები</territory>
+ <territory type="KN">სენტ-კიტსი და ნევისი</territory>
+ <territory type="KP">ჩრდილოეთი კორეა</territory>
+ <territory type="KR">სამხრეთი კორეა</territory>
+ <territory type="KW">კუვეიტი</territory>
+ <territory type="KY">კაიმანის კუნძულები</territory>
+ <territory type="KZ">ყაზახეთი</territory>
+ <territory type="LA">ლაოსი</territory>
+ <territory type="LB">ლიბანი</territory>
+ <territory type="LC">სენტ-ლუსია</territory>
+ <territory type="LI">ლიხტენშტაინი</territory>
+ <territory type="LK">შრი-ლანკა</territory>
+ <territory type="LR">ლიბერია</territory>
+ <territory type="LS" draft="contributed">ლესოთო</territory>
+ <territory type="LT">ლიტვა</territory>
+ <territory type="LU">ლუქსემბურგი</territory>
+ <territory type="LV">ლატვია</territory>
+ <territory type="LY">ლიბია</territory>
+ <territory type="MA">მაროკო</territory>
+ <territory type="MC">მონაკო</territory>
+ <territory type="MD">მოლდოვა</territory>
+ <territory type="ME">მონტენეგრო</territory>
+ <territory type="MG">მადაგასკარი</territory>
+ <territory type="MH">მარშალის კუნძულები</territory>
+ <territory type="MK">მაკედონია</territory>
+ <territory type="ML">მალი</territory>
+ <territory type="MM">მიანმარი</territory>
+ <territory type="MN">მონღოლეთი</territory>
+ <territory type="MO" draft="contributed">მაკაო</territory>
+ <territory type="MO" alt="short">მაკაო</territory>
+ <territory type="MQ" draft="contributed">მარტინიკი</territory>
+ <territory type="MR">მავრიტანია</territory>
+ <territory type="MS">მონსერატი</territory>
+ <territory type="MT">მალტა</territory>
+ <territory type="MU">მავრიკია</territory>
+ <territory type="MV">მალდივის კუნძულები</territory>
+ <territory type="MW">მალავი</territory>
+ <territory type="MX">მექსიკა</territory>
+ <territory type="MY">მალაიზია</territory>
+ <territory type="MZ">მოზამბიკი</territory>
+ <territory type="NA">ნამიბია</territory>
+ <territory type="NC" draft="contributed">ახალი კალედონია</territory>
+ <territory type="NE">ნიგერი</territory>
+ <territory type="NF">ნორფოლკის კუნძული</territory>
+ <territory type="NG">ნიგერია</territory>
+ <territory type="NI">ნიკარაგუა</territory>
+ <territory type="NL">ნიდერლანდები</territory>
+ <territory type="NO">ნორვეგია</territory>
+ <territory type="NP">ნეპალი</territory>
+ <territory type="NR">ნაურუ</territory>
+ <territory type="NZ">ახალი ზელანდია</territory>
+ <territory type="OM">ომანი</territory>
+ <territory type="PA">პანამა</territory>
+ <territory type="PE">პერუ</territory>
+ <territory type="PF" draft="contributed">ფრანგული პოლინეზია</territory>
+ <territory type="PG">პაპუა-ახალი გვინეა</territory>
+ <territory type="PH">ფილიპინები</territory>
+ <territory type="PK">პაკისტანი</territory>
+ <territory type="PL">პოლონეთი</territory>
+ <territory type="PM" draft="contributed">სენტ-პიერი და მიქელონი</territory>
+ <territory type="PR">პუერტო რიკო</territory>
+ <territory type="PS">პალესტინის ტერიტორია</territory>
+ <territory type="PT">პორტუგალია</territory>
+ <territory type="PW">პალაუ</territory>
+ <territory type="PY">პარაგვაი</territory>
+ <territory type="QA">კატარი</territory>
+ <territory type="QO" draft="contributed">დაშორებული ოკეანია</territory>
+ <territory type="QU">ევროკავშირი</territory>
+ <territory type="RE" draft="contributed">რეიუნიონი</territory>
+ <territory type="RO">რუმინეთი</territory>
+ <territory type="RS">სერბია</territory>
+ <territory type="RU">რუსეთი</territory>
+ <territory type="RW">რუანდა</territory>
+ <territory type="SA">საუდის არაბეთი</territory>
+ <territory type="SB">სოლომონის კუნძულები</territory>
+ <territory type="SC">სეიშელის კუნძულები</territory>
+ <territory type="SD">სუდანი</territory>
+ <territory type="SE">შვეცია</territory>
+ <territory type="SG">სინგაპური</territory>
+ <territory type="SH" draft="contributed">წმინდა ელენეს კუნძული</territory>
+ <territory type="SI">სლოვენია</territory>
+ <territory type="SK">სლოვაკეთი</territory>
+ <territory type="SL">სიერა-ლეონე</territory>
+ <territory type="SM">სან-მარინო</territory>
+ <territory type="SN">სენეგალი</territory>
+ <territory type="SO">სომალი</territory>
+ <territory type="SR">სურინამი</territory>
+ <territory type="ST">საო-ტომე და პრინსიპი</territory>
+ <territory type="SV">სალვადორი</territory>
+ <territory type="SY">სირია</territory>
+ <territory type="SZ">სვაზილენდი</territory>
+ <territory type="TD">ჩადი</territory>
+ <territory type="TF" draft="contributed">ფრანგული სამხრეთის ტერიტორიები</territory>
+ <territory type="TG">ტოგო</territory>
+ <territory type="TH">ტაილანდი</territory>
+ <territory type="TJ">ტაჯიკეთი</territory>
+ <territory type="TL">აღმოსავლეთი ტიმორი</territory>
+ <territory type="TM">თურქმენეთი</territory>
+ <territory type="TN">ტუნისი</territory>
+ <territory type="TO">ტონგა</territory>
+ <territory type="TR">თურქეთი</territory>
+ <territory type="TT">ტრინიდადი და ტობაგო</territory>
+ <territory type="TV">ტუვალუ</territory>
+ <territory type="TW">ტაივანი</territory>
+ <territory type="TZ">ტანზანია</territory>
+ <territory type="UA">უკრაინა</territory>
+ <territory type="UG">უგანდა</territory>
+ <territory type="UM">შეერთებული შტატების მცირე დაშორებული კუნძულები</territory>
+ <territory type="US">ამერიკის შეერთებული შტატები</territory>
+ <territory type="UY">ურუგვაი</territory>
+ <territory type="UZ">უზბეკეთი</territory>
+ <territory type="VA">ვატიკანი</territory>
+ <territory type="VC">სენტ-ვინსენტი და გრენადინები</territory>
+ <territory type="VE">ვენესუელა</territory>
+ <territory type="VN">ვიეტნამი</territory>
+ <territory type="VU">ვანუატუ</territory>
+ <territory type="WF" draft="contributed">ვალისი და ფუტუნა</territory>
+ <territory type="WS">სამოა</territory>
+ <territory type="YE">იემენი</territory>
+ <territory type="ZA">სამხრეთ აფრიკა</territory>
+ <territory type="ZM">ზამბია</territory>
+ <territory type="ZW">ზიმბაბვე</territory>
+ <territory type="ZZ">უცნობი ან არასწორი რეგიონი</territory>
+ </territories>
+ <keys>
+ <key type="calendar">კალენდარი</key>
+ <key type="collation">მიმდევრობა</key>
+ <key type="currency">ვალუტა</key>
+ </keys>
+ <types>
+ <type type="big5han" key="collation">ტრადიციული ჩინური</type>
+ <type type="buddhist" key="calendar">ბუდისტური კალენდარი</type>
+ <type type="chinese" key="calendar">ჩინური კალენდარი</type>
+ <type type="direct" key="collation">პირდაპირი მიმდევრობა</type>
+ <type type="gb2312han" key="collation">გამარტივებული ჩინური</type>
+ <type type="gregorian" key="calendar">გრიგორიანული კალენდარი</type>
+ <type type="hebrew" key="calendar">ებრაული კალენდარი</type>
+ <type type="indian" key="calendar" draft="contributed">ინდური ეროვნული კალენდარი</type>
+ <type type="islamic" key="calendar">ისლამური კალენდარი</type>
+ <type type="islamic-civil" key="calendar">ისლამური სამოქალაქო კალენდარი</type>
+ <type type="japanese" key="calendar">იაპონური კალენდარი</type>
+ <type type="roc" key="calendar" draft="contributed">ჩინეთის რესპუბლიკის კალენდარი</type>
+ <type type="traditional" key="collation">ტრადიციული</type>
+ </types>
+ <measurementSystemNames>
+ <measurementSystemName type="US" draft="contributed">US</measurementSystemName>
+ <measurementSystemName type="metric" draft="contributed">Metric</measurementSystemName>
+ </measurementSystemNames>
+ </localeDisplayNames>
+ <characters>
+ <exemplarCharacters>[ა ⴀ ბ ⴁ გ ⴂ დ ⴃ ე ⴄ ვ ⴅ ზ ⴆ ჱ ⴡ თ ⴇ ი ⴈ კ ⴉ ლ ⴊ მ ⴋ ნ ⴌ ჲ ⴢ ო ⴍ პ ⴎ ჟ ⴏ რ ⴐ ს ⴑ ტ ⴒ ჳ ⴣ უ ⴓ ფ ⴔ ქ ⴕ ღ ⴖ ყ ⴗ შ ⴘ ჩ ⴙ ც ⴚ ძ ⴛ წ ⴜ ჭ ⴝ ხ ⴞ ჴ ⴤ ჯ ⴟ ჰ ⴠ ჵ ⴥ ჶ-ჺ]</exemplarCharacters>
+ </characters>
+ <delimiters>
+ <quotationStart draft="contributed">“</quotationStart>
+ <quotationEnd draft="contributed">”</quotationEnd>
+ <alternateQuotationStart draft="contributed">‘</alternateQuotationStart>
+ <alternateQuotationEnd draft="contributed">’</alternateQuotationEnd>
+ </delimiters>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <months>
+ <monthContext type="format">
+ <monthWidth type="abbreviated">
+ <month type="1" draft="provisional">იან</month>
+ <month type="2" draft="provisional">თებ</month>
+ <month type="3" draft="provisional">მარ</month>
+ <month type="4" draft="provisional">აპრ</month>
+ <month type="5" draft="provisional">მაი</month>
+ <month type="6" draft="provisional">ივნ</month>
+ <month type="7" draft="provisional">ივლ</month>
+ <month type="8" draft="provisional">აგვ</month>
+ <month type="9" draft="provisional">სექ</month>
+ <month type="10" draft="provisional">ოქტ</month>
+ <month type="11" draft="provisional">ნოე</month>
+ <month type="12" draft="provisional">დეკ</month>
+ </monthWidth>
+ <monthWidth type="wide">
+ <month type="1" draft="provisional">იანვარი</month>
+ <month type="2" draft="provisional">თებერვალი</month>
+ <month type="3" draft="provisional">მარტი</month>
+ <month type="4" draft="provisional">აპრილი</month>
+ <month type="5" draft="provisional">მაისი</month>
+ <month type="6" draft="provisional">ივნისი</month>
+ <month type="7" draft="provisional">ივლისი</month>
+ <month type="8" draft="provisional">აგვისტო</month>
+ <month type="9" draft="provisional">სექტემბერი</month>
+ <month type="10" draft="provisional">ოქტომბერი</month>
+ <month type="11" draft="provisional">ნოემბერი</month>
+ <month type="12" draft="provisional">დეკემბერი</month>
+ </monthWidth>
+ </monthContext>
+ <monthContext type="stand-alone">
+ <monthWidth type="narrow">
+ <month type="1" draft="provisional">ი</month>
+ <month type="2" draft="provisional">თ</month>
+ <month type="3" draft="provisional">მ</month>
+ <month type="4" draft="provisional">ა</month>
+ <month type="5" draft="provisional">მ</month>
+ <month type="6" draft="provisional">ი</month>
+ <month type="7" draft="provisional">ი</month>
+ <month type="8" draft="provisional">ა</month>
+ <month type="9" draft="provisional">ს</month>
+ <month type="10" draft="provisional">ო</month>
+ <month type="11" draft="provisional">ნ</month>
+ <month type="12" draft="provisional">დ</month>
+ </monthWidth>
+ </monthContext>
+ </months>
+ <days>
+ <dayContext type="format">
+ <dayWidth type="abbreviated">
+ <day type="sun" draft="provisional">კვი</day>
+ <day type="mon" draft="provisional">ორშ</day>
+ <day type="tue" draft="provisional">სამ</day>
+ <day type="wed" draft="provisional">ოთხ</day>
+ <day type="thu" draft="provisional">ხუთ</day>
+ <day type="fri" draft="provisional">პარ</day>
+ <day type="sat" draft="provisional">შაბ</day>
+ </dayWidth>
+ <dayWidth type="wide">
+ <day type="sun" draft="provisional">კვირა</day>
+ <day type="mon" draft="provisional">ორშაბათი</day>
+ <day type="tue" draft="provisional">სამშაბათი</day>
+ <day type="wed" draft="provisional">ოთხშაბათი</day>
+ <day type="thu" draft="provisional">ხუთშაბათი</day>
+ <day type="fri" draft="provisional">პარასკევი</day>
+ <day type="sat" draft="provisional">შაბათი</day>
+ </dayWidth>
+ </dayContext>
+ <dayContext type="stand-alone">
+ <dayWidth type="narrow">
+ <day type="sun" draft="provisional">კ</day>
+ <day type="mon" draft="provisional">ო</day>
+ <day type="tue" draft="provisional">ს</day>
+ <day type="wed" draft="provisional">ო</day>
+ <day type="thu" draft="provisional">ხ</day>
+ <day type="fri" draft="provisional">პ</day>
+ <day type="sat" draft="provisional">შ</day>
+ </dayWidth>
+ </dayContext>
+ </days>
+ <quarters>
+ <quarterContext type="format">
+ <quarterWidth type="abbreviated">
+ <quarter type="1">I კვ.</quarter>
+ <quarter type="2">II კვ.</quarter>
+ <quarter type="3">III კვ.</quarter>
+ <quarter type="4">IV კვ.</quarter>
+ </quarterWidth>
+ <quarterWidth type="wide">
+ <quarter type="1">1-ლი კვარტალი</quarter>
+ <quarter type="2">მე-2 კვარტალი</quarter>
+ <quarter type="3">მე-3 კვარტალი</quarter>
+ <quarter type="4">მე-4 კვარტალი</quarter>
+ </quarterWidth>
+ </quarterContext>
+ <quarterContext type="stand-alone">
+ <quarterWidth type="wide">
+ <quarter type="1" draft="provisional">I კვარტალი</quarter>
+ <quarter type="2" draft="provisional">II კვარტალი</quarter>
+ <quarter type="3" draft="provisional">III კვარტალი</quarter>
+ <quarter type="4" draft="provisional">IV კვარტალი</quarter>
+ </quarterWidth>
+ </quarterContext>
+ </quarters>
+ <am draft="provisional">დილის</am>
+ <pm draft="provisional">საღამოს</pm>
+ <eras>
+ <eraNames>
+ <era type="0" draft="provisional">ჩვენს წელთაღრიცხვამდე</era>
+ <era type="1" draft="provisional">ჩვენი წელთაღრიცხვით</era>
+ </eraNames>
+ <eraAbbr>
+ <era type="0" draft="provisional">ჩვენს წელთაღრიცხვამდე</era>
+ <era type="1" draft="provisional">ჩვენი წელთაღრიცხვით</era>
+ </eraAbbr>
+ <eraNarrow>
+ <era type="0" draft="provisional">ჩვენს წელთაღრიცხვამდე</era>
+ <era type="1" draft="provisional">ჩვენი წელთაღრიცხვით</era>
+ </eraNarrow>
+ </eras>
+ <dateFormats>
+ <dateFormatLength type="full">
+ <dateFormat>
+ <pattern draft="unconfirmed">EEEE, y MMMM dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern draft="unconfirmed">y MMMM d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="medium">
+ <dateFormat>
+ <pattern draft="unconfirmed">y MMM d</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern draft="unconfirmed">yy/MM/dd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="full">
+ <timeFormat>
+ <pattern draft="provisional">HH:mm:ss zzzz</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern draft="provisional">HH:mm:ss z</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="medium">
+ <timeFormat>
+ <pattern draft="provisional">HH:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern draft="provisional">HH:mm</pattern>
+ </timeFormat>
+ </timeFormatLength>
+ </timeFormats>
+ <dateTimeFormats>
+ <availableFormats>
+ <dateFormatItem id="HHmm" draft="unconfirmed">HH:mm</dateFormatItem>
+ <dateFormatItem id="HHmmss" draft="unconfirmed">HH:mm:ss</dateFormatItem>
+ <dateFormatItem id="MMMdd" draft="unconfirmed">dd MMM</dateFormatItem>
+ <dateFormatItem id="MMdd" draft="contributed">dd/MM</dateFormatItem>
+ <dateFormatItem id="hhmm" draft="unconfirmed">hh:mm a</dateFormatItem>
+ <dateFormatItem id="hhmmss" draft="unconfirmed">hh:mm:ss a</dateFormatItem>
+ <dateFormatItem id="yyMM" draft="unconfirmed">MM/yy</dateFormatItem>
+ <dateFormatItem id="yyMMMEEEd" draft="unconfirmed">EEE, d MMM, yy</dateFormatItem>
+ <dateFormatItem id="yyMMMd" draft="unconfirmed">d MMM, yy</dateFormatItem>
+ <dateFormatItem id="yyMMdd" draft="unconfirmed">dd/MM/yy</dateFormatItem>
+ <dateFormatItem id="yyQ" draft="unconfirmed">Q yy</dateFormatItem>
+ <dateFormatItem id="yyQQQQ" draft="unconfirmed">QQQQ yy</dateFormatItem>
+ </availableFormats>
+ </dateTimeFormats>
+ <fields>
+ <field type="era">
+ <displayName draft="provisional">ხანა</displayName>
+ </field>
+ <field type="year">
+ <displayName draft="provisional">წელი</displayName>
+ </field>
+ <field type="month">
+ <displayName draft="provisional">თვე</displayName>
+ </field>
+ <field type="week">
+ <displayName draft="provisional">კვირა</displayName>
+ </field>
+ <field type="day">
+ <displayName draft="provisional">დღე</displayName>
+ <relative type="-3" draft="provisional">სამი დღის წინ</relative>
+ <relative type="-2" draft="provisional">გუშინწინ</relative>
+ <relative type="-1" draft="provisional">გუშინ</relative>
+ <relative type="0" draft="provisional">დღეს</relative>
+ <relative type="1" draft="provisional">ხვალ</relative>
+ <relative type="2" draft="provisional">ზეგ</relative>
+ <relative type="3" draft="provisional">სამი დღის შემდეგ</relative>
+ </field>
+ <field type="weekday">
+ <displayName draft="provisional">კვირის დღე</displayName>
+ </field>
+ <field type="dayperiod">
+ <displayName draft="provisional">დღის პერიოდი</displayName>
+ </field>
+ <field type="hour">
+ <displayName draft="provisional">საათი</displayName>
+ </field>
+ <field type="minute">
+ <displayName draft="provisional">წუთი</displayName>
+ </field>
+ <field type="second">
+ <displayName draft="provisional">წამი</displayName>
+ </field>
+ <field type="zone">
+ <displayName draft="provisional">ზონა</displayName>
+ </field>
+ </fields>
+ </calendar>
+ </calendars>
+ <timeZoneNames>
+ <hourFormat draft="contributed">+HH:mm;-HH:mm</hourFormat>
+ <gmtFormat draft="unconfirmed">GMT{0}</gmtFormat>
+ <regionFormat draft="contributed">{0}</regionFormat>
+ <fallbackFormat draft="contributed">{1} ({0})</fallbackFormat>
+ <zone type="Etc/Unknown">
+ <exemplarCity draft="contributed">უცნობი</exemplarCity>
+ </zone>
+ <zone type="America/Antigua">
+ <exemplarCity draft="provisional">ბარბუდა</exemplarCity>
+ </zone>
+ <zone type="America/Anguilla">
+ <exemplarCity draft="provisional">ანგილა</exemplarCity>
+ </zone>
+ <zone type="America/Curacao">
+ <exemplarCity draft="provisional">ნიდერლანდის</exemplarCity>
+ </zone>
+ <zone type="Africa/Luanda">
+ <exemplarCity draft="provisional">ანგოლა</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Rothera">
+ <exemplarCity draft="contributed">როთერა</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Palmer">
+ <exemplarCity draft="contributed">პალმერი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/South_Pole">
+ <exemplarCity draft="contributed">სამხრეთი პოლუსი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Syowa">
+ <exemplarCity draft="contributed">სიოუა</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Mawson">
+ <exemplarCity draft="contributed">მოუსონი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Davis">
+ <exemplarCity draft="contributed">დევისი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Vostok">
+ <exemplarCity draft="contributed">ვოსტოკი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/Casey">
+ <exemplarCity draft="contributed">კეისი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/DumontDUrville">
+ <exemplarCity draft="contributed">დიუმონ დ'ურვილი</exemplarCity>
+ </zone>
+ <zone type="Antarctica/McMurdo">
+ <exemplarCity draft="contributed">მაკმურდო</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Rio_Gallegos">
+ <exemplarCity draft="contributed">რიო გალეგოსი</exemplarCity>
+ </zone>
+ <zone type="America/Mendoza">
+ <exemplarCity draft="contributed">მენდოზა</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Juan">
+ <exemplarCity draft="contributed">სან ხუანი</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Ushuaia">
+ <exemplarCity draft="contributed">უშუაია</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/La_Rioja">
+ <exemplarCity draft="contributed">ლა რიოხა</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/San_Luis">
+ <exemplarCity draft="contributed">სან ლუისი</exemplarCity>
+ </zone>
+ <zone type="America/Catamarca">
+ <exemplarCity draft="contributed">კატამარკა</exemplarCity>
+ </zone>
+ <zone type="America/Jujuy">
+ <exemplarCity draft="contributed">ჯუჯუი</exemplarCity>
+ </zone>
+ <zone type="America/Argentina/Tucuman">
+ <exemplarCity draft="contributed">ტუკუმანი</exemplarCity>
+ </zone>
+ <zone type="America/Cordoba">
+ <exemplarCity draft="contributed">კორდობა</exemplarCity>
+ </zone>
+ <zone type="America/Buenos_Aires">
+ <exemplarCity draft="contributed">ბუენოს აირესი</exemplarCity>
+ </zone>
+ <zone type="Australia/Perth">
+ <exemplarCity draft="contributed">პერთი</exemplarCity>
+ </zone>
+ <zone type="Australia/Eucla">
+ <exemplarCity draft="contributed">ეუკლა</exemplarCity>
+ </zone>
+ <zone type="Australia/Darwin">
+ <exemplarCity draft="contributed">დარვინი</exemplarCity>
+ </zone>
+ <zone type="Australia/Adelaide">
+ <exemplarCity draft="contributed">ადელაიდა</exemplarCity>
+ </zone>
+ <zone type="Australia/Broken_Hill">
+ <exemplarCity draft="contributed">ბროუკენ ჰილი</exemplarCity>
+ </zone>
+ <zone type="Australia/Currie">
+ <exemplarCity draft="contributed">ქური</exemplarCity>
+ </zone>
+ <zone type="Australia/Melbourne">
+ <exemplarCity draft="contributed">მელბურნი</exemplarCity>
+ </zone>
+ <zone type="Australia/Hobart">
+ <exemplarCity draft="contributed">ჰობარტი</exemplarCity>
+ </zone>
+ <zone type="Australia/Lindeman">
+ <exemplarCity draft="contributed">ლინდმანი</exemplarCity>
+ </zone>
+ <zone type="Australia/Sydney">
+ <exemplarCity draft="contributed">სიდნეი</exemplarCity>
+ </zone>
+ <zone type="Australia/Brisbane">
+ <exemplarCity draft="contributed">ბრისბეინი</exemplarCity>
+ </zone>
+ <zone type="Australia/Lord_Howe">
+ <exemplarCity draft="contributed">ლორდ ჰოუი</exemplarCity>
+ </zone>
+ <zone type="America/Aruba">
+ <exemplarCity draft="provisional">არუბა</exemplarCity>
+ </zone>
+ <zone type="America/Barbados">
+ <exemplarCity draft="provisional">ბარბადოსი</exemplarCity>
+ </zone>
+ <zone type="Africa/Ouagadougou">
+ <exemplarCity draft="provisional">ბურკინა ფასო</exemplarCity>
+ </zone>
+ <zone type="Africa/Bujumbura">
+ <exemplarCity draft="provisional">ბურუნდი</exemplarCity>
+ </zone>
+ <zone type="Africa/Porto-Novo">
+ <exemplarCity draft="provisional">ბენინი</exemplarCity>
+ </zone>
+ <zone type="America/La_Paz">
+ <exemplarCity draft="provisional">ბოლივია</exemplarCity>
+ </zone>
+ <zone type="America/Eirunepe">
+ <exemplarCity draft="contributed">ეირუნეპე</exemplarCity>
+ </zone>
+ <zone type="America/Rio_Branco">
+ <exemplarCity draft="contributed">რიო ბრანკო</exemplarCity>
+ </zone>
+ <zone type="America/Porto_Velho">
+ <exemplarCity draft="contributed">პორტო ველჰო</exemplarCity>
+ </zone>
+ <zone type="America/Boa_Vista">
+ <exemplarCity draft="contributed">ბოა ვისტა</exemplarCity>
+ </zone>
+ <zone type="America/Manaus">
+ <exemplarCity draft="contributed">მანაუსი</exemplarCity>
+ </zone>
+ <zone type="America/Cuiaba">
+ <exemplarCity draft="contributed">კუიაბა</exemplarCity>
+ </zone>
+ <zone type="America/Campo_Grande">
+ <exemplarCity draft="contributed">კამპო გრანდე</exemplarCity>
+ </zone>
+ <zone type="America/Belem">
+ <exemplarCity draft="contributed">ბელემი</exemplarCity>
+ </zone>
+ <zone type="America/Araguaina">
+ <exemplarCity draft="contributed">არაგუაინა</exemplarCity>
+ </zone>
+ <zone type="America/Sao_Paulo">
+ <exemplarCity draft="contributed">საო პაულო</exemplarCity>
+ </zone>
+ <zone type="America/Bahia">
+ <exemplarCity draft="contributed">ბაია</exemplarCity>
+ </zone>
+ <zone type="America/Fortaleza">
+ <exemplarCity draft="contributed">ფორტალეზა</exemplarCity>
+ </zone>
+ <zone type="America/Maceio">
+ <exemplarCity draft="contributed">მასეიო</exemplarCity>
+ </zone>
+ <zone type="America/Recife">
+ <exemplarCity draft="contributed">რეციფე</exemplarCity>
+ </zone>
+ <zone type="America/Noronha">
+ <exemplarCity draft="contributed">ნორონია</exemplarCity>
+ </zone>
+ <zone type="America/Nassau">
+ <exemplarCity draft="provisional">ბაჰამის კუნძულები</exemplarCity>
+ </zone>
+ <zone type="Africa/Gaborone">
+ <exemplarCity draft="provisional">ბოტსვანა</exemplarCity>
+ </zone>
+ <zone type="America/Belize">
+ <exemplarCity draft="provisional">ბელიზი</exemplarCity>
+ </zone>
+ <zone type="America/Dawson">
+ <exemplarCity draft="contributed">დოუსონი</exemplarCity>
+ </zone>
+ <zone type="America/Whitehorse">
+ <exemplarCity draft="contributed">უაითჰორსი</exemplarCity>
+ </zone>
+ <zone type="America/Inuvik">
+ <exemplarCity draft="contributed">ინუვიკი</exemplarCity>
+ </zone>
+ <zone type="America/Vancouver">
+ <exemplarCity draft="contributed">ვანკუვერი</exemplarCity>
+ </zone>
+ <zone type="America/Dawson_Creek">
+ <exemplarCity draft="contributed">დოუსონ ქრიკი</exemplarCity>
+ </zone>
+ <zone type="America/Yellowknife">
+ <exemplarCity draft="contributed">იელოუნაიფი</exemplarCity>
+ </zone>
+ <zone type="America/Edmonton">
+ <exemplarCity draft="contributed">ედმონტონი</exemplarCity>
+ </zone>
+ <zone type="America/Swift_Current">
+ <exemplarCity draft="contributed">სვიფტ კარენტი</exemplarCity>
+ </zone>
+ <zone type="America/Cambridge_Bay">
+ <exemplarCity draft="contributed">კემბრიჯ ბეი</exemplarCity>
+ </zone>
+ <zone type="America/Regina">
+ <exemplarCity draft="contributed">რეჯინა</exemplarCity>
+ </zone>
+ <zone type="America/Winnipeg">
+ <exemplarCity draft="contributed">უინიპეგი</exemplarCity>
+ </zone>
+ <zone type="America/Resolute">
+ <exemplarCity draft="contributed">რეზოლუტე</exemplarCity>
+ </zone>
+ <zone type="America/Rainy_River">
+ <exemplarCity draft="contributed">რეინი რივერი</exemplarCity>
+ </zone>
+ <zone type="America/Rankin_Inlet">
+ <exemplarCity draft="contributed">რენკინ ინლეტი</exemplarCity>
+ </zone>
+ <zone type="America/Coral_Harbour">
+ <exemplarCity draft="contributed">ქორალ ჰარბორი</exemplarCity>
+ </zone>
+ <zone type="America/Thunder_Bay">
+ <exemplarCity draft="contributed">თანდერ ბეი</exemplarCity>
+ </zone>
+ <zone type="America/Nipigon">
+ <exemplarCity draft="contributed">ნიპიგონი</exemplarCity>
+ </zone>
+ <zone type="America/Toronto">
+ <exemplarCity draft="contributed">ტორონტო</exemplarCity>
+ </zone>
+ <zone type="America/Montreal">
+ <exemplarCity draft="contributed">მონრეალი</exemplarCity>
+ </zone>
+ <zone type="America/Iqaluit">
+ <exemplarCity draft="contributed">იქალუიტი</exemplarCity>
+ </zone>
+ <zone type="America/Pangnirtung">
+ <exemplarCity draft="contributed">პანგნირტუნგი</exemplarCity>
+ </zone>
+ <zone type="America/Moncton">
+ <exemplarCity draft="contributed">მონქტონი</exemplarCity>
+ </zone>
+ <zone type="America/Halifax">
+ <exemplarCity draft="contributed">ჰალიფაქსი</exemplarCity>
+ </zone>
+ <zone type="America/Goose_Bay">
+ <exemplarCity draft="contributed">გუზ ბეი</exemplarCity>
+ </zone>
+ <zone type="America/Glace_Bay">
+ <exemplarCity draft="contributed">გლეის ბეი</exemplarCity>
+ </zone>
+ <zone type="America/Blanc-Sablon">
+ <exemplarCity draft="contributed">ბლან-საბლონი</exemplarCity>
+ </zone>
+ <zone type="America/St_Johns">
+ <exemplarCity draft="contributed">სენტ ჯონსი</exemplarCity>
+ </zone>
+ <zone type="Africa/Kinshasa">
+ <exemplarCity draft="contributed">კინშასა</exemplarCity>
+ </zone>
+ <zone type="Africa/Lubumbashi">
+ <exemplarCity draft="contributed">ლუბუმბაში</exemplarCity>
+ </zone>
+ <zone type="Africa/Bangui">
+ <exemplarCity draft="provisional">ცენტრალური აფრიკის რესპუბლიკა</exemplarCity>
+ </zone>
+ <zone type="Africa/Brazzaville">
+ <exemplarCity draft="provisional">კონგო - ბრაზავილი</exemplarCity>
+ </zone>
+ <zone type="Africa/Abidjan">
+ <exemplarCity draft="provisional">სპილოს ძვლის სანაპირო</exemplarCity>
+ </zone>
+ <zone type="Pacific/Easter">
+ <exemplarCity draft="contributed">ისთერი</exemplarCity>
+ </zone>
+ <zone type="Africa/Douala">
+ <exemplarCity draft="provisional">კამერუნი</exemplarCity>
+ </zone>
+ <zone type="Asia/Kashgar">
+ <exemplarCity draft="contributed">კაშგარი</exemplarCity>
+ </zone>
+ <zone type="Asia/Urumqi">
+ <exemplarCity draft="contributed">ურუმქი</exemplarCity>
+ </zone>
+ <zone type="Asia/Chongqing">
+ <exemplarCity draft="contributed">ჩონგქინგი</exemplarCity>
+ </zone>
+ <zone type="Asia/Harbin">
+ <exemplarCity draft="contributed">ჰარბინი</exemplarCity>
+ </zone>
+ <zone type="America/Bogota">
+ <exemplarCity draft="provisional">კოლუმბია</exemplarCity>
+ </zone>
+ <zone type="America/Costa_Rica">
+ <exemplarCity draft="provisional">კოსტა რიკა</exemplarCity>
+ </zone>
+ <zone type="America/Havana">
+ <exemplarCity draft="provisional">კუბა</exemplarCity>
+ </zone>
+ <zone type="Africa/Djibouti">
+ <exemplarCity draft="provisional">ჯიბუტი</exemplarCity>
+ </zone>
+ <zone type="America/Dominica">
+ <exemplarCity draft="provisional">დომინიკა</exemplarCity>
+ </zone>
+ <zone type="Africa/Algiers">
+ <exemplarCity draft="provisional">ალჟირი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Galapagos">
+ <exemplarCity draft="contributed">გალაპაგოსი</exemplarCity>
+ </zone>
+ <zone type="Africa/Cairo">
+ <exemplarCity draft="provisional">ეგვიპტე</exemplarCity>
+ </zone>
+ <zone type="Africa/El_Aaiun">
+ <exemplarCity draft="provisional">დასავლეთი საჰარა</exemplarCity>
+ </zone>
+ <zone type="Africa/Asmera">
+ <exemplarCity draft="provisional">ერითრეა</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Canary">
+ <exemplarCity draft="contributed">კანარი</exemplarCity>
+ </zone>
+ <zone type="Africa/Ceuta">
+ <exemplarCity draft="contributed">სეუტა</exemplarCity>
+ </zone>
+ <zone type="Africa/Addis_Ababa">
+ <exemplarCity draft="provisional">ეთიოპია</exemplarCity>
+ </zone>
+ <zone type="Pacific/Truk">
+ <exemplarCity draft="contributed">ტრუკი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Ponape">
+ <exemplarCity draft="contributed">პონაპე</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kosrae">
+ <exemplarCity draft="contributed">კოსრაე</exemplarCity>
+ </zone>
+ <zone type="Africa/Libreville">
+ <exemplarCity draft="provisional">გაბონი</exemplarCity>
+ </zone>
+ <zone type="America/Grenada">
+ <exemplarCity draft="provisional">გრენადა</exemplarCity>
+ </zone>
+ <zone type="America/Cayenne">
+ <exemplarCity draft="provisional">გუიანა</exemplarCity>
+ </zone>
+ <zone type="Africa/Accra">
+ <exemplarCity draft="provisional">განა</exemplarCity>
+ </zone>
+ <zone type="America/Thule">
+ <exemplarCity draft="contributed">თულე</exemplarCity>
+ </zone>
+ <zone type="America/Scoresbysund">
+ <exemplarCity draft="contributed">სკორსბისუნდი</exemplarCity>
+ </zone>
+ <zone type="America/Danmarkshavn">
+ <exemplarCity draft="contributed">დენმარკშავნი</exemplarCity>
+ </zone>
+ <zone type="Africa/Banjul">
+ <exemplarCity draft="provisional">გამბია</exemplarCity>
+ </zone>
+ <zone type="Africa/Conakry">
+ <exemplarCity draft="provisional">გინეა</exemplarCity>
+ </zone>
+ <zone type="America/Guadeloupe">
+ <exemplarCity draft="provisional">გუადელუპე</exemplarCity>
+ </zone>
+ <zone type="Africa/Malabo">
+ <exemplarCity draft="provisional">ეკვატორული გვინეა</exemplarCity>
+ </zone>
+ <zone type="America/Guatemala">
+ <exemplarCity draft="provisional">გუატემალა</exemplarCity>
+ </zone>
+ <zone type="Africa/Bissau">
+ <exemplarCity draft="provisional">გინეა-ბისაუ</exemplarCity>
+ </zone>
+ <zone type="America/Guyana">
+ <exemplarCity draft="provisional">გუიანა</exemplarCity>
+ </zone>
+ <zone type="Asia/Jakarta">
+ <exemplarCity draft="contributed">ჯაკარტა</exemplarCity>
+ </zone>
+ <zone type="Asia/Pontianak">
+ <exemplarCity draft="contributed">პონტიანაკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Makassar">
+ <exemplarCity draft="contributed">მაკასარი</exemplarCity>
+ </zone>
+ <zone type="Asia/Jayapura">
+ <exemplarCity draft="contributed">ჯაიაპურა</exemplarCity>
+ </zone>
+ <zone type="America/Jamaica">
+ <exemplarCity draft="provisional">იამაიკა</exemplarCity>
+ </zone>
+ <zone type="Africa/Nairobi">
+ <exemplarCity draft="provisional">კენია</exemplarCity>
+ </zone>
+ <zone type="Pacific/Enderbury">
+ <exemplarCity draft="contributed">ენდერბური</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kiritimati">
+ <exemplarCity draft="contributed">კირიტიმატი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Tarawa">
+ <exemplarCity draft="contributed">ტარაუა</exemplarCity>
+ </zone>
+ <zone type="America/Cayman">
+ <exemplarCity draft="provisional">კაიმანის</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtau">
+ <exemplarCity draft="contributed">აქტაუ</exemplarCity>
+ </zone>
+ <zone type="Asia/Oral">
+ <exemplarCity draft="contributed">ორალი</exemplarCity>
+ </zone>
+ <zone type="Asia/Aqtobe">
+ <exemplarCity draft="contributed">აქტობე</exemplarCity>
+ </zone>
+ <zone type="Asia/Qyzylorda">
+ <exemplarCity draft="contributed">ყიზილორდა</exemplarCity>
+ </zone>
+ <zone type="Asia/Almaty">
+ <exemplarCity draft="contributed">ალმატი</exemplarCity>
+ </zone>
+ <zone type="Africa/Monrovia">
+ <exemplarCity draft="provisional">ლიბერია</exemplarCity>
+ </zone>
+ <zone type="Africa/Maseru">
+ <exemplarCity draft="provisional">ლესოთო</exemplarCity>
+ </zone>
+ <zone type="Africa/Tripoli">
+ <exemplarCity draft="provisional">ლიბია</exemplarCity>
+ </zone>
+ <zone type="Africa/Casablanca">
+ <exemplarCity draft="provisional">მაროკო</exemplarCity>
+ </zone>
+ <zone type="Pacific/Kwajalein">
+ <exemplarCity draft="contributed">კვაჯალეინი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Majuro">
+ <exemplarCity draft="contributed">მახურო</exemplarCity>
+ </zone>
+ <zone type="Africa/Bamako">
+ <exemplarCity draft="provisional">მალი</exemplarCity>
+ </zone>
+ <zone type="Asia/Hovd">
+ <exemplarCity draft="contributed">ჰოვდი</exemplarCity>
+ </zone>
+ <zone type="Asia/Ulaanbaatar">
+ <exemplarCity draft="contributed">ულანბატარი</exemplarCity>
+ </zone>
+ <zone type="Asia/Choibalsan">
+ <exemplarCity draft="contributed">ჩოიბალსანი</exemplarCity>
+ </zone>
+ <zone type="America/Martinique">
+ <exemplarCity draft="provisional">მარტინიკი</exemplarCity>
+ </zone>
+ <zone type="Africa/Nouakchott">
+ <exemplarCity draft="provisional">მავრიტანია</exemplarCity>
+ </zone>
+ <zone type="America/Montserrat">
+ <exemplarCity draft="provisional">მონსერატი</exemplarCity>
+ </zone>
+ <zone type="Africa/Blantyre">
+ <exemplarCity draft="provisional">მალავი</exemplarCity>
+ </zone>
+ <zone type="America/Tijuana">
+ <exemplarCity draft="contributed">ტიხუანა</exemplarCity>
+ </zone>
+ <zone type="America/Hermosillo">
+ <exemplarCity draft="contributed">ჰერმოსიო</exemplarCity>
+ </zone>
+ <zone type="America/Mazatlan">
+ <exemplarCity draft="contributed">მაზატლანი</exemplarCity>
+ </zone>
+ <zone type="America/Chihuahua">
+ <exemplarCity draft="contributed">ჩიჰუაჰუა</exemplarCity>
+ </zone>
+ <zone type="America/Monterrey">
+ <exemplarCity draft="contributed">მონტერეი</exemplarCity>
+ </zone>
+ <zone type="America/Mexico_City">
+ <exemplarCity draft="contributed">მექსიკო სითი</exemplarCity>
+ </zone>
+ <zone type="America/Merida">
+ <exemplarCity draft="contributed">მერიდა</exemplarCity>
+ </zone>
+ <zone type="America/Cancun">
+ <exemplarCity draft="contributed">კანკუნი</exemplarCity>
+ </zone>
+ <zone type="Asia/Kuching">
+ <exemplarCity draft="contributed">კუჩინგი</exemplarCity>
+ </zone>
+ <zone type="Africa/Maputo">
+ <exemplarCity draft="provisional">მოზამბიკი</exemplarCity>
+ </zone>
+ <zone type="Africa/Windhoek">
+ <exemplarCity draft="provisional">ნამიბია</exemplarCity>
+ </zone>
+ <zone type="Africa/Niamey">
+ <exemplarCity draft="provisional">ნიგერი</exemplarCity>
+ </zone>
+ <zone type="Africa/Lagos">
+ <exemplarCity draft="provisional">ნიგერია</exemplarCity>
+ </zone>
+ <zone type="America/Managua">
+ <exemplarCity draft="provisional">ნიკარაგუა</exemplarCity>
+ </zone>
+ <zone type="Pacific/Chatham">
+ <exemplarCity draft="contributed">ჩათამი</exemplarCity>
+ </zone>
+ <zone type="America/Lima">
+ <exemplarCity draft="provisional">პერუ</exemplarCity>
+ </zone>
+ <zone type="Pacific/Marquesas">
+ <exemplarCity draft="contributed">მარკეზასი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Gambier">
+ <exemplarCity draft="contributed">გამბიერი</exemplarCity>
+ </zone>
+ <zone type="America/Miquelon">
+ <exemplarCity draft="provisional">სენტ პიერი და მიკელონი</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Azores">
+ <exemplarCity draft="contributed">აზორეს</exemplarCity>
+ </zone>
+ <zone type="Atlantic/Madeira">
+ <exemplarCity draft="contributed">მადეირა</exemplarCity>
+ </zone>
+ <zone type="America/Asuncion">
+ <exemplarCity draft="provisional">პარაგვაი</exemplarCity>
+ </zone>
+ <zone type="Europe/Kaliningrad">
+ <exemplarCity draft="contributed">კალინინგრადი</exemplarCity>
+ </zone>
+ <zone type="Europe/Moscow">
+ <exemplarCity draft="contributed">მოსკოვი</exemplarCity>
+ </zone>
+ <zone type="Europe/Volgograd">
+ <exemplarCity draft="contributed">ვოლგოგრადი</exemplarCity>
+ </zone>
+ <zone type="Europe/Samara">
+ <exemplarCity draft="contributed">სამარა</exemplarCity>
+ </zone>
+ <zone type="Asia/Yekaterinburg">
+ <exemplarCity draft="contributed">ეკატერინბურგი</exemplarCity>
+ </zone>
+ <zone type="Asia/Omsk">
+ <exemplarCity draft="contributed">ომსკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Novosibirsk">
+ <exemplarCity draft="contributed">ნოვოსიბირსკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Krasnoyarsk">
+ <exemplarCity draft="contributed">კრასნოიარსკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Irkutsk">
+ <exemplarCity draft="contributed">ირკუტსკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Yakutsk">
+ <exemplarCity draft="contributed">იაკუტსკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Vladivostok">
+ <exemplarCity draft="contributed">ვლადივოსტოკი</exemplarCity>
+ </zone>
+ <zone type="Asia/Sakhalin">
+ <exemplarCity draft="contributed">სახალინი</exemplarCity>
+ </zone>
+ <zone type="Asia/Magadan">
+ <exemplarCity draft="contributed">მაგადანი</exemplarCity>
+ </zone>
+ <zone type="Asia/Kamchatka">
+ <exemplarCity draft="contributed">კამჩატკა</exemplarCity>
+ </zone>
+ <zone type="Asia/Anadyr">
+ <exemplarCity draft="contributed">ანადირი</exemplarCity>
+ </zone>
+ <zone type="Africa/Kigali">
+ <exemplarCity draft="provisional">რუანდა</exemplarCity>
+ </zone>
+ <zone type="Africa/Khartoum">
+ <exemplarCity draft="provisional">სუდანი</exemplarCity>
+ </zone>
+ <zone type="Africa/Freetown">
+ <exemplarCity draft="provisional">სიერა ლეონე</exemplarCity>
+ </zone>
+ <zone type="Africa/Dakar">
+ <exemplarCity draft="provisional">სენეგალი</exemplarCity>
+ </zone>
+ <zone type="Africa/Mogadishu">
+ <exemplarCity draft="provisional">სომალია</exemplarCity>
+ </zone>
+ <zone type="Africa/Sao_Tome">
+ <exemplarCity draft="provisional">საო ტომე და პრინსიპე</exemplarCity>
+ </zone>
+ <zone type="America/El_Salvador">
+ <exemplarCity draft="provisional">ელ სალვადორი</exemplarCity>
+ </zone>
+ <zone type="Africa/Mbabane">
+ <exemplarCity draft="provisional">სვაზილენდი</exemplarCity>
+ </zone>
+ <zone type="America/Grand_Turk">
+ <exemplarCity draft="provisional">ტერკის და კაიკოს</exemplarCity>
+ </zone>
+ <zone type="Africa/Ndjamena">
+ <exemplarCity draft="provisional">ჩადი</exemplarCity>
+ </zone>
+ <zone type="Africa/Lome">
+ <exemplarCity draft="provisional">ტოგო</exemplarCity>
+ </zone>
+ <zone type="Africa/Tunis">
+ <exemplarCity draft="provisional">ტუნისი</exemplarCity>
+ </zone>
+ <zone type="Africa/Dar_es_Salaam">
+ <exemplarCity draft="provisional">ტანზანია</exemplarCity>
+ </zone>
+ <zone type="Europe/Uzhgorod">
+ <exemplarCity draft="contributed">უჟგოროდი</exemplarCity>
+ </zone>
+ <zone type="Europe/Kiev">
+ <exemplarCity draft="contributed">კიევი</exemplarCity>
+ </zone>
+ <zone type="Europe/Simferopol">
+ <exemplarCity draft="contributed">სიმფეროპოლი</exemplarCity>
+ </zone>
+ <zone type="Europe/Zaporozhye">
+ <exemplarCity draft="contributed">ზაპოროჟიე</exemplarCity>
+ </zone>
+ <zone type="Africa/Kampala">
+ <exemplarCity draft="provisional">უგანდა</exemplarCity>
+ </zone>
+ <zone type="Pacific/Midway">
+ <exemplarCity draft="contributed">მიდუეი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Johnston">
+ <exemplarCity draft="contributed">ჯონსტონი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Wake">
+ <exemplarCity draft="contributed">უეიკი</exemplarCity>
+ </zone>
+ <zone type="America/Adak">
+ <exemplarCity draft="contributed">ადაკი</exemplarCity>
+ </zone>
+ <zone type="America/Nome">
+ <exemplarCity draft="contributed">ნომი</exemplarCity>
+ </zone>
+ <zone type="Pacific/Honolulu">
+ <exemplarCity draft="contributed">ჰონოლულუ</exemplarCity>
+ </zone>
+ <zone type="America/Anchorage">
+ <exemplarCity draft="contributed">ენქორაჯი</exemplarCity>
+ </zone>
+ <zone type="America/Yakutat">
+ <exemplarCity draft="contributed">იაკუტატი</exemplarCity>
+ </zone>
+ <zone type="America/Juneau">
+ <exemplarCity draft="contributed">ჯუნო</exemplarCity>
+ </zone>
+ <zone type="America/Los_Angeles">
+ <exemplarCity draft="contributed">ლოს ანჯელესი</exemplarCity>
+ </zone>
+ <zone type="America/Boise">
+ <exemplarCity draft="contributed">ბუასი</exemplarCity>
+ </zone>
+ <zone type="America/Phoenix">
+ <exemplarCity draft="contributed">ფენიქსი</exemplarCity>
+ </zone>
+ <zone type="America/Shiprock">
+ <exemplarCity draft="contributed">შიპროკი</exemplarCity>
+ </zone>
+ <zone type="America/Denver">
+ <exemplarCity draft="contributed">დენვერი</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/New_Salem">
+ <exemplarCity draft="contributed">ნიუ სალემი, ჩრდილოეთი დაკოტა</exemplarCity>
+ </zone>
+ <zone type="America/North_Dakota/Center">
+ <exemplarCity draft="contributed">ცენტრი, ჩრდილოეთი დაკოტა</exemplarCity>
+ </zone>
+ <zone type="America/Chicago">
+ <exemplarCity draft="contributed">ჩიკაგო</exemplarCity>
+ </zone>
+ <zone type="America/Menominee">
+ <exemplarCity draft="contributed">მენომინი</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vincennes">
+ <exemplarCity draft="contributed">ვინსენი, ინდიანა</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Petersburg">
+ <exemplarCity draft="contributed">პიტერსბურგი</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Tell_City">
+ <exemplarCity draft="contributed">თელ სითი, ინდიანა</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Knox">
+ <exemplarCity draft="contributed">ნოქსი, ინდიანა</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Winamac">
+ <exemplarCity draft="contributed">უინემაკი, ინდიანა</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Marengo">
+ <exemplarCity draft="contributed">მარენგო</exemplarCity>
+ </zone>
+ <zone type="America/Indianapolis">
+ <exemplarCity draft="contributed">ინდიანაპოლისი</exemplarCity>
+ </zone>
+ <zone type="America/Louisville">
+ <exemplarCity draft="contributed">ლუისვილი</exemplarCity>
+ </zone>
+ <zone type="America/Indiana/Vevay">
+ <exemplarCity draft="contributed">ვივეი, ინდიანა</exemplarCity>
+ </zone>
+ <zone type="America/Kentucky/Monticello">
+ <exemplarCity draft="contributed">მონტიჩელო</exemplarCity>
+ </zone>
+ <zone type="America/Detroit">
+ <exemplarCity draft="contributed">დეტროიტი</exemplarCity>
+ </zone>
+ <zone type="America/New_York">
+ <exemplarCity draft="contributed">ნიუ იორკი</exemplarCity>
+ </zone>
+ <zone type="America/Montevideo">
+ <exemplarCity draft="provisional">ურუგვაი</exemplarCity>
+ </zone>
+ <zone type="Asia/Samarkand">
+ <exemplarCity draft="contributed">სამარყანდი</exemplarCity>
+ </zone>
+ <zone type="America/Caracas">
+ <exemplarCity draft="provisional">ვენესუელა</exemplarCity>
+ </zone>
+ <zone type="Africa/Johannesburg">
+ <exemplarCity draft="provisional">სამხრეთი აფრიკა</exemplarCity>
+ </zone>
+ <zone type="Africa/Lusaka">
+ <exemplarCity draft="provisional">ზამბია</exemplarCity>
+ </zone>
+ <zone type="Africa/Harare">
+ <exemplarCity draft="provisional">ზიმბაბვე</exemplarCity>
+ </zone>
+ </timeZoneNames>
+ </dates>
+ <numbers>
+ <symbols>
+ <decimal draft="contributed">,</decimal>
+ <group draft="contributed">.</group>
+ <list draft="contributed">;</list>
+ <percentSign draft="contributed">%</percentSign>
+ <nativeZeroDigit draft="contributed">0</nativeZeroDigit>
+ <plusSign draft="contributed">+</plusSign>
+ <minusSign draft="contributed">-</minusSign>
+ <exponential draft="contributed">E</exponential>
+ <perMille draft="contributed">‰</perMille>
+ <infinity draft="contributed">∞</infinity>
+ <nan draft="contributed">NaN</nan>
+ </symbols>
+ <decimalFormats>
+ <decimalFormatLength>
+ <decimalFormat>
+ <pattern draft="provisional">#,##0.###</pattern>
+ </decimalFormat>
+ </decimalFormatLength>
+ </decimalFormats>
+ <percentFormats>
+ <percentFormatLength>
+ <percentFormat>
+ <pattern draft="provisional">#,##0%</pattern>
+ </percentFormat>
+ </percentFormatLength>
+ </percentFormats>
+ <currencyFormats>
+ <currencyFormatLength>
+ <currencyFormat>
+ <pattern draft="provisional">¤ #,##0.00</pattern>
+ </currencyFormat>
+ </currencyFormatLength>
+ <unitPattern count="other" draft="contributed">{0} {1}</unitPattern>
+ </currencyFormats>
+ <currencies>
+ <currency type="ADP">
+ <displayName draft="contributed">ანდორული პესეტა</displayName>
+ </currency>
+ <currency type="AED">
+ <displayName draft="contributed">გაერთიანებული არაბული საემიროების დირჰემი</displayName>
+ </currency>
+ <currency type="AFA">
+ <displayName draft="contributed">ავღანი (1927-2002)</displayName>
+ </currency>
+ <currency type="AFN">
+ <displayName draft="contributed">ავღანი</displayName>
+ </currency>
+ <currency type="ALL">
+ <displayName draft="contributed">ალბანური ლეკი</displayName>
+ </currency>
+ <currency type="AMD">
+ <displayName draft="contributed">სომხური დრამი</displayName>
+ </currency>
+ <currency type="ANG">
+ <displayName draft="contributed">ნიდრელანდების ანტილიის გულდენი</displayName>
+ </currency>
+ <currency type="AOA">
+ <displayName draft="contributed">ანგოლური კვანზა</displayName>
+ </currency>
+ <currency type="AOK">
+ <displayName draft="contributed">ანგოლური კვანზა (1977-1990)</displayName>
+ </currency>
+ <currency type="AON">
+ <displayName draft="contributed">ანგოლური ახალი კვანზა (1990-2000)</displayName>
+ </currency>
+ <currency type="AOR">
+ <displayName draft="contributed">ანგოლური მიტოლებული კვანზა (1995-1999)</displayName>
+ </currency>
+ <currency type="ARA">
+ <displayName draft="contributed">არგენტინული აუსტრალი</displayName>
+ </currency>
+ <currency type="ARP">
+ <displayName draft="contributed">არგენტინული პესო (1983-1985)</displayName>
+ </currency>
+ <currency type="ARS">
+ <displayName draft="contributed">არგენტინული პესო</displayName>
+ </currency>
+ <currency type="ATS">
+ <displayName draft="contributed">ავსტრიული შილინგი</displayName>
+ </currency>
+ <currency type="AUD">
+ <displayName draft="contributed">ავსტრალიური დოლარი</displayName>
+ </currency>
+ <currency type="AWG">
+ <displayName draft="contributed">არუბანული გულდენი</displayName>
+ </currency>
+ <currency type="AZM">
+ <displayName draft="contributed">აზერბაიჯანული მანათი (1993-2006)</displayName>
+ </currency>
+ <currency type="AZN">
+ <displayName draft="contributed">აზერბაიჯანული მანათი</displayName>
+ </currency>
+ <currency type="BAD">
+ <displayName draft="contributed">ბოსნია-ჰერცოგოვინას დინარი</displayName>
+ </currency>
+ <currency type="BAM">
+ <displayName draft="contributed">ბოსნია-ჰერცოგოვინას კონვერტირებადი მარკა</displayName>
+ </currency>
+ <currency type="BBD">
+ <displayName draft="contributed">ბარბადოსული დოლარი</displayName>
+ </currency>
+ <currency type="BDT">
+ <displayName draft="contributed">ბანგლადეშური ტაკა</displayName>
+ </currency>
+ <currency type="BEC">
+ <displayName draft="contributed">ბელგიური ფრანკი (კოვერტირებადი)</displayName>
+ </currency>
+ <currency type="BEF">
+ <displayName draft="contributed">ბელგიური ფრანკი</displayName>
+ </currency>
+ <currency type="BEL">
+ <displayName draft="contributed">ბელგიური ფრანკი (ფინანსური)</displayName>
+ </currency>
+ <currency type="BGL">
+ <displayName draft="contributed">ბულგარული მყარი ლევი</displayName>
+ </currency>
+ <currency type="BGN">
+ <displayName draft="contributed">ბულგარული ახალი ლევი</displayName>
+ </currency>
+ <currency type="BHD">
+ <displayName draft="contributed">ბაჰრეინული დინარი</displayName>
+ </currency>
+ <currency type="BIF">
+ <displayName draft="contributed">ბურუნდიული ფრანკი</displayName>
+ </currency>
+ <currency type="BMD">
+ <displayName draft="contributed">ბერმუდული დინარი</displayName>
+ </currency>
+ <currency type="BND">
+ <displayName draft="contributed">ბრუნეული დოლარი</displayName>
+ </currency>
+ <currency type="BOB">
+ <displayName draft="contributed">ბოლივიანო</displayName>
+ </currency>
+ <currency type="BOP">
+ <displayName draft="contributed">ბოლივიური პესო</displayName>
+ </currency>
+ <currency type="BRB">
+ <displayName draft="contributed">ბრაზილიური კრუზეირო ნოვო (1967-1986)</displayName>
+ </currency>
+ <currency type="BRC">
+ <displayName draft="contributed">ბრაზილიური კრუზადო</displayName>
+ </currency>
+ <currency type="BRE">
+ <displayName draft="contributed">ბრაზილიური კრუზეირო (1990-1993)</displayName>
+ </currency>
+ <currency type="BRL">
+ <displayName draft="contributed">ბრაზილიური რეალი</displayName>
+ </currency>
+ <currency type="BRN">
+ <displayName draft="contributed">ბრაზილიური კრუზადო ნოვო</displayName>
+ </currency>
+ <currency type="BRR">
+ <displayName draft="contributed">ბრაზილიური კრუზეირო</displayName>
+ </currency>
+ <currency type="BSD">
+ <displayName draft="contributed">ბაჰამური დოლარი</displayName>
+ </currency>
+ <currency type="BWP">
+ <displayName draft="contributed">ბოტსვანიური პულა</displayName>
+ </currency>
+ <currency type="BYB">
+ <displayName draft="contributed">ახალი ბელარუსიული რუბლი (1994-1999)</displayName>
+ </currency>
+ <currency type="BYR">
+ <displayName draft="contributed">ბელარუსიული რუბლი</displayName>
+ </currency>
+ <currency type="CAD">
+ <displayName draft="contributed">კანადური დოლარი</displayName>
+ </currency>
+ <currency type="CHF">
+ <displayName draft="contributed">შვეიცარიული ფრანკი</displayName>
+ </currency>
+ <currency type="CNY">
+ <displayName draft="contributed">ჩინური უანი</displayName>
+ </currency>
+ <currency type="CRC">
+ <displayName draft="contributed">კოსტა რიკული კოლონი</displayName>
+ </currency>
+ <currency type="CSD">
+ <displayName draft="contributed">ძველი სერბიული დინარი</displayName>
+ </currency>
+ <currency type="CSK">
+ <displayName draft="contributed">ჩეხოსლოვაკიის მყარი კრონა</displayName>
+ </currency>
+ <currency type="CUP">
+ <displayName draft="contributed">კუბური პესო</displayName>
+ </currency>
+ <currency type="CVE">
+ <displayName draft="contributed">კაბო ვერდეს ესკუდო</displayName>
+ </currency>
+ <currency type="CYP">
+ <displayName draft="contributed">კვიპროსის გირვანქა</displayName>
+ </currency>
+ <currency type="CZK">
+ <displayName draft="contributed">ჩეხური კრონა</displayName>
+ </currency>
+ <currency type="DDM">
+ <displayName draft="contributed">აღმოსავლეთ გერმანული მარკა</displayName>
+ </currency>
+ <currency type="DEM">
+ <displayName draft="contributed">გერმანული მარკა</displayName>
+ </currency>
+ <currency type="DJF">
+ <displayName draft="contributed">ჯიბუტის ფრანკი</displayName>
+ </currency>
+ <currency type="DKK">
+ <displayName draft="contributed">დანიური კრონა</displayName>
+ </currency>
+ <currency type="DOP">
+ <displayName draft="contributed">დომინიკური პესო</displayName>
+ </currency>
+ <currency type="DZD">
+ <displayName draft="contributed">ალჟირიული დინარი</displayName>
+ </currency>
+ <currency type="EEK">
+ <displayName draft="contributed">ესტონური კრუნა</displayName>
+ </currency>
+ <currency type="EGP">
+ <displayName draft="contributed">ეგვიპტური გირვანქა</displayName>
+ </currency>
+ <currency type="ESP">
+ <displayName draft="contributed">ესპანური პესეტა</displayName>
+ </currency>
+ <currency type="EUR">
+ <displayName draft="contributed">ევრო</displayName>
+ </currency>
+ <currency type="FIM">
+ <displayName draft="contributed">ფინური მარკა</displayName>
+ </currency>
+ <currency type="FJD">
+ <displayName draft="contributed">ფიჯი დოლარი</displayName>
+ </currency>
+ <currency type="FRF">
+ <displayName draft="contributed">ფრანგული ფრანკი</displayName>
+ </currency>
+ <currency type="GBP">
+ <displayName draft="contributed">ინგლისური გირვანქა სტერლინგი</displayName>
+ </currency>
+ <currency type="GEK">
+ <displayName draft="contributed">ქართული კუპონი ლარით</displayName>
+ </currency>
+ <currency type="GEL">
+ <displayName draft="contributed">ქართული ლარი</displayName>
+ </currency>
+ <currency type="GRD">
+ <displayName draft="contributed">ბერძნული დრაჰმა</displayName>
+ </currency>
+ <currency type="GWE">
+ <displayName draft="contributed">პორტუგალიური გინეა ესკუდო</displayName>
+ </currency>
+ <currency type="HKD">
+ <displayName draft="contributed">ჰონგ კონგის დოლარი</displayName>
+ </currency>
+ <currency type="HNL">
+ <displayName draft="contributed">ჰონდურასის ლემპირა</displayName>
+ </currency>
+ <currency type="HRD">
+ <displayName draft="contributed">ხორვატიული დინარი</displayName>
+ </currency>
+ <currency type="HRK">
+ <displayName draft="contributed">ხორვატიული კუნა</displayName>
+ </currency>
+ <currency type="HUF">
+ <displayName draft="contributed">უნგრული ფორინტი</displayName>
+ </currency>
+ <currency type="IDR">
+ <displayName draft="contributed">ინდონეზიური რუპია</displayName>
+ </currency>
+ <currency type="IEP">
+ <displayName draft="contributed">ირლანდიური გირვანქა</displayName>
+ </currency>
+ <currency type="INR">
+ <displayName draft="contributed">ინდური რუპია</displayName>
+ </currency>
+ <currency type="ISK">
+ <displayName draft="contributed">ისლანდიური კრონა</displayName>
+ </currency>
+ <currency type="ITL">
+ <displayName draft="contributed">იტალიური ლირა</displayName>
+ </currency>
+ <currency type="JMD">
+ <displayName draft="contributed">იამაიკური დოლარი</displayName>
+ </currency>
+ <currency type="JOD">
+ <displayName draft="contributed">იორდანიული დოლარი</displayName>
+ </currency>
+ <currency type="JPY">
+ <displayName draft="contributed">იაპონური იენი</displayName>
+ </currency>
+ <currency type="KES">
+ <displayName draft="contributed">კენიური შილინგი</displayName>
+ </currency>
+ <currency type="KGS">
+ <displayName draft="contributed">ყირღიზული სომი</displayName>
+ </currency>
+ <currency type="KPW">
+ <displayName draft="contributed">ჩრდილოეთ კორეული ვონი</displayName>
+ </currency>
+ <currency type="KRW">
+ <displayName draft="contributed">სამხრეთ კორეული ვონი</displayName>
+ </currency>
+ <currency type="KWD">
+ <displayName draft="contributed">კუვეიტური დინარი</displayName>
+ </currency>
+ <currency type="KYD">
+ <displayName draft="contributed">კაიმანის კუნძულების დოლარი</displayName>
+ </currency>
+ <currency type="KZT">
+ <displayName draft="contributed">ყაზახური ტენგე</displayName>
+ </currency>
+ <currency type="LKR">
+ <displayName draft="contributed">შრი ლანკის რუპია</displayName>
+ </currency>
+ <currency type="LRD">
+ <displayName draft="contributed">ლიბერიული დოლარი</displayName>
+ </currency>
+ <currency type="LTL">
+ <displayName draft="contributed">ლიტვური ლიტა</displayName>
+ </currency>
+ <currency type="LTT">
+ <displayName draft="contributed">ლიტვური ტალონი</displayName>
+ </currency>
+ <currency type="LUC">
+ <displayName draft="contributed">ლუქსემბურგის კონვერტირებადი ფრანკი</displayName>
+ </currency>
+ <currency type="LUF">
+ <displayName draft="contributed">ლუქსემბურგის ფრანკი</displayName>
+ </currency>
+ <currency type="LUL">
+ <displayName draft="contributed">ლუქსემბურგის ფინანსური ფრანკი</displayName>
+ </currency>
+ <currency type="LVL">
+ <displayName draft="contributed">ლატვიური ლატი</displayName>
+ </currency>
+ <currency type="LVR">
+ <displayName draft="contributed">ლატვიური რუბლი</displayName>
+ </currency>
+ <currency type="LYD">
+ <displayName draft="contributed">ლიბიური დინარი</displayName>
+ </currency>
+ <currency type="MAD">
+ <displayName draft="contributed">მაროკოს დირჰამი</displayName>
+ </currency>
+ <currency type="MAF">
+ <displayName draft="contributed">მაროკოს ფრანკი</displayName>
+ </currency>
+ <currency type="MDL">
+ <displayName draft="contributed">მოლდოვური ლეუ</displayName>
+ </currency>
+ <currency type="MGA">
+ <displayName draft="contributed">მადაგასკარის არიარი</displayName>
+ </currency>
+ <currency type="MGF">
+ <displayName draft="contributed">მადაგასკარის ფრანკი</displayName>
+ </currency>
+ <currency type="MKD">
+ <displayName draft="contributed">მაკედონიური დენარი</displayName>
+ </currency>
+ <currency type="MLF">
+ <displayName draft="contributed">მალის ფრანკი</displayName>
+ </currency>
+ <currency type="MMK">
+ <displayName draft="contributed">მიანმარის კიატი</displayName>
+ </currency>
+ <currency type="MNT">
+ <displayName draft="contributed">მონღოლური ტუგრიკი</displayName>
+ </currency>
+ <currency type="MTL">
+ <displayName draft="contributed">მალტის ლირა</displayName>
+ </currency>
+ <currency type="MTP">
+ <displayName draft="contributed">მალტის გირვანქა</displayName>
+ </currency>
+ <currency type="MUR">
+ <displayName draft="contributed">მავრიტანული რუპია</displayName>
+ </currency>
+ <currency type="MVR">
+ <displayName draft="contributed">მალდივური რუფია</displayName>
+ </currency>
+ <currency type="MWK">
+ <displayName draft="contributed">მალავის კვანჩა</displayName>
+ </currency>
+ <currency type="MXN">
+ <displayName draft="contributed">მექსიკური პესო</displayName>
+ </currency>
+ <currency type="MXP">
+ <displayName draft="contributed">მექსიკური ვერცხლის პესო (1861-1992)</displayName>
+ </currency>
+ <currency type="MYR">
+ <displayName draft="contributed">მალაიზიური რინგიტი</displayName>
+ </currency>
+ <currency type="MZE">
+ <displayName draft="contributed">მოზამბიკური ესკუდო</displayName>
+ </currency>
+ <currency type="MZM">
+ <displayName draft="contributed">ძველი მოზამბიკური მეტიკალი</displayName>
+ </currency>
+ <currency type="MZN">
+ <displayName draft="contributed">მოზამბიკური მეტიკალი</displayName>
+ </currency>
+ <currency type="NAD">
+ <displayName draft="contributed">ნამიბიური დოლარი</displayName>
+ </currency>
+ <currency type="NGN">
+ <displayName draft="contributed">ნიგერიული ნაირა</displayName>
+ </currency>
+ <currency type="NIC">
+ <displayName draft="contributed">ნიკარაგუას კორდობა</displayName>
+ </currency>
+ <currency type="NIO">
+ <displayName draft="contributed">ნიკარაგუას ოქროს კორდობა</displayName>
+ </currency>
+ <currency type="NLG">
+ <displayName draft="contributed">ჰოლანდიური გულდენი</displayName>
+ </currency>
+ <currency type="NOK">
+ <displayName draft="contributed">ნორვეგიული კრონა</displayName>
+ </currency>
+ <currency type="NPR">
+ <displayName draft="contributed">ნეპალური რუპია</displayName>
+ </currency>
+ <currency type="NZD">
+ <displayName draft="contributed">ახალი ზელანდიის დოლარი</displayName>
+ </currency>
+ <currency type="OMR">
+ <displayName draft="contributed">ომანის რეალი</displayName>
+ </currency>
+ <currency type="PEI">
+ <displayName draft="contributed">პერუს ინტი</displayName>
+ </currency>
+ <currency type="PEN">
+ <displayName draft="contributed">პერუს ახალი სოლი</displayName>
+ </currency>
+ <currency type="PES">
+ <displayName draft="contributed">პერუს სოლი</displayName>
+ </currency>
+ <currency type="PHP">
+ <displayName draft="contributed">ფილიპინური პესო</displayName>
+ </currency>
+ <currency type="PKR">
+ <displayName draft="contributed">პაკისტანური რუპია</displayName>
+ </currency>
+ <currency type="PLN">
+ <displayName draft="contributed">პოლონური ზლოტი</displayName>
+ </currency>
+ <currency type="PLZ">
+ <displayName draft="contributed">პოლონური ზლოტი (1950-1995)</displayName>
+ </currency>
+ <currency type="PTE">
+ <displayName draft="contributed">პორტუგალიური ესკუდო</displayName>
+ </currency>
+ <currency type="QAR">
+ <displayName draft="contributed">კატარის რიალი</displayName>
+ </currency>
+ <currency type="RHD">
+ <displayName draft="contributed">როდეზიული დოლარი</displayName>
+ </currency>
+ <currency type="ROL">
+ <displayName draft="contributed">ძველი რუმინული ლეუ</displayName>
+ </currency>
+ <currency type="RON">
+ <displayName draft="contributed">რუმინული ლეუ</displayName>
+ </currency>
+ <currency type="RUB">
+ <displayName draft="contributed">რუსული რუბლი</displayName>
+ </currency>
+ <currency type="RUR">
+ <displayName draft="contributed">რუსული რუბლი (1991-1998)</displayName>
+ </currency>
+ <currency type="RWF">
+ <displayName draft="contributed">რუანდული ფრანკი</displayName>
+ </currency>
+ <currency type="SCR">
+ <displayName draft="contributed">სეიშელის რუპია</displayName>
+ </currency>
+ <currency type="SDD">
+ <displayName draft="contributed">სუდანის დინარი</displayName>
+ </currency>
+ <currency type="SDP">
+ <displayName draft="contributed">სუდანის გირვანქა</displayName>
+ </currency>
+ <currency type="SEK">
+ <displayName draft="contributed">შვედური კრონა</displayName>
+ </currency>
+ <currency type="SGD">
+ <displayName draft="contributed">სინგაპურის დოლარი</displayName>
+ </currency>
+ <currency type="SLL">
+ <displayName draft="contributed">სიერა ლეონეს ლეონე</displayName>
+ </currency>
+ <currency type="SRD">
+ <displayName draft="contributed">სურინამის დოლარი</displayName>
+ </currency>
+ <currency type="SRG">
+ <displayName draft="contributed">სურინამის გულდენი</displayName>
+ </currency>
+ <currency type="SUR">
+ <displayName draft="contributed">საბჭოთა რუბლი</displayName>
+ </currency>
+ <currency type="SYP">
+ <displayName draft="contributed">სირიული გირვანქა</displayName>
+ </currency>
+ <currency type="TJR">
+ <displayName draft="contributed">ტაჯიკური რუბლი</displayName>
+ </currency>
+ <currency type="TJS">
+ <displayName draft="contributed">ტაჯიკური სომონი</displayName>
+ </currency>
+ <currency type="TMM">
+ <displayName draft="contributed">თურქმენული მანათი</displayName>
+ </currency>
+ <currency type="TND">
+ <displayName draft="contributed">ტუნისიური დინარი</displayName>
+ </currency>
+ <currency type="TRL">
+ <displayName draft="contributed">თურქული ლირა</displayName>
+ </currency>
+ <currency type="TRY">
+ <displayName draft="contributed">ახალი თურქული ლირა</displayName>
+ </currency>
+ <currency type="TTD">
+ <displayName draft="contributed">ტრინიდად და ტობაგოს დოლარი</displayName>
+ </currency>
+ <currency type="TWD">
+ <displayName draft="contributed">ტაივანური ახალი დოლარი</displayName>
+ </currency>
+ <currency type="TZS">
+ <displayName draft="contributed">ტანზანიური შილინგი</displayName>
+ </currency>
+ <currency type="UAH">
+ <displayName draft="contributed">უკრაინული გრივნა</displayName>
+ </currency>
+ <currency type="UAK">
+ <displayName draft="contributed">უკრაინული კარბოვანეცი</displayName>
+ </currency>
+ <currency type="UGS">
+ <displayName draft="contributed">უგანდური შილინგი (1966-1987)</displayName>
+ </currency>
+ <currency type="UGX">
+ <displayName draft="contributed">უგანდური შილინგი</displayName>
+ </currency>
+ <currency type="USD">
+ <displayName draft="contributed">აშშ დოლარი</displayName>
+ </currency>
+ <currency type="USN">
+ <displayName draft="contributed">აშშ დოლარი (შემდეგი დღე)</displayName>
+ </currency>
+ <currency type="USS">
+ <displayName draft="contributed">აშშ დოლარი (იგივე დღე)</displayName>
+ </currency>
+ <currency type="UYP">
+ <displayName draft="contributed">ურუგვაის პესო (1975-1993)</displayName>
+ </currency>
+ <currency type="UYU">
+ <displayName draft="contributed">ურუგვაის პესო ურუგვაიო</displayName>
+ </currency>
+ <currency type="UZS">
+ <displayName draft="contributed">უზბეკური სუმი</displayName>
+ </currency>
+ <currency type="VEB">
+ <displayName draft="contributed">ვენესუელის ბოლივარი</displayName>
+ </currency>
+ <currency type="VND">
+ <displayName draft="contributed">ვიეტნამური დონგი</displayName>
+ </currency>
+ <currency type="VUV">
+ <displayName draft="contributed">ვანატუს ვატუ</displayName>
+ </currency>
+ <currency type="WST">
+ <displayName draft="contributed">დასავლეთ სამოას ტალა</displayName>
+ </currency>
+ <currency type="XAG">
+ <displayName draft="contributed">ვერცხლი</displayName>
+ </currency>
+ <currency type="XBA">
+ <displayName draft="contributed">ევროპული კომპპოზიტური ერთეული</displayName>
+ </currency>
+ <currency type="XBB">
+ <displayName draft="contributed">ევროპული ფულადი ერთეული</displayName>
+ </currency>
+ <currency type="XCD">
+ <displayName draft="contributed">აღმოსავლეთ კარიბიული დოლარი</displayName>
+ </currency>
+ <currency type="XEU">
+ <displayName draft="contributed">ევროპული სავალუტო ერთეული</displayName>
+ </currency>
+ <currency type="XFO">
+ <displayName draft="contributed">ფრანგული ოქროს ფრანკი</displayName>
+ </currency>
+ <currency type="XXX">
+ <displayName draft="contributed">უცნობი ან არასწორი ვალუტა</displayName>
+ </currency>
+ <currency type="YDD">
+ <displayName draft="contributed">იემენის დინარი</displayName>
+ </currency>
+ <currency type="YER">
+ <displayName draft="contributed">იემენის რეალი</displayName>
+ </currency>
+ <currency type="YUD">
+ <displayName draft="contributed">იუგოსლავიური მყარი დინარი</displayName>
+ </currency>
+ <currency type="YUM">
+ <displayName draft="contributed">იუგოსლავიური ახალი დინარი</displayName>
+ </currency>
+ <currency type="YUN">
+ <displayName draft="contributed">იუგოსლავიური კონვერტირებადი დინარი</displayName>
+ </currency>
+ <currency type="ZMK">
+ <displayName draft="contributed">ზამბიური კვანჩა</displayName>
+ </currency>
+ <currency type="ZRN">
+ <displayName draft="contributed">ზაირის ახალი ზაირი</displayName>
+ </currency>
+ <currency type="ZRZ">
+ <displayName draft="contributed">ზაირის ზაირი</displayName>
+ </currency>
+ <currency type="ZWD">
+ <displayName draft="contributed">ზიმბაბვეს დოლარი</displayName>
+ </currency>
+ </currencies>
+ </numbers>
+ <units>
+ <unit type="day">
+ <unitPattern count="other" draft="contributed">{0} დღე</unitPattern>
+ </unit>
+ <unit type="hour">
+ <unitPattern count="other" draft="contributed">{0} საათი</unitPattern>
+ </unit>
+ <unit type="minute">
+ <unitPattern count="other" draft="contributed">{0} წუთი</unitPattern>
+ </unit>
+ <unit type="month">
+ <unitPattern count="other" draft="contributed">{0} თვე</unitPattern>
+ </unit>
+ <unit type="second">
+ <unitPattern count="other" draft="contributed">{0} წამი</unitPattern>
+ </unit>
+ <unit type="week">
+ <unitPattern count="other" draft="contributed">{0} კვირა</unitPattern>
+ </unit>
+ <unit type="year">
+ <unitPattern count="other" draft="contributed">{0} წელი</unitPattern>
+ </unit>
+ </units>
+ <posix>
+ <messages>
+ <yesstr draft="contributed">დიახ</yesstr>
+ <nostr draft="contributed">არა</nostr>
+ </messages>
+ </posix>
+</ldml>
diff --git a/tools/locale-builder/lcids.xml b/tools/locale-builder/lcids.xml
index c57f7e6c6ad..eddbe6ffb48 100755
--- a/tools/locale-builder/lcids.xml
+++ b/tools/locale-builder/lcids.xml
@@ -18,6 +18,7 @@
<lcid name="ja" id="0x0011" parent="0x007F" specific="0x0411" iso2="ja" iso3="jpn" win="JPN" icu_name="Japanese" />
<lcid name="en-PH" id="0x3409" parent="0x0009" specific="0x3409" iso2="en" iso3="eng" win="ENP" icu_name="English (Philippines)" />
<lcid name="nl" id="0x0013" parent="0x007F" specific="0x0413" iso2="nl" iso3="nld" win="NLD" icu_name="Dutch" />
+ <lcid name="ka" id="0x0037" parent="0x007F" specific="0x0437" iso2="ka" iso3="kat" win="KAT" icu_name="Georgian" />
<lcid name="ko" id="0x0012" parent="0x007F" specific="0x0412" iso2="ko" iso3="kor" win="KOR" icu_name="Korean" />
<lcid name="ar-SA" id="0x0401" parent="0x0001" specific="0x0401" iso2="ar" iso3="ara" win="ARA" icu_name="Arabic (Saudi Arabia)" />
<lcid name="bg-BG" id="0x0402" parent="0x0002" specific="0x0402" iso2="bg" iso3="bul" win="BGR" icu_name="Bulgarian (Bulgaria)" />
@@ -36,6 +37,7 @@
<lcid name="be" id="0x0023" parent="0x007F" specific="0x0423" iso2="be" iso3="bel" win="BEL" icu_name="Belarusian" />
<lcid name="id" id="0x0021" parent="0x007F" specific="0x0421" iso2="id" iso3="ind" win="IND" icu_name="Indonesian" />
<lcid name="et" id="0x0025" parent="0x007F" specific="0x0425" iso2="et" iso3="est" win="ETI" icu_name="Estonian" />
+ <lcid name="ka-GE" id="0x0437" parent="0x0037" specific="0x0437" iso2="ka" iso3="kat" win="KAT" icu_name="Georgian (Georgia)" />
<lcid name="ko-KR" id="0x0412" parent="0x0012" specific="0x0412" iso2="ko" iso3="kor" win="KOR" icu_name="Korean (South Korea)" />
<lcid name="nl-NL" id="0x0413" parent="0x0013" specific="0x0413" iso2="nl" iso3="nld" win="NLD" icu_name="Dutch (Netherlands)" />
<lcid name="no" id="0x0014" parent="0x007F" specific="0x0414" iso2="no" iso3="nor" win="NOR" icu_name="Norwegian" />
diff --git a/tools/locale-builder/locales/ka_GE.xml b/tools/locale-builder/locales/ka_GE.xml
new file mode 100644
index 00000000000..e2009e99209
--- /dev/null
+++ b/tools/locale-builder/locales/ka_GE.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE ldml SYSTEM "../../common/dtd/ldml.dtd">
+<ldml>
+ <identity>
+ <version number="$Revision: 1.37 $"/>
+ <generation date="$Date: 2009/05/05 23:06:37 $"/>
+ <language type="ka"/>
+ <territory type="GE"/>
+ </identity>
+</ldml>
diff --git a/tools/locale-builder/supp/ka_GE.xml b/tools/locale-builder/supp/ka_GE.xml
new file mode 100644
index 00000000000..01c15f76e51
--- /dev/null
+++ b/tools/locale-builder/supp/ka_GE.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<ldml>
+ <dates>
+ <calendars>
+ <calendar type="gregorian">
+ <dateFormats>
+ <dateFormatLength type="short">
+ <dateFormat>
+ <pattern>dd.MM.yyyy</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ <dateFormatLength type="long">
+ <dateFormat>
+ <pattern>yyyy 'წლის' dd MM, dddd</pattern>
+ </dateFormat>
+ </dateFormatLength>
+ </dateFormats>
+ <timeFormats>
+ <timeFormatLength type="short">
+ <timeFormat>
+ <pattern>H:mm</pattern>
+ </timeFormat>
+ </timeFormatLength >
+ <timeFormatLength type="long">
+ <timeFormat>
+ <pattern>H:mm:ss</pattern>
+ </timeFormat>
+ </timeFormatLength >
+ </timeFormats>
+ </calendar>
+ </calendars>
+ </dates>
+</ldml>