
Revision 0.4.7, released 01-09-2019
-----------------------------------

- Added `isInconsistent` property to all constructed types. This property
  conceptually replaces `verifySizeSpec` method to serve a more general
  purpose e.g. ensuring all required fields are in a good shape. By default
  this check invokes subtype constraints verification and is run by codecs
  on value de/serialisation.
- Deprecate `subtypeSpec` attributes and keyword argument. It is now
  recommended to pass `ValueSizeConstraint`, as well as all other constraints,
  to `subtypeSpec`.
- Fixed a design bug in a way of how the items assigned to constructed
  types are verified. Now if `Asn1Type`-based object is assigned, its
  compatibility is verified based on having all tags and constraint
  objects as the type in field definition. When a bare Python value is
  assigned, then field type object is cloned and initialized with the
  bare value (constraints verificaton would run at this moment).
- Added `WithComponentsConstraint` along with related
  `ComponentPresentConstraint` and `ComponentAbsentConstraint` classes
  to be used with `Sequence`/`Set` types representing
  `SET ... WITH COMPONENTS ...` like ASN.1 constructs.

Revision 0.4.6, released 31-07-2019
-----------------------------------

- Added previously missing `SET OF ANY` construct encoding/decoding support.
- Added `omitEmptyOptionals` option which is respected by `Sequence`
  and `Set` encoders. When `omitEmptyOptionals` is set to `True`, empty
  initialized optional components are not encoded. Default is `False`.
- New elements to `SequenceOf`/`SetOf` objects can now be added at any
  position - the requirement for the new elements to reside at the end
  of the existing ones (i.e. s[len(s)] = 123) is removed.
- List-like slicing support added to `SequenceOf`/`SetOf` objects.
- Removed default initializer from `SequenceOf`/`SetOf` types to ensure
  consistent behaviour with the rest of ASN.1 types. Before this change,
  `SequenceOf`/`SetOf` instances immediately become value objects behaving
  like an empty list. With this change, `SequenceOf`/`SetOf` objects
  remain schema objects unless a component is added or `.clear()` is
  called.
  This change can potentially cause incompatibilities with existing
  pyasn1 objects which assume `SequenceOf`/`SetOf` instances are value
  objects right upon instantiation.
  The behaviour of `Sequence`/`Set` types depends on the `componentType`
  initializer: if on `componentType` is given, the behaviour is the
  same as `SequenceOf`/`SetOf` have. IF `componentType` is given, but
  neither optional nor defaulted components are present, the created
  instance remains schema object, If, however, either optional or
  defaulted component isi present, the created instance immediately
  becomes a value object.
- Added `.reset()` method to all constructed types to turn value object
  into a schema object.
- Added `PyAsn1UnicodeDecodeError`/`PyAsn1UnicodeDecodeError` exceptions
  to help the caller treating unicode errors happening internally
  to pyasn1 at the upper layers.
- Added support for subseconds CER/DER encoding edge cases in
  `GeneralizedTime` codec.
- Fixed 3-digit fractional seconds value CER/DER encoding of
  `GeneralizedTime`.
- Fixed `AnyDecoder` to accept possible `TagMap` as `asn1Spec`
  to make dumping raw value operational

Revision 0.4.5, released 29-12-2018
-----------------------------------

- Debug logging refactored for more efficiency when disabled and
  for more functionality when in use. Specifically, the global
  LOG object can easily be used from any function/method, not just
  from codec main loop as it used to be.
- More debug logging added to BER family of codecs to ease encoding
  problems troubleshooting.
- Copyright notice extended to the year 2019
- Fixed defaulted constructed SEQUENCE component initialization.

Revision 0.4.4, released 26-07-2018
-----------------------------------

- Fixed native encoder type map to include all ASN.1 types
  rather than just ambiguous ones
- Fixed crash in `.prettyPrint` of `Sequence` and `Set` occurring
  at OPTIONAL components

Revision 0.4.3, released 23-05-2018
-----------------------------------

- Copyright notice extended to the year 2018
- Fixed GeneralizedTime.asDateTime to perform milliseconds conversion
  correctly

Revision 0.4.2, released 23-11-2017
-----------------------------------

- Fixed explicit tag splitting in chunked encoding mode at
  OctetString and BitString encoders

Revision 0.4.1, released 23-11-2017
-----------------------------------

- ANY DEFINED BY clause support implemented
- Encoders refactored to take either a value (as ASN.1 object)
  or a Python value plus ASN.1 schema
