Instruction:
作为 Java 安全专家，检测此代码中的安全漏洞：
## 内容1
### 文件路径：
src/changes/changes.xml
### 代码内容：
<document xmlns="http://maven.apache.org/changes/1.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 http://maven.apache.org/plugins/maven-changes-plugin/xsd/changes-1.0.0.xsd">
    <properties>
        <title>YAML 1.1 parser and emitter</title>
    </properties>
    <body>
        <release version="1.31" date="in Git" description="Maintenance">
            <action dev="asomov" type="add" issue="525">
                Add test for stackoverflow
            </action>
            <action dev="maslovalex" type="fix" issue="522">
                Deserializing key "on" fails with Exception
            </action>
            <action dev="asomov" type="update">
                Merged PR #7: https://bitbucket.org/snakeyaml/snakeyaml/pull-requests/7 (2022-04-04)
            </action>
            <action dev="asomov" type="update">
                Do not emit global TAGs by not keeping them in Parser
                (breaks https://code.google.com/archive/p/snakeyaml/issues/149)
            </action>
            <action dev="asomov" type="add">
                Add an example with Lombok and ENV variable substitution (2021-12-29)
            </action>
            <action dev="asomov" type="update">
                Fix issues with comments
            </action>
            <action dev="asomov" type="update" issue="517">
                Recognise issue with trailing TAB
            </action>
        </release>
        <release version="1.30" date="2021-12-14" description="Maintenance">
            <action dev="asomov" type="fix" issue="516">
                Remove snakeyaml.org
            </action>
            <action dev="asomov" type="update">
                Migrate to https://bitbucket.org/snakeyaml/snakeyaml (2021-10-23)
            </action>
            <action dev="asomov" type="update">
                Fix issues with comments
            </action>
            <action dev="asomov" type="fix" issue="506">
                Improve parsing a number starting with 0x (2021-06-28)
                Take the Float pattern from ruamel: https://pypi.org/project/ruamel.yaml
            </action>
        </release>
        <release version="1.29" date="2021-06-08" description="Maintenance">
            <action dev="Wolf2323" type="fix">
                Fix Events ordering and improve Node-Comment association (2021-05-13)
            </action>
            <action dev="asomov" type="fix">
                Fix corner case for comments where blank lines after plain token  (2021-03-02)
            </action>
            <action dev="asomov" type="add">
                Add a test for issue 500 (2021-03-14)
            </action>
            <action dev="asomov" type="remove">
                Remove unused variable (2021-02-28)
            </action>
        </release>
        <release version="1.28" date="2021-02-22" description="Maintenance">
            <action dev="maslovalex" type="fix">
                Fix tests to work on Windows (2021-02-19)
            </action>
            <action dev="asomov" type="add">
                Add enumCaseSensitive property to LoaderOptions to control constructing enum with case sensitivity (2021-01-05)
            </action>
            <action dev="asomov" type="fix" issue="493">
                ENV substitution default can contain special characters (2021-01-03)
            </action>
            <action dev="asomov" type="add">
                Allow for read and write YAML with Comments (2020-11-01)
            </action>
            <action dev="asomov" type="fix" issue="485">
                Alias names are too permissive compared to libyaml and future spec.
                Follow https://github.com/yaml/yaml-spec/blob/master/rfc/RFC-0003.md (2020-10-06)
            </action>
        </release>
        <release version="1.27" date="2020-08-31" description="Maintenance">
            <action dev="asomov" type="fix" issue="481">
                Serialize anchors that are not used by any alias (2020-08-14)
            </action>
            <action dev="asomov" type="fix" issue="416">
                Add indentWithIndicator option to improve dumping sequences (2020-07-14)
            </action>
            <action dev="asomov" type="fix" issue="480">
                Anchor should allow non ascii characters while dumping (2020-06-29)
            </action>
            <action dev="asomov" type="update" issue="remove">
                Remove Spring related tests because they are outdated and upgrading to Spring 5
                makes the tests fail under JDK 7 (2020-05-02)
            </action>
            <action dev="asomov" type="update" issue="476">
                Make constructor of EnvScalarConstructor public (2020-04-24)
            </action>
            <action dev="asomov" type="fix" issue="474">
                Parse the value of byte and short after a narrowing primitive conversion (2020-04-16)
            </action>
            <action dev="asomov" type="add">
                Add test for different Line Break Characters in the error message (2020-03-09)
            </action>
            <action dev="asomov" type="update">
                Fix yet another OWASP false positive. It complains that the Spring controller makes SnakeYAML insecure
                even though SnakeYAML does not use Spring controller and does not depend on Spring (but the tests do).
                Bump spring.version from 3.2.17.RELEASE to 5.2.4.RELEASE (2020-03-08)
            </action>
            <action dev="asomov" type="update">
                Migrated to GIT (2020-02-29)
            </action>
        </release>
        <release version="1.26" date="2020-02-28" description="Maintenance">
            <action dev="asomov" type="fix" issue="377">
                Allow configuration for preventing billion laughs attack (2020-02-24)
            </action>
            <action dev="asomov" type="update">
                Update Maven wrapper (2020-01-18)
            </action>
            <action dev="asomov" type="fix" issue="468">
                Parse ENV variables similar to how it works in docker-compose (2019-12-25)
            </action>
            <action dev="asomov" type="fix" issue="468">
                Allow non ASCII characters in the anchor names (2019-12-23)
            </action>
            <action dev="asomov" type="update" issue="462">
                Clean up composer internal maps after construction. Should not have any impact but
                it does not harm (2019-10-25)
            </action>
            <action dev="asomov" type="update" issue="459">
                The '!' tag now works the same way as for PyYAML. (12 is parsed as int instead of string)
                The spec files are modified (spec-08-07.canonical spec-08-07.data)
            </action>
            <action dev="asomov" type="add">
                Add test for not implemented "!" tag (2019-10-11)
            </action>
            <action dev="asomov" type="update">
                Refactor Events: expose Event.ID via a getter (2019-10-05)
            </action>
            <action dev="asomov" type="update">
                Refactor ScalarAnalysis: make it immutable (2019-09-28)
            </action>
            <action dev="asomov" type="add" issue="454">
                Add example for integer without time pattern (2019-08-22)
            </action>
        </release>
        <release version="1.25" date="2019-08-13" description="Maintenance">
            <action dev="asomov" type="update">
                Deprecate setting tags in TypeDescription (2019-06-23)
            </action>
            <action dev="asomov" type="fix" issue="449">
                Add test for issue 449 (2019-06-19)
            </action>
            <action dev="asomov" type="add" issue="441">
                Restore the way to get anchor for a Node (2019-04-13)
            </action>
            <action dev="asomov" type="fix" issue="437">
                Introduce setting to keep !!str tag for String even when it contains non-printable chars (2019-03-24)
            </action>
            <action dev="asomov" type="update">
                Update plugin versions (2019-03-04)
            </action>
        </release>
        <release version="1.24" date="2019-02-28" description="Maintenance">
            <action dev="asomov" type="update">
                Refactor BaseConstructor: Factored out postponed mapping logic so subclasses can effectively
                override constructMapping2ndStep() and delegate to the postponed mapping logic.
                This is backported from SnakeYAML engine (2019-01-26)
            </action>
            <action dev="asomov" type="fix" issue="431">
                Customize simple key length when dumping (2019-01-17)
            </action>
            <action dev="asomov" type="fix" issue="430">
                Wrap runtime exceptions into YAMLException (2019-01-14)
            </action>
            <action dev="asomov" type="fix">
                Fix: Null tag constructor not called when parsing top-level null value (2019-01-13)
                (issue reported for snakeyaml-engine)
            </action>
            <action dev="asomov" type="fix" issue="429">
                Provide "Automatic-Module-Name" entry in MANIFEST (2018-12-16)
            </action>
            <action dev="asomov" type="fix" issue="426">
                Fix NPE when duplicate keys are not allowed and the key is null (2018-12-02)
            </action>
            <action dev="asomov" type="update">
                Support java.sql classes without the need to depend on java.sql module in java9+ (2018-11-06)
            </action>
            <action dev="asomov" type="update">
                Require Java 7  (2018-11-06)
            </action>
            <action dev="asomov" type="fix" issue="423">
                Date Serialization Fails for TimeZones on Daylight Savings Time (2018-11-06)
            </action>
        </release>
        <release version="1.23" date="2018-08-27" description="Maintenance">
            <action dev="asomov" type="fix" issue="412">
                Add another getter for ScalarStyle to support backwards compatibility (2018-08-27)
            </action>
        </release>
        <release version="1.22" date="2018-08-25" description="Maintenance">
            <action dev="asomov" type="update">
                Run tests under Java 11  (2018-08-19)
            </action>
            <action dev="asomov" type="update">
                Use Maven 3.5.4 (2018-08-19)
            </action>
            <action dev="asomov" type="fix"  issue="412">
                Restore the Boolean constructors for Events and Nodes for binary compatibility
                of dependent projects (2018-08-17)
            </action>
            <action dev="asomov" type="fix"  issue="411">
                System Property "java.runtime.name" is not required to be defined (2018-08-12)
                Ensure Compatibility with Graal
            </action>
            <action dev="asomov" type="fix"  issue="409">
                Dumping Enum breaks when Enum value is Anonymous inner class (2018-08-07)
                Solution: refactor the way to detect if the full tag can be omitted (and !!str is used instead).
                Instead of checking whether the class for property and the class for the actual value is the same
                we can just check that the property class is not java.lang.Enum
            </action>
        </release>
        <release version="1.21" date="2018-04-13" description="Maintenance">
            <action dev="asomov" type="update">
                Scanner throws IndexOutOfBoundsException if no more token left but getToken()
                or peekToken() called (2018-04-10)
            </action>
            <action dev="asomov" type="update">
                Enhance output of token IDs (2018-04-06)
            </action>
            <action dev="asomov" type="add">
                Mark: expose buffer and pointer  (2018-04-06)
            </action>
            <action dev="asomov" type="fix" issue="401">
                Restore index in Mark - it is used in JRuby (2018-03-26)
            </action>
            <action dev="asomov" type="fix"  issue="397">
                Plain scalars with colons in flow sequences/mappings are valid YAML (2018-03-03)
            </action>
        </release>
        <release version="1.20" date="2018-02-28" description="Maintenance">
            <action dev="maslovalex" type="fix"  issue="393">
                Improve reflective access operation to avoid warning under Java 9 (2018-02-24)
            </action>
            <action dev="asomov" type="update">
                Refactor collection node - flow style must not be null (2018-02-16)
            </action>
            <action dev="asomov" type="remove">
                Refactor: remove unused method isResolved in Node (2018-02-15)
            </action>
            <action dev="asomov" type="remove">
                Refactor: remove unused code in Tag (2018-02-15)
            </action>
            <action dev="asomov" type="update">
                Refactor nodes and events - use enum FlowStyle instead of Boolean (2018-02-10)
            </action>
            <action dev="asomov" type="update">
                Refactor ScalarToken, ScalarNode and ScalarEvent - use enum ScalarStyle instead of Character (2018-02-10)
            </action>
            <action dev="asomov" type="update">
                Refactor Token - remove unused code (2018-02-08)
            </action>
            <action dev="asomov" type="update">
                Refactor Mark - remove unused code (2018-02-06)
            </action>
            <action dev="asomov" type="fix" issue="395">
                Introduce DuplicateKeyException and report line number for duplicate keys
                when creating non-Javabeans (2017-12-15)
            </action>
        </release>
        <release version="1.19" date="2017-10-14" description="Maintenance">
            <action dev="maslovalex" type="update">
                Only use FIELD access for Android in PropertyUtils (2017-08-20)
            </action>
            <action dev="maslovalex" type="update">
                Add getAnnotations() and getAnnotation() methods to Property (2017-08-20)
            </action>
            <action dev="maslovalex" type="fix" issue="383">
                Some configuration properties of Representer are ignored.
            </action>
            <action dev="maslovalex" type="fix" issue="386">
                Fix order of duplicate keys indices to prevent wrong removals.
            </action>
            <action dev="maslovalex" type="fix" issue="382">
                Fix 382: same as 322
            </action>
            <action dev="maslovalex" type="fix" issue="322">
                Fix 322: if there is no getter try to get type information from a setter
            </action>
            <action dev="asomov" type="fix" issue="377">
                Add test for 'billion laughs attack'
            </action>
            <action dev="asomov" type="fix" issue="368">
                Relax final restriction on TypeDescription (2017-05-05)
            </action>
            <action dev="asomov" type="fix" issue="375">
                Empty yaml file must return null instead of throwing an exception when loading a JavaBean (2017-05-03)
            </action>
            <action dev="asomov" type="fix" issue="374">
                Fix Number when it is used as a JavaBean property with a custom Locale (2017-04-30)
            </action>
            <action dev="asomov" type="add" issue="373">
                Add redundant test (2017-04-06)
            </action>
            <action dev="asomov" type="update">
                Provide access to node's anchor, pull request#20 (2017-03-30)
            </action>
            <action dev="asomov" type="fix" issue="370">
                Remove redundant "Bundle-RequiredExecutionEnvironment: J2SE-1.5" (2017-03-16)
            </action>
            <action dev="asomov" type="fix" issue="364">
                Serializing Calendar objects with certain timezone offsets renders invalid YAML (2017-02-28)
            </action>
        </release>
        <release version="1.18" date="2017-02-22" description="Maintenance">
            <action dev="asomov" type="fix" issue="358">
                Validate DumperOptions to prevent invalid YAML to be dumped (2017-01-12)
            </action>
            <action dev="asomov" type="fix" issue="355">
                Fix for emitter to split long plain string scalars over multiple lines (2017-01-10)
            </action>
            <action dev="asomov" type="update">
                Let Mark implement Serializable so that ParserException can be serialized (2016-12-15)
            </action>
            <action dev="asomov" type="update" issue="354">
                Add tests for issue 354 (2016-12-12)
            </action>
            <action dev="maslovalex" type="fix" issue="337">
                Throw exception in case of duplicate keys in MappingNode and
                LoaderOptions.allowDuplicateKeys is false. (2016-11-25)
            </action>
            <action dev="maslovalex" type="fix" issue="351">
                Keep same nodes order on merge (preprocess keys for MappingNode
                and remove duplicates keeping the last one). (2016-11-22)
            </action>
            <action dev="asomov" type="fix" issue="349">
                Ignore white spaces for base64 encoded scalar (2016-11-17)
            </action>
            <action dev="maslovalex" type="fix" issue="348">
                Not removing parent object when composed object is an anchor. (2016-10-13)
            </action>
            <action dev="asomov" type="fix" issue="323">
                Support "Miscellaneous Symbols and Pictographs" (2016-09-05)
            </action>
            <action dev="asomov" type="fix" issue="341">
                Fix NPE in BaseRepresenter.multiRepresenters if it contains 'null' as value (2016-05-03)
            </action>
            <action dev="asomov" type="update" issue="335">
                Add example for issue 335 - the same tag for different node kinds (2016-03-19)
            </action>
            <action dev="asomov" type="update" issue="332">
                Add example for issue 332 (2016-02-24)
            </action>
            <action dev="asomov" type="update">
                Build SnakeYAML for different JDKs with docker without building images (2016-02-22)
            </action>
            <action dev="asomov" type="update">
                Update plugin versions (2016-02-19)
            </action>
        </release>
        <release version="1.17" date="2016-02-19" description="Maintenance">
            <action dev="maslovalex" type="fix" issue="318" due-to="Rog Sigal">
                Use Thread.currentThread.getContextClassLoader in Class.forName instead of default one (2016-02-15)
            </action>
            <action dev="asomov" type="update" issue="329">
                Add parameters to POM to change distribution server (2016-02-03)
            </action>
            <action dev="asomov" type="update" issue="326">
                Relax some of the modifiers to make integration easier (2016-02-02)
            </action>
            <action dev="maslovalex" type="update" issue="310">
                Make use of private/protected constructors for Scalars and 'immutable' objects.
                Added 'src/test/java8' for Java8 specific tests (requires -Pwith-java8-tests) (2016-01-07)
            </action>
            <action dev="asomov" type="update" issue="320">
                Better support to customise BaseConstructor. Make 'composer' field and constructDocument()
                method protected (2015-10-03)
            </action>
            <action dev="asomov" type="fix" issue="306">
                Better UUID support (2015-09-23)
            </action>
            <action dev="asomov" type="add">
                Use Polyglot Maven: add support for YAML POM (2015-09-10)
            </action>
            <action dev="asomov" type="fix" issue="314">
                Provide ability to customize anchor names (2015-08-25)
            </action>
        </release>
        <release version="1.16" date="2015-08-18" description="Maintenance">
            <action dev="asomov" type="fix" issue="308">
                Provide Docker image for testing under different Java 8 (2015-06-19)
            </action>
            <action dev="asomov" type="fix" issue="302">
                Convert binary byte[] to String when it matches the JavaBean property (2015-05-26)
            </action>
            <action dev="asomov" type="update">
                The source code migrated to Bitbucket. Old commits (older then 6 years) have
                been removed. (2015-05-20)
            </action>
            <action dev="asomov" type="fix"  issue="212">
                Fix a typo in an error message in ScannerImpl (2015-05-19)
            </action>
            <action dev="asomov" type="fix"  issue="209">
                Do not print special characters in the error message (2015-04-16)
            </action>
            <action dev="asomov" type="fix"  issue="199">
                Evaluate implementations for duplicate mapping keys.
            </action>
        </release>
        <release version="1.15" date="2015-02-19" description="Maintenance">
            <action dev="asomov" type="update">
                Apply FindBugs and PMD recommendations (2015-02-16)
            </action>
            <action dev="asomov" type="update">
                Added split lines option to DumperOptions to allow line splitting to be disabled. (2015-02-08)
            </action>
            <action dev="asomov" type="update">
                Use Maven 3 and update plugin versions (2015-02-05)
            </action>
            <action dev="asomov" type="update"  issue="205">
                Add test to clarify iOS emoji character in the surrogate range (2015-02-03)
            </action>
            <action dev="asomov" type="fix"  issue="201">
                Fix grammar error in exception message (2014-11-18)
            </action>
        </release>
        <release version="1.14" date="2014-08-29" description="Maintenance">
            <action dev="maslovalex" type="fix"  issue="197">
                Load JavaBean with fields using custom constructors (2014-08-18)
            </action>
            <action dev="asomov" type="fix"  issue="192">
                Drop support for "Value Key Language-Independent Type" and '=' a standard character (2014-05-22)
            </action>
            <action dev="maslovalex" type="fix"  issue="191">
                Improve error message for invalid YAML document (2014-05-21)
            </action>
            <action dev="asomov" type="fix"  issue="188">
                Improve error message for invalid YAML document (2014-03-26)
            </action>
            <action dev="asomov" type="fix"  issue="183">
                Support Number class (2013-11-07)
            </action>
             <action dev="asomov" type="fix"  issue="182">
                Double.POSITIVE_INFINITY applied to float fields (2013-11-07)
             </action>
        </release>
        <release version="1.13" date="2013-08-29" description="Maintenance">
             <action dev="asomov" type="fix"  issue="178">
                OSGi: Specify version for exported packages (2013-06-27)
             </action>
             <action dev="asomov" type="fix"  issue="177">
                Improve error report while parsing a JavaBean (2013-05-14)
             </action>
              <action dev="Jordan" type="fix"  issue="135">
                Arrays of primitives are now fully supported (2013-04-16)
             </action>
             <action dev="asomov" type="fix"  issue="174">
                Duplicate anchors in an input document should not be an error (2013-04-03)
             </action>
             <action dev="asomov" type="fix"  issue="172">
                Using a locale with minimum number fraction digits breaks anchor generation (2013-03-30)
             </action>
             <action dev="asomov" type="fix"  issue="171">
                Use more generic generics in BaseRepresenter (2013-03-30)
             </action>
        </release>
        <release version="1.12" date="2013-03-02" description="Maintenance">
             <action dev="asomov" type="update">
                The build is using JDK 1.6 (2013-03-02)
             </action>
             <action dev="asomov" type="fix"  issue="169">
                Make Constructor.typeDefinitions protected to be more flexible (2013-02-18)
             </action>
             <action dev="asomov" type="remove">
                Remove file AUTHORS because it does not reflect the actual situation (2012-11-09)
             </action>
             <action dev="asomov" type="update">
                Improve the error message when a TAB character starts a token (2012-11-06)
             </action>
        </release>
        <release version="1.11" date="2012-09-29" description="Maintenance">
             <action dev="asomov" type="fix"  issue="158">
                Fix issue 158: improve support for 32-bit characters (UTF-16 surrogate pairs) (2012-09-29)
             </action>
             <action dev="asomov" type="fix"  issue="146">
                Fix issue 146: empty tags should not force explicit document start (2012-09-29)
             </action>
             <action dev="asomov" type="fix"  issue="156">
                Fix issue 156: setSkipMissingProperties fails for non-scalar values (2012-09-05)
             </action>
             <action dev="asomov" type="fix"  issue="155">
                Fix issue 155: SnakeYAML must always eat its own food - a YAML document created by itself must
                be read without exceptions (2012-09-04)
             </action>
             <action dev="asomov" type="update"  issue="154">
                Fix issue 154: Add option to skip missing properties when deserializing YAML into Java object (2012-07-25)
             </action>
             <action dev="asomov" type="update">
                Add a test for issue 150 (2012-06-17)
             </action>
             <action dev="asomov" type="update">
                Add a test for issue 151 (2012-06-14)
             </action>
             <action dev="asomov" type="fix">
                Fix issue 149: Directives are no longer lost between documents (2012-06-10)
             </action>
             <action dev="asomov" type="update">
                Refactor: use Version enum instead of Array of Integers.
                This is done to simplify fixing issue 149 (2012-06-09)
             </action>
             <action dev="asomov" type="fix">
                Add tests for issue 148  (2012-06-07)
             </action>
             <action dev="asomov" type="fix">
                Fix issue 147: Serialized representation of character U+FFFD causes exception on deserialization  (2012-06-05)
             </action>
             <action dev="asomov" type="fix">
                Fix issue 145: exception.getMessage() must show the line number as exception.toString() does (2012-04-03)
             </action>
             <action dev="maslovalex" type="fix">
                Fix issue 144: improve type inference for Compact Object Notation (2012-03-16)
             </action>
             <action dev="maslovalex" type="add">
                Improve Android support
             </action>
        </release>
        <release version="1.10" date="2012-02-08" description="Maintenance">
             <action dev="asomov" type="update">
                Fix issue 141: TimeZone is configurable in DumperOptions (2012-02-03)
             </action>
             <action dev="asomov" type="update">
                Refactor with PMD: minor non-functional improvements (2012-01-28)
             </action>
             <action dev="asomov" type="update">
                Refactor with PMD: Avoid unused method parameter 'index' in
                Serializer and Emitter (2012-01-28)
             </action>
             <action dev="asomov" type="update">
                Refactor with PMD: Composer - Avoid unused method parameter 'index' in
                'Composer.composeNode(Node parent, Object index)''. It was used
                in PyYAML for kind of XPath for YAML, but it was not imported from PyYAML (2012-01-28)
             </action>
             <action dev="asomov" type="update">
                Refactor Emitter: the SPACE mutable static field could be changed by malicious code or by accident.
                Boxed value is unboxed and then immediately reboxed (2012-01-28)
             </action>
             <action dev="asomov" type="remove">
                Refactor with FindBugs: remove unused ScalarAnalysis.allowDoubleQuoted (2012-01-28)
             </action>
             <action dev="asomov" type="update">
                Refactor with FindBugs: do not rely on default encoding (2012-01-28)
             </action>
             <action dev="asomov" type="update">
                Refactor: apply FindBugs recommendations (2012-01-28)
             </action>
             <action dev="maslovalex" type="fix">
                Fix issue 139: merge should use last key in map (2012-01-24)
             </action>
             <action dev="asomov" type="fix">
                Fix issue 136: tabs are allowed in plain scalars. This is a deviation from PyYAML (2012-01-11)
             </action>
             <action dev="asomov" type="add" issue="138">
                Expose internal data of ReaderException (2012-01-06)
             </action>
             <action dev="asomov" type="fix" issue="137">
                Respect supplementary characters (2012-01-06)
             </action>
             <action dev="asomov" type="add">
                Use http://mercurial.selenic.com/wiki/EolExtension to force LF  as line separator
                for all operating systems (2011-12-20)
             </action>
             <action dev="asomov" type="add">
                Add a test for issue 136 (2011-12-14)
             </action>
              <action dev="asomov" type="remove">
                Deprecate the DumperOptions.calculateScalarStyle() method because it was introduced as a quick
                fix for issue 29. Now it should not be required at all (because of the fix for issue 66),
                or it should be implemented in the Representer (in RepresentString) (2011-10-10)
             </action>
             <action dev="asomov" type="fix">
                Fix issue 66: literal scalar style is used by default for multiline scalars (2011-10-10)
             </action>
             <action dev="asomov" type="add">
                An example added: how to dump multiline literal scalars (2011-10-04)
             </action>
             <action dev="asomov" type="add">
                An example added: how to dump recursive object for issue 133 (2011-09-14)
             </action>
             <action dev="asomov" type="add">
                A test added for issue 132 (2011-09-13)
             </action>
             <action dev="asomov" type="update">
                Finish 1.9 release (2011-08-15)
             </action>
        </release>
        <release version="1.9" date="2011-08-15" description="Introduce Yaml.loadAs() and Yaml.dumpAs() methods">
            <action dev="asomov" type="update">
                Add a test to prove that SnakeYAML is not affected by the problem reported for libyaml
                at http://pyyaml.org/ticket/196 (2011-07-28)
            </action>
            <action dev="asomov" type="fix" issue="128">
                Since timestamp contains ':' characters it is dumped with single quoted scalar style
                in the flow context. The single quoted scalar style causes to dump the explicit tag.
                In the block context the plain scalar can be used and the tag is not required. It may cause
                unpredictable behaviour if the tag is required. See the comments in JodaTimeExampleTest (2011-07-25)
            </action>
            <action dev="asomov" type="fix" issue="130">
                Fix scientific notation inconsistency in the YAML 1.1 specification:
                scalar '8e-06' should be parsed as a Double (2011-07-24)
            </action>
            <action dev="asomov" type="remove" issue="127">
                Do not allow to override BaseRepresenter.representData(Object data) because
                users should instead implement Represent interface (2011-07-21)
            </action>
            <action dev="asomov" type="remove" issue="124">
                Deprecate DumperOptions.explicitRoot (2011-07-20)
            </action>
            <action dev="asomov" type="add" issue="124">
                Add Yaml.dumpAs(Object, Tag.MAP, FlowStyle) and Yaml.dumpAsMap(Object) methods. JavaBeanDumper is marked as deprecated (2011-07-16)
            </action>
            <action dev="asomov" type="add" issue="127">
                Add example to show how to dump a custom class (2011-07-12)
            </action>
            <action dev="asomov" type="add" issue="129">
                Add Yaml.serialize(Node) low level method to the public API (2011-07-14)
            </action>
            <action dev="asomov" type="add" issue="129">
                Add Yaml.represent(Object) low level method to the public API (2011-07-14)
            </action>
            <action dev="asomov" type="add" issue="125">
                Add support for Maven 3 via 'm3' profile (2011-07-10)
            </action>
            <action dev="asomov" type="remove" issue="124">
                Remove deprecated JavaBeanParser (2011-07-05)
            </action>
            <action dev="asomov" type="remove" issue="124">
                Remove redundant JavaBeanDumper.classTags set (2011-07-03)
            </action>
            <action dev="asomov" type="add" issue="124">
                Add Yaml.loadAs() methods. JavaBeanLoader is marked as deprecated (2011-07-03)
            </action>
            <action dev="asomov" type="remove" issue="124">
                Remove TypeDescription.root property to prepare issue 124. This is a minor backwards incompatible change.
                Now instead of setting as root, the TypeDescription must be passed to the Contructor's constructor
                to be taken as the root definition (2011-07-03)
            </action>
            <action dev="asomov" type="fix" issue="121" due-to="Jaromir">
                Fix: close files in tests to avoid a possible file handle limit (2011-06-09)
            </action>
            <action dev="asomov" type="fix" issue="116" due-to="Jim Peterson">
                Fix: Improved support for empty JavaBeans (2011-06-09)
            </action>
            <action dev="asomov" type="fix" issue="112" due-to="Lethargish">
                Fix: Improved support for parameterised types in collections (2011-05-25)
            </action>
            <action dev="asomov" type="fix" issue="115" due-to="elkniwt">
                Fix: parameterised JavaBeans fail to load and dump because they are treated as Maps (2011-05-16)
            </action>
            <action dev="asomov" type="fix" issue="114" due-to="gileadis">
                Fix: Do not remove root tags of JavaBeans when it is not explicitly requested (2011-04-20)
            </action>
            <action dev="asomov" type="fix" issue="111" due-to="JordanAngold">
                Fix: Long escaped tag URI sequences throw BufferOverflowException (2011-03-03)
            </action>
            <action dev="asomov" type="fix" issue="110" due-to="dmitry.s.mamonov">
                Fix: introduce a package for external libraries and move there the 64Coder
                and the Google's URL encoder (2011-02-24)
            </action>
            <action dev="asomov" type="fix" issue="109" due-to="cjalmeida">
                Fix: ancient years must be dumped with leading zeros (2011-02-19)
            </action>
            <action dev="asomov" type="remove" due-to="JordanAngold">
                Remove unused code in Constructor: Modifier.isAbstract() is not needed any more (2011-02-18)
            </action>
            <action dev="JordanAngold" type="fix" issue="108">
                Enum's name property shall be dumped instead of the 'toString()' output (2011-02-16)
            </action>
        </release>
        <release version="1.8" date="2011-02-15" description="Performance improvement">
            <action dev="asomov" type="add">
                Add example to howto Wiki:
                How_to_substitute_object_in_YAML_document_with_a_custom_object (2011-01-27)
            </action>
            <action dev="asomov" type="update">
                When the YAML document to be loaded is provided as String parse it directly
                without making a Reader first (2011-01-23)
            </action>
            <action dev="asomov" type="fix" issue="106">
                Immutable data structures in StreamReader allow to share the same buffer for all
                the Mark instances. It makes 'withMarkContext' setting redundant (2011-01-19)
            </action>
            <action dev="maslovalex" type="update" issue="100">
                Merge JavaBean properties when an explicit tag is provided (2011-01-11)
            </action>
            <action dev="asomov" type="update" issue="99">
                Add an example for escaping line breaks in binary content (2011-01-03)
            </action>
            <action dev="asomov" type="update" issue="97">
                Propose a solution for JavaBeans to support SortedSet property when it is encoded
                as a sequence (2010-11-24)
            </action>
            <action dev="asomov" type="update" issue="59">
                Simplify the way how the order of JavaBean properties is specified. Introduce
                PropertyUtils.createPropertySet() method to be overridden when a specific order
                is expected (2010-11-23)
            </action>
            <action dev="maslovalex" type="fix" issue="95">
                Fix: Loading of generic collections with Array parameter(s). (2010-11-16)
            </action>
            <action dev="asomov" type="update" issue="94">
                Add ChangeRuntimeClassTest as an example how to change a class for a global tag (2010-11-05)
            </action>
            <action dev="asomov" type="update">
                Inner objects in Constructor become protected to be more flexible when Constructor
                is expended (2010-10-03)
            </action>
            <action dev="asomov" type="update" issue="91">
                Apply www.snakeyaml.org domain name (2010-09-20)
            </action>
            <action dev="asomov" type="fix" issue="90">
                Move Base64Coder into another package to keep a separate copyright statement.
                Base64Coder is left unchanged (2010-09-19)
            </action>
            <action dev="asomov" type="fix" issue="69">
                Iterable should not be serialised as sequence (2010-09-16)
            </action>
            <action dev="asomov" type="update">
                Introduce 'fast' Maven profile to quickly build cobertura reports (2010-09-16)
            </action>
            <action dev="asomov" type="update" issue="89">
                Fix: Specify plugin versions in POM (2010-09-15)
            </action>
            <action dev="maslovalex" type="fix" issue="88">
                Fix: Custom tag erased when referenced from generic collection (2010-09-15)
            </action>
            <action dev="asomov" type="update">
                Minor refactoring in Emitter to improve performance: save calls to Constant.has() (2010-09-13)
            </action>
            <action dev="maslovalex" type="update">
                Minor refactorings in Emitter to improve performance: create less Strings [r9185e0b3] (2010-09-10)
            </action>
            <action dev="asomov" type="update" issue="79">
                Introduce LoaderOptions to be able to specify configuration while loading (2010-09-03)
            </action>
            <action dev="asomov" type="fix" issue="81">
                Representer.representJavaBeanProperty() is given the wrong tag. Instead of the property tag,
                the tag for the JavaBean itself is provided. (2010-09-01)
            </action>
            <action dev="asomov" type="update">
                Rename JvmDetector into GenericsBugDetector (2010-08-31)
            </action>
            <action dev="asomov" type="fix" issue="80" due-to="SebastienRainville">
                Fix: Timestamp is not parsed properly when milliseconds start with 0 (2010-08-24)
            </action>
            <action dev="maslovalex" type="update" issue="79">
                Context for error reporting consumes a lot of resources (2010-08-21)
            </action>
            <action dev="asomov" type="remove">
                Cleanup unused code in deprecated Loader and Dumper (2010-08-13)
            </action>
        </release>
        <release version="1.7" date="2010-08-12" description="Simplify public API (drop Loader and Dumper)">
            <action dev="asomov" type="update">
                Eclipse does not run JUnit 4 tests when they are launched for the whole project (2010-08-11)
            </action>
            <action dev="maslovalex" type="update" issue="55">
                Share PropertyUtils if not explicitly set in Constructor or Representer
                (BeanAccess.FIELD works properly when JavaBean is identified by a root tag) (2010-08-11)
            </action>
            <action dev="asomov" type="update">
                Create 1.7 Release Candidate 1 (2010-08-11)
            </action>
            <action dev="asomov" type="update" issue="77">
                Simplify public API: Drop Dumper (2010-08-06)
            </action>
            <action dev="asomov" type="update" issue="77">
                Simplify public API: Drop Loader (2010-08-05)
            </action>
            <action dev="asomov" type="update" issue="75" due-to="jon.p.hermes">
                Add examples to create scalars that match custom regular expression:
                CustomImplicitResolverTest, CustomBeanResolverTest (2010-08-03)
            </action>
            <action dev="asomov" type="fix" issue="74" due-to="Kevin Menard">
                Do not use redundant tags for arrays which are JavaBean properties. (2010-07-21)
            </action>
            <action dev="asomov" type="update">
                RecursiveSetTest proves that it is possible to construct a recursive set (2010-07-20)
            </action>
            <action dev="asomov" type="add" issue="73" due-to="birnbuazn">
                Provide sequence support for loading java.util.Set. Also provide an example
                to serialise a java.util.Set as a sequence. (2010-07-19)
            </action>
            <action dev="asomov" type="add" issue="72" due-to="birnbuazn">
                Support java.util.Collection as a parent for List and Set (2010-07-09)
            </action>
            <action dev="maslovalex" type="add" issue="55" due-to="birnbuazn">
                Allow direct field access bypassing setters and getters. Empty constructor
                is required to support 2-step construction (2010-07-02)
            </action>
            <action dev="asomov" type="update" issue="69">
                Serialise Iterator and Iterable as sequences (2010-06-25)
            </action>
            <action dev="asomov" type="update" due-to="maslovalex">
                Change error message when 'No suitable constructor with N arguments found for class' (2010-06-23)
            </action>
            <action dev="asomov" type="add" due-to="Antony Stubbs">
                Add JodaTime example (2010-06-04)
            </action>
            <action dev="asomov" type="add" issue="67" due-to="Manuel Sugawara">
                Add possibility to create a Tag out of an URI (2010-05-31)
            </action>
            <action dev="asomov" type="update">
                URLDecoder.decode() does not fail when UTF-8 is invalid. Use
                CodingErrorAction.REPORT to implement the failure (2010-05-21)
            </action>
            <action dev="maslovalex" type="update">
                Fix generic collections which contain other collections (2010-05-18)
            </action>
            <action dev="asomov" type="fix" issue="67" due-to="Manuel Sugawara">
                Fix: java classes containing non-ASCII characters in names are
                incorrectly encoded (2010-05-14)
            </action>
            <action dev="asomov" type="fix" issue="65" due-to="lerch.johannes">
                Fix: add checks for null arguments for JavaBeanDumper (2010-04-27)
            </action>
            <action dev="asomov" type="add">
                Add a test to see how stack trace is serialised (2010-04-27)
            </action>
            <action dev="asomov" type="fix" issue="64" due-to="maxim.moschko">
                ClassCastException in Representer when working with ParameterizedType (2010-04-25)
            </action>
            <action dev="asomov" type="update">
                Improve toString() method for Node. Since scalars cannot be recursive
                they can be printed (2010-04-15)
            </action>
            <action dev="maslovalex" type="fix" issue="63" due-to="Udo">
                Refactor the way arrays are constructed (2010-04-15)
            </action>
            <action dev="asomov" type="fix" issue="62">
                Add examples for dumping custom values for !!bool and !!null (2010-04-13)
            </action>
            <action dev="asomov" type="fix" issue="61">
                Fix: ClassCastException when dumping generic bean (2010-04-11)
            </action>
            <action dev="asomov" type="fix" issue="59">
                Provide an example for changing JavaBean properties order (2010-04-01)
            </action>
            <action dev="asomov" type="fix" issue="60">
                Provide example for skipping null and empty collections (2010-03-29)
            </action>
            <action dev="asomov" type="fix" issue="58" due-to="jeff.caulfield">
                JavaBeanDumper.dump throws NullPointerException on list property
                with null element (2010-03-23)
            </action>
            <action dev="asomov" type="fix" issue="56" due-to="DZeiss">
                Make constructors in SafeConstructor public (2010-03-16)
            </action>
            <action dev="asomov" type="update" due-to="David Bernard">
                Releases and snapshots are available in the Sonatype Maven repository.
                https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
            </action>
            <action dev="obastard" type="fix" issue="53" due-to="obastard">
                Enhancement for a pretty format that combines BLOCK and FLOW (2010-03-03)
            </action>
            <action dev="asomov" type="fix" issue="50" due-to="sualeh.fatehi">
                Unable to dump JavaBean that inherits from a protected base class (2010-03-02)
            </action>
            <action dev="asomov" type="update">
                Format source (2010-03-01)
            </action>
            <action dev="asomov" type="update">
                Use Token.ID and Event.ID instead of just ID (2010-03-01)
            </action>
            <action dev="asomov" type="update">
                Issue 50 fails in Eclipse but works with Maven (2010-03-01)
            </action>
        </release>
        <release version="1.6" date="2010-02-26" description="introduce Tag class">
            <action dev="asomov" type="update">
                Release Candidate 2 is available (2010-02-24)
            </action>
            <action dev="asomov" type="fix" issue="47" due-to="obastard">
                Don't dump read-only properties by default. DumperOptions gets a setting to
                include read-only JavaBean properties.
                This is no backwards compatible change (2010-02-19)
            </action>
            <action dev="asomov" type="fix" issue="49" due-to="obastard">
                Support GregorianCalendar. Due to Daylight Saving Time parsing the timestamp with
                a TimeZone cannot determine the exact time (2010-02-19)
            </action>
            <action dev="asomov" type="fix" issue="51" due-to="johann.Werner">
                Some Unicode characters are wrongly replaced by \x{fffd} during
                double quoted style dump (2010-02-15)
            </action>
            <action dev="asomov" type="fix" issue="48" due-to="obastard">
                Introduce representJavaBeanProperty() method in Representer. The method
                can be overridden to simplify custom JavaBean representation (2010-02-12)
            </action>
            <action dev="asomov" type="update">
                Release Candidate 1 is available (2010-02-01)
            </action>
            <action dev="asomov" type="add">
                Representer.representJavaBean() returns MappingNode (2010-01-26)
            </action>
            <action dev="asomov" type="add">
                Add example of serialising static fields  (2010-01-26)
            </action>
            <action dev="asomov" type="add">
                Add example of serialising java.io.File as scalar node for issue 46  (2010-01-25)
            </action>
            <action dev="asomov" type="update">
                Refactor: introduce Chomping to avoid using null as value for Boolean.
                Stay in line with Scala port where null is not allowed (2010-01-19)
            </action>
            <action dev="asomov" type="update">
                Refactor: use Event.ID enum instead of classes (2010-01-15)
            </action>
            <action dev="asomov" type="update">
                Refactor: use Token.ID enum instead of classes (2010-01-15)
            </action>
            <action dev="asomov" type="update">
                Refactor: use generic classes for DirectiveToken (2010-01-14)
            </action>
            <action dev="asomov" type="update">
                Refactor: rename Reader to StreamReader to avoid name conflict with java.io.Reader (2010-01-13)
            </action>
            <action dev="asomov" type="update">
                Refactor: use StringBuilder instead of StringBuffer (2010-01-12)
            </action>
            <action dev="asomov" type="update">
                Refactor: introduce Constant class to share String constants (2010-01-12)
            </action>
            <action dev="asomov" type="update">
                Keep Tag.equals(String) to simplify transition to Tag class (2010-01-08)
            </action>
            <action dev="asomov" type="update">
                Refactor: introduce Tag instead of Tags. Nodes use Tag class instead of String (2010-01-05)
            </action>
            <action dev="asomov" type="fix" issue="42" due-to="Artem">
                BaseConstructor shall give more flexibility to choose a constructor at runtime (2010-01-08)
            </action>
            <action dev="asomov" type="update">
                Refactor: introduce TagTuple instead of String[] (2010-01-04)
            </action>
            <action dev="asomov" type="fix" issue="40" due-to="sitrious">
                Ignore tags when they are compatible with the runtime class (2010-01-04)
            </action>
            <action dev="asomov" type="add">
                Add example to ignore unknown tags (2009-12-08)
            </action>
            <action dev="asomov" type="add">
                Add Ruby example (2009-12-08)
            </action>
            <action dev="asomov" type="update">
                Do not omit the tag for JavaBean properties when the tag is explicitly defined (2009-12-08)
            </action>
            <action dev="asomov" type="fix" issue="38" due-to="gchpaco">
                Fix ID format for numbers over 999 (2009-12-05)
            </action>
            <action dev="asomov" type="fix" issue="29" due-to="grignaak">
                Allow separate option in DumperOptions for long strings (2009-11-16)
            </action>
            <action dev="asomov" type="add">
                JavaBeanDumper: add possibility to define a custom Representer (2009-11-25)
            </action>
            <action dev="asomov" type="fix" issue="36">
                Introduce multi contructors (tag prefix). A family of tags may be processed
                by a single constructor (2009-11-25)
            </action>
            <action dev="asomov" type="update">
                Refactor BaseConstructor: simplify second step for recursive structures (2009-11-25)
            </action>
            <action dev="asomov" type="add">
                Add FilterPropertyToDumpTest to show how to filter JavaBean properties (2009-11-24)
            </action>
            <action dev="asomov" type="add">
                Add FilterClassesConstructorTest to show how to filter created classes (2009-11-16)
            </action>
            <action dev="asomov" type="update" due-to="Stefan">
                Improve JavaDoc (2009-11-12)
            </action>
            <action dev="asomov" type="add">
                Add Velocity example (2009-11-03)
            </action>
            <action dev="asomov" type="update">
                Refactor: rename Tuple to RecursiveTuple and hide it inside BaseConstructor (2009-11-03)
            </action>
        </release>
        <release version="1.5" date="2009-10-30" description="Improve usage of generic collections in JavaBeans">
            <action dev="asomov" type="fix" issue="27" due-to="Polyglot Maven team">
                Extend Resolver to support custom implicit types (2009-10-27)
            </action>
            <action dev="asomov" type="update">
                Performance improvement: use ArrayStack instead of Stack which extends Vector (2009-10-20)
            </action>
            <action dev="asomov" type="fix" issue="25" due-to="Benjamin Bentmann">
                Improve usage of generic collections: while type erase makes no difference between
                Class< Foo> and Class< Bar> at runtime, the information about generics is still
                accessible via reflection from Method/Field. (2009-10-19)
            </action>
            <action dev="asomov" type="update">
                Fix ConstructYamlObject: support recursive objects. Introduce 'resolved'
                property for Nodes. This property supposed to help to distinguish explicit tag
                from the resolved tag (2009-10-19)
            </action>
            <action dev="asomov" type="update">
                Refactor: use rootTag instead of rootType (for Class) in BaseConstructor. This is done to
                solve the priority problem: normally explicit tag has more priority then runtime class but
                for the root tag it is the other way around (2009-10-19)
            </action>
            <action dev="asomov" type="fix" issue="24" due-to="shrode">
                Line numbers reported in Exceptions are Zero based, should be 1 based (2009-10-12)
            </action>
            <action dev="asomov" type="fix" issue="21" due-to="ashwin.jayaprakash">
                Support arrays of reference types as JavaBean properties (2009-09-22)
            </action>
            <action dev="asomov" type="fix" issue="17" due-to="jcucurull">
                Respect root tag for sequences (2009-09-04)
            </action>
            <action dev="asomov" type="fix" issue="18" due-to="creiniger">
                SafeRepresenter respects custom tags for standard Java classes where standard tag has
                more then one Java implementation available (Long, List, Map, Date etc) (2009-09-03)
            </action>
            <action dev="asomov" type="add">
                Add possibility to define a custom Class Loader. (2009-09-01)
            </action>
            <action dev="asomov" type="fix">
                Fixed an obscure scanner error not reported when there is no line break at the end
                of the stream. The fix is imported from PyYAML 3.09 {ticket 118} (2009-08-31)
            </action>
            <action dev="asomov" type="fix" issue="16" due-to="infinity0x">
                Cache JavaBean class properties. Tests show that the loading has become a few percents faster (2009-08-31)
            </action>
            <action dev="asomov" type="add">
                Introduce ArrayStack to use push() and pop() instead of standard (and too verbose)
                'remove(size()-1)'  (2009-08-27)
            </action>
            <action dev="asomov" type="fix" issue="14" due-to="infinity0x">
                Fix: ArrayList is more efficient than LinkedList  (2009-08-26)
            </action>
        </release>
        <release version="1.4" date="2009-08-26" description="better support for loading immutable objects">
            <action dev="asomov" type="update">
                Apply Apache License Version 2.0 (2009-08-14)
            </action>
            <action dev="asomov" type="fix" issue="13" due-to="infinity0x">
                Provide javadocs link to Sun Java API (2009-08-10)
            </action>
            <action dev="asomov" type="add">
                Build 1.4 Release Candidate 1 (2009-08-07)
            </action>
            <action dev="asomov" type="add">
                Introduce Tags.getGlobalTagForClass() to simplify tag generation in custom constructors (2009-08-06)
            </action>
            <action dev="asomov" type="update">
                Refactor: introduce ImplicitTuple (2009-08-06)
            </action>
            <action dev="asomov" type="fix" issue="11" due-to="infinity0x">
                Fix: create a Java instance with the following priority to choose the class:
                Explicit tag -> Runtime class (defined in JavaBean) -> implicit tag  (2009-08-06)
            </action>
            <action dev="asomov" type="fix" issue="9" due-to="wwagner4">
                Fix: Bean with no property cannot be instantiated. This is implemented via better
                support for immutable objects. Custom Constructor may be used when there are more
                then 1 way to create an instance (2009-08-04)
            </action>
            <action dev="asomov" type="add">
                Deliver possibility to load immutable instances with no global tags. Reflection for
                constructor arguments is used to get the runtime classes (2009-08-04)
            </action>
            <action dev="asomov" type="update">
                Use more informative error message when a JavaBean property cannot
                be created (2009-08-02)
            </action>
            <action dev="asomov" type="update">
                Refactor: Constructor is rewritten. Do not overwrite methods from BaseConstructor.
                Instead introduce ConstructScalar, ConstructSequence, ConstructMapping (2009-07-31)
            </action>
            <action dev="asomov" type="update">
                Change Maven repository path: groupId='org.yaml', artifactId='snakeyaml' (2009-07-31)
            </action>
            <action dev="asomov" type="fix" issue="10" due-to="derrick.rice">
                Fix: dump omits JavaBean class name when used with an alias (2009-07-28)
            </action>
            <action dev="asomov" type="add">
                Generate sources and Javadoc (2009-07-27)
            </action>
            <action dev="asomov" type="update">
                Node does not have the value. It is delegated to the non-abstract classes (2009-07-27)
            </action>
            <action dev="asomov" type="add">
                Extends JavaBeanDumper to allow skipping global tags inside type-safe collections.
                Introduce method setMapTagForBean() (2009-07-22)
            </action>
            <action dev="asomov" type="add">
                Add ConstructEmptyBeanTest to test JavaBean construction with no
                properties in the YAML document(2009-07-22)
            </action>
            <action dev="asomov" type="remove">
                Refactor: redesign tag management for JavaBeans in Representer.
                Drop dynamic root tag concept (2009-07-22)
            </action>
            <action dev="asomov" type="remove">
                Remove unused TypeDescription in Representer (2009-07-21)
            </action>
            <action dev="asomov" type="update">
                Use NodeTuple instead of Node[] for mappings (2009-07-21)
            </action>
            <action dev="asomov" type="add">
                Introduce JavaBeanLoader and JavaBeanDumper. Deprecate JavaBeanParser (2009-07-21)
            </action>
            <action dev="asomov" type="fix" issue="8" due-to="Alan Gutierrez">
                Fix: Representer was keeping state between invocations (2009-07-21)
            </action>
        </release>
        <release version="1.3" date="2009-07-20" description="complete support for recursive objects">
            <action dev="asomov" type="fix" issue="6" due-to="infinity0x">
                Fix: values returned by System.identityHashCode() are not guaranteed to be unique (2009-07-14)
            </action>
            <action dev="asomov" type="add">
                Add a simple test for Java Generics (BirdTest). Unfortunately it shows that some JVM
                implementations do not recognise classes for JavaBean properties at runtime.
                It leads to unnecessary global tags. See http://code.google.com/p/snakeyaml/wiki/Documentation#Generics
                for details (2009-07-13)
            </action>
            <action dev="asomov" type="fix" issue="5" due-to="infinity0x">
                Fix: set the "cause" field for MarkedYAMLException (2009-07-10)
            </action>
            <action dev="maslovalex" type="fix" issue="1">
                Fix: Recursive objects are now fully supported (2009-07-09)
            </action>
            <action dev="asomov" type="add">
                Add support for BigDecimal as a JavaBean property (2009-07-07)
            </action>
            <action dev="asomov" type="update">
                Improve test coverage for Constructor. Allow construction of JavaBeans
                with only setter without the corresponding getter (2009-07-07)
            </action>
            <action dev="asomov" type="add">
                Add a test to check the proper report for IOException (2009-07-03)
            </action>
            <action dev="asomov" type="fix" issue="3" due-to="infinity0x">
                Fix: represent proper tags for JavaBeans when they are not the root of the YAML
                document but a member of a collection (2009-07-03)
            </action>
            <action dev="asomov" type="update">
                Refactor: run PMD and apply some of the recommendations (2009-06-18)
            </action>
            <action dev="asomov" type="add" issue="1">
                Create an issue for Recursive objects to be remembered (2009-06-08)
            </action>
            <action dev="asomov" type="update">
                Migrate project hosting from Assembla to Google code (2009-06-08)
            </action>
            <action dev="asomov" type="fix" due-to="Magne">
                Fix: null as a JavaBean property was not handled properly (2009-06-04)
            </action>
            <action dev="asomov" type="update">
                Validate changes.xml file (2009-05-25)
            </action>
            <action dev="asomov" type="fix" due-to="Magne">
                Fix ticket 40 in Assembla: getting an error when javabean contains java.sql.Timestamp fields (2009-05-25)
            </action>
        </release>
        <release version="1.2" date="2009-04-27" description="expose low-level API">
            <action dev="asomov" type="add">
                Add 'Yaml.parse()' method which return Events to support low level YAML processing (2009-04-20)
            </action>
            <action dev="asomov" type="add" due-to="Bob Jalex">
                Introduce LineBreak.getPlatformLineBreak (ticket 5 in Assembla) (2009-04-18)
            </action>
            <action dev="asomov" type="update" due-to="Bob Jalex">
                 Rename LineBreak.LINUX to LineBreak.UNIX (ticket 5 in Assembla) (2009-04-18)
            </action>
            <action dev="asomov" type="add">
                Add 'Yaml.compose()' methods which return Nodes to support YEdit (2009-04-17)
            </action>
            <action dev="asomov" type="update">
                Refactor: rename enums in DumperOptions to make the names consistent (2009-04-07)
            </action>
            <action dev="asomov" type="update">
                Refactor: use Character instead of char primitive for style in Emitter (2009-04-07)
            </action>
            <action dev="asomov" type="add">
                Add possibility to parse all scalars as Strings (2009-03-30)
            </action>
            <action dev="asomov" type="update">
                Merge changeset 347 from PyYAML (2009-03-30)
            </action>
            <action dev="asomov" type="fix">
                Respect DumperOptions with a custom Representer (2009-03-18)
            </action>
            <action dev="asomov" type="fix">
                Represent TAB as '\t' instead of '(9' in the error message (2009-03-17)
            </action>
        </release>
        <release version="1.1" date="2009-03-14" description="improve performance and test coverage">
            <action dev="asomov" type="add">
                Introduce JavaBeanParser (2009-03-14)
            </action>
            <action dev="asomov" type="add">
                Introduce DumperOptions.Version enum (2009-03-13)
            </action>
            <action dev="asomov" type="add">
                Introduce DumperOptions.LineBreak enum (2009-03-10)
            </action>
            <action dev="asomov" type="update">
                Use byte[] for binary type. (2009-03-09)
            </action>
            <action dev="asomov" type="update">
                Restore Regular Expressions in Resolver. Ragel gives only 5% performance increase.
                Fix a bug in Resolver with expanded regular expressions which caused the
                performance problem. (2009-03-06)
            </action>
            <action dev="asomov" type="add">
                Better Spring support: it is now possible to create a constructor with a String
                as the class name. (2009-03-05)
            </action>
            <action dev="asomov" type="update">
                Throw an exception when the same Loader or Dumper instance is shared between
                different Yaml instances. Because they are statefull it is not Thread-safe. (2009-03-05)
            </action>
            <action dev="asomov" type="add">
                Add possibility to set a meaningful name for Yaml instance to be shown in toString(). (2009-03-05)
            </action>
            <action dev="asomov" type="update">
                Refactor: declare classes which are not expected to be extended as final. (2009-03-04)
            </action>
            <action dev="asomov" type="update">
                Refactor: use 'final' keyword to identify immutable fields. (2009-03-04)
            </action>
            <action dev="asomov" type="update">
                Refactor: do not use 'final' keyword for local variables. (2009-03-04)
            </action>
            <action dev="asomov" type="fix">
                Fix: respect implicit resolvers with 'null' as a first character. (2009-03-02)
            </action>
            <action dev="asomov" type="update">
                Refactor: use Character instead of String as a key for implicit resolvers. (2009-03-02)
            </action>
            <action dev="asomov" type="add">
                Use Ragel instead of Regular Expressions for implicit types. (2009-03-02)
            </action>
            <action dev="asomov" type="fix" due-to="Christophe Desguez">
                Fix ticket #4 (in Assembla): java.sql.Date not handled. (2009-02-28)
            </action>
             <action dev="asomov" type="add">
                Introduce DumperOptions.DefaultFlowStyle enum (2009-02-24)
            </action>
            <action dev="asomov" type="add">
                Introduce DumperOptions.DefaultScalarStyle enum (2009-02-24)
            </action>
            <action dev="asomov" type="update">
                Refactor: use 'switch' with Enum instead of multiple 'if' statements to distinguish nodes (2009-02-19)
            </action>
            <action dev="asomov" type="update">
                Refactor: use Enum instead of String as NodeId (2009-02-19)
            </action>
        </release>
        <release version="1.0.1" date="2009-02-18" description="implement Enum support">
            <action dev="asomov" type="fix">
                Do not emit anchors for Enum (2009-02-18)
            </action>
            <action dev="asomov" type="fix">
                Enum as a JavaBean property (when the Enum class is implicitly defined) does
                not need tags for both loading and dumping (2009-02-17)
            </action>
            <action dev="asomov" type="fix">
                Enum is emitted as a scalar node (2009-02-17)
            </action>
            <action dev="asomov" type="fix" due-to="James Nissel">
                Enum is parsed as a scalar node or as a JavaBean property (2009-02-17)
            </action>
            <action dev="asomov" type="update">
                Refactor: for performance ScannerImpl.stalePossibleSimpleKeys() does not copy key Set (2009-02-10)
            </action>
            <action dev="asomov" type="update">
                By default allowUnicode=true. If it is necessary to escape Unicode use
                DumperOptions.setAllowUnicode(false) (2009-02-09)
            </action>
            <action dev="asomov" type="add">
                Implement allowUnicode setting (to escape Unicode characters on non UTF-8 terminals) (2009-02-09)
            </action>
            <action dev="asomov" type="add">
                Add possibility to specify tags for dumping (2009-02-09)
            </action>
            <action dev="asomov" type="update">
                Rename getExpRoot to getExplicitRoot to conform with
                standard JavaBean naming convention (2009-02-09)
            </action>
            <action dev="asomov" type="update">
                Rename explictStart and explicitEnd to standard setters to conform with
                standard JavaBean naming convention (2009-02-09)
            </action>
            <action dev="asomov" type="fix">
                Add possibility to specify a line break (2009-02-09)
            </action>
        </release>
        <release version="1.0" date="2009-02-06" description="final 1.0 release">
            <action dev="asomov" type="add">
                Deliver first release (2009-02-06)
            </action>
        </release>
    </body>
</document>

## 内容2
### 文件路径：
src/main/java/org/yaml/snakeyaml/LoaderOptions.java
### 代码内容：
package org.yaml.snakeyaml;

public class LoaderOptions {

    private boolean allowDuplicateKeys = true;
    private boolean wrappedToRootException = false;
    private int maxAliasesForCollections = 50; //to prevent YAML at https://en.wikipedia.org/wiki/Billion_laughs_attack
    private boolean allowRecursiveKeys = false;
    private boolean processComments = false;
    private boolean enumCaseSensitive = true;

    public boolean isAllowDuplicateKeys() {
        return allowDuplicateKeys;
    }

    /**
     * Allow/Reject duplicate map keys in the YAML file.
     *
     * Default is to allow.
     *
     * YAML 1.1 is slightly vague around duplicate entries in the YAML file. The
     * best reference is <a href="http://www.yaml.org/spec/1.1/#id862121">
     * 3.2.1.3. Nodes Comparison</a> where it hints that a duplicate map key is
     * an error.
     *
     * For future reference, YAML spec 1.2 is clear. The keys MUST be unique.
     * <a href="http://www.yaml.org/spec/1.2/spec.html#id2759572">1.3. Relation
     * to JSON</a>
     * @param allowDuplicateKeys false to reject duplicate mapping keys
     */
    public void setAllowDuplicateKeys(boolean allowDuplicateKeys) {
        this.allowDuplicateKeys = allowDuplicateKeys;
    }

    public boolean isWrappedToRootException() {
        return wrappedToRootException;
    }

    /**
     * Wrap runtime exception to YAMLException during parsing or leave them as they are
     *
     * Default is to leave original exceptions
     *
     * @param wrappedToRootException - true to convert runtime exception to YAMLException
     */
    public void setWrappedToRootException(boolean wrappedToRootException) {
        this.wrappedToRootException = wrappedToRootException;
    }

    public int getMaxAliasesForCollections() {
        return maxAliasesForCollections;
    }

    /**
     * Restrict the amount of aliases for collections (sequences and mappings) to avoid https://en.wikipedia.org/wiki/Billion_laughs_attack
     * @param maxAliasesForCollections set max allowed value (50 by default)
     */
    public void setMaxAliasesForCollections(int maxAliasesForCollections) {
    	this.maxAliasesForCollections = maxAliasesForCollections;
    }

    /**
     * Allow recursive keys for mappings. By default it is not allowed.
     * This setting only prevents the case when the key is the value. If the key is only a part of the value
     * (the value is a sequence or a mapping) then this case is not recognized and always allowed.
     * @param allowRecursiveKeys - false to disable recursive keys
     */
    public void setAllowRecursiveKeys(boolean allowRecursiveKeys) {
    	this.allowRecursiveKeys = allowRecursiveKeys;
    }

    public boolean getAllowRecursiveKeys() {
        return allowRecursiveKeys;
    }

    /**
     * Set the comment processing. By default, comments are ignored.
     *
     * @param processComments <code>true</code> to process; <code>false</code> to ignore
     */
    public void setProcessComments(boolean processComments) {
        this.processComments = processComments;
    }

    public boolean isProcessComments() {
        return processComments;
    }

    public boolean isEnumCaseSensitive() {
        return enumCaseSensitive;
    }

    /**
     * Disables or enables case sensitivity during construct enum constant from string value
     * Default is false.
     *
     * @param enumCaseSensitive - true to set enum case sensitive, false the reverse
     */
    public void setEnumCaseSensitive(boolean enumCaseSensitive) {
        this.enumCaseSensitive = enumCaseSensitive;
    }
}

## 内容3
### 文件路径：
src/main/java/org/yaml/snakeyaml/composer/Composer.java
### 代码内容：
package org.yaml.snakeyaml.composer;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.yaml.snakeyaml.DumperOptions.FlowStyle;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.comments.CommentEventsCollector;
import org.yaml.snakeyaml.comments.CommentLine;
import org.yaml.snakeyaml.comments.CommentType;
import org.yaml.snakeyaml.error.Mark;
import org.yaml.snakeyaml.error.YAMLException;
import org.yaml.snakeyaml.events.AliasEvent;
import org.yaml.snakeyaml.events.Event;
import org.yaml.snakeyaml.events.MappingStartEvent;
import org.yaml.snakeyaml.events.NodeEvent;
import org.yaml.snakeyaml.events.ScalarEvent;
import org.yaml.snakeyaml.events.SequenceStartEvent;
import org.yaml.snakeyaml.nodes.AnchorNode;
import org.yaml.snakeyaml.nodes.MappingNode;
import org.yaml.snakeyaml.nodes.Node;
import org.yaml.snakeyaml.nodes.NodeId;
import org.yaml.snakeyaml.nodes.NodeTuple;
import org.yaml.snakeyaml.nodes.ScalarNode;
import org.yaml.snakeyaml.nodes.SequenceNode;
import org.yaml.snakeyaml.nodes.Tag;
import org.yaml.snakeyaml.parser.Parser;
import org.yaml.snakeyaml.resolver.Resolver;

/**
 * Creates a node graph from parser events.
 * <p>
 * Corresponds to the 'Compose' step as described in chapter 3.1 of the
 * <a href="http://yaml.org/spec/1.1/">YAML Specification</a>.
 * </p>
 */
public class Composer {
    protected final Parser parser;
    private final Resolver resolver;
    private final Map<String, Node> anchors;
    private final Set<Node> recursiveNodes;
    private int nonScalarAliasesCount = 0;
    private final LoaderOptions loadingConfig;
    private final CommentEventsCollector blockCommentsCollector;
    private final CommentEventsCollector inlineCommentsCollector;

    public Composer(Parser parser, Resolver resolver) {
        this(parser, resolver, new LoaderOptions());
    }

    public Composer(Parser parser, Resolver resolver, LoaderOptions loadingConfig) {
        this.parser = parser;
        this.resolver = resolver;
        this.anchors = new HashMap<String, Node>();
        this.recursiveNodes = new HashSet<Node>();
        this.loadingConfig = loadingConfig;
        this.blockCommentsCollector = new CommentEventsCollector(parser,
                CommentType.BLANK_LINE, CommentType.BLOCK);
        this.inlineCommentsCollector = new CommentEventsCollector(parser,
                CommentType.IN_LINE);
    }

    /**
     * Checks if further documents are available.
     *
     * @return <code>true</code> if there is at least one more document.
     */
    public boolean checkNode() {
        // Drop the STREAM-START event.
        if (parser.checkEvent(Event.ID.StreamStart)) {
            parser.getEvent();
        }
        // If there are more documents available?
        return !parser.checkEvent(Event.ID.StreamEnd);
    }

    /**
     * Reads and composes the next document.
     *
     * @return The root node of the document or <code>null</code> if no more documents are available.
     */
    public Node getNode() {
        // Collect inter-document start comments
        blockCommentsCollector.collectEvents();
        if (parser.checkEvent(Event.ID.StreamEnd)) {
            List<CommentLine> commentLines = blockCommentsCollector.consume();
            Mark startMark = commentLines.get(0).getStartMark();
            List<NodeTuple> children = Collections.emptyList();
            Node node = new MappingNode(Tag.COMMENT, false, children, startMark, null, FlowStyle.BLOCK);
            node.setBlockComments(commentLines);
            return node;
        }
        // Drop the DOCUMENT-START event.
        parser.getEvent();
        // Compose the root node.
        Node node = composeNode(null);
        // Drop the DOCUMENT-END event.
        blockCommentsCollector.collectEvents();
        if(!blockCommentsCollector.isEmpty()) {
            node.setEndComments(blockCommentsCollector.consume());
        }
        parser.getEvent();
        this.anchors.clear();
        this.recursiveNodes.clear();
        return node;
    }

    /**
     * Reads a document from a source that contains only one document.
     * <p>
     * If the stream contains more than one document an exception is thrown.
     * </p>
     *
     * @return The root node of the document or <code>null</code> if no document
     * is available.
     */
    public Node getSingleNode() {
        // Drop the STREAM-START event.
        parser.getEvent();
        // Compose a document if the stream is not empty.
        Node document = null;
        if (!parser.checkEvent(Event.ID.StreamEnd)) {
            document = getNode();
        }
        // Ensure that the stream contains no more documents.
        if (!parser.checkEvent(Event.ID.StreamEnd)) {
            Event event = parser.getEvent();
            Mark contextMark = document != null ? document.getStartMark(): null;
            throw new ComposerException("expected a single document in the stream",
                    contextMark, "but found another document", event.getStartMark());
        }
        // Drop the STREAM-END event.
        parser.getEvent();
        return document;
    }

    private Node composeNode(Node parent) {
        blockCommentsCollector.collectEvents();
        if (parent != null)
            recursiveNodes.add(parent);
        final Node node;
        if (parser.checkEvent(Event.ID.Alias)) {
            AliasEvent event = (AliasEvent) parser.getEvent();
            String anchor = event.getAnchor();
            if (!anchors.containsKey(anchor)) {
                throw new ComposerException(null, null, "found undefined alias " + anchor,
                        event.getStartMark());
            }
            node = anchors.get(anchor);
            if (!(node instanceof ScalarNode)) {
                this.nonScalarAliasesCount++;
                if (this.nonScalarAliasesCount > loadingConfig.getMaxAliasesForCollections()) {
                    throw new YAMLException("Number of aliases for non-scalar nodes exceeds the specified max=" + loadingConfig.getMaxAliasesForCollections());
                }
            }
            if (recursiveNodes.remove(node)) {
                node.setTwoStepsConstruction(true);
            }
            // drop comments, they can not be supported here
            blockCommentsCollector.consume();
            inlineCommentsCollector.collectEvents().consume();
        } else {
            NodeEvent event = (NodeEvent) parser.peekEvent();
            String anchor = event.getAnchor();
            // the check for duplicate anchors has been removed (issue 174)
            if (parser.checkEvent(Event.ID.Scalar)) {
                node = composeScalarNode(anchor, blockCommentsCollector.consume());
            } else if (parser.checkEvent(Event.ID.SequenceStart)) {
                node = composeSequenceNode(anchor);
            } else {
                node = composeMappingNode(anchor);
            }
        }
        recursiveNodes.remove(parent);
        return node;
    }

    protected Node composeScalarNode(String anchor, List<CommentLine> blockComments) {
        ScalarEvent ev = (ScalarEvent) parser.getEvent();
        String tag = ev.getTag();
        boolean resolved = false;
        Tag nodeTag;
        if (tag == null || tag.equals("!")) {
            nodeTag = resolver.resolve(NodeId.scalar, ev.getValue(),
                    ev.getImplicit().canOmitTagInPlainScalar());
            resolved = true;
        } else {
            nodeTag = new Tag(tag);
        }
        Node node = new ScalarNode(nodeTag, resolved, ev.getValue(), ev.getStartMark(),
                ev.getEndMark(), ev.getScalarStyle());
        if (anchor != null) {
            node.setAnchor(anchor);
            anchors.put(anchor, node);
        }
        node.setBlockComments(blockComments);
        node.setInLineComments(inlineCommentsCollector.collectEvents().consume());
        return node;
    }

    protected Node composeSequenceNode(String anchor) {
        SequenceStartEvent startEvent = (SequenceStartEvent) parser.getEvent();
        String tag = startEvent.getTag();
        Tag nodeTag;

        boolean resolved = false;
        if (tag == null || tag.equals("!")) {
            nodeTag = resolver.resolve(NodeId.sequence, null, startEvent.getImplicit());
            resolved = true;
        } else {
            nodeTag = new Tag(tag);
        }
        final ArrayList<Node> children = new ArrayList<Node>();
        SequenceNode node = new SequenceNode(nodeTag, resolved, children, startEvent.getStartMark(),
                null, startEvent.getFlowStyle());
        if (startEvent.isFlow()) {
            node.setBlockComments(blockCommentsCollector.consume());
        }
        if (anchor != null) {
            node.setAnchor(anchor);
            anchors.put(anchor, node);
        }
        while (!parser.checkEvent(Event.ID.SequenceEnd)) {
            blockCommentsCollector.collectEvents();
            if (parser.checkEvent(Event.ID.SequenceEnd)) {
                break;
            }
            children.add(composeNode(node));
        }
        if (startEvent.isFlow()) {
            node.setInLineComments(inlineCommentsCollector.collectEvents().consume());
        }
        Event endEvent = parser.getEvent();
        node.setEndMark(endEvent.getEndMark());
        inlineCommentsCollector.collectEvents();
        if(!inlineCommentsCollector.isEmpty()) {
            node.setInLineComments(inlineCommentsCollector.consume());
        }
        return node;
    }

    protected Node composeMappingNode(String anchor) {
        MappingStartEvent startEvent = (MappingStartEvent) parser.getEvent();
        String tag = startEvent.getTag();
        Tag nodeTag;
        boolean resolved = false;
        if (tag == null || tag.equals("!")) {
            nodeTag = resolver.resolve(NodeId.mapping, null, startEvent.getImplicit());
            resolved = true;
        } else {
            nodeTag = new Tag(tag);
        }

        final List<NodeTuple> children = new ArrayList<NodeTuple>();
        MappingNode node = new MappingNode(nodeTag, resolved, children, startEvent.getStartMark(),
                null, startEvent.getFlowStyle());
        if (startEvent.isFlow()) {
            node.setBlockComments(blockCommentsCollector.consume());
        }
        if (anchor != null) {
            node.setAnchor(anchor);
            anchors.put(anchor, node);
        }
        while (!parser.checkEvent(Event.ID.MappingEnd)) {
            blockCommentsCollector.collectEvents();
            if (parser.checkEvent(Event.ID.MappingEnd)) {
                break;
            }
            composeMappingChildren(children, node);
        }
        if (startEvent.isFlow()) {
            node.setInLineComments(inlineCommentsCollector.collectEvents().consume());
        }
        Event endEvent = parser.getEvent();
        node.setEndMark(endEvent.getEndMark());
        inlineCommentsCollector.collectEvents();
        if(!inlineCommentsCollector.isEmpty()) {
            node.setInLineComments(inlineCommentsCollector.consume());
        }
        return node;
    }

    protected void composeMappingChildren(List<NodeTuple> children, MappingNode node) {
        Node itemKey = composeKeyNode(node);
        if (itemKey.getTag().equals(Tag.MERGE)) {
            node.setMerged(true);
        }
        Node itemValue = composeValueNode(node);
        children.add(new NodeTuple(itemKey, itemValue));
    }

    protected Node composeKeyNode(MappingNode node) {
        return composeNode(node);
    }

    protected Node composeValueNode(MappingNode node) {
        return composeNode(node);
    }
}