/**
 * 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.
 */
//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, v2.2.11
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a>
// Any modifications to this file will be lost upon recompilation of the source schema.
// Generated on: 2017.07.31 at 11:10:09 AM IST
//


package org.apache.xml.security.binding.xmldsig11;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;
import org.w3c.dom.Element;


/**
 * <p>Java class for FieldIDType complex type.
 *
 * <p>The following schema fragment specifies the expected content contained within this class.
 *
 * <pre>
 * &lt;complexType name="FieldIDType"&gt;
 *   &lt;complexContent&gt;
 *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&gt;
 *       &lt;choice&gt;
 *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}Prime"/&gt;
 *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}TnB"/&gt;
 *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}PnB"/&gt;
 *         &lt;element ref="{http://www.w3.org/2009/xmldsig11#}GnB"/&gt;
 *         &lt;any processContents='lax' namespace='##other'/&gt;
 *       &lt;/choice&gt;
 *     &lt;/restriction&gt;
 *   &lt;/complexContent&gt;
 * &lt;/complexType&gt;
 * </pre>
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "FieldIDType", namespace = "http://www.w3.org/2009/xmldsig11#", propOrder = {
    "prime",
    "tnB",
    "pnB",
    "gnB",
    "any"
})
public class FieldIDType {

    @XmlElement(name = "Prime", namespace = "http://www.w3.org/2009/xmldsig11#")
    protected PrimeFieldParamsType prime;
    @XmlElement(name = "TnB", namespace = "http://www.w3.org/2009/xmldsig11#")
    protected TnBFieldParamsType tnB;
    @XmlElement(name = "PnB", namespace = "http://www.w3.org/2009/xmldsig11#")
    protected PnBFieldParamsType pnB;
    @XmlElement(name = "GnB", namespace = "http://www.w3.org/2009/xmldsig11#")
    protected CharTwoFieldParamsType gnB;
    @XmlAnyElement(lax = true)
    protected Object any;

    /**
     * Gets the value of the prime property.
     *
     * @return
     *     possible object is
     *     {@link PrimeFieldParamsType }
     *
     */
    public PrimeFieldParamsType getPrime() {
        return prime;
    }

    /**
     * Sets the value of the prime property.
     *
     * @param value
     *     allowed object is
     *     {@link PrimeFieldParamsType }
     *
     */
    public void setPrime(PrimeFieldParamsType value) {
        this.prime = value;
    }

    /**
     * Gets the value of the tnB property.
     *
     * @return
     *     possible object is
     *     {@link TnBFieldParamsType }
     *
     */
    public TnBFieldParamsType getTnB() {
        return tnB;
    }

    /**
     * Sets the value of the tnB property.
     *
     * @param value
     *     allowed object is
     *     {@link TnBFieldParamsType }
     *
     */
    public void setTnB(TnBFieldParamsType value) {
        this.tnB = value;
    }

    /**
     * Gets the value of the pnB property.
     *
     * @return
     *     possible object is
     *     {@link PnBFieldParamsType }
     *
     */
    public PnBFieldParamsType getPnB() {
        return pnB;
    }

    /**
     * Sets the value of the pnB property.
     *
     * @param value
     *     allowed object is
     *     {@link PnBFieldParamsType }
     *
     */
    public void setPnB(PnBFieldParamsType value) {
        this.pnB = value;
    }

    /**
     * Gets the value of the gnB property.
     *
     * @return
     *     possible object is
     *     {@link CharTwoFieldParamsType }
     *
     */
    public CharTwoFieldParamsType getGnB() {
        return gnB;
    }

    /**
     * Sets the value of the gnB property.
     *
     * @param value
     *     allowed object is
     *     {@link CharTwoFieldParamsType }
     *
     */
    public void setGnB(CharTwoFieldParamsType value) {
        this.gnB = value;
    }

    /**
     * Gets the value of the any property.
     *
     * @return
     *     possible object is
     *     {@link Object }
     *     {@link Element }
     *
     */
    public Object getAny() {
        return any;
    }

    /**
     * Sets the value of the any property.
     *
     * @param value
     *     allowed object is
     *     {@link Object }
     *     {@link Element }
     *
     */
    public void setAny(Object value) {
        this.any = value;
    }

}