- BitString decoder optimised for better performance when running on
  constructed encoding
- Constructed types' .getComponentBy*() methods accept the `default`
  parameter to return instead if schema object is to be returned
- Constructed types' .getComponentBy*() methods accept the `instantiate`
  parameter to disable automatic inner component instantiation
- The ASN.1 types' `__repr__` implementation reworked for better readability
  at the cost of not being `eval`-compliant
- Most ASN.1 types' `__str__` magic methods (except for OctetString and
  character types) reworked to call `.prettyPrint()` rather than
  `.prettyPrint` calling `__str__` as it was before. The intention is
  to eventually deprecate `.prettyPrint()` in favor of `str()`.
  The other related change is that `str()` of enumerations and boolean
  types will return string label instead of number.
- Fixed Choice.clear() to fully reset internal state of the object
- Sphinx documentation rearranged, simplified and reworded
- The `isValue` singleton is now the only way to indicate ASN.1 schema
  as opposed to ASN.1 schema instance. The legacy `None` initializer
  support has been removed.
- Changed `Null` object initialization behaviour: previous default
  value (`''`) is not set anymore. Thus `Null()` call produces a
  ASN.1 schema object, while `Null('')` - value object.
- Migrated all docs and references from SourceForge
- Imports PEP8'ed
- Fixed ASN.1 encoder not to omit empty substrate produced for inner
  component if the inner component belongs to the simple class (as
  opposed to constructed class)
- Fixed CER/DER encoders to respect tagged CHOICE when ordering
  SET components
- Fixed ASN.1 types not to interfere with the Pickle protocol
- Fixed Sequence/SequenceOf types decoding heuristics in schema-less
  decoding mode

Revision 0.3.7, released 04-10-2017
-----------------------------------

- Fixed ASN.1 time types pickling/deepcopy'ing

Revision 0.3.6, released 21-09-2017
-----------------------------------

- End-of-octets encoding optimized at ASN.1 encoders
- The __getitem__/__setitem__ behavior of Set/Sequence and SetOf/SequenceOf
  objects aligned with the canonical Mapping and Sequence protocols in part
- Fixed crash in ASN.1 encoder when encoding an explicitly tagged
  component of a Sequence

Revision 0.3.5, released 16-09-2017
-----------------------------------

- Codecs signatures unified and pass the options kwargs through the
  call chain
- Explicit tag encoding optimized to avoid unnecessary copying
- End-of-octets sentinel encoding optimized
- Refactored ASN.1 codecs properties to silently enforce proper
  length and chunk size encoding modes
- Fixed DER encoder to always produce primitive encoding
- Fixed crash at SequenceOf native decoder
- Fixed Real.prettyPrint() to fail gracefully on overflow
- Fixed a couple of crashes when debug mode is enabled

Revision 0.3.4, released 07-09-2017
-----------------------------------

- Fixed Native encoder to handle SEQUENCE/SET objects without
  the componentType property
- Added missing component-less SEQUENCE/SET objects dict duck-typing support
- Fixed unnecessary duplicate tags detection at NamesType.tagMap
- Fixed crash at SEQUENCE and SEQUENCE OF CER encoder when running
  in schemaless mode
- Fixed Character types instantiation from OctetString type -- double
  unicode decoding may have scrambled the data

Revision 0.3.3, released 27-08-2017
-----------------------------------

- Improved ASN.1 types instantiation performance
- Improved BER/CER/DER decoder performance by not unconditionally casting
  substrate into str/bytes.
- Fixed exponential index size growth bug when building ambiguous
  NamedTypes tree
- Fixed constructed types decoding failure at BER codec if running
  in schema-less mode
- Fixed crash on prettyPrint'ing a SEQUENCE with no defined components
- Fixed SetOf ordering at CER/DER encoder
- Fixed crash on conditional binascii module import
- Fix to TagSet hash value build

Revision 0.3.2, released 04-08-2017
-----------------------------------

- Fixed SequenceOf/SetOf types initialization syntax to remain
  backward compatible with pyasn1 0.2.*
- Rectified thread safety issues by moving lazy, run-time computation
  into object initializer.
- Fixed .isValue property to return True for empty SetOf/SequenceOf
  objects
- Fixed GeneralizedTime/UTCTime CER/DER codecs to actually get invoked
- Fixed DER/CER encoders handling optional SEQUENCE/SET fields containing
  nested SEQUENCE/SET with optional fields.
- Fixed crash in SequenceOf/SetOf pretty printing and decoding (in some
  cases)
- Fixed documentation markup issues.

Revision 0.3.1, released 26-07-2017
-----------------------------------

- ASN.1 types __init__(), .clone() and .subtype() signatures
  refactored into keyword arguments to simplify their signatures.
- ASN.1 types initialization refactored to minimize the use of
  relatively expensive isNoValue() call
- Lazily pre-populate list of values of Sequence/Set/Choice types
- NamedTypes comparison made more efficient
- More efficient constraints computation and code clean up
- The __getitem__() implementation of some ASN.1 types & tag object
  refactored for better performance
- BER/CER/DER value encoders refactored to produce either tuple of
  bytes or octet-stream depending on what is more optimal
- Reduced the frequency of expensive isinstance() calls
- Tag-related classes optimized, refactored into properties and
  documented.
- The NamedValues implementation refactored to mimic Python dict, its use
  in ASN.1 types refactored into properties and better documented.
  WARNING: this change introduces a deviation from original API.
- NamedType family of classes overhauled, optimized and documented.
- The `componentType` attribute of constructed ASN.1 types turned
  read-only on instances.
- Sequence/Set DER/CER/DER decoder optimized to skip the case of
  reordered components handling when not necessary.
- Tags and constraints-related getter methods refactored into read-only
  instance attributes.
- The .hasValue() method refactored into .isValue property. All ASN.1
  objects now support them, not just scalars.
- The Real.{isInfinity, isPlusInfinity, isMinusInfinity} methods
  refactored into properties and renamed into IsInf, IsPlusInf and isMinusInf
- The end-of-octets type refactored to ensure it is a singleton. Codecs
  changed to rely on that for better performance.
- Codecs lookup made more efficient at BER/CER/DER decoder main loop by
  assigning `typeId` to every ASN.1 type, not just ambiguous ones.
- The .getComponent*() methods of constructed ASN.1 types changed
  to lazily instantiate underlying type rather than return `None`.
  This should simplify its API as initialization like `X[0][1] = 2` becomes
  possible.
  WARNING: this change introduces a deviation from the original API.
- The .setComponent*() methods of SetOf/SequenceOf types changed not
  to allow uninitialized "holes" inside the sequences of their components.
  They now behave similarly to Python lists.
  WARNING: this change introduces a deviation from the original API.
- Default and optional components en/decoding of Constructed type
  refactored towards better efficiency and more control.
- OctetsString and Any decoder optimized to avoid creating ASN.1
  objects for chunks of substrate. Instead they now join substrate
  chunks together and create ASN.1 object from it just once.
- The GeneralizedTime and UTCTime types now support to/from Python
  datetime object conversion.
- Unit tests added for the `compat` sub-package.
- Fixed BitString named bits initialization bug.
- Fixed non-functional tag cache (when running Python 2) at DER decoder.
- Fixed chunked encoding restriction on DER encoder.
- Fixed SET components ordering at DER encoder.
- Fixed BIT STRING & OCTET STRING encoding to be always non-chunked (e.g.
  primitive) at DER encoder
- Fixed `compat.integer.from_bytes()` behaviour on empty input.

Revision 0.2.3, released 25-02-2017
-----------------------------------

- Improved SEQUENCE/SET/CHOICE decoding performance by maintaining a single shared
  NamedType object for all instances of SEQUENCE/SET object.
- Improved INTEGER encoding/decoding by switching to Python's built-in
  integer serialisation functions.
- Improved BitString performance by rebasing it onto Python int type and leveraging
  fast Integer serialisation functions.
- BitString type usability improved in many ways: for example bitshifting and
  numeric operation on BitString is now possible.
- Minor ObjectIdentifier type performance optimization.
- ASN.1 character types refactored to keep unicode contents internally
  (rather than serialised octet stream) and duck-type it directly.
- ASN.1 OctetString initialized from a Python object performs bytes()
  on it when running on Python 3 (used to do str() which is probably
  less logical).
- Missing support for NoValue.__sizeof__ added.
- Added checks to make sure SEQUENCE/SET components being assigned
  match the prototypes.
- Setter methods for constructed types consistently accept matchTags
  and matchConstraints flags to control the strictness of inner
  components compatibility verification. Previously, these checks
  were tied to verifyConstraints flag, now they are all independent.
- General documentation improvements here and there.
- Fix to __reversed__() magic to make it returning an iterator.
- Test suite simplified and unified.
- The __all__ variable added to most of the Python modules.
- The "test" directory renamed into "tests" not to collide with
  the "test" module.

Revision 0.2.2, released 07-02-2017
-----------------------------------

- FIX TO A SECURITY WEAKNESS: define length only decoders could have successfully
  processed indefinite length serialisation.
- FIX TO A SECURITY WEAKNESS: canonical decoders (CER/DER) may have successfully
  consumed non-canonical variations of (otherwise valid) serialisation.
- Broken Enumerated subtyping fixed.

Revision 0.2.1, released 05-02-2017
-----------------------------------

- FIX TO A SECURITY WEAKNESS: BER decoder improperly cached long tags.
- New "native" codec implemented to transform pyasn1 types to Python built-in types and back.
- Switched to new-style classes.
- Sphinx documentation added.
- BitString improvements:

  * simple string of binary digits is now supported as initializer
  * default str() yields string of binary digits (used to yield str(tuple())
  * binValue and hexValue initializers added
  * .asNumbers(), .asOctets() and asInteger() representation added

- Components of constructed ASN.1 types can now be populated with
  uninitialized ASN.1 objects by assigning either noValue sentinel or
  setupComponent() function return in addition to now-legacy None sentinel.
  This should improve code readability.
- NoValue class improved to become a singleton and catch more kinds
  of access to it.
- Compatibility wrappers str2octs() and oct2strs() fixed to run over
  iso-8859-1 encoding.
- Integer changed to emit Real instance if division produces a float.
- True division operation now supported by Integer type.
- The __contains__(), __reverse__() methods implemented for container types
- Iterator protocol support implemented for all container types.
  Warning, warning, warning: this change may potentially affect backward
  compatibility when:

  * user class overrides __getitem__() without overriding __iter__()
  * when user code iterates over SEQUENCE object to get its components (now keys will be yielded)

- Almost complete Python list and dict protocols added to SequenceOf/SetOf and
  Sequence/Set respectively
- Fix to divmod operation implementation in Integer type.
- Fix to IntegerDecoder's precomputed value map on Python 3.
- Fix to base ASN.1 types to run in "unicode_literals" mode.
- Fix to composite constraints "+" operands ordering (AbstractConstraintSet.__radd__)
- Fix to constraints merge in .subtype() -- on merge existing constraints are
  expanded to accommodate new constraints, not the other way round. When existing
  constraints are wrapped in ConstraintsIntersection composite, additional
  constraints being added on subtyping effectively further narrow the set of
  allowed values, which aligns well with the notion of subtyping.
- Fix to NamedTypes methods to handle .getTagMap() returning None
- Fix to Set/Sequence.setDefaultComponents() to return self
- Copyright notice added to non-trivial source code files.
- Author's email changed, copyright extended to 2017

Revision 0.1.9, released 28-09-2015
-----------------------------------

- Wheel distribution format now supported.
- Extensions added to text files, CVS attic flushed.
- Fix to make uninitialized pyasn1 objects failing properly on hash().
- Fix to ObjectIdentifier initialization from unicode string.
- Fix to CER/DER Boolean decoder - fail on non single-octet payload.

Revision 0.1.8, released 22-06-2015
-----------------------------------

- ObjectIdentifier codec fixed to work properly with arc 0 and arc 2 values.
- Explicit limit on ObjectIdentifier arc value size removed.
- Unicode initializer support added to OctetString type and derivatives.
- New prettyPrintType() abstract method implemented to base pyasn1 types
  to facilitate encoding errors analysis.
- The __str__() method implemented to Tag, TagSet and TagMap classes to
  ease encoding errors troubleshooting.
  easing encoding errors
- Fix to SEQUENCE and SET types to give them their private componentTypes
  collection (which is a NamedTypes object) so that they won't collide in
  a MT execution environment.
- Missing T61String,ISO646String character types and ObjectDescriptor useful
  type added.
- Distribute is gone, switched to setuptools completely.
- Missing NamedValues.__repr__() added.
- The base.NoValue() class, that indicates uninitialized ASN.1 object,
  made public.
- The base.NoValue() class instances now support __repr__() what makes
  possible to perform repr() on uninitialized pyasn1 types objects.
- When comparing ASN.1 types, by-tag and/or by-constraints matching
  can now be performed with the isSuperTypeOf()/isSameTypeWith() optional
  flags.
- Constructed types now verify their consistency by invoking 
  isSameTypeWith(matchTags=True, matchConstraints=False) and
  isSuperTypeOf(matchTags=False, matchConstraints=True) for each of their
  components rather than isSuperTypeOf() as it used to be. Constriants check 
  could be enforced to isSameTypeWith() with the strictConstraints=True
  constructed classes attribute.
- Constructed types can now be initialized with new .setComponents() method
  which accepts both var-args and keyword-args. Default repr() modified to
  reflect this change.
- NamedTypes() and NamedValues() made comparable.
- Test coverage extended to cover pyasn1 types __repr__() function.
- The abs(Integer()) & abs(Real()) operation now returns respective pyasn1 
  type, not a Python type.
- More Python magic methods implementations added to Integer & Real classes
  (e.g.  __pos__, __neg__, __round__, __floor__, __ceil__, __trunc__)
- The Integer.__invert__ Python magic method implemented.
- The OctetString.__int__() and .__float__() magic methods implemented.
- Handle the case of null writer at Debug printer.
- BitString encoder/decoder performance improved.
- Built-in debugging is now based on Python logging module.
- Fix to NamedType.__repr__() to work properly.
- Fixes to __repr__() implementation of many built-in ASN.1 types to take into
  account all of their initializers such as tagSet, subtypeSpec etc.
- String typed float initializer to REAL type now supported.
- Float typed mantissa initializer to REAL type for base 2 added.
- Encoding bases 8 and 16 support for REAL type binary encoder added.
- More strict CER/DER encoders added for GeneralizedTime and UTCTime types.
- Asn1Item.hasValue() added to easily distinguish initalized ASN.1 objects
  from uninitialized ones (e.g. pure types).
- Fix to REAL type binary decoder to handle different bases and scale factor.
- Fix to TagSet.repr() to include [obsolete] baseTag information.
- Fix to broken REAL type decoding handling.
- Fix to BitString and OctetString decoders dealing with constructed
  encoding -- it used to be possible to embed other types in substrate.
- DER codec hardened not to tolerate indefinite length encoding/decoding.
- Fix to end-of-octest sentinel handling:

  + require strict two-zeros sentinel encoding
  + recognize EOO sentinel only when explicitly requested by caller
    of the decoder via allowEoo=True parameter (warning: API change)

Revision 0.1.7
--------------

- License updated to vanilla BSD 2-Clause to ease package use
  (https://opensource.org/licenses/BSD-2-Clause).
- Test suite made discoverable by unittest/unittest2 discovery feature.
- Fix to decoder working on indefinite length substrate -- end-of-octets
  marker is now detected by both tag and value. Otherwise zero values may
  interfere with end-of-octets marker.
- Fix to decoder to fail in cases where tagFormat indicates inappropriate
  format for the type (e.g. BOOLEAN is always PRIMITIVE, SET is always 
  CONSTRUCTED and OCTET STRING is either of the two)
- Fix to REAL type encoder to force primitive encoding form encoding.
- Fix to CHOICE decoder to handle explicitly tagged, indefinite length
  mode encoding
- Fix to REAL type decoder to handle negative REAL values correctly. Test
  case added.

Revision 0.1.6
--------------

- The compact (valueless) way of encoding zero INTEGERs introduced in
  0.1.5 seems to fail miserably as the world is filled with broken
  BER decoders. So we had to back off the *encoder* for a while.
  There's still the IntegerEncoder.supportCompactZero flag which
  enables compact encoding form whenever it evaluates to True.
- Report package version on debugging code initialization.

Revision 0.1.5
--------------

- Documentation updated and split into chapters to better match
  web-site contents.
- Make prettyPrint() working for non-initialized pyasn1 data objects. It
  used to throw an exception.
- Fix to encoder to produce empty-payload INTEGER values for zeros
- Fix to decoder to support empty-payload INTEGER and REAL values
- Fix to unit test suites imports to be able to run each from
  their current directory

Revision 0.1.4
--------------

- Built-in codec debugging facility added
- Added some more checks to ObjectIdentifier BER encoder catching
  posible 2^8 overflow condition by two leading sub-OIDs
- Implementations overriding the AbstractDecoder.valueDecoder method
  changed to return the rest of substrate behind the item being processed
  rather than the unprocessed substrate within the item (which is usually
  empty).
- Decoder's recursiveFlag feature generalized as a user callback function
  which is passed an uninitialized object recovered from substrate and
  its uninterpreted payload.
- Catch inappropriate substrate type passed to decoder.
- Expose tagMap/typeMap/Decoder objects at DER decoder to uniform API.
- Obsolete __init__.MajorVersionId replaced with __init__.__version__
  which is now in-sync with distutils.
- Package classifiers updated.
- The __init__.py's made non-empty (rumors are that they may be optimized 
  out by package managers).
- Bail out gracefully whenever Python version is older than 2.4.
- Fix to Real codec exponent encoding (should be in 2's complement form),
  some more test cases added.
- Fix in Boolean truth testing built-in methods
- Fix to substrate underrun error handling at ObjectIdentifier BER decoder
- Fix to BER Boolean decoder that allows other pre-computed
  values besides 0 and 1
- Fix to leading 0x80 octet handling in DER/CER/DER ObjectIdentifier decoder.
  See https://www.esat.kuleuven.be/cosic/publications/article-1432.pdf

Revision 0.1.3
--------------

- Include class name into asn1 value constraint violation exception.
- Fix to OctetString.prettyOut() method that looses leading zero when
  building hex string.

Revision 0.1.2
--------------

- Fix to __long__() to actually return longs on py2k
- Fix to OctetString.__str__() workings of a non-initialized object.
- Fix to quote initializer of OctetString.__repr__()
- Minor fix towards ObjectIdentifier.prettyIn() reliability
- ObjectIdentifier.__str__() is aliased to prettyPrint()
- Exlicit repr() calls replaced with '%r'

Revision 0.1.1
--------------

- Hex/bin string initializer to OctetString object reworked
  (in a backward-incompatible manner)
- Fixed float() infinity compatibility issue (affects 2.5 and earlier)
- Fixed a bug/typo at Boolean CER encoder.
- Major overhawl for Python 2.4 -- 3.2 compatibility:
  + get rid of old-style types
  + drop string module usage
  + switch to rich comparation
  + drop explicit long integer type use
  + map()/filter() replaced with list comprehension
  + apply() replaced with \*/\*\*args
  + switched to use 'key' sort() callback function
  + support both __nonzero__() and __bool__() methods
  + modified not to use py3k-incompatible exception syntax
  + getslice() operator fully replaced with getitem()
  + dictionary operations made 2K/3K compatible
  + base type for encoding substrate and OctetString-based types
  is now 'bytes' when running py3k and 'str' otherwise
  + OctetString and derivatives now unicode compliant.
  + OctetString now supports two python-neutral getters: asOcts() & asInts()
  + print OctetString content in hex whenever it is not printable otherwise
  + in test suite, implicit relative import replaced with the absolute one
  + in test suite, string constants replaced with numerics

Revision 0.0.13
---------------

- Fix to base10 normalization function that loops on univ.Real(0)

Revision 0.0.13b
----------------

- ASN.1 Real type is now supported properly.
- Objects of Constructed types now support __setitem__()
- Set/Sequence objects can now be addressed by their field names (string index)
  and position (integer index).
- Typo fix to ber.SetDecoder code that prevented with schema decoding
  operation.
- Fix to explicitly tagged items decoding support.
- Fix to OctetString.prettyPrint() to better handle non-printable content.
- Fix to repr() workings of Choice objects.

Revision 0.0.13a
----------------

- Major codec re-design.
- Documentation significantly improved.
- ASN.1 Any type is now supported.
- All example ASN.1 modules moved to separate pyasn1-modules package.
- Fix to initial sub-OID overflow condition detection an encoder.
- BitString initialization value verification improved.
- The Set/Sequence.getNameByPosition() method implemented.
- Fix to proper behaviour of PermittedAlphabetConstraint object.
- Fix to improper Boolean substrate handling at CER/DER decoders.
- Changes towards performance improvement:

  + all dict.has_key() & dict.get() invocations replaced with modern syntax
    (this breaks compatibility with Python 2.1 and older).
  + tag and tagset caches introduced to decoder
  + decoder code improved to prevent unnecessary pyasn1 objects creation
  + allow disabling components verification when setting components to
    structured types, this is used by decoder whilst running with schema
    mode.
  + BER decoder for integer values now looks up a small set of pre-computed
    substrate values to save on decoding.
  + a few pre-computed values configured to ObjectIdentifier BER encoder.
  + ChoiceDecoder split-off SequenceOf one to save on unnecessary checks.
  + replace slow hasattr()/getattr() calls with isinstance() introspection.
  + track the number of initialized components of Constructed types to save
    on default/optional components initialization.
  + added a shortcut ObjectIdentifier.asTuple() to be used instead of
    __getitem__() in hotspots.
  + use Tag.asTuple() and pure integers at tag encoder.
  + introduce and use in decoder the baseTagSet attribute of the built-in
    ASN.1 types.

Revision 0.0.12a
----------------

- The individual tag/length/value processing methods of 
  encoder.AbstractItemEncoder renamed (leading underscore stripped)
  to promote overloading in cases where partial substrate processing
  is required.
- The ocsp.py, ldap.py example scripts added.
- Fix to univ.ObjectIdentifier input value handler to disallow negative
  sub-IDs.

Revision 0.0.11a
----------------

- Decoder can now treat values of unknown types as opaque OctetString.
- Fix to Set/SetOf type decoder to handle uninitialized scalar SetOf 
  components correctly.

Revision 0.0.10a
----------------

- API versioning mechanics retired (pyasn1.v1 -> pyasn1) what makes
  it possible to zip-import pyasn1 sources (used by egg and py2exe).

Revision 0.0.9a
---------------

- Allow any non-zero values in Boolean type BER decoder, as it's in
  accordnance with the standard.

Revision 0.0.8a
---------------

- Integer.__index__() now supported (for Python 2.5+).
- Fix to empty value encoding in BitString encoder, test case added.
- Fix to SequenceOf decoder that prevents it skipping possible Choice
  typed inner component.
- Choice.getName() method added for getting currently set component
  name.
- OctetsString.prettyPrint() does a single str() against its value
  eliminating an extra quotes.

Revision 0.0.7a
---------------

- Large tags (>31) now supported by codecs.
- Fix to encoder to properly handle explicitly tagged untagged items.
- All possible value lengths (up to 256^126) now supported by encoders.
- Fix to Tag class constructor to prevent negative IDs.

Revision 0.0.6a
---------------

- Make use of setuptools.
- Constraints derivation verification (isSuperTypeOf()/isSubTypeOf()) fixed.
- Fix to constraints comparation logic -- can't cmp() hash values as it
  may cause false positives due to hash conflicts.

Revision 0.0.5a
---------------

- Integer BER codec reworked fixing negative values encoding bug.
- clone() and subtype() methods of Constructed ASN.1 classes now 
  accept optional cloneValueFlag flag which controls original value
  inheritance. The default is *not* to inherit original value for 
  performance reasons (this may affect backward compatibility).
  Performance penalty may be huge on deeply nested Constructed objects
  re-creation.
- Base ASN.1 types (pyasn1.type.univ.*) do not have default values
  anymore. They remain uninitialized acting as ASN.1 types. In 
  this model, initialized ASN.1 types represent either types with
  default value installed or a type instance.
- Decoders' prototypes are now class instances rather than classes.
  This is to simplify initial value installation to decoder's
  prototype value.
- Bugfix to BitString BER decoder (trailing bits not regarded).
- Bugfix to Constraints use as mapping keys.
- Bugfix to Integer & BitString clone() methods
- Bugix to the way to distinguish Set from SetOf at CER/DER SetOfEncoder
- Adjustments to make it running on Python 1.5.
- In tests, substrate constants converted from hex escaped literals into
  octals to overcome indefinite hex width issue occuring in young Python.
- Minor performance optimization of TagSet.isSuperTagSetOf() method
- examples/sshkey.py added

Revision 0.0.4a
---------------

* Asn1Type.prettyPrinter() -> \*.prettyPrint()

Revision 0.0.3a
---------------

* Simple ASN1 objects now hash to their Python value and don't
  depend upon tag/constraints/etc.
* prettyIn & prettyOut methods of SimplleAsn1Object become public
* many syntax fixes

Revision 0.0.2a
---------------

* ConstraintsIntersection.isSuperTypeOf() and 
  ConstraintsIntersection.hasConstraint() implemented
* Bugfix to NamedValues initialization code
* +/- operators added to NamedValues objects
* Integer.__abs__() & Integer.subtype() added
* ObjectIdentifier.prettyOut() fixes
* Allow subclass components at SequenceAndSetBase
* AbstractConstraint.__cmp__() dropped
* error.Asn1Error replaced with error.PyAsn1Error

Revision 0.0.1a
---------------

* Initial public alpha release
