/// <summary>
        /// Parse a COR state machine from a MIF state machine
        /// </summary>
        internal static MohawkCollege.EHR.gpmr.COR.StateMachine Parse(MohawkCollege.EHR.HL7v3.MIF.MIF20.StateMachine StateMachine)
        {
            MohawkCollege.EHR.gpmr.COR.StateMachine retVal = new MohawkCollege.EHR.gpmr.COR.StateMachine();

            retVal.Transitions = new List <MohawkCollege.EHR.gpmr.COR.StateTransition>();
            Dictionary <String, MohawkCollege.EHR.gpmr.COR.State> tStates = new Dictionary <String, MohawkCollege.EHR.gpmr.COR.State>();

            retVal.States = new Dictionary <string, MohawkCollege.EHR.gpmr.COR.State>();

            // Sort each state
            StateMachine.SubState.Sort(new MohawkCollege.EHR.HL7v3.MIF.MIF20.State.Comparator());

            // Parse States
            foreach (MohawkCollege.EHR.HL7v3.MIF.MIF20.State st in StateMachine.SubState)
            {
                MohawkCollege.EHR.gpmr.COR.State nst = Parse(st);
                tStates.Add(nst.Name, nst);
            }

            // Sort parent/child states
            foreach (KeyValuePair <String, MohawkCollege.EHR.gpmr.COR.State> kv in tStates)
            {
                if (kv.Value.ParentStateName == null) // No parent? Its at the root
                {
                    retVal.States.Add(kv.Key, kv.Value);
                }
                else
                {
                    if (tStates[kv.Value.ParentStateName].ChildStates == null)
                    {
                        tStates[kv.Value.ParentStateName].ChildStates = new Dictionary <string, State>();
                    }
                    tStates[kv.Value.ParentStateName].ChildStates.Add(kv.Key, kv.Value);
                }
            }

            // Parse Transitions
            foreach (MohawkCollege.EHR.HL7v3.MIF.MIF20.Transition tx in StateMachine.Transition)
            {
                retVal.Transitions.Add(Parse(tx, tStates));
            }

            return(retVal);
        }
        /// <summary>
        /// Parse a COR state machine from a MIF state machine
        /// </summary>
        internal static MohawkCollege.EHR.gpmr.COR.StateMachine Parse(MohawkCollege.EHR.HL7v3.MIF.MIF20.StateMachine StateMachine)
        {
            MohawkCollege.EHR.gpmr.COR.StateMachine retVal = new MohawkCollege.EHR.gpmr.COR.StateMachine();

            retVal.Transitions = new List<MohawkCollege.EHR.gpmr.COR.StateTransition>();
            Dictionary<String, MohawkCollege.EHR.gpmr.COR.State> tStates = new Dictionary<String, MohawkCollege.EHR.gpmr.COR.State>();
            retVal.States = new Dictionary<string, MohawkCollege.EHR.gpmr.COR.State>();

            // Sort each state
            StateMachine.SubState.Sort(new MohawkCollege.EHR.HL7v3.MIF.MIF20.State.Comparator());

            // Parse States
            foreach (MohawkCollege.EHR.HL7v3.MIF.MIF20.State st in StateMachine.SubState)
            {
                MohawkCollege.EHR.gpmr.COR.State nst = Parse(st);
                tStates.Add(nst.Name, nst);
            }

            // Sort parent/child states
            foreach (KeyValuePair<String, MohawkCollege.EHR.gpmr.COR.State> kv in tStates)
            {
                if (kv.Value.ParentStateName == null) // No parent? Its at the root
                    retVal.States.Add(kv.Key, kv.Value);
                else
                {
                    if (tStates[kv.Value.ParentStateName].ChildStates == null) tStates[kv.Value.ParentStateName].ChildStates = new Dictionary<string, State>();
                    tStates[kv.Value.ParentStateName].ChildStates.Add(kv.Key, kv.Value);
                }
            }

            // Parse Transitions
            foreach (MohawkCollege.EHR.HL7v3.MIF.MIF20.Transition tx in StateMachine.Transition)
                retVal.Transitions.Add(Parse(tx, tStates));

            return retVal;
        }