// ***************************************************************************************************************************
// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements.  See the NOTICE file *
// * distributed with this work for additional information regarding copyright ownership.  The ASF licenses this file        *
// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance            *
// * with the License.  You may obtain a copy of the License at                                                              *
// *                                                                                                                         *
// *  http://www.apache.org/licenses/LICENSE-2.0                                                                             *
// *                                                                                                                         *
// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an  *
// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the License for the        *
// * specific language governing permissions and limitations under the License.                                              *
// ***************************************************************************************************************************
package org.apache.juneau.transforms;

import static org.apache.juneau.testutils.TestUtils.*;

import java.lang.reflect.*;
import java.util.*;

import org.apache.juneau.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.testutils.*;
import org.junit.*;
import org.junit.runner.*;
import org.junit.runners.*;

/**
 * Exhaustive serialization tests for the DateSwap class.
 */
@RunWith(Parameterized.class)
@SuppressWarnings("deprecation")
public class DateSwapComboTest extends ComboRoundTripTest {

	private static Date singleDate = CalendarSwapTest.testDate.getTime();

	private static Date[] dateArray = new Date[]{singleDate};

	private static ObjectMap dateMap = new ObjectMap().append("foo", singleDate);


	@Parameterized.Parameters
	public static Collection<Object[]> getParameters() {
		return Arrays.asList(new Object[][] {
			{	/* 0 */
				new ComboInput2<Date>(
					"DateSwap.ToString/singleDate",
					Date.class,
					singleDate,
					DateSwap.ToString.class,
					/* Json */		"'Sun Mar 03 10:11:12 PST 1901'",
					/* JsonT */		"'Sun Mar 03 10:11:12 PST 1901'",
					/* JsonR */		"'Sun Mar 03 10:11:12 PST 1901'",
					/* Xml */		"<string>Sun Mar 03 10:11:12 PST 1901</string>",
					/* XmlT */		"<string>Sun Mar 03 10:11:12 PST 1901</string>",
					/* XmlR */		"<string>Sun Mar 03 10:11:12 PST 1901</string>\n",
					/* XmlNs */		"<string>Sun Mar 03 10:11:12 PST 1901</string>",
					/* Html */		"<string>Sun Mar 03 10:11:12 PST 1901</string>",
					/* HtmlT */		"<string>Sun Mar 03 10:11:12 PST 1901</string>",
					/* HtmlR */		"<string>Sun Mar 03 10:11:12 PST 1901</string>",
					/* Uon */		"'Sun Mar 03 10:11:12 PST 1901'",
					/* UonT */		"'Sun Mar 03 10:11:12 PST 1901'",
					/* UonR */		"'Sun Mar 03 10:11:12 PST 1901'",
					/* UrlEnc */	"_value='Sun+Mar+03+10:11:12+PST+1901'",
					/* UrlEncT */	"_value='Sun+Mar+03+10:11:12+PST+1901'",
					/* UrlEncR */	"_value='Sun+Mar+03+10:11:12+PST+1901'",
					/* MsgPack */	"BC53756E204D61722030332031303A31313A3132205053542031393031",
					/* MsgPackT */	"BC53756E204D61722030332031303A31313A3132205053542031393031",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun Mar 03 10:11:12 PST 1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun Mar 03 10:11:12 PST 1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <j:value>Sun Mar 03 10:11:12 PST 1901</j:value>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date o) {
						assertInstanceOf(Date.class, o);
					}
				}
			},
			{	/* 1 */
				new ComboInput2<Date[]>(
					"DateSwap.ToString/dateArray",
					Date[].class,
					dateArray,
					DateSwap.ToString.class,
					/* Json */		"['Sun Mar 03 10:11:12 PST 1901']",
					/* JsonT */		"['Sun Mar 03 10:11:12 PST 1901']",
					/* JsonR */		"[\n\t'Sun Mar 03 10:11:12 PST 1901'\n]",
					/* Xml */		"<array><string>Sun Mar 03 10:11:12 PST 1901</string></array>",
					/* XmlT */		"<array><string>Sun Mar 03 10:11:12 PST 1901</string></array>",
					/* XmlR */		"<array>\n\t<string>Sun Mar 03 10:11:12 PST 1901</string>\n</array>\n",
					/* XmlNs */		"<array><string>Sun Mar 03 10:11:12 PST 1901</string></array>",
					/* Html */		"<ul><li>Sun Mar 03 10:11:12 PST 1901</li></ul>",
					/* HtmlT */		"<ul><li>Sun Mar 03 10:11:12 PST 1901</li></ul>",
					/* HtmlR */		"<ul>\n\t<li>Sun Mar 03 10:11:12 PST 1901</li>\n</ul>\n",
					/* Uon */		"@('Sun Mar 03 10:11:12 PST 1901')",
					/* UonT */		"@('Sun Mar 03 10:11:12 PST 1901')",
					/* UonR */		"@(\n\t'Sun Mar 03 10:11:12 PST 1901'\n)",
					/* UrlEnc */	"0='Sun+Mar+03+10:11:12+PST+1901'",
					/* UrlEncT */	"0='Sun+Mar+03+10:11:12+PST+1901'",
					/* UrlEncR */	"0='Sun+Mar+03+10:11:12+PST+1901'",
					/* MsgPack */	"91BC53756E204D61722030332031303A31313A3132205053542031393031",
					/* MsgPackT */	"91BC53756E204D61722030332031303A31313A3132205053542031393031",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun Mar 03 10:11:12 PST 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun Mar 03 10:11:12 PST 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Seq>\n    <rdf:li>Sun Mar 03 10:11:12 PST 1901</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date[] o) {
						assertInstanceOf(Date.class, o[0]);
					}
				}
			},
			{	/* 2 */
				new ComboInput2<ObjectMap>(
					"DateSwap.ToString",
					getType(Map.class,String.class,Date.class),
					dateMap,
					DateSwap.ToString.class,
					/* Json */		"{foo:'Sun Mar 03 10:11:12 PST 1901'}",
					/* JsonT */		"{foo:'Sun Mar 03 10:11:12 PST 1901'}",
					/* JsonR */		"{\n\tfoo: 'Sun Mar 03 10:11:12 PST 1901'\n}",
					/* Xml */		"<object><foo>Sun Mar 03 10:11:12 PST 1901</foo></object>",
					/* XmlT */		"<object><foo>Sun Mar 03 10:11:12 PST 1901</foo></object>",
					/* XmlR */		"<object>\n\t<foo>Sun Mar 03 10:11:12 PST 1901</foo>\n</object>\n",
					/* XmlNs */		"<object><foo>Sun Mar 03 10:11:12 PST 1901</foo></object>",
					/* Html */		"<table><tr><td>foo</td><td>Sun Mar 03 10:11:12 PST 1901</td></tr></table>",
					/* HtmlT */		"<table><tr><td>foo</td><td>Sun Mar 03 10:11:12 PST 1901</td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>foo</td>\n\t\t<td>Sun Mar 03 10:11:12 PST 1901</td>\n\t</tr>\n</table>\n",
					/* Uon */		"(foo='Sun Mar 03 10:11:12 PST 1901')",
					/* UonT */		"(foo='Sun Mar 03 10:11:12 PST 1901')",
					/* UonR */		"(\n\tfoo='Sun Mar 03 10:11:12 PST 1901'\n)",
					/* UrlEnc */	"foo='Sun+Mar+03+10:11:12+PST+1901'",
					/* UrlEncT */	"foo='Sun+Mar+03+10:11:12+PST+1901'",
					/* UrlEncR */	"foo='Sun+Mar+03+10:11:12+PST+1901'",
					/* MsgPack */	"81A3666F6FBC53756E204D61722030332031303A31313A3132205053542031393031",
					/* MsgPackT */	"81A3666F6FBC53756E204D61722030332031303A31313A3132205053542031393031",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun Mar 03 10:11:12 PST 1901</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun Mar 03 10:11:12 PST 1901</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:foo>Sun Mar 03 10:11:12 PST 1901</jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(ObjectMap o) {
						assertInstanceOf(Date.class, o.get("foo"));
					}
				}
			},
			{	/* 3 */
				new ComboInput2<Date>(
					"DateSwap.ISO8601DT/singleDate",
					Date.class,
					singleDate,
					DateSwap.ISO8601DT.class,
					/* Json */		"'1901-03-03T10:11:12-08:00'",
					/* JsonT */		"'1901-03-03T10:11:12-08:00'",
					/* JsonR */		"'1901-03-03T10:11:12-08:00'",
					/* Xml */		"<string>1901-03-03T10:11:12-08:00</string>",
					/* XmlT */		"<string>1901-03-03T10:11:12-08:00</string>",
					/* XmlR */		"<string>1901-03-03T10:11:12-08:00</string>\n",
					/* XmlNs */		"<string>1901-03-03T10:11:12-08:00</string>",
					/* Html */		"<string>1901-03-03T10:11:12-08:00</string>",
					/* HtmlT */		"<string>1901-03-03T10:11:12-08:00</string>",
					/* HtmlR */		"<string>1901-03-03T10:11:12-08:00</string>",
					/* Uon */		"1901-03-03T10:11:12-08:00",
					/* UonT */		"1901-03-03T10:11:12-08:00",
					/* UonR */		"1901-03-03T10:11:12-08:00",
					/* UrlEnc */	"_value=1901-03-03T10:11:12-08:00",
					/* UrlEncT */	"_value=1901-03-03T10:11:12-08:00",
					/* UrlEncR */	"_value=1901-03-03T10:11:12-08:00",
					/* MsgPack */	"B9313930312D30332D30335431303A31313A31322D30383A3030",
					/* MsgPackT */	"B9313930312D30332D30335431303A31313A31322D30383A3030",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<j:value>1901-03-03T10:11:12-08:00</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<j:value>1901-03-03T10:11:12-08:00</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <j:value>1901-03-03T10:11:12-08:00</j:value>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date o) {
						assertInstanceOf(Date.class, o);
					}
				}
			},
			{	/* 4 */
				new ComboInput2<Date[]>(
					"DateSwap.ISO8601DT/dateArray",
					Date[].class,
					dateArray,
					DateSwap.ISO8601DT.class,
					/* Json */		"['1901-03-03T10:11:12-08:00']",
					/* JsonT */		"['1901-03-03T10:11:12-08:00']",
					/* JsonR */		"[\n\t'1901-03-03T10:11:12-08:00'\n]",
					/* Xml */		"<array><string>1901-03-03T10:11:12-08:00</string></array>",
					/* XmlT */		"<array><string>1901-03-03T10:11:12-08:00</string></array>",
					/* XmlR */		"<array>\n\t<string>1901-03-03T10:11:12-08:00</string>\n</array>\n",
					/* XmlNs */		"<array><string>1901-03-03T10:11:12-08:00</string></array>",
					/* Html */		"<ul><li>1901-03-03T10:11:12-08:00</li></ul>",
					/* HtmlT */		"<ul><li>1901-03-03T10:11:12-08:00</li></ul>",
					/* HtmlR */		"<ul>\n\t<li>1901-03-03T10:11:12-08:00</li>\n</ul>\n",
					/* Uon */		"@(1901-03-03T10:11:12-08:00)",
					/* UonT */		"@(1901-03-03T10:11:12-08:00)",
					/* UonR */		"@(\n\t1901-03-03T10:11:12-08:00\n)",
					/* UrlEnc */	"0=1901-03-03T10:11:12-08:00",
					/* UrlEncT */	"0=1901-03-03T10:11:12-08:00",
					/* UrlEncR */	"0=1901-03-03T10:11:12-08:00",
					/* MsgPack */	"91B9313930312D30332D30335431303A31313A31322D30383A3030",
					/* MsgPackT */	"91B9313930312D30332D30335431303A31313A31322D30383A3030",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Seq>\n    <rdf:li>1901-03-03T10:11:12-08:00</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date[] o) {
						assertInstanceOf(Date.class, o[0]);
					}
				}
			},
			{	/* 5 */
				new ComboInput2<ObjectMap>(
					"DateSwap.ISO8601DT/dateMap",
					getType(Map.class,String.class,Date.class),
					dateMap,
					DateSwap.ISO8601DT.class,
					/* Json */		"{foo:'1901-03-03T10:11:12-08:00'}",
					/* JsonT */		"{foo:'1901-03-03T10:11:12-08:00'}",
					/* JsonR */		"{\n\tfoo: '1901-03-03T10:11:12-08:00'\n}",
					/* Xml */		"<object><foo>1901-03-03T10:11:12-08:00</foo></object>",
					/* XmlT */		"<object><foo>1901-03-03T10:11:12-08:00</foo></object>",
					/* XmlR */		"<object>\n\t<foo>1901-03-03T10:11:12-08:00</foo>\n</object>\n",
					/* XmlNs */		"<object><foo>1901-03-03T10:11:12-08:00</foo></object>",
					/* Html */		"<table><tr><td>foo</td><td>1901-03-03T10:11:12-08:00</td></tr></table>",
					/* HtmlT */		"<table><tr><td>foo</td><td>1901-03-03T10:11:12-08:00</td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>foo</td>\n\t\t<td>1901-03-03T10:11:12-08:00</td>\n\t</tr>\n</table>\n",
					/* Uon */		"(foo=1901-03-03T10:11:12-08:00)",
					/* UonT */		"(foo=1901-03-03T10:11:12-08:00)",
					/* UonR */		"(\n\tfoo=1901-03-03T10:11:12-08:00\n)",
					/* UrlEnc */	"foo=1901-03-03T10:11:12-08:00",
					/* UrlEncT */	"foo=1901-03-03T10:11:12-08:00",
					/* UrlEncR */	"foo=1901-03-03T10:11:12-08:00",
					/* MsgPack */	"81A3666F6FB9313930312D30332D30335431303A31313A31322D30383A3030",
					/* MsgPackT */	"81A3666F6FB9313930312D30332D30335431303A31313A31322D30383A3030",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:foo>1901-03-03T10:11:12-08:00</jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(ObjectMap o) {
						assertInstanceOf(Date.class, o.get("foo"));
					}
				}
			},
			{	/* 6 */
				new ComboInput2<Date>(
					"DateSwap.RFC2822DTZ/singleDate",
					Date.class,
					singleDate,
					DateSwap.RFC2822DTZ.class,
					/* Json */		"'Sun, 03 Mar 1901 18:11:12 GMT'",
					/* JsonT */		"'Sun, 03 Mar 1901 18:11:12 GMT'",
					/* JsonR */		"'Sun, 03 Mar 1901 18:11:12 GMT'",
					/* Xml */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>",
					/* XmlT */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>",
					/* XmlR */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>\n",
					/* XmlNs */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>",
					/* Html */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>",
					/* HtmlT */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>",
					/* HtmlR */		"<string>Sun, 03 Mar 1901 18:11:12 GMT</string>",
					/* Uon */		"'Sun, 03 Mar 1901 18:11:12 GMT'",
					/* UonT */		"'Sun, 03 Mar 1901 18:11:12 GMT'",
					/* UonR */		"'Sun, 03 Mar 1901 18:11:12 GMT'",
					/* UrlEnc */	"_value='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* UrlEncT */	"_value='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* UrlEncR */	"_value='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* MsgPack */	"BD53756E2C203033204D617220313930312031383A31313A313220474D54",
					/* MsgPackT */	"BD53756E2C203033204D617220313930312031383A31313A313220474D54",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun, 03 Mar 1901 18:11:12 GMT</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<j:value>Sun, 03 Mar 1901 18:11:12 GMT</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <j:value>Sun, 03 Mar 1901 18:11:12 GMT</j:value>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date o) {
						assertInstanceOf(Date.class, o);
					}
				}
			},
			{	/* 7 */
				new ComboInput2<Date[]>(
					"DateSwap.RFC2822DTZ/dateArray",
					Date[].class,
					dateArray,
					DateSwap.RFC2822DTZ.class,
					/* Json */		"['Sun, 03 Mar 1901 18:11:12 GMT']",
					/* JsonT */		"['Sun, 03 Mar 1901 18:11:12 GMT']",
					/* JsonR */		"[\n\t'Sun, 03 Mar 1901 18:11:12 GMT'\n]",
					/* Xml */		"<array><string>Sun, 03 Mar 1901 18:11:12 GMT</string></array>",
					/* XmlT */		"<array><string>Sun, 03 Mar 1901 18:11:12 GMT</string></array>",
					/* XmlR */		"<array>\n\t<string>Sun, 03 Mar 1901 18:11:12 GMT</string>\n</array>\n",
					/* XmlNs */		"<array><string>Sun, 03 Mar 1901 18:11:12 GMT</string></array>",
					/* Html */		"<ul><li>Sun, 03 Mar 1901 18:11:12 GMT</li></ul>",
					/* HtmlT */		"<ul><li>Sun, 03 Mar 1901 18:11:12 GMT</li></ul>",
					/* HtmlR */		"<ul>\n\t<li>Sun, 03 Mar 1901 18:11:12 GMT</li>\n</ul>\n",
					/* Uon */		"@('Sun, 03 Mar 1901 18:11:12 GMT')",
					/* UonT */		"@('Sun, 03 Mar 1901 18:11:12 GMT')",
					/* UonR */		"@(\n\t'Sun, 03 Mar 1901 18:11:12 GMT'\n)",
					/* UrlEnc */	"0='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* UrlEncT */	"0='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* UrlEncR */	"0='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* MsgPack */	"91BD53756E2C203033204D617220313930312031383A31313A313220474D54",
					/* MsgPackT */	"91BD53756E2C203033204D617220313930312031383A31313A313220474D54",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun, 03 Mar 1901 18:11:12 GMT</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Sun, 03 Mar 1901 18:11:12 GMT</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Seq>\n    <rdf:li>Sun, 03 Mar 1901 18:11:12 GMT</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date[] o) {
						assertInstanceOf(Date.class, o[0]);
					}
				}
			},
			{	/* 8 */
				new ComboInput2<ObjectMap>(
					"DateSwap.RFC2822DTZ/dateMap",
					getType(Map.class,String.class,Date.class),
					dateMap,
					DateSwap.RFC2822DTZ.class,
					/* Json */		"{foo:'Sun, 03 Mar 1901 18:11:12 GMT'}",
					/* JsonT */		"{foo:'Sun, 03 Mar 1901 18:11:12 GMT'}",
					/* JsonR */		"{\n\tfoo: 'Sun, 03 Mar 1901 18:11:12 GMT'\n}",
					/* Xml */		"<object><foo>Sun, 03 Mar 1901 18:11:12 GMT</foo></object>",
					/* XmlT */		"<object><foo>Sun, 03 Mar 1901 18:11:12 GMT</foo></object>",
					/* XmlR */		"<object>\n\t<foo>Sun, 03 Mar 1901 18:11:12 GMT</foo>\n</object>\n",
					/* XmlNs */		"<object><foo>Sun, 03 Mar 1901 18:11:12 GMT</foo></object>",
					/* Html */		"<table><tr><td>foo</td><td>Sun, 03 Mar 1901 18:11:12 GMT</td></tr></table>",
					/* HtmlT */		"<table><tr><td>foo</td><td>Sun, 03 Mar 1901 18:11:12 GMT</td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>foo</td>\n\t\t<td>Sun, 03 Mar 1901 18:11:12 GMT</td>\n\t</tr>\n</table>\n",
					/* Uon */		"(foo='Sun, 03 Mar 1901 18:11:12 GMT')",
					/* UonT */		"(foo='Sun, 03 Mar 1901 18:11:12 GMT')",
					/* UonR */		"(\n\tfoo='Sun, 03 Mar 1901 18:11:12 GMT'\n)",
					/* UrlEnc */	"foo='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* UrlEncT */	"foo='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* UrlEncR */	"foo='Sun,+03+Mar+1901+18:11:12+GMT'",
					/* MsgPack */	"81A3666F6FBD53756E2C203033204D617220313930312031383A31313A313220474D54",
					/* MsgPackT */	"81A3666F6FBD53756E2C203033204D617220313930312031383A31313A313220474D54",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun, 03 Mar 1901 18:11:12 GMT</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Sun, 03 Mar 1901 18:11:12 GMT</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:foo>Sun, 03 Mar 1901 18:11:12 GMT</jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(ObjectMap o) {
						assertInstanceOf(Date.class, o.get("foo"));
					}
				}
			},
			{	/* 9 */
				new ComboInput2<Date>(
					"DateLongSwap",
					Date.class,
					singleDate,
					DateLongSwap.class,
					/* Json */		"-2172116928000",
					/* JsonT */		"-2172116928000",
					/* JsonR */		"-2172116928000",
					/* Xml */		"<number>-2172116928000</number>",
					/* XmlT */		"<number>-2172116928000</number>",
					/* XmlR */		"<number>-2172116928000</number>\n",
					/* XmlNs */		"<number>-2172116928000</number>",
					/* Html */		"<number>-2172116928000</number>",
					/* HtmlT */		"<number>-2172116928000</number>",
					/* HtmlR */		"<number>-2172116928000</number>",
					/* Uon */		"-2172116928000",
					/* UonT */		"-2172116928000",
					/* UonR */		"-2172116928000",
					/* UrlEnc */	"_value=-2172116928000",
					/* UrlEncT */	"_value=-2172116928000",
					/* UrlEncR */	"_value=-2172116928000",
					/* MsgPack */	"D3FFFFFE0643BDFA00",
					/* MsgPackT */	"D3FFFFFE0643BDFA00",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<j:value>-2172116928000</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<j:value>-2172116928000</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <j:value>-2172116928000</j:value>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date o) {
						assertInstanceOf(Date.class, o);
					}
				}
			},
			{	/* 10 */
				new ComboInput2<Date[]>(
					"DateLongSwap/dateArray",
					Date[].class,
					dateArray,
					DateLongSwap.class,
					/* Json */		"[-2172116928000]",
					/* JsonT */		"[-2172116928000]",
					/* JsonR */		"[\n\t-2172116928000\n]",
					/* Xml */		"<array><number>-2172116928000</number></array>",
					/* XmlT */		"<array><number>-2172116928000</number></array>",
					/* XmlR */		"<array>\n\t<number>-2172116928000</number>\n</array>\n",
					/* XmlNs */		"<array><number>-2172116928000</number></array>",
					/* Html */		"<ul><li><number>-2172116928000</number></li></ul>",
					/* HtmlT */		"<ul><li><number>-2172116928000</number></li></ul>",
					/* HtmlR */		"<ul>\n\t<li><number>-2172116928000</number></li>\n</ul>\n",
					/* Uon */		"@(-2172116928000)",
					/* UonT */		"@(-2172116928000)",
					/* UonR */		"@(\n\t-2172116928000\n)",
					/* UrlEnc */	"0=-2172116928000",
					/* UrlEncT */	"0=-2172116928000",
					/* UrlEncR */	"0=-2172116928000",
					/* MsgPack */	"91D3FFFFFE0643BDFA00",
					/* MsgPackT */	"91D3FFFFFE0643BDFA00",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>-2172116928000</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>-2172116928000</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Seq>\n    <rdf:li>-2172116928000</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date[] o) {
						assertInstanceOf(Date.class, o[0]);
					}
				}
			},
			{	/* 11 */
				new ComboInput2<ObjectMap>(
					"DateLongSwap/dateMap",
					getType(Map.class,String.class,Date.class),
					dateMap,
					DateLongSwap.class,
					/* Json */		"{foo:-2172116928000}",
					/* JsonT */		"{foo:-2172116928000}",
					/* JsonR */		"{\n\tfoo: -2172116928000\n}",
					/* Xml */		"<object><foo _type='number'>-2172116928000</foo></object>",
					/* XmlT */		"<object><foo t='number'>-2172116928000</foo></object>",
					/* XmlR */		"<object>\n\t<foo _type='number'>-2172116928000</foo>\n</object>\n",
					/* XmlNs */		"<object><foo _type='number'>-2172116928000</foo></object>",
					/* Html */		"<table><tr><td>foo</td><td><number>-2172116928000</number></td></tr></table>",
					/* HtmlT */		"<table><tr><td>foo</td><td><number>-2172116928000</number></td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>foo</td>\n\t\t<td><number>-2172116928000</number></td>\n\t</tr>\n</table>\n",
					/* Uon */		"(foo=-2172116928000)",
					/* UonT */		"(foo=-2172116928000)",
					/* UonR */		"(\n\tfoo=-2172116928000\n)",
					/* UrlEnc */	"foo=-2172116928000",
					/* UrlEncT */	"foo=-2172116928000",
					/* UrlEncR */	"foo=-2172116928000",
					/* MsgPack */	"81A3666F6FD3FFFFFE0643BDFA00",
					/* MsgPackT */	"81A3666F6FD3FFFFFE0643BDFA00",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>-2172116928000</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>-2172116928000</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:foo>-2172116928000</jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(ObjectMap o) {
						assertInstanceOf(Date.class, o.get("foo"));
					}
				}
			},
			{	/* 12 */
				new ComboInput2<Date>(
					"DateMapSwap/singleDate",
					Date.class,
					singleDate,
					DateMapSwap.class,
					/* Json */		"{time:-2172116928000}",
					/* JsonT */		"{time:-2172116928000}",
					/* JsonR */		"{\n\ttime: -2172116928000\n}",
					/* Xml */		"<object><time _type='number'>-2172116928000</time></object>",
					/* XmlT */		"<object><time t='number'>-2172116928000</time></object>",
					/* XmlR */		"<object>\n\t<time _type='number'>-2172116928000</time>\n</object>\n",
					/* XmlNs */		"<object><time _type='number'>-2172116928000</time></object>",
					/* Html */		"<table><tr><td>time</td><td><number>-2172116928000</number></td></tr></table>",
					/* HtmlT */		"<table><tr><td>time</td><td><number>-2172116928000</number></td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>time</td>\n\t\t<td><number>-2172116928000</number></td>\n\t</tr>\n</table>\n",
					/* Uon */		"(time=-2172116928000)",
					/* UonT */		"(time=-2172116928000)",
					/* UonR */		"(\n\ttime=-2172116928000\n)",
					/* UrlEnc */	"time=-2172116928000",
					/* UrlEncT */	"time=-2172116928000",
					/* UrlEncR */	"time=-2172116928000",
					/* MsgPack */	"81A474696D65D3FFFFFE0643BDFA00",
					/* MsgPackT */	"81A474696D65D3FFFFFE0643BDFA00",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:time>-2172116928000</jp:time>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:time>-2172116928000</jp:time>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:time>-2172116928000</jp:time>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date o) {
						assertInstanceOf(Date.class, o);
					}
				}
			},
			{	/* 13 */
				new ComboInput2<Date[]>(
					"DateMapSwap/dateArray",
					Date[].class,
					dateArray,
					DateMapSwap.class,
					/* Json */		"[{time:-2172116928000}]",
					/* JsonT */		"[{time:-2172116928000}]",
					/* JsonR */		"[\n\t{\n\t\ttime: -2172116928000\n\t}\n]",
					/* Xml */		"<array><object><time _type='number'>-2172116928000</time></object></array>",
					/* XmlT */		"<array><object><time t='number'>-2172116928000</time></object></array>",
					/* XmlR */		"<array>\n\t<object>\n\t\t<time _type='number'>-2172116928000</time>\n\t</object>\n</array>\n",
					/* XmlNs */		"<array><object><time _type='number'>-2172116928000</time></object></array>",
					/* Html */		"<ul><li><table><tr><td>time</td><td><number>-2172116928000</number></td></tr></table></li></ul>",
					/* HtmlT */		"<ul><li><table><tr><td>time</td><td><number>-2172116928000</number></td></tr></table></li></ul>",
					/* HtmlR */		"<ul>\n\t<li>\n\t\t<table>\n\t\t\t<tr>\n\t\t\t\t<td>time</td>\n\t\t\t\t<td><number>-2172116928000</number></td>\n\t\t\t</tr>\n\t\t</table>\n\t</li>\n</ul>\n",
					/* Uon */		"@((time=-2172116928000))",
					/* UonT */		"@((time=-2172116928000))",
					/* UonR */		"@(\n\t(\n\t\ttime=-2172116928000\n\t)\n)",
					/* UrlEnc */	"0=(time=-2172116928000)",
					/* UrlEncT */	"0=(time=-2172116928000)",
					/* UrlEncR */	"0=(\n\ttime=-2172116928000\n)",
					/* MsgPack */	"9181A474696D65D3FFFFFE0643BDFA00",
					/* MsgPackT */	"9181A474696D65D3FFFFFE0643BDFA00",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Seq>\n    <rdf:li rdf:parseType='Resource'>\n      <jp:time>-2172116928000</jp:time>\n    </rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date[] o) {
						assertInstanceOf(Date.class, o[0]);
					}
				}
			},
			{	/* 14 */
				new ComboInput2<ObjectMap>(
					"DateMapSwap/dateMap",
					getType(Map.class,String.class,Date.class),
					dateMap,
					DateMapSwap.class,
					/* Json */		"{foo:{time:-2172116928000}}",
					/* JsonT */		"{foo:{time:-2172116928000}}",
					/* JsonR */		"{\n\tfoo: {\n\t\ttime: -2172116928000\n\t}\n}",
					/* Xml */		"<object><foo _type='object'><time _type='number'>-2172116928000</time></foo></object>",
					/* XmlT */		"<object><foo t='object'><time t='number'>-2172116928000</time></foo></object>",
					/* XmlR */		"<object>\n\t<foo _type='object'>\n\t\t<time _type='number'>-2172116928000</time>\n\t</foo>\n</object>\n",
					/* XmlNs */		"<object><foo _type='object'><time _type='number'>-2172116928000</time></foo></object>",
					/* Html */		"<table><tr><td>foo</td><td><table><tr><td>time</td><td><number>-2172116928000</number></td></tr></table></td></tr></table>",
					/* HtmlT */		"<table><tr><td>foo</td><td><table><tr><td>time</td><td><number>-2172116928000</number></td></tr></table></td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>foo</td>\n\t\t<td>\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>time</td>\n\t\t\t\t\t<td><number>-2172116928000</number></td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</td>\n\t</tr>\n</table>\n",
					/* Uon */		"(foo=(time=-2172116928000))",
					/* UonT */		"(foo=(time=-2172116928000))",
					/* UonR */		"(\n\tfoo=(\n\t\ttime=-2172116928000\n\t)\n)",
					/* UrlEnc */	"foo=(time=-2172116928000)",
					/* UrlEncT */	"foo=(time=-2172116928000)",
					/* UrlEncR */	"foo=(\n\ttime=-2172116928000\n)",
					/* MsgPack */	"81A3666F6F81A474696D65D3FFFFFE0643BDFA00",
					/* MsgPackT */	"81A3666F6F81A474696D65D3FFFFFE0643BDFA00",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo rdf:parseType='Resource'>\n<jp:time>-2172116928000</jp:time>\n</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:foo rdf:parseType='Resource'>\n      <jp:time>-2172116928000</jp:time>\n    </jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(ObjectMap o) {
						assertInstanceOf(Date.class, o.get("foo"));
					}
				}
			},
			{	/* 15 */
				new ComboInput2<Date>(
					"DateSwap.DateMedium/singleDate",
					Date.class,
					singleDate,
					DateSwap.DateMedium.class,
					/* Json */		"'Mar 3, 1901'",
					/* JsonT */		"'Mar 3, 1901'",
					/* JsonR */		"'Mar 3, 1901'",
					/* Xml */		"<string>Mar 3, 1901</string>",
					/* XmlT */		"<string>Mar 3, 1901</string>",
					/* XmlR */		"<string>Mar 3, 1901</string>\n",
					/* XmlNs */		"<string>Mar 3, 1901</string>",
					/* Html */		"<string>Mar 3, 1901</string>",
					/* HtmlT */		"<string>Mar 3, 1901</string>",
					/* HtmlR */		"<string>Mar 3, 1901</string>",
					/* Uon */		"'Mar 3, 1901'",
					/* UonT */		"'Mar 3, 1901'",
					/* UonR */		"'Mar 3, 1901'",
					/* UrlEnc */	"_value='Mar+3,+1901'",
					/* UrlEncT */	"_value='Mar+3,+1901'",
					/* UrlEncR */	"_value='Mar+3,+1901'",
					/* MsgPack */	"AB4D617220332C2031393031",
					/* MsgPackT */	"AB4D617220332C2031393031",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<j:value>Mar 3, 1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<j:value>Mar 3, 1901</j:value>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <j:value>Mar 3, 1901</j:value>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date o) {
						assertInstanceOf(Date.class, o);
					}
				}
			},
			{	/* 16 */
				new ComboInput2<Date[]>(
					"DateSwap.DateMedium/dateArray",
					Date[].class,
					dateArray,
					DateSwap.DateMedium.class,
					/* Json */		"['Mar 3, 1901']",
					/* JsonT */		"['Mar 3, 1901']",
					/* JsonR */		"[\n\t'Mar 3, 1901'\n]",
					/* Xml */		"<array><string>Mar 3, 1901</string></array>",
					/* XmlT */		"<array><string>Mar 3, 1901</string></array>",
					/* XmlR */		"<array>\n\t<string>Mar 3, 1901</string>\n</array>\n",
					/* XmlNs */		"<array><string>Mar 3, 1901</string></array>",
					/* Html */		"<ul><li>Mar 3, 1901</li></ul>",
					/* HtmlT */		"<ul><li>Mar 3, 1901</li></ul>",
					/* HtmlR */		"<ul>\n\t<li>Mar 3, 1901</li>\n</ul>\n",
					/* Uon */		"@('Mar 3, 1901')",
					/* UonT */		"@('Mar 3, 1901')",
					/* UonR */		"@(\n\t'Mar 3, 1901'\n)",
					/* UrlEnc */	"0='Mar+3,+1901'",
					/* UrlEncT */	"0='Mar+3,+1901'",
					/* UrlEncR */	"0='Mar+3,+1901'",
					/* MsgPack */	"91AB4D617220332C2031393031",
					/* MsgPackT */	"91AB4D617220332C2031393031",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Mar 3, 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Seq>\n<rdf:li>Mar 3, 1901</rdf:li>\n</rdf:Seq>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Seq>\n    <rdf:li>Mar 3, 1901</rdf:li>\n  </rdf:Seq>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(Date[] o) {
						assertInstanceOf(Date.class, o[0]);
					}
				}
			},
			{	/* 17 */
				new ComboInput2<ObjectMap>(
					"DateSwap.DateMedium/dateMap",
					getType(Map.class,String.class,Date.class),
					dateMap,
					DateSwap.DateMedium.class,
					/* Json */		"{foo:'Mar 3, 1901'}",
					/* JsonT */		"{foo:'Mar 3, 1901'}",
					/* JsonR */		"{\n\tfoo: 'Mar 3, 1901'\n}",
					/* Xml */		"<object><foo>Mar 3, 1901</foo></object>",
					/* XmlT */		"<object><foo>Mar 3, 1901</foo></object>",
					/* XmlR */		"<object>\n\t<foo>Mar 3, 1901</foo>\n</object>\n",
					/* XmlNs */		"<object><foo>Mar 3, 1901</foo></object>",
					/* Html */		"<table><tr><td>foo</td><td>Mar 3, 1901</td></tr></table>",
					/* HtmlT */		"<table><tr><td>foo</td><td>Mar 3, 1901</td></tr></table>",
					/* HtmlR */		"<table>\n\t<tr>\n\t\t<td>foo</td>\n\t\t<td>Mar 3, 1901</td>\n\t</tr>\n</table>\n",
					/* Uon */		"(foo='Mar 3, 1901')",
					/* UonT */		"(foo='Mar 3, 1901')",
					/* UonR */		"(\n\tfoo='Mar 3, 1901'\n)",
					/* UrlEnc */	"foo='Mar+3,+1901'",
					/* UrlEncT */	"foo='Mar+3,+1901'",
					/* UrlEncR */	"foo='Mar+3,+1901'",
					/* MsgPack */	"81A3666F6FAB4D617220332C2031393031",
					/* MsgPackT */	"81A3666F6FAB4D617220332C2031393031",
					/* RdfXml */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Mar 3, 1901</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlT */	"<rdf:RDF>\n<rdf:Description>\n<jp:foo>Mar 3, 1901</jp:foo>\n</rdf:Description>\n</rdf:RDF>\n",
					/* RdfXmlR */	"<rdf:RDF>\n  <rdf:Description>\n    <jp:foo>Mar 3, 1901</jp:foo>\n  </rdf:Description>\n</rdf:RDF>\n"
				)
				{
					@Override
					public void verify(ObjectMap o) {
						assertInstanceOf(Date.class, o.get("foo"));
					}
				}
			},
		});
	}

	private final Class<?> swapClass;

	public DateSwapComboTest(ComboInput2<?> comboInput) {
		super(comboInput);
		this.swapClass = comboInput.swapClass;
	}

	public static class ComboInput2<T> extends ComboInput<T> {
		private final Class<?> swapClass;

		public ComboInput2(
				String label,
				Type type,
				T in,
				Class<?> swapClass,
				String json,
				String jsonT,
				String jsonR,
				String xml,
				String xmlT,
				String xmlR,
				String xmlNs,
				String html,
				String htmlT,
				String htmlR,
				String uon,
				String uonT,
				String uonR,
				String urlEncoding,
				String urlEncodingT,
				String urlEncodingR,
				String msgPack,
				String msgPackT,
				String rdfXml,
				String rdfXmlT,
				String rdfXmlR
			) {
			super(label, type, in, json, jsonT, jsonR, xml, xmlT, xmlR, xmlNs, html, htmlT, htmlR, uon, uonT, uonR, urlEncoding, urlEncodingT, urlEncodingR, msgPack, msgPackT, rdfXml, rdfXmlT, rdfXmlR);
			this.swapClass = swapClass;
		}
	}

	@BeforeClass
	public static void beforeClass() {
		TestUtils.setTimeZone("PST");
		TestUtils.setLocale(Locale.US);
	}

	@AfterClass
	public static void afterClass() {
		TestUtils.unsetTimeZone();
		TestUtils.unsetLocale();
	}

	@Override
	protected Serializer applySettings(Serializer s) throws Exception {
		return s.builder().pojoSwaps(swapClass).build();
	}

	@Override
	protected Parser applySettings(Parser p) throws Exception {
		return p.builder().pojoSwaps(swapClass).build();
	}
}
