NoticeReference
using Org.BouncyCastle.Math;
using System;
using System.Collections.Generic;
namespace Org.BouncyCastle.Asn1.X509
{
    public class NoticeReference : Asn1Encodable
    {
        private readonly DisplayText m_organization;
        private readonly Asn1Sequence m_noticeNumbers;
        public virtual DisplayText Organization => m_organization;
        public static NoticeReference GetInstance(object obj)
        {
            if (obj == null)
                return null;
            NoticeReference noticeReference = obj as NoticeReference;
            if (noticeReference != null)
                return noticeReference;
            return new NoticeReference(Asn1Sequence.GetInstance(obj));
        }
        public static NoticeReference GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new NoticeReference(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
        }
        public static NoticeReference GetOptional(Asn1Encodable element)
        {
            if (element == null)
                throw new ArgumentNullException("element");
            NoticeReference noticeReference = element as NoticeReference;
            if (noticeReference != null)
                return noticeReference;
            Asn1Sequence optional = Asn1Sequence.GetOptional(element);
            if (optional != null)
                return new NoticeReference(optional);
            return null;
        }
        public static NoticeReference GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit)
        {
            return new NoticeReference(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
        }
        private NoticeReference(Asn1Sequence seq)
        {
            int count = seq.Count;
            if (count != 2)
                throw new ArgumentException("Bad sequence size: " + count.ToString(), "seq");
            m_organization = DisplayText.GetInstance(seq[0]);
            m_noticeNumbers = Asn1Sequence.GetInstance(seq[1]);
        }
        public NoticeReference(string organization, IList<object> numbers)
            : this(organization, ConvertVector(numbers))
        {
        }
        public NoticeReference(string organization, Asn1EncodableVector noticeNumbers)
            : this(new DisplayText(organization), noticeNumbers)
        {
        }
        public NoticeReference(DisplayText organization, Asn1EncodableVector noticeNumbers)
        {
            if (organization == null)
                throw new ArgumentNullException("organization");
            m_organization = organization;
            m_noticeNumbers = new DerSequence(noticeNumbers);
        }
        public virtual DerInteger[] GetNoticeNumbers()
        {
            return m_noticeNumbers.MapElements(DerInteger.GetInstance);
        }
        public override Asn1Object ToAsn1Object()
        {
            return new DerSequence(m_organization, m_noticeNumbers);
        }
        private static Asn1EncodableVector ConvertVector(IList<object> numbers)
        {
            Asn1EncodableVector asn1EncodableVector = new Asn1EncodableVector(numbers.Count);
            foreach (object number in numbers) {
                BigInteger bigInteger = number as BigInteger;
                DerInteger element;
                if (bigInteger != null)
                    element = new DerInteger(bigInteger);
                else {
                    if (!(number is int))
                        throw new ArgumentException();
                    int value = (int)number;
                    element = new DerInteger(value);
                }
                asn1EncodableVector.Add(element);
            }
            return asn1EncodableVector;
        }
    }
}