This document specifies a JSON object called a "State Machine". A State Machine MUST have an object field named "States"; each field is a "State". A State Machine MUST have a string field named "StartAt". A State Machine MAY have a string field named "Comment". A State Machine MAY have a string field named "Version". A State Machine MAY have a positive-integer field named "TimeoutSeconds" whose value MUST be less than 99999999. A State MUST have a string field named "Type" whose value MUST be one of "Pass", "Succeed", "Fail", "Task", "Choice", "Wait", "Parallel", or "Map". A State whose "Type" field's value is "Pass" is a "Pass State". A State whose "Type" field's value is "Succeed" is a "Succeed State". A State whose "Type" field's value is "Fail" is a "Fail State". A State whose "Type" field's value is "Task" is a "Task State". A State whose "Type" field's value is "Choice" is a "Choice State". A State whose "Type" field's value is "Wait" is a "Wait State". A State whose "Type" field's value is "Parallel" is a "Parallel State". A State whose "Type" field's value is "Map" is a "Map State". A State MAY have a string field named "Comment". Each of a Pass State, a Task State, a Wait State, a Parallel State, and a Map State MAY have a boolean field named "End". Each of a Pass State, a Task State, a Parallel State, and a Map State MAY have a field named "Parameters". A State whose "End" field's value is true is a "Terminal State". Each of a Succeed State and a Fail State is a "Terminal State". A State which is not a Terminal State or a Choice State MUST have a string field named "Next". A Terminal State MUST NOT have a field named "Next". A State MAY have a field named "InputPath". Each of a Pass State, a Task State, a Parallel State, and a Map State MAY have a nullable-referencePath field named "ResultPath". Each of a Task State, a Parallel State, and a Map State MAY have a field named "ResultSelector". A State MAY have a field named "OutputPath". A Pass State MAY have a field named "Result". A Fail State MUST NOT have a field named "InputPath". A Fail State MUST NOT have a field named "OutputPath". A Fail State MAY have a string field named "Cause". A Fail State MAY have a field named "CausePath". A Fail State MAY have only one of "Cause" and "CausePath". A Fail State MAY have a string field named "Error". A Fail State MAY have a field named "ErrorPath". A Fail State MAY have only one of "Error" and "ErrorPath". Each of a Task State, a Parallel State, and a Map State MAY have an object-array field named "Retry"; each element is a "Retrier". A Task State MUST have a URI field named "Resource". A Task State MAY have a positive-integer field named "TimeoutSeconds" whose value MUST be less than 99999999. A Task State MAY have a positive-integer field named "HeartbeatSeconds" whose value MUST be less than 99999999. A Task State MAY have a referencePath field named "TimeoutSecondsPath". A Task State MAY have a referencePath field named "HeartbeatSecondsPath". A Task State MAY have only one of "TimeoutSeconds" and "TimeoutSecondsPath". A Task State MAY have only one of "HeartbeatSeconds" and "HeartbeatSecondsPath". A Task State MAY have an object field named "Credentials". A Retrier MUST have a nonempty-string-array field named "ErrorEquals". A Retrier MAY have an positive-integer field named "IntervalSeconds". A Retrier MAY have a nonnegative-integer field named "MaxAttempts" whose value MUST be less than 99999999. A Retrier MAY have a float field named "BackoffRate" whose value MUST be greater than or equal to 1.0. A Retrier MAY have a positive-integer field named "MaxDelaySeconds". A Retrier MAY have a string field named "JitterStrategy" whose value MUST be one of "FULL" or "NONE". Each of a Task State, a Parallel State, and a Map State MAY have an object-array field named "Catch"; each element is a "Catcher". A Catcher MUST have an nonempty-string-array field named "ErrorEquals". A Catcher MUST have a string field named "Next". A Catcher MAY have a nullable-referencePath field named "ResultPath". A Choice State MUST have a nonempty-object-array field named "Choices"; each element is a "Choice Rule". A Choice State MUST NOT have a field named "Next". A Choice State MUST NOT have a field named "End". A Choice State MAY have a string field named "Default". A Choice Rule MAY have a nonempty-object-array field named "And"; each element is a "Nested Rule". A Choice Rule MAY have a nonempty-object-array field named "Or"; each element is a "Nested Rule". A Choice Rule MAY have an object field named "Not"; its value is a "Nested Rule". A Choice Rule MUST have a string field named "Next". A Choice Rule with an "And" field is a "Boolean". A Choice Rule with an "Or" field is a "Boolean". A Choice Rule with a "Not" field is a "Boolean". A Choice Rule MAY have a field named "Variable". A Choice Rule with a "Variable" field is a "Comparison". A Choice Rule MAY have a string field named "Comment". A Comparison MUST have a field named one of "StringEquals", "StringLessThan", "StringGreaterThan", "StringLessThanEquals", "StringGreaterThanEquals", "NumericEquals", "NumericLessThan", "NumericGreaterThan", "NumericLessThanEquals", "NumericGreaterThanEquals", "BooleanEquals", "TimestampEquals", "TimestampLessThan", "TimestampGreaterThan", "TimestampLessThanEquals", "TimestampGreaterThanEquals", "StringEqualsPath", "StringLessThanPath", "StringGreaterThanPath", "StringLessThanEqualsPath", "StringGreaterThanEqualsPath", "NumericEqualsPath", "NumericLessThanPath", "NumericGreaterThanPath", "NumericLessThanEqualsPath", "NumericGreaterThanEqualsPath", "BooleanEqualsPath", "TimestampEqualsPath", "TimestampLessThanPath", "TimestampGreaterThanPath", "TimestampLessThanEqualsPath", "TimestampGreaterThanEqualsPath", "IsNull", "IsPresent", "IsNumeric", "IsString", "IsBoolean", "IsTimestamp", or "StringMatches". A Comparison MAY have a string field named "StringEquals". A Comparison MAY have a string field named "StringLessThan". A Comparison MAY have a string field named "StringGreaterThan". A Comparison MAY have a string field named "StringLessThanEquals". A Comparison MAY have a string field named "StringGreaterThanEquals". A Comparison MAY have a numeric field named "NumericEquals". A Comparison MAY have a numeric field named "NumericLessThan". A Comparison MAY have a numeric field named "NumericGreaterThan". A Comparison MAY have a numeric field named "NumericLessThanEquals". A Comparison MAY have a numeric field named "NumericGreaterThanEquals". A Comparison MAY have a boolean field named "BooleanEquals". A Comparison MAY have a timestamp field named "TimestampEquals". A Comparison MAY have a timestamp field named "TimestampLessThan". A Comparison MAY have a timestamp field named "TimestampGreaterThan". A Comparison MAY have a timestamp field named "TimestampLessThanEquals". A Comparison MAY have a timestamp field named "TimestampGreaterThanEquals". A Comparison MAY have a boolean field named "IsNull". A Comparison MAY have a boolean field named "IsPresent". A Comparison MAY have a boolean field named "IsNumeric". A Comparison MAY have a boolean field named "IsString". A Comparison MAY have a boolean field named "IsBoolean". A Comparison MAY have a boolean field named "IsTimestamp". A Comparison MAY have a string field named "StringMatches". A Comparison MAY have a referencePath field named "StringEqualsPath". A Comparison MAY have a referencePath field named "StringLessThanPath". A Comparison MAY have a referencePath field named "StringGreaterThanPath". A Comparison MAY have a referencePath field named "StringLessThanEqualsPath". A Comparison MAY have a referencePath field named "StringGreaterThanEqualsPath". A Comparison MAY have a referencePath field named "NumericEqualsPath". A Comparison MAY have a referencePath field named "NumericLessThanPath". A Comparison MAY have a referencePath field named "NumericGreaterThanPath". A Comparison MAY have a referencePath field named "NumericLessThanEqualsPath". A Comparison MAY have a referencePath field named "NumericGreaterThanEqualsPath". A Comparison MAY have a referencePath field named "BooleanEqualsPath". A Comparison MAY have a referencePath field named "TimestampEqualsPath". A Comparison MAY have a referencePath field named "TimestampLessThanPath". A Comparison MAY have a referencePath field named "TimestampGreaterThanPath". A Comparison MAY have a referencePath field named "TimestampLessThanEqualsPath". A Comparison MAY have a referencePath field named "TimestampGreaterThanEqualsPath". A Comparison MUST NOT have a field named "And". A Comparison MUST NOT have a field named "Or". A Comparison MUST NOT have a field named "Not". A Nested Rule MAY have a nonempty-object-array field named "And"; each element is a "Nested Rule". A Nested Rule MAY have a nonempty-object-array field named "Or"; each element is a "Nested Rule". A Nested Rule MAY have an object field named "Not"; its value is a "Nested Rule". A Nested Rule with an "And" field is a "Nested Boolean". A Nested Rule with an "Or" field is a "Nested Boolean". A Nested Rule with a "Not" field is a "Nested Boolean". A Nested Rule MUST NOT have a field named "Next". A Nested Rule MAY have a field named "Variable". A Nested Rule with a "Variable" field is a "Nested Comparison". A Nested Comparison MAY have a string field named "StringEquals". A Nested Comparison MAY have a string field named "StringLessThan". A Nested Comparison MAY have a string field named "StringGreaterThan". A Nested Comparison MAY have a string field named "StringLessThanEquals". A Nested Comparison MAY have a string field named "StringGreaterThanEquals". A Nested Comparison MAY have a numeric field named "NumericEquals". A Nested Comparison MAY have a numeric field named "NumericLessThan". A Nested Comparison MAY have a numeric field named "NumericGreaterThan". A Nested Comparison MAY have a numeric field named "NumericLessThanEquals". A Nested Comparison MAY have a numeric field named "NumericGreaterThanEquals". A Nested Comparison MAY have a boolean field named "BooleanEquals". A Nested Comparison MAY have a timestamp field named "TimestampEquals". A Nested Comparison MAY have a timestamp field named "TimestampLessThan". A Nested Comparison MAY have a timestamp field named "TimestampGreaterThan". A Nested Comparison MAY have a timestamp field named "TimestampLessThanEquals". A Nested Comparison MAY have a timestamp field named "TimestampGreaterThanEquals". A Nested Comparison MAY have a boolean field named "IsNull". A Nested Comparison MAY have a boolean field named "IsPresent". A Nested Comparison MAY have a boolean field named "IsNumeric". A Nested Comparison MAY have a boolean field named "IsString". A Nested Comparison MAY have a boolean field named "IsBoolean". A Nested Comparison MAY have a boolean field named "IsTimestamp". A Nested Comparison MAY have a string field named "StringMatches". A Nested Comparison MAY have a referencePath field named "StringEqualsPath". A Nested Comparison MAY have a referencePath field named "StringLessThanPath". A Nested Comparison MAY have a referencePath field named "StringGreaterThanPath". A Nested Comparison MAY have a referencePath field named "StringLessThanEqualsPath". A Nested Comparison MAY have a referencePath field named "StringGreaterThanEqualsPath". A Nested Comparison MAY have a referencePath field named "NumericEqualsPath". A Nested Comparison MAY have a referencePath field named "NumericLessThanPath". A Nested Comparison MAY have a referencePath field named "NumericGreaterThanPath". A Nested Comparison MAY have a referencePath field named "NumericLessThanEqualsPath". A Nested Comparison MAY have a referencePath field named "NumericGreaterThanEqualsPath". A Nested Comparison MAY have a referencePath field named "BooleanEqualsPath". A Nested Comparison MAY have a referencePath field named "TimestampEqualsPath". A Nested Comparison MAY have a referencePath field named "TimestampLessThanPath". A Nested Comparison MAY have a referencePath field named "TimestampGreaterThanPath". A Nested Comparison MAY have a referencePath field named "TimestampLessThanEqualsPath". A Nested Comparison MAY have a referencePath field named "TimestampGreaterThanEqualsPath". A Nested Comparison MUST NOT have a field named "And". A Nested Comparison MUST NOT have a field named "Or". A Nested Comparison MUST NOT have a field named "Not". A Wait State MAY have a positive-integer field named "Seconds". A Wait State MAY have a referencePath field named "SecondsPath". A Wait State MAY have a timestamp field named "Timestamp". A Wait State MAY have a referencePath field named "TimestampPath". A Wait State MUST have only one of "Seconds", "SecondsPath", "Timestamp", and "TimestampPath". A Wait State MUST have a field named one of "Seconds", "SecondsPath", "Timestamp", or "TimestampPath". A Parallel State MUST have an object-array field named "Branches"; each element is a "Branch". A Map State MAY have an object field named "Iterator"; its value is a "ItemProcessor". A Map State MAY have an object field named "ItemProcessor"; its value is a "ItemProcessor". A Map State MUST have only one of "Iterator" and "ItemProcessor". A Map State MAY have a field named "ItemsPath". A Map State MAY have an object field named "ItemSelector". A Map State MAY have only one of "ItemSelector" and "Parameters". A Map State MAY have a numeric field named "MaxConcurrency". A Branch MUST have an object field named "States"; each field is a "State". A Branch MUST have a string field named "StartAt". A Branch MAY have a string field named "Comment". A Catcher MAY have a string field named "Comment". A ItemProcessor MAY have an object field named "ProcessorConfig". A ItemProcessor MAY have a string field named "Comment". A ItemProcessor MUST have a string field named "StartAt". A ItemProcessor MUST have an object field named "States"; each field is a "State".