package test.wsdl.roundtrip2;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.rmi.RemoteException;
import java.util.Calendar;

public class RoundTrip2SoapBindingImpl implements test.wsdl.roundtrip2.RoundTrip2Test {
    /**
     * Method booleanTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public boolean booleanTest(boolean v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperBooleanTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Boolean wrapperBooleanTest(Boolean v) throws RemoteException {
        return v;
    }

    /**
     * Method byteTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public byte byteTest(byte v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperByteTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Byte wrapperByteTest(Byte v) throws RemoteException {
        return v;
    }

    /**
     * Method shortTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public short shortTest(short v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperShortTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Short wrapperShortTest(Short v) throws RemoteException {
        return v;
    }

    /**
     * Method intTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public int intTest(int v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperIntegerTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Integer wrapperIntegerTest(Integer v) throws RemoteException {
        return v;
    }

    /**
     * Method longTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public long longTest(long v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperLongTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Long wrapperLongTest(Long v) throws RemoteException {
        return v;
    }

    /**
     * Method floatTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public float floatTest(float v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperFloatTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Float wrapperFloatTest(Float v) throws RemoteException {
        return v;
    }

    /**
     * Method doubleTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public double doubleTest(double v) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperDoubleTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Double wrapperDoubleTest(Double v) throws RemoteException {
        return v;
    }

    /**
     * Method booleanArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public boolean[] booleanArrayTest(boolean v[]) throws RemoteException {
        return v;
    }

    /**
     * Method byteArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public byte[] byteArrayTest(byte v[]) throws RemoteException {
        return v;
    }

    /**
     * Method shortArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public short[] shortArrayTest(short v[]) throws RemoteException {
        return v;
    }

    /**
     * Method intArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public int[] intArrayTest(int v[]) throws RemoteException {
        return v;
    }

    /**
     * Method longArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public long[] longArrayTest(long v[]) throws RemoteException {
        return v;
    }

    /**
     * Method floatArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public float[] floatArrayTest(float v[]) throws RemoteException {
        return v;
    }

    /**
     * Method doubleArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public double[] doubleArrayTest(double v[]) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperBooleanArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Boolean[] wrapperBooleanArrayTest(Boolean v[])
            throws RemoteException {
        return v;
    }

    /**
     * Method wrapperByteArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Byte[] wrapperByteArrayTest(Byte v[]) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperShortArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Short[] wrapperShortArrayTest(Short v[]) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperIntArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Integer[] wrapperIntArrayTest(Integer v[]) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperLongArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Long[] wrapperLongArrayTest(Long v[]) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperFloatArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Float[] wrapperFloatArrayTest(Float v[]) throws RemoteException {
        return v;
    }

    /**
     * Method wrapperDoubleArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Double[] wrapperDoubleArrayTest(Double v[]) throws RemoteException {
        return v;
    }

    /**
     * Method booleanMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public boolean[][] booleanMultiArrayTest(boolean v[][])
            throws RemoteException {
        return v;
    }

    /**
     * Method byteMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public byte[][] byteMultiArrayTest(byte v[][]) throws RemoteException {
        return v;
    }

    /**
     * Method shortMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public short[][] shortMultiArrayTest(short v[][]) throws RemoteException {
        return v;
    }

    /**
     * Method intMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public int[][] intMultiArrayTest(int v[][]) throws RemoteException {
        return v;
    }

    /**
     * Method longMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public long[][] longMultiArrayTest(long v[][]) throws RemoteException {
        return v;
    }

    /**
     * Method floatMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public float[][] floatMultiArrayTest(float v[][]) throws RemoteException {
        return v;
    }

    /**
     * Method doubleMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public double[][] doubleMultiArrayTest(double v[][])
            throws RemoteException {
        return v;
    }

    /**
     * Method stringTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public String stringTest(String v) throws RemoteException {
        return v;
    }

    /**
     * Method stringArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public String[] stringArrayTest(String v[]) throws RemoteException {
        return v;
    }

    /**
     * Method stringMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public String[][] stringMultiArrayTest(String v[][])
            throws RemoteException {
        return v;
    }

    /**
     * Method calendarTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Calendar calendarTest(Calendar v) throws RemoteException {
        return v;
    }

    /**
     * Method calendarArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Calendar[] calendarArrayTest(Calendar v[]) throws RemoteException {
        return v;
    }

    /**
     * Method calendarMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public Calendar[][] calendarMultiArrayTest(Calendar v[][])
            throws RemoteException {
        return v;
    }

    /**
     * Method bigIntegerTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public BigInteger bigIntegerTest(BigInteger v) throws RemoteException {
        return v;
    }

    /**
     * Method bigIntegerArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public BigInteger[] bigIntegerArrayTest(BigInteger v[])
            throws RemoteException {
        return v;
    }

    /**
     * Method bigIntegerMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public BigInteger[][] bigIntegerMultiArrayTest(BigInteger v[][])
            throws RemoteException {
        return v;
    }

    /**
     * Method bigDecimalTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public BigDecimal bigDecimalTest(BigDecimal v) throws RemoteException {
        return v;
    }

    /**
     * Method bigDecimalArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public BigDecimal[] bigDecimalArrayTest(BigDecimal v[])
            throws RemoteException {
        return v;
    }

    /**
     * Method bigDecimalMultiArrayTest
     *
     * @param v
     * @return
     * @throws RemoteException
     */
    public BigDecimal[][] bigDecimalMultiArrayTest(BigDecimal v[][])
            throws RemoteException {
        return v;
    }
}
