// End-state may have less events then the termination state
        public bool CompareTerminationStateToEndState(
            RowRecogNFAStateEntry terminationState,
            RowRecogNFAStateEntry endState)
        {
            if (terminationState.MatchBeginEventSeqNo != endState.MatchBeginEventSeqNo) {
                return false;
            }

            foreach (var entry in variableStreams) {
                var stream = entry.Value.First;
                var multi = entry.Value.Second;
                if (multi) {
                    var termStreamEvents = RowRecogNFAViewUtil.GetMultimatchArray(
                        multimatchStreamNumToVariable,
                        terminationState,
                        stream);
                    var endStreamEvents = RowRecogNFAViewUtil.GetMultimatchArray(
                        multimatchStreamNumToVariable,
                        endState,
                        stream);
                    if (endStreamEvents != null) {
                        if (termStreamEvents == null) {
                            return false;
                        }

                        for (var i = 0; i < endStreamEvents.Length; i++) {
                            if (termStreamEvents.Length > i &&
                                !EventBeanUtility.EventsAreEqualsAllowNull(
                                    endStreamEvents[i],
                                    termStreamEvents[i])) {
                                return false;
                            }
                        }
                    }
                }
                else {
                    var termStreamEvent = terminationState.EventsPerStream[stream];
                    var endStreamEvent = endState.EventsPerStream[stream];
                    if (!EventBeanUtility.EventsAreEqualsAllowNull(endStreamEvent, termStreamEvent)) {
                        return false;
                    }
                }
            }

            return true;
        }