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 contributor’s 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>