package org.eclipse.qvtd.xtext.qvtrelation.parser.antlr.internal;

import org.eclipse.xtext.*;
import org.eclipse.xtext.parser.*;
import org.eclipse.xtext.parser.impl.*;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.parser.antlr.AbstractInternalAntlrParser;
import org.eclipse.xtext.parser.antlr.XtextTokenStream;
import org.eclipse.xtext.parser.antlr.XtextTokenStream.HiddenTokens;
import org.eclipse.xtext.parser.antlr.AntlrDatatypeRuleToken;
import org.eclipse.qvtd.xtext.qvtrelation.services.QVTrelationGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
/*******************************************************************************
 * Copyright (c) 2011, 2020 Willink Transformations and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v20.html
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     E.D.Willink - initial API and implementation
 *******************************************************************************/
@SuppressWarnings("all")
public class InternalQVTrelationParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_SINGLE_QUOTED_STRING", "RULE_UNQUOTED_STRING", "RULE_INT", "RULE_SIMPLE_ID", "RULE_ESCAPED_ID", "RULE_ESCAPED_CHARACTER", "RULE_LETTER_CHARACTER", "RULE_DOUBLE_QUOTED_STRING", "RULE_ML_SINGLE_QUOTED_STRING", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "':'", "'='", "'{'", "'}'", "';'", "','", "'++'", "'checkonly'", "'enforce'", "'replace'", "'domain'", "'implementedby'", "'default_values'", "'key'", "'opposite'", "'('", "')'", "'dependsOn'", "'iterates'", "'primitive'", "'transient'", "'query'", "'top'", "'abstract'", "'relation'", "'overrides'", "'::'", "'transformation'", "'extends'", "'import'", "'*'", "'when'", "'where'", "'input'", "'library'", "'output'", "'target'", "'via'", "'static'", "'definition'", "'attribute'", "'derived'", "'!derived'", "'id'", "'!id'", "'ordered'", "'!ordered'", "'readonly'", "'!readonly'", "'!transient'", "'unique'", "'!unique'", "'unsettable'", "'!unsettable'", "'volatile'", "'!volatile'", "'initial'", "'derivation'", "'datatype'", "'serializable'", "'!serializable'", "'enum'", "'literal'", "'operation'", "'throws'", "'body'", "'property'", "'#'", "'composes'", "'!composes'", "'resolve'", "'!resolve'", "'class'", "'interface'", "'-'", "'not'", "'not2'", "'/'", "'+'", "'>'", "'<'", "'>='", "'<='", "'<>'", "'and'", "'and2'", "'implies'", "'implies2'", "'or'", "'or2'", "'xor'", "'xor2'", "'.'", "'->'", "'?.'", "'?->'", "'Map'", "'Tuple'", "'Boolean'", "'Integer'", "'Real'", "'String'", "'UnlimitedNatural'", "'OclAny'", "'OclInvalid'", "'OclVoid'", "'Set'", "'Bag'", "'Sequence'", "'Collection'", "'OrderedSet'", "'..'", "'Lambda'", "'<-'", "'true'", "'false'", "'invalid'", "'null'", "'@'", "'pre'", "'['", "']'", "'in'", "'|'", "'if'", "'then'", "'else'", "'endif'", "'elseif'", "'let'", "'self'", "'|?'", "'|1'", "'?'", "'&&'"
    };
    public static final int T__144=144;
    public static final int T__143=143;
    public static final int T__146=146;
    public static final int T__50=50;
    public static final int T__145=145;
    public static final int T__140=140;
    public static final int T__142=142;
    public static final int T__141=141;
    public static final int T__59=59;
    public static final int T__55=55;
    public static final int T__56=56;
    public static final int T__57=57;
    public static final int T__58=58;
    public static final int T__51=51;
    public static final int T__137=137;
    public static final int T__52=52;
    public static final int T__136=136;
    public static final int T__53=53;
    public static final int T__139=139;
    public static final int T__54=54;
    public static final int T__138=138;
    public static final int T__133=133;
    public static final int T__132=132;
    public static final int T__60=60;
    public static final int T__135=135;
    public static final int T__61=61;
    public static final int T__134=134;
    public static final int T__131=131;
    public static final int T__130=130;
    public static final int RULE_INT=6;
    public static final int T__66=66;
    public static final int RULE_ML_COMMENT=13;
    public static final int T__67=67;
    public static final int T__129=129;
    public static final int T__68=68;
    public static final int T__69=69;
    public static final int T__62=62;
    public static final int T__126=126;
    public static final int T__63=63;
    public static final int T__125=125;
    public static final int T__64=64;
    public static final int T__128=128;
    public static final int T__65=65;
    public static final int T__127=127;
    public static final int T__37=37;
    public static final int T__38=38;
    public static final int T__39=39;
    public static final int T__33=33;
    public static final int T__34=34;
    public static final int T__35=35;
    public static final int T__36=36;
    public static final int T__30=30;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__152=152;
    public static final int RULE_SINGLE_QUOTED_STRING=4;
    public static final int T__48=48;
    public static final int T__49=49;
    public static final int RULE_DOUBLE_QUOTED_STRING=11;
    public static final int T__44=44;
    public static final int T__45=45;
    public static final int T__46=46;
    public static final int T__47=47;
    public static final int RULE_ESCAPED_ID=8;
    public static final int T__40=40;
    public static final int T__148=148;
    public static final int T__41=41;
    public static final int T__147=147;
    public static final int T__42=42;
    public static final int T__43=43;
    public static final int T__149=149;
    public static final int T__91=91;
    public static final int T__100=100;
    public static final int T__92=92;
    public static final int T__93=93;
    public static final int T__102=102;
    public static final int T__94=94;
    public static final int T__101=101;
    public static final int T__90=90;
    public static final int RULE_LETTER_CHARACTER=10;
    public static final int T__19=19;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__99=99;
    public static final int RULE_ESCAPED_CHARACTER=9;
    public static final int T__95=95;
    public static final int RULE_ML_SINGLE_QUOTED_STRING=12;
    public static final int T__96=96;
    public static final int T__97=97;
    public static final int T__98=98;
    public static final int T__26=26;
    public static final int T__27=27;
    public static final int T__28=28;
    public static final int T__29=29;
    public static final int T__22=22;
    public static final int T__23=23;
    public static final int T__24=24;
    public static final int T__25=25;
    public static final int T__20=20;
    public static final int T__21=21;
    public static final int T__122=122;
    public static final int T__70=70;
    public static final int T__121=121;
    public static final int T__71=71;
    public static final int T__124=124;
    public static final int T__72=72;
    public static final int T__123=123;
    public static final int T__120=120;
    public static final int RULE_UNQUOTED_STRING=5;
    public static final int RULE_SL_COMMENT=14;
    public static final int T__77=77;
    public static final int T__119=119;
    public static final int T__78=78;
    public static final int T__118=118;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int T__115=115;
    public static final int EOF=-1;
    public static final int T__74=74;
    public static final int T__114=114;
    public static final int T__75=75;
    public static final int T__117=117;
    public static final int T__76=76;
    public static final int T__116=116;
    public static final int T__80=80;
    public static final int T__111=111;
    public static final int T__81=81;
    public static final int T__110=110;
    public static final int T__82=82;
    public static final int T__113=113;
    public static final int RULE_SIMPLE_ID=7;
    public static final int T__83=83;
    public static final int T__112=112;
    public static final int RULE_WS=15;
    public static final int RULE_ANY_OTHER=16;
    public static final int T__88=88;
    public static final int T__108=108;
    public static final int T__89=89;
    public static final int T__107=107;
    public static final int T__109=109;
    public static final int T__84=84;
    public static final int T__104=104;
    public static final int T__85=85;
    public static final int T__103=103;
    public static final int T__86=86;
    public static final int T__106=106;
    public static final int T__87=87;
    public static final int T__105=105;

    // delegates
    // delegators


        public InternalQVTrelationParser(TokenStream input) {
            this(input, new RecognizerSharedState());
        }
        public InternalQVTrelationParser(TokenStream input, RecognizerSharedState state) {
            super(input, state);

        }


    public String[] getTokenNames() { return InternalQVTrelationParser.tokenNames; }
    public String getGrammarFileName() { return "InternalQVTrelation.g"; }



    /*
      This grammar contains a lot of empty actions to work around a bug in ANTLR.
      Otherwise the ANTLR tool will create synpreds that cannot be compiled in some rare cases.
    */

     	private QVTrelationGrammarAccess grammarAccess;

        public InternalQVTrelationParser(TokenStream input, QVTrelationGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }

        @Override
        protected String getFirstRuleName() {
        	return "TopLevelCS";
       	}

       	@Override
       	protected QVTrelationGrammarAccess getGrammarAccess() {
       		return grammarAccess;
       	}




    // $ANTLR start "entryRuleTopLevelCS"
    // InternalQVTrelation.g:79:1: entryRuleTopLevelCS returns [EObject current=null] : iv_ruleTopLevelCS= ruleTopLevelCS EOF ;
    public final EObject entryRuleTopLevelCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTopLevelCS = null;


        try {
            // InternalQVTrelation.g:79:51: (iv_ruleTopLevelCS= ruleTopLevelCS EOF )
            // InternalQVTrelation.g:80:2: iv_ruleTopLevelCS= ruleTopLevelCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTopLevelCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTopLevelCS=ruleTopLevelCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTopLevelCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTopLevelCS"


    // $ANTLR start "ruleTopLevelCS"
    // InternalQVTrelation.g:86:1: ruleTopLevelCS returns [EObject current=null] : ( ( (lv_ownedImports_0_0= ruleUnitCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* ) ;
    public final EObject ruleTopLevelCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedImports_0_0 = null;

        EObject lv_ownedPackages_1_0 = null;

        EObject lv_ownedTransformations_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:92:2: ( ( ( (lv_ownedImports_0_0= ruleUnitCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* ) )
            // InternalQVTrelation.g:93:2: ( ( (lv_ownedImports_0_0= ruleUnitCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* )
            {
            // InternalQVTrelation.g:93:2: ( ( (lv_ownedImports_0_0= ruleUnitCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )* )
            // InternalQVTrelation.g:94:3: ( (lv_ownedImports_0_0= ruleUnitCS ) )* ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )*
            {
            // InternalQVTrelation.g:94:3: ( (lv_ownedImports_0_0= ruleUnitCS ) )*
            loop1:
            do {
                int alt1=2;
                int LA1_0 = input.LA(1);

                if ( (LA1_0==47) ) {
                    alt1=1;
                }


                switch (alt1) {
            	case 1 :
            	    // InternalQVTrelation.g:95:4: (lv_ownedImports_0_0= ruleUnitCS )
            	    {
            	    // InternalQVTrelation.g:95:4: (lv_ownedImports_0_0= ruleUnitCS )
            	    // InternalQVTrelation.g:96:5: lv_ownedImports_0_0= ruleUnitCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedImportsUnitCSParserRuleCall_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_3);
            	    lv_ownedImports_0_0=ruleUnitCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedImports",
            	      						lv_ownedImports_0_0,
            	      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnitCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop1;
                }
            } while (true);

            // InternalQVTrelation.g:113:3: ( ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) ) | ( (lv_ownedTransformations_2_0= ruleTransformationCS ) ) )*
            loop2:
            do {
                int alt2=3;
                int LA2_0 = input.LA(1);

                if ( (LA2_0==17) ) {
                    alt2=1;
                }
                else if ( (LA2_0==45) ) {
                    alt2=2;
                }


                switch (alt2) {
            	case 1 :
            	    // InternalQVTrelation.g:114:4: ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) )
            	    {
            	    // InternalQVTrelation.g:114:4: ( (lv_ownedPackages_1_0= ruleQualifiedPackageCS ) )
            	    // InternalQVTrelation.g:115:5: (lv_ownedPackages_1_0= ruleQualifiedPackageCS )
            	    {
            	    // InternalQVTrelation.g:115:5: (lv_ownedPackages_1_0= ruleQualifiedPackageCS )
            	    // InternalQVTrelation.g:116:6: lv_ownedPackages_1_0= ruleQualifiedPackageCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedPackagesQualifiedPackageCSParserRuleCall_1_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_ownedPackages_1_0=ruleQualifiedPackageCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedPackages",
            	      							lv_ownedPackages_1_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.QualifiedPackageCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalQVTrelation.g:134:4: ( (lv_ownedTransformations_2_0= ruleTransformationCS ) )
            	    {
            	    // InternalQVTrelation.g:134:4: ( (lv_ownedTransformations_2_0= ruleTransformationCS ) )
            	    // InternalQVTrelation.g:135:5: (lv_ownedTransformations_2_0= ruleTransformationCS )
            	    {
            	    // InternalQVTrelation.g:135:5: (lv_ownedTransformations_2_0= ruleTransformationCS )
            	    // InternalQVTrelation.g:136:6: lv_ownedTransformations_2_0= ruleTransformationCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTopLevelCSAccess().getOwnedTransformationsTransformationCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_4);
            	    lv_ownedTransformations_2_0=ruleTransformationCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTopLevelCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedTransformations",
            	      							lv_ownedTransformations_2_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TransformationCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop2;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTopLevelCS"


    // $ANTLR start "entryRuleQualifiedPackageCS"
    // InternalQVTrelation.g:158:1: entryRuleQualifiedPackageCS returns [EObject current=null] : iv_ruleQualifiedPackageCS= ruleQualifiedPackageCS EOF ;
    public final EObject entryRuleQualifiedPackageCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQualifiedPackageCS = null;


        try {
            // InternalQVTrelation.g:158:59: (iv_ruleQualifiedPackageCS= ruleQualifiedPackageCS EOF )
            // InternalQVTrelation.g:159:2: iv_ruleQualifiedPackageCS= ruleQualifiedPackageCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQualifiedPackageCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQualifiedPackageCS=ruleQualifiedPackageCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQualifiedPackageCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQualifiedPackageCS"


    // $ANTLR start "ruleQualifiedPackageCS"
    // InternalQVTrelation.g:165:1: ruleQualifiedPackageCS returns [EObject current=null] : (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) ) ;
    public final EObject ruleQualifiedPackageCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        EObject lv_ownedPathName_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        AntlrDatatypeRuleToken lv_nsPrefix_4_0 = null;

        AntlrDatatypeRuleToken lv_nsURI_6_0 = null;

        EObject lv_ownedPackages_8_0 = null;

        EObject lv_ownedClasses_9_1 = null;

        EObject lv_ownedClasses_9_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:171:2: ( (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) ) )
            // InternalQVTrelation.g:172:2: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) )
            {
            // InternalQVTrelation.g:172:2: (otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' ) )
            // InternalQVTrelation.g:173:3: otherlv_0= 'package' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )? (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )? ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' )
            {
            otherlv_0=(Token)match(input,17,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getQualifiedPackageCSAccess().getPackageKeyword_0());

            }
            // InternalQVTrelation.g:177:3: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?
            int alt3=2;
            alt3 = dfa3.predict(input);
            switch (alt3) {
                case 1 :
                    // InternalQVTrelation.g:178:4: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    {
                    // InternalQVTrelation.g:178:4: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    // InternalQVTrelation.g:179:5: lv_ownedPathName_1_0= ruleScopeNameCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedPathNameScopeNameCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_5);
                    lv_ownedPathName_1_0=ruleScopeNameCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedPathName",
                      						lv_ownedPathName_1_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ScopeNameCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:196:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:197:4: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:197:4: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:198:5: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_6);
            lv_name_2_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:215:3: (otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) ) )?
            int alt4=2;
            int LA4_0 = input.LA(1);

            if ( (LA4_0==18) ) {
                alt4=1;
            }
            switch (alt4) {
                case 1 :
                    // InternalQVTrelation.g:216:4: otherlv_3= ':' ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) )
                    {
                    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getQualifiedPackageCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTrelation.g:220:4: ( (lv_nsPrefix_4_0= ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:221:5: (lv_nsPrefix_4_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:221:5: (lv_nsPrefix_4_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:222:6: lv_nsPrefix_4_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getNsPrefixUnrestrictedNameParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_7);
                    lv_nsPrefix_4_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                      						}
                      						set(
                      							current,
                      							"nsPrefix",
                      							lv_nsPrefix_4_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:240:3: (otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) ) )?
            int alt5=2;
            int LA5_0 = input.LA(1);

            if ( (LA5_0==19) ) {
                alt5=1;
            }
            switch (alt5) {
                case 1 :
                    // InternalQVTrelation.g:241:4: otherlv_5= '=' ( (lv_nsURI_6_0= ruleURI ) )
                    {
                    otherlv_5=(Token)match(input,19,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getQualifiedPackageCSAccess().getEqualsSignKeyword_4_0());

                    }
                    // InternalQVTrelation.g:245:4: ( (lv_nsURI_6_0= ruleURI ) )
                    // InternalQVTrelation.g:246:5: (lv_nsURI_6_0= ruleURI )
                    {
                    // InternalQVTrelation.g:246:5: (lv_nsURI_6_0= ruleURI )
                    // InternalQVTrelation.g:247:6: lv_nsURI_6_0= ruleURI
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getNsURIURIParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_9);
                    lv_nsURI_6_0=ruleURI();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                      						}
                      						set(
                      							current,
                      							"nsURI",
                      							lv_nsURI_6_0,
                      							"org.eclipse.ocl.xtext.base.Base.URI");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:265:3: ( (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' ) | otherlv_11= ';' )
            int alt8=2;
            int LA8_0 = input.LA(1);

            if ( (LA8_0==20) ) {
                alt8=1;
            }
            else if ( (LA8_0==22) ) {
                alt8=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 8, 0, input);

                throw nvae;
            }
            switch (alt8) {
                case 1 :
                    // InternalQVTrelation.g:266:4: (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' )
                    {
                    // InternalQVTrelation.g:266:4: (otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}' )
                    // InternalQVTrelation.g:267:5: otherlv_7= '{' ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )* otherlv_10= '}'
                    {
                    otherlv_7=(Token)match(input,20,FollowSets000.FOLLOW_10); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_7, grammarAccess.getQualifiedPackageCSAccess().getLeftCurlyBracketKeyword_5_0_0());

                    }
                    // InternalQVTrelation.g:271:5: ( ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) ) | ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) ) )*
                    loop7:
                    do {
                        int alt7=3;
                        int LA7_0 = input.LA(1);

                        if ( (LA7_0==17) ) {
                            alt7=1;
                        }
                        else if ( (LA7_0==37||LA7_0==41||LA7_0==45||LA7_0==76||LA7_0==79||LA7_0==90) ) {
                            alt7=2;
                        }


                        switch (alt7) {
                    	case 1 :
                    	    // InternalQVTrelation.g:272:6: ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) )
                    	    {
                    	    // InternalQVTrelation.g:272:6: ( (lv_ownedPackages_8_0= ruleQualifiedPackageCS ) )
                    	    // InternalQVTrelation.g:273:7: (lv_ownedPackages_8_0= ruleQualifiedPackageCS )
                    	    {
                    	    // InternalQVTrelation.g:273:7: (lv_ownedPackages_8_0= ruleQualifiedPackageCS )
                    	    // InternalQVTrelation.g:274:8: lv_ownedPackages_8_0= ruleQualifiedPackageCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedPackagesQualifiedPackageCSParserRuleCall_5_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_10);
                    	    lv_ownedPackages_8_0=ruleQualifiedPackageCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"ownedPackages",
                    	      									lv_ownedPackages_8_0,
                    	      									"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.QualifiedPackageCS");
                    	      								afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTrelation.g:292:6: ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) )
                    	    {
                    	    // InternalQVTrelation.g:292:6: ( ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) ) )
                    	    // InternalQVTrelation.g:293:7: ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) )
                    	    {
                    	    // InternalQVTrelation.g:293:7: ( (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS ) )
                    	    // InternalQVTrelation.g:294:8: (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS )
                    	    {
                    	    // InternalQVTrelation.g:294:8: (lv_ownedClasses_9_1= ruleClassCS | lv_ownedClasses_9_2= ruleTransformationCS )
                    	    int alt6=2;
                    	    int LA6_0 = input.LA(1);

                    	    if ( (LA6_0==37||LA6_0==41||LA6_0==76||LA6_0==79||LA6_0==90) ) {
                    	        alt6=1;
                    	    }
                    	    else if ( (LA6_0==45) ) {
                    	        alt6=2;
                    	    }
                    	    else {
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 6, 0, input);

                    	        throw nvae;
                    	    }
                    	    switch (alt6) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:295:9: lv_ownedClasses_9_1= ruleClassCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              									newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedClassesClassCSParserRuleCall_5_0_1_1_0_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_10);
                    	            lv_ownedClasses_9_1=ruleClassCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              									if (current==null) {
                    	              										current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                    	              									}
                    	              									add(
                    	              										current,
                    	              										"ownedClasses",
                    	              										lv_ownedClasses_9_1,
                    	              										"org.eclipse.qvtd.xtext.qvtbase.QVTbase.ClassCS");
                    	              									afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTrelation.g:311:9: lv_ownedClasses_9_2= ruleTransformationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              									newCompositeNode(grammarAccess.getQualifiedPackageCSAccess().getOwnedClassesTransformationCSParserRuleCall_5_0_1_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_10);
                    	            lv_ownedClasses_9_2=ruleTransformationCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              									if (current==null) {
                    	              										current = createModelElementForParent(grammarAccess.getQualifiedPackageCSRule());
                    	              									}
                    	              									add(
                    	              										current,
                    	              										"ownedClasses",
                    	              										lv_ownedClasses_9_2,
                    	              										"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TransformationCS");
                    	              									afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop7;
                        }
                    } while (true);

                    otherlv_10=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_10, grammarAccess.getQualifiedPackageCSAccess().getRightCurlyBracketKeyword_5_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:336:4: otherlv_11= ';'
                    {
                    otherlv_11=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getQualifiedPackageCSAccess().getSemicolonKeyword_5_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQualifiedPackageCS"


    // $ANTLR start "entryRuleCollectionTemplateCS"
    // InternalQVTrelation.g:345:1: entryRuleCollectionTemplateCS returns [EObject current=null] : iv_ruleCollectionTemplateCS= ruleCollectionTemplateCS EOF ;
    public final EObject entryRuleCollectionTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionTemplateCS = null;


        try {
            // InternalQVTrelation.g:345:61: (iv_ruleCollectionTemplateCS= ruleCollectionTemplateCS EOF )
            // InternalQVTrelation.g:346:2: iv_ruleCollectionTemplateCS= ruleCollectionTemplateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionTemplateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionTemplateCS=ruleCollectionTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCollectionTemplateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCollectionTemplateCS"


    // $ANTLR start "ruleCollectionTemplateCS"
    // InternalQVTrelation.g:352:1: ruleCollectionTemplateCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleCollectionTypeCS ) ) (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )? ) ;
    public final EObject ruleCollectionTemplateCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedMemberIdentifiers_4_1 = null;

        EObject lv_ownedMemberIdentifiers_4_2 = null;

        EObject lv_ownedMemberIdentifiers_6_1 = null;

        EObject lv_ownedMemberIdentifiers_6_2 = null;

        EObject lv_ownedRestIdentifier_8_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:358:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleCollectionTypeCS ) ) (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )? ) )
            // InternalQVTrelation.g:359:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleCollectionTypeCS ) ) (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )? )
            {
            // InternalQVTrelation.g:359:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleCollectionTypeCS ) ) (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )? )
            // InternalQVTrelation.g:360:3: ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleCollectionTypeCS ) ) (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )?
            {
            // InternalQVTrelation.g:360:3: ( (lv_name_0_0= ruleUnrestrictedName ) )?
            int alt9=2;
            int LA9_0 = input.LA(1);

            if ( ((LA9_0>=RULE_SIMPLE_ID && LA9_0<=RULE_ESCAPED_ID)||LA9_0==17||(LA9_0>=25 && LA9_0<=32)||(LA9_0>=35 && LA9_0<=43)||(LA9_0>=45 && LA9_0<=47)||(LA9_0>=49 && LA9_0<=59)||LA9_0==61||LA9_0==63||LA9_0==65||LA9_0==68||LA9_0==70||LA9_0==72||(LA9_0>=74 && LA9_0<=77)||(LA9_0>=79 && LA9_0<=84)||LA9_0==86||LA9_0==88||(LA9_0>=90 && LA9_0<=91)) ) {
                alt9=1;
            }
            switch (alt9) {
                case 1 :
                    // InternalQVTrelation.g:361:4: (lv_name_0_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:361:4: (lv_name_0_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:362:5: lv_name_0_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_name_0_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
                      					}
                      					set(
                      						current,
                      						"name",
                      						lv_name_0_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_12); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getCollectionTemplateCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:383:3: ( (lv_ownedType_2_0= ruleCollectionTypeCS ) )
            // InternalQVTrelation.g:384:4: (lv_ownedType_2_0= ruleCollectionTypeCS )
            {
            // InternalQVTrelation.g:384:4: (lv_ownedType_2_0= ruleCollectionTypeCS )
            // InternalQVTrelation.g:385:5: lv_ownedType_2_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_13);
            lv_ownedType_2_0=ruleCollectionTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:402:3: (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )?
            int alt14=2;
            alt14 = dfa14.predict(input);
            switch (alt14) {
                case 1 :
                    // InternalQVTrelation.g:403:4: otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}'
                    {
                    otherlv_3=(Token)match(input,20,FollowSets000.FOLLOW_14); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getCollectionTemplateCSAccess().getLeftCurlyBracketKeyword_3_0());

                    }
                    // InternalQVTrelation.g:407:4: ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )?
                    int alt13=2;
                    int LA13_0 = input.LA(1);

                    if ( ((LA13_0>=RULE_SIMPLE_ID && LA13_0<=RULE_ESCAPED_ID)||(LA13_0>=17 && LA13_0<=18)||(LA13_0>=25 && LA13_0<=32)||(LA13_0>=35 && LA13_0<=43)||(LA13_0>=45 && LA13_0<=47)||(LA13_0>=49 && LA13_0<=59)||LA13_0==61||LA13_0==63||LA13_0==65||LA13_0==68||LA13_0==70||LA13_0==72||(LA13_0>=74 && LA13_0<=77)||(LA13_0>=79 && LA13_0<=84)||LA13_0==86||LA13_0==88||(LA13_0>=90 && LA13_0<=91)) ) {
                        alt13=1;
                    }
                    switch (alt13) {
                        case 1 :
                            // InternalQVTrelation.g:408:5: ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) )
                            {
                            // InternalQVTrelation.g:408:5: ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) )
                            // InternalQVTrelation.g:409:6: ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) )
                            {
                            // InternalQVTrelation.g:409:6: ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) )
                            // InternalQVTrelation.g:410:7: (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS )
                            {
                            // InternalQVTrelation.g:410:7: (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS )
                            int alt10=2;
                            alt10 = dfa10.predict(input);
                            switch (alt10) {
                                case 1 :
                                    // InternalQVTrelation.g:411:8: lv_ownedMemberIdentifiers_4_1= ruleTemplateCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      								newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getOwnedMemberIdentifiersTemplateCSParserRuleCall_3_1_0_0_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_15);
                                    lv_ownedMemberIdentifiers_4_1=ruleTemplateCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								if (current==null) {
                                      									current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
                                      								}
                                      								add(
                                      									current,
                                      									"ownedMemberIdentifiers",
                                      									lv_ownedMemberIdentifiers_4_1,
                                      									"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TemplateCS");
                                      								afterParserOrEnumRuleCall();

                                    }

                                    }
                                    break;
                                case 2 :
                                    // InternalQVTrelation.g:427:8: lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      								newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getOwnedMemberIdentifiersElementTemplateCSParserRuleCall_3_1_0_0_1());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_15);
                                    lv_ownedMemberIdentifiers_4_2=ruleElementTemplateCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      								if (current==null) {
                                      									current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
                                      								}
                                      								add(
                                      									current,
                                      									"ownedMemberIdentifiers",
                                      									lv_ownedMemberIdentifiers_4_2,
                                      									"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ElementTemplateCS");
                                      								afterParserOrEnumRuleCall();

                                    }

                                    }
                                    break;

                            }


                            }


                            }

                            // InternalQVTrelation.g:445:5: (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )*
                            loop12:
                            do {
                                int alt12=2;
                                int LA12_0 = input.LA(1);

                                if ( (LA12_0==23) ) {
                                    alt12=1;
                                }


                                switch (alt12) {
                            	case 1 :
                            	    // InternalQVTrelation.g:446:6: otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) )
                            	    {
                            	    otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_16); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_5, grammarAccess.getCollectionTemplateCSAccess().getCommaKeyword_3_1_1_0());

                            	    }
                            	    // InternalQVTrelation.g:450:6: ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) )
                            	    // InternalQVTrelation.g:451:7: ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) )
                            	    {
                            	    // InternalQVTrelation.g:451:7: ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) )
                            	    // InternalQVTrelation.g:452:8: (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS )
                            	    {
                            	    // InternalQVTrelation.g:452:8: (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS )
                            	    int alt11=2;
                            	    alt11 = dfa11.predict(input);
                            	    switch (alt11) {
                            	        case 1 :
                            	            // InternalQVTrelation.g:453:9: lv_ownedMemberIdentifiers_6_1= ruleTemplateCS
                            	            {
                            	            if ( state.backtracking==0 ) {

                            	              									newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getOwnedMemberIdentifiersTemplateCSParserRuleCall_3_1_1_1_0_0());

                            	            }
                            	            pushFollow(FollowSets000.FOLLOW_15);
                            	            lv_ownedMemberIdentifiers_6_1=ruleTemplateCS();

                            	            state._fsp--;
                            	            if (state.failed) return current;
                            	            if ( state.backtracking==0 ) {

                            	              									if (current==null) {
                            	              										current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
                            	              									}
                            	              									add(
                            	              										current,
                            	              										"ownedMemberIdentifiers",
                            	              										lv_ownedMemberIdentifiers_6_1,
                            	              										"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TemplateCS");
                            	              									afterParserOrEnumRuleCall();

                            	            }

                            	            }
                            	            break;
                            	        case 2 :
                            	            // InternalQVTrelation.g:469:9: lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS
                            	            {
                            	            if ( state.backtracking==0 ) {

                            	              									newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getOwnedMemberIdentifiersElementTemplateCSParserRuleCall_3_1_1_1_0_1());

                            	            }
                            	            pushFollow(FollowSets000.FOLLOW_15);
                            	            lv_ownedMemberIdentifiers_6_2=ruleElementTemplateCS();

                            	            state._fsp--;
                            	            if (state.failed) return current;
                            	            if ( state.backtracking==0 ) {

                            	              									if (current==null) {
                            	              										current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
                            	              									}
                            	              									add(
                            	              										current,
                            	              										"ownedMemberIdentifiers",
                            	              										lv_ownedMemberIdentifiers_6_2,
                            	              										"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ElementTemplateCS");
                            	              									afterParserOrEnumRuleCall();

                            	            }

                            	            }
                            	            break;

                            	    }


                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop12;
                                }
                            } while (true);

                            otherlv_7=(Token)match(input,24,FollowSets000.FOLLOW_16); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_7, grammarAccess.getCollectionTemplateCSAccess().getPlusSignPlusSignKeyword_3_1_2());

                            }
                            // InternalQVTrelation.g:492:5: ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) )
                            // InternalQVTrelation.g:493:6: (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS )
                            {
                            // InternalQVTrelation.g:493:6: (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS )
                            // InternalQVTrelation.g:494:7: lv_ownedRestIdentifier_8_0= ruleElementTemplateCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getCollectionTemplateCSAccess().getOwnedRestIdentifierElementTemplateCSParserRuleCall_3_1_3_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_17);
                            lv_ownedRestIdentifier_8_0=ruleElementTemplateCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getCollectionTemplateCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedRestIdentifier",
                              								lv_ownedRestIdentifier_8_0,
                              								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ElementTemplateCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_9=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getCollectionTemplateCSAccess().getRightCurlyBracketKeyword_3_2());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCollectionTemplateCS"


    // $ANTLR start "entryRuleDefaultValueCS"
    // InternalQVTrelation.g:521:1: entryRuleDefaultValueCS returns [EObject current=null] : iv_ruleDefaultValueCS= ruleDefaultValueCS EOF ;
    public final EObject entryRuleDefaultValueCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDefaultValueCS = null;


        try {
            // InternalQVTrelation.g:521:55: (iv_ruleDefaultValueCS= ruleDefaultValueCS EOF )
            // InternalQVTrelation.g:522:2: iv_ruleDefaultValueCS= ruleDefaultValueCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDefaultValueCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDefaultValueCS=ruleDefaultValueCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDefaultValueCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDefaultValueCS"


    // $ANTLR start "ruleDefaultValueCS"
    // InternalQVTrelation.g:528:1: ruleDefaultValueCS returns [EObject current=null] : ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( (lv_ownedInitExpression_2_0= ruleExpCS ) ) otherlv_3= ';' ) ;
    public final EObject ruleDefaultValueCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedInitExpression_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:534:2: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( (lv_ownedInitExpression_2_0= ruleExpCS ) ) otherlv_3= ';' ) )
            // InternalQVTrelation.g:535:2: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( (lv_ownedInitExpression_2_0= ruleExpCS ) ) otherlv_3= ';' )
            {
            // InternalQVTrelation.g:535:2: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( (lv_ownedInitExpression_2_0= ruleExpCS ) ) otherlv_3= ';' )
            // InternalQVTrelation.g:536:3: ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( (lv_ownedInitExpression_2_0= ruleExpCS ) ) otherlv_3= ';'
            {
            // InternalQVTrelation.g:536:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTrelation.g:537:4: ( ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:537:4: ( ruleUnrestrictedName )
            // InternalQVTrelation.g:538:5: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					/* */

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDefaultValueCSRule());
              					}

            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDefaultValueCSAccess().getPropertyIdSharedVariableCrossReference_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_18);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDefaultValueCSAccess().getEqualsSignKeyword_1());

            }
            // InternalQVTrelation.g:559:3: ( (lv_ownedInitExpression_2_0= ruleExpCS ) )
            // InternalQVTrelation.g:560:4: (lv_ownedInitExpression_2_0= ruleExpCS )
            {
            // InternalQVTrelation.g:560:4: (lv_ownedInitExpression_2_0= ruleExpCS )
            // InternalQVTrelation.g:561:5: lv_ownedInitExpression_2_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDefaultValueCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_20);
            lv_ownedInitExpression_2_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDefaultValueCSRule());
              					}
              					set(
              						current,
              						"ownedInitExpression",
              						lv_ownedInitExpression_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_3=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getDefaultValueCSAccess().getSemicolonKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDefaultValueCS"


    // $ANTLR start "entryRuleDomainCS"
    // InternalQVTrelation.g:586:1: entryRuleDomainCS returns [EObject current=null] : iv_ruleDomainCS= ruleDomainCS EOF ;
    public final EObject entryRuleDomainCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDomainCS = null;


        try {
            // InternalQVTrelation.g:586:49: (iv_ruleDomainCS= ruleDomainCS EOF )
            // InternalQVTrelation.g:587:2: iv_ruleDomainCS= ruleDomainCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDomainCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDomainCS=ruleDomainCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDomainCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDomainCS"


    // $ANTLR start "ruleDomainCS"
    // InternalQVTrelation.g:593:1: ruleDomainCS returns [EObject current=null] : ( ( ( (lv_isCheckonly_0_0= 'checkonly' ) ) | ( (lv_isEnforce_1_0= 'enforce' ) ) | otherlv_2= 'replace' )? otherlv_3= 'domain' ( ( ruleUnrestrictedName ) ) ( ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )* )? (otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) ) )? (otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}' )? otherlv_14= ';' ) ;
    public final EObject ruleDomainCS() throws RecognitionException {
        EObject current = null;

        Token lv_isCheckonly_0_0=null;
        Token lv_isEnforce_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_14=null;
        EObject lv_ownedPatterns_5_0 = null;

        EObject lv_ownedPatterns_7_0 = null;

        AntlrDatatypeRuleToken lv_implementedBy_9_0 = null;

        EObject lv_ownedDefaultValues_12_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:599:2: ( ( ( ( (lv_isCheckonly_0_0= 'checkonly' ) ) | ( (lv_isEnforce_1_0= 'enforce' ) ) | otherlv_2= 'replace' )? otherlv_3= 'domain' ( ( ruleUnrestrictedName ) ) ( ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )* )? (otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) ) )? (otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}' )? otherlv_14= ';' ) )
            // InternalQVTrelation.g:600:2: ( ( ( (lv_isCheckonly_0_0= 'checkonly' ) ) | ( (lv_isEnforce_1_0= 'enforce' ) ) | otherlv_2= 'replace' )? otherlv_3= 'domain' ( ( ruleUnrestrictedName ) ) ( ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )* )? (otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) ) )? (otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}' )? otherlv_14= ';' )
            {
            // InternalQVTrelation.g:600:2: ( ( ( (lv_isCheckonly_0_0= 'checkonly' ) ) | ( (lv_isEnforce_1_0= 'enforce' ) ) | otherlv_2= 'replace' )? otherlv_3= 'domain' ( ( ruleUnrestrictedName ) ) ( ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )* )? (otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) ) )? (otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}' )? otherlv_14= ';' )
            // InternalQVTrelation.g:601:3: ( ( (lv_isCheckonly_0_0= 'checkonly' ) ) | ( (lv_isEnforce_1_0= 'enforce' ) ) | otherlv_2= 'replace' )? otherlv_3= 'domain' ( ( ruleUnrestrictedName ) ) ( ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )* )? (otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) ) )? (otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}' )? otherlv_14= ';'
            {
            // InternalQVTrelation.g:601:3: ( ( (lv_isCheckonly_0_0= 'checkonly' ) ) | ( (lv_isEnforce_1_0= 'enforce' ) ) | otherlv_2= 'replace' )?
            int alt15=4;
            switch ( input.LA(1) ) {
                case 25:
                    {
                    alt15=1;
                    }
                    break;
                case 26:
                    {
                    alt15=2;
                    }
                    break;
                case 27:
                    {
                    alt15=3;
                    }
                    break;
            }

            switch (alt15) {
                case 1 :
                    // InternalQVTrelation.g:602:4: ( (lv_isCheckonly_0_0= 'checkonly' ) )
                    {
                    // InternalQVTrelation.g:602:4: ( (lv_isCheckonly_0_0= 'checkonly' ) )
                    // InternalQVTrelation.g:603:5: (lv_isCheckonly_0_0= 'checkonly' )
                    {
                    // InternalQVTrelation.g:603:5: (lv_isCheckonly_0_0= 'checkonly' )
                    // InternalQVTrelation.g:604:6: lv_isCheckonly_0_0= 'checkonly'
                    {
                    lv_isCheckonly_0_0=(Token)match(input,25,FollowSets000.FOLLOW_21); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isCheckonly_0_0, grammarAccess.getDomainCSAccess().getIsCheckonlyCheckonlyKeyword_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDomainCSRule());
                      						}
                      						setWithLastConsumed(current, "isCheckonly", lv_isCheckonly_0_0 != null, "checkonly");

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:617:4: ( (lv_isEnforce_1_0= 'enforce' ) )
                    {
                    // InternalQVTrelation.g:617:4: ( (lv_isEnforce_1_0= 'enforce' ) )
                    // InternalQVTrelation.g:618:5: (lv_isEnforce_1_0= 'enforce' )
                    {
                    // InternalQVTrelation.g:618:5: (lv_isEnforce_1_0= 'enforce' )
                    // InternalQVTrelation.g:619:6: lv_isEnforce_1_0= 'enforce'
                    {
                    lv_isEnforce_1_0=(Token)match(input,26,FollowSets000.FOLLOW_21); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isEnforce_1_0, grammarAccess.getDomainCSAccess().getIsEnforceEnforceKeyword_0_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDomainCSRule());
                      						}
                      						setWithLastConsumed(current, "isEnforce", lv_isEnforce_1_0 != null, "enforce");

                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:632:4: otherlv_2= 'replace'
                    {
                    otherlv_2=(Token)match(input,27,FollowSets000.FOLLOW_21); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getDomainCSAccess().getReplaceKeyword_0_2());

                    }

                    }
                    break;

            }

            otherlv_3=(Token)match(input,28,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getDomainCSAccess().getDomainKeyword_1());

            }
            // InternalQVTrelation.g:641:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTrelation.g:642:4: ( ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:642:4: ( ruleUnrestrictedName )
            // InternalQVTrelation.g:643:5: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					/* */

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getDomainCSRule());
              					}

            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDomainCSAccess().getModelIdTypedModelCrossReference_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_22);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:660:3: ( ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )* )?
            int alt17=2;
            switch ( input.LA(1) ) {
                case RULE_SIMPLE_ID:
                case RULE_ESCAPED_ID:
                case 17:
                case 18:
                case 25:
                case 26:
                case 27:
                case 28:
                case 31:
                case 32:
                case 35:
                case 36:
                case 37:
                case 38:
                case 39:
                case 40:
                case 41:
                case 42:
                case 43:
                case 45:
                case 46:
                case 47:
                case 49:
                case 50:
                case 51:
                case 52:
                case 53:
                case 54:
                case 55:
                case 56:
                case 57:
                case 58:
                case 59:
                case 61:
                case 63:
                case 65:
                case 68:
                case 70:
                case 72:
                case 74:
                case 75:
                case 76:
                case 77:
                case 79:
                case 80:
                case 81:
                case 82:
                case 83:
                case 84:
                case 86:
                case 88:
                case 90:
                case 91:
                    {
                    alt17=1;
                    }
                    break;
                case 30:
                    {
                    int LA17_2 = input.LA(2);

                    if ( (LA17_2==18) ) {
                        alt17=1;
                    }
                    }
                    break;
                case 29:
                    {
                    int LA17_3 = input.LA(2);

                    if ( (LA17_3==18) ) {
                        alt17=1;
                    }
                    }
                    break;
            }

            switch (alt17) {
                case 1 :
                    // InternalQVTrelation.g:661:4: ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) ) (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )*
                    {
                    // InternalQVTrelation.g:661:4: ( (lv_ownedPatterns_5_0= ruleDomainPatternCS ) )
                    // InternalQVTrelation.g:662:5: (lv_ownedPatterns_5_0= ruleDomainPatternCS )
                    {
                    // InternalQVTrelation.g:662:5: (lv_ownedPatterns_5_0= ruleDomainPatternCS )
                    // InternalQVTrelation.g:663:6: lv_ownedPatterns_5_0= ruleDomainPatternCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDomainCSAccess().getOwnedPatternsDomainPatternCSParserRuleCall_3_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_23);
                    lv_ownedPatterns_5_0=ruleDomainPatternCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDomainCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedPatterns",
                      							lv_ownedPatterns_5_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.DomainPatternCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:680:4: (otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) ) )*
                    loop16:
                    do {
                        int alt16=2;
                        int LA16_0 = input.LA(1);

                        if ( (LA16_0==23) ) {
                            alt16=1;
                        }


                        switch (alt16) {
                    	case 1 :
                    	    // InternalQVTrelation.g:681:5: otherlv_6= ',' ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) )
                    	    {
                    	    otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_6, grammarAccess.getDomainCSAccess().getCommaKeyword_3_1_0());

                    	    }
                    	    // InternalQVTrelation.g:685:5: ( (lv_ownedPatterns_7_0= ruleDomainPatternCS ) )
                    	    // InternalQVTrelation.g:686:6: (lv_ownedPatterns_7_0= ruleDomainPatternCS )
                    	    {
                    	    // InternalQVTrelation.g:686:6: (lv_ownedPatterns_7_0= ruleDomainPatternCS )
                    	    // InternalQVTrelation.g:687:7: lv_ownedPatterns_7_0= ruleDomainPatternCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getDomainCSAccess().getOwnedPatternsDomainPatternCSParserRuleCall_3_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_23);
                    	    lv_ownedPatterns_7_0=ruleDomainPatternCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getDomainCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedPatterns",
                    	      								lv_ownedPatterns_7_0,
                    	      								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.DomainPatternCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop16;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalQVTrelation.g:706:3: (otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) ) )?
            int alt18=2;
            int LA18_0 = input.LA(1);

            if ( (LA18_0==29) ) {
                alt18=1;
            }
            switch (alt18) {
                case 1 :
                    // InternalQVTrelation.g:707:4: otherlv_8= 'implementedby' ( (lv_implementedBy_9_0= ruleUnrestrictedName ) )
                    {
                    otherlv_8=(Token)match(input,29,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getDomainCSAccess().getImplementedbyKeyword_4_0());

                    }
                    // InternalQVTrelation.g:711:4: ( (lv_implementedBy_9_0= ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:712:5: (lv_implementedBy_9_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:712:5: (lv_implementedBy_9_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:713:6: lv_implementedBy_9_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getDomainCSAccess().getImplementedByUnrestrictedNameParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_24);
                    lv_implementedBy_9_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getDomainCSRule());
                      						}
                      						set(
                      							current,
                      							"implementedBy",
                      							lv_implementedBy_9_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:731:3: (otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}' )?
            int alt20=2;
            int LA20_0 = input.LA(1);

            if ( (LA20_0==30) ) {
                alt20=1;
            }
            switch (alt20) {
                case 1 :
                    // InternalQVTrelation.g:732:4: otherlv_10= 'default_values' otherlv_11= '{' ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+ otherlv_13= '}'
                    {
                    otherlv_10=(Token)match(input,30,FollowSets000.FOLLOW_25); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getDomainCSAccess().getDefault_valuesKeyword_5_0());

                    }
                    otherlv_11=(Token)match(input,20,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getDomainCSAccess().getLeftCurlyBracketKeyword_5_1());

                    }
                    // InternalQVTrelation.g:740:4: ( (lv_ownedDefaultValues_12_0= ruleDefaultValueCS ) )+
                    int cnt19=0;
                    loop19:
                    do {
                        int alt19=2;
                        int LA19_0 = input.LA(1);

                        if ( ((LA19_0>=RULE_SIMPLE_ID && LA19_0<=RULE_ESCAPED_ID)||LA19_0==17||(LA19_0>=25 && LA19_0<=32)||(LA19_0>=35 && LA19_0<=43)||(LA19_0>=45 && LA19_0<=47)||(LA19_0>=49 && LA19_0<=59)||LA19_0==61||LA19_0==63||LA19_0==65||LA19_0==68||LA19_0==70||LA19_0==72||(LA19_0>=74 && LA19_0<=77)||(LA19_0>=79 && LA19_0<=84)||LA19_0==86||LA19_0==88||(LA19_0>=90 && LA19_0<=91)) ) {
                            alt19=1;
                        }


                        switch (alt19) {
                    	case 1 :
                    	    // InternalQVTrelation.g:741:5: (lv_ownedDefaultValues_12_0= ruleDefaultValueCS )
                    	    {
                    	    // InternalQVTrelation.g:741:5: (lv_ownedDefaultValues_12_0= ruleDefaultValueCS )
                    	    // InternalQVTrelation.g:742:6: lv_ownedDefaultValues_12_0= ruleDefaultValueCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      						newCompositeNode(grammarAccess.getDomainCSAccess().getOwnedDefaultValuesDefaultValueCSParserRuleCall_5_2_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_26);
                    	    lv_ownedDefaultValues_12_0=ruleDefaultValueCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						if (current==null) {
                    	      							current = createModelElementForParent(grammarAccess.getDomainCSRule());
                    	      						}
                    	      						add(
                    	      							current,
                    	      							"ownedDefaultValues",
                    	      							lv_ownedDefaultValues_12_0,
                    	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.DefaultValueCS");
                    	      						afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt19 >= 1 ) break loop19;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(19, input);
                                throw eee;
                        }
                        cnt19++;
                    } while (true);

                    otherlv_13=(Token)match(input,21,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_13, grammarAccess.getDomainCSAccess().getRightCurlyBracketKeyword_5_3());

                    }

                    }
                    break;

            }

            otherlv_14=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_14, grammarAccess.getDomainCSAccess().getSemicolonKeyword_6());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDomainCS"


    // $ANTLR start "entryRuleDomainPatternCS"
    // InternalQVTrelation.g:772:1: entryRuleDomainPatternCS returns [EObject current=null] : iv_ruleDomainPatternCS= ruleDomainPatternCS EOF ;
    public final EObject entryRuleDomainPatternCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDomainPatternCS = null;


        try {
            // InternalQVTrelation.g:772:56: (iv_ruleDomainPatternCS= ruleDomainPatternCS EOF )
            // InternalQVTrelation.g:773:2: iv_ruleDomainPatternCS= ruleDomainPatternCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDomainPatternCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDomainPatternCS=ruleDomainPatternCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDomainPatternCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDomainPatternCS"


    // $ANTLR start "ruleDomainPatternCS"
    // InternalQVTrelation.g:779:1: ruleDomainPatternCS returns [EObject current=null] : ( (lv_ownedTemplate_0_0= ruleTemplateCS ) ) ;
    public final EObject ruleDomainPatternCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedTemplate_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:785:2: ( ( (lv_ownedTemplate_0_0= ruleTemplateCS ) ) )
            // InternalQVTrelation.g:786:2: ( (lv_ownedTemplate_0_0= ruleTemplateCS ) )
            {
            // InternalQVTrelation.g:786:2: ( (lv_ownedTemplate_0_0= ruleTemplateCS ) )
            // InternalQVTrelation.g:787:3: (lv_ownedTemplate_0_0= ruleTemplateCS )
            {
            // InternalQVTrelation.g:787:3: (lv_ownedTemplate_0_0= ruleTemplateCS )
            // InternalQVTrelation.g:788:4: lv_ownedTemplate_0_0= ruleTemplateCS
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getDomainPatternCSAccess().getOwnedTemplateTemplateCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedTemplate_0_0=ruleTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getDomainPatternCSRule());
              				}
              				set(
              					current,
              					"ownedTemplate",
              					lv_ownedTemplate_0_0,
              					"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TemplateCS");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDomainPatternCS"


    // $ANTLR start "entryRuleElementTemplateCS"
    // InternalQVTrelation.g:808:1: entryRuleElementTemplateCS returns [EObject current=null] : iv_ruleElementTemplateCS= ruleElementTemplateCS EOF ;
    public final EObject entryRuleElementTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleElementTemplateCS = null;


        try {
            // InternalQVTrelation.g:808:58: (iv_ruleElementTemplateCS= ruleElementTemplateCS EOF )
            // InternalQVTrelation.g:809:2: iv_ruleElementTemplateCS= ruleElementTemplateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getElementTemplateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleElementTemplateCS=ruleElementTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleElementTemplateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleElementTemplateCS"


    // $ANTLR start "ruleElementTemplateCS"
    // InternalQVTrelation.g:815:1: ruleElementTemplateCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
    public final EObject ruleElementTemplateCS() throws RecognitionException {
        EObject current = null;


        	enterRule();

        try {
            // InternalQVTrelation.g:821:2: ( ( ( ruleUnrestrictedName ) ) )
            // InternalQVTrelation.g:822:2: ( ( ruleUnrestrictedName ) )
            {
            // InternalQVTrelation.g:822:2: ( ( ruleUnrestrictedName ) )
            // InternalQVTrelation.g:823:3: ( ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:823:3: ( ruleUnrestrictedName )
            // InternalQVTrelation.g:824:4: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getElementTemplateCSRule());
              				}

            }
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getElementTemplateCSAccess().getIdentifierSharedVariableCrossReference_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleElementTemplateCS"


    // $ANTLR start "entryRuleKeyDeclCS"
    // InternalQVTrelation.g:844:1: entryRuleKeyDeclCS returns [EObject current=null] : iv_ruleKeyDeclCS= ruleKeyDeclCS EOF ;
    public final EObject entryRuleKeyDeclCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleKeyDeclCS = null;


        try {
            // InternalQVTrelation.g:844:50: (iv_ruleKeyDeclCS= ruleKeyDeclCS EOF )
            // InternalQVTrelation.g:845:2: iv_ruleKeyDeclCS= ruleKeyDeclCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getKeyDeclCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleKeyDeclCS=ruleKeyDeclCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleKeyDeclCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleKeyDeclCS"


    // $ANTLR start "ruleKeyDeclCS"
    // InternalQVTrelation.g:851:1: ruleKeyDeclCS returns [EObject current=null] : (otherlv_0= 'key' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= '{' ( ( ( ruleUnrestrictedName ) ) | (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' ) ) (otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) ) )* otherlv_14= '}' otherlv_15= ';' ) ;
    public final EObject ruleKeyDeclCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        EObject lv_ownedPathName_1_0 = null;

        EObject lv_ownedOppositePropertyIds_6_0 = null;

        EObject lv_ownedOppositePropertyIds_12_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:857:2: ( (otherlv_0= 'key' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= '{' ( ( ( ruleUnrestrictedName ) ) | (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' ) ) (otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) ) )* otherlv_14= '}' otherlv_15= ';' ) )
            // InternalQVTrelation.g:858:2: (otherlv_0= 'key' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= '{' ( ( ( ruleUnrestrictedName ) ) | (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' ) ) (otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) ) )* otherlv_14= '}' otherlv_15= ';' )
            {
            // InternalQVTrelation.g:858:2: (otherlv_0= 'key' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= '{' ( ( ( ruleUnrestrictedName ) ) | (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' ) ) (otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) ) )* otherlv_14= '}' otherlv_15= ';' )
            // InternalQVTrelation.g:859:3: otherlv_0= 'key' ( (lv_ownedPathName_1_0= rulePathNameCS ) ) otherlv_2= '{' ( ( ( ruleUnrestrictedName ) ) | (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' ) ) (otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) ) )* otherlv_14= '}' otherlv_15= ';'
            {
            otherlv_0=(Token)match(input,31,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getKeyDeclCSAccess().getKeyKeyword_0());

            }
            // InternalQVTrelation.g:863:3: ( (lv_ownedPathName_1_0= rulePathNameCS ) )
            // InternalQVTrelation.g:864:4: (lv_ownedPathName_1_0= rulePathNameCS )
            {
            // InternalQVTrelation.g:864:4: (lv_ownedPathName_1_0= rulePathNameCS )
            // InternalQVTrelation.g:865:5: lv_ownedPathName_1_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getKeyDeclCSAccess().getOwnedPathNamePathNameCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_ownedPathName_1_0=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getKeyDeclCSRule());
              					}
              					set(
              						current,
              						"ownedPathName",
              						lv_ownedPathName_1_0,
              						"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getKeyDeclCSAccess().getLeftCurlyBracketKeyword_2());

            }
            // InternalQVTrelation.g:886:3: ( ( ( ruleUnrestrictedName ) ) | (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' ) )
            int alt21=2;
            int LA21_0 = input.LA(1);

            if ( ((LA21_0>=RULE_SIMPLE_ID && LA21_0<=RULE_ESCAPED_ID)||LA21_0==17||(LA21_0>=25 && LA21_0<=31)||(LA21_0>=35 && LA21_0<=43)||(LA21_0>=45 && LA21_0<=47)||(LA21_0>=49 && LA21_0<=59)||LA21_0==61||LA21_0==63||LA21_0==65||LA21_0==68||LA21_0==70||LA21_0==72||(LA21_0>=74 && LA21_0<=77)||(LA21_0>=79 && LA21_0<=84)||LA21_0==86||LA21_0==88||(LA21_0>=90 && LA21_0<=91)) ) {
                alt21=1;
            }
            else if ( (LA21_0==32) ) {
                int LA21_2 = input.LA(2);

                if ( (LA21_2==33) ) {
                    alt21=2;
                }
                else if ( (LA21_2==21||LA21_2==23) ) {
                    alt21=1;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 21, 2, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 21, 0, input);

                throw nvae;
            }
            switch (alt21) {
                case 1 :
                    // InternalQVTrelation.g:887:4: ( ( ruleUnrestrictedName ) )
                    {
                    // InternalQVTrelation.g:887:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:888:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:888:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:889:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getKeyDeclCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getKeyDeclCSAccess().getPropertyIdsPropertyCrossReference_3_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:907:4: (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' )
                    {
                    // InternalQVTrelation.g:907:4: (otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')' )
                    // InternalQVTrelation.g:908:5: otherlv_4= 'opposite' otherlv_5= '(' ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) ) otherlv_7= ')'
                    {
                    otherlv_4=(Token)match(input,32,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getKeyDeclCSAccess().getOppositeKeyword_3_1_0());

                    }
                    otherlv_5=(Token)match(input,33,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_5, grammarAccess.getKeyDeclCSAccess().getLeftParenthesisKeyword_3_1_1());

                    }
                    // InternalQVTrelation.g:916:5: ( (lv_ownedOppositePropertyIds_6_0= rulePathNameCS ) )
                    // InternalQVTrelation.g:917:6: (lv_ownedOppositePropertyIds_6_0= rulePathNameCS )
                    {
                    // InternalQVTrelation.g:917:6: (lv_ownedOppositePropertyIds_6_0= rulePathNameCS )
                    // InternalQVTrelation.g:918:7: lv_ownedOppositePropertyIds_6_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getKeyDeclCSAccess().getOwnedOppositePropertyIdsPathNameCSParserRuleCall_3_1_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_30);
                    lv_ownedOppositePropertyIds_6_0=rulePathNameCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getKeyDeclCSRule());
                      							}
                      							add(
                      								current,
                      								"ownedOppositePropertyIds",
                      								lv_ownedOppositePropertyIds_6_0,
                      								"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_7=(Token)match(input,34,FollowSets000.FOLLOW_28); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_7, grammarAccess.getKeyDeclCSAccess().getRightParenthesisKeyword_3_1_3());

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:941:3: (otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) ) )*
            loop23:
            do {
                int alt23=2;
                int LA23_0 = input.LA(1);

                if ( (LA23_0==23) ) {
                    alt23=1;
                }


                switch (alt23) {
            	case 1 :
            	    // InternalQVTrelation.g:942:4: otherlv_8= ',' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) )
            	    {
            	    otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_8, grammarAccess.getKeyDeclCSAccess().getCommaKeyword_4_0());

            	    }
            	    // InternalQVTrelation.g:946:4: ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' ) )
            	    int alt22=2;
            	    int LA22_0 = input.LA(1);

            	    if ( ((LA22_0>=RULE_SIMPLE_ID && LA22_0<=RULE_ESCAPED_ID)||LA22_0==17||(LA22_0>=25 && LA22_0<=31)||(LA22_0>=35 && LA22_0<=43)||(LA22_0>=45 && LA22_0<=47)||(LA22_0>=49 && LA22_0<=59)||LA22_0==61||LA22_0==63||LA22_0==65||LA22_0==68||LA22_0==70||LA22_0==72||(LA22_0>=74 && LA22_0<=77)||(LA22_0>=79 && LA22_0<=84)||LA22_0==86||LA22_0==88||(LA22_0>=90 && LA22_0<=91)) ) {
            	        alt22=1;
            	    }
            	    else if ( (LA22_0==32) ) {
            	        int LA22_2 = input.LA(2);

            	        if ( (LA22_2==33) ) {
            	            alt22=2;
            	        }
            	        else if ( (LA22_2==21||LA22_2==23) ) {
            	            alt22=1;
            	        }
            	        else {
            	            if (state.backtracking>0) {state.failed=true; return current;}
            	            NoViableAltException nvae =
            	                new NoViableAltException("", 22, 2, input);

            	            throw nvae;
            	        }
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 22, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt22) {
            	        case 1 :
            	            // InternalQVTrelation.g:947:5: ( ( ruleUnrestrictedName ) )
            	            {
            	            // InternalQVTrelation.g:947:5: ( ( ruleUnrestrictedName ) )
            	            // InternalQVTrelation.g:948:6: ( ruleUnrestrictedName )
            	            {
            	            // InternalQVTrelation.g:948:6: ( ruleUnrestrictedName )
            	            // InternalQVTrelation.g:949:7: ruleUnrestrictedName
            	            {
            	            if ( state.backtracking==0 ) {

            	              							/* */

            	            }
            	            if ( state.backtracking==0 ) {

            	              							if (current==null) {
            	              								current = createModelElement(grammarAccess.getKeyDeclCSRule());
            	              							}

            	            }
            	            if ( state.backtracking==0 ) {

            	              							newCompositeNode(grammarAccess.getKeyDeclCSAccess().getPropertyIdsPropertyCrossReference_4_1_0_0());

            	            }
            	            pushFollow(FollowSets000.FOLLOW_28);
            	            ruleUnrestrictedName();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              							afterParserOrEnumRuleCall();

            	            }

            	            }


            	            }


            	            }
            	            break;
            	        case 2 :
            	            // InternalQVTrelation.g:967:5: (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' )
            	            {
            	            // InternalQVTrelation.g:967:5: (otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')' )
            	            // InternalQVTrelation.g:968:6: otherlv_10= 'opposite' otherlv_11= '(' ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) ) otherlv_13= ')'
            	            {
            	            otherlv_10=(Token)match(input,32,FollowSets000.FOLLOW_29); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_10, grammarAccess.getKeyDeclCSAccess().getOppositeKeyword_4_1_1_0());

            	            }
            	            otherlv_11=(Token)match(input,33,FollowSets000.FOLLOW_27); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_11, grammarAccess.getKeyDeclCSAccess().getLeftParenthesisKeyword_4_1_1_1());

            	            }
            	            // InternalQVTrelation.g:976:6: ( (lv_ownedOppositePropertyIds_12_0= rulePathNameCS ) )
            	            // InternalQVTrelation.g:977:7: (lv_ownedOppositePropertyIds_12_0= rulePathNameCS )
            	            {
            	            // InternalQVTrelation.g:977:7: (lv_ownedOppositePropertyIds_12_0= rulePathNameCS )
            	            // InternalQVTrelation.g:978:8: lv_ownedOppositePropertyIds_12_0= rulePathNameCS
            	            {
            	            if ( state.backtracking==0 ) {

            	              								newCompositeNode(grammarAccess.getKeyDeclCSAccess().getOwnedOppositePropertyIdsPathNameCSParserRuleCall_4_1_1_2_0());

            	            }
            	            pushFollow(FollowSets000.FOLLOW_30);
            	            lv_ownedOppositePropertyIds_12_0=rulePathNameCS();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              								if (current==null) {
            	              									current = createModelElementForParent(grammarAccess.getKeyDeclCSRule());
            	              								}
            	              								add(
            	              									current,
            	              									"ownedOppositePropertyIds",
            	              									lv_ownedOppositePropertyIds_12_0,
            	              									"org.eclipse.ocl.xtext.base.Base.PathNameCS");
            	              								afterParserOrEnumRuleCall();

            	            }

            	            }


            	            }

            	            otherlv_13=(Token)match(input,34,FollowSets000.FOLLOW_28); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						newLeafNode(otherlv_13, grammarAccess.getKeyDeclCSAccess().getRightParenthesisKeyword_4_1_1_3());

            	            }

            	            }


            	            }
            	            break;

            	    }


            	    }
            	    break;

            	default :
            	    break loop23;
                }
            } while (true);

            otherlv_14=(Token)match(input,21,FollowSets000.FOLLOW_20); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_14, grammarAccess.getKeyDeclCSAccess().getRightCurlyBracketKeyword_5());

            }
            otherlv_15=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_15, grammarAccess.getKeyDeclCSAccess().getSemicolonKeyword_6());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleKeyDeclCS"


    // $ANTLR start "entryRuleModelDeclCS"
    // InternalQVTrelation.g:1014:1: entryRuleModelDeclCS returns [EObject current=null] : iv_ruleModelDeclCS= ruleModelDeclCS EOF ;
    public final EObject entryRuleModelDeclCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleModelDeclCS = null;


        try {
            // InternalQVTrelation.g:1014:52: (iv_ruleModelDeclCS= ruleModelDeclCS EOF )
            // InternalQVTrelation.g:1015:2: iv_ruleModelDeclCS= ruleModelDeclCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getModelDeclCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleModelDeclCS=ruleModelDeclCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleModelDeclCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleModelDeclCS"


    // $ANTLR start "ruleModelDeclCS"
    // InternalQVTrelation.g:1021:1: ruleModelDeclCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( ( ( ruleUnrestrictedName ) ) | (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' ) ) (otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) ) )? (otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) ) )? ) ;
    public final EObject ruleModelDeclCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        Token otherlv_21=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1027:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( ( ( ruleUnrestrictedName ) ) | (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' ) ) (otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) ) )? (otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) ) )? ) )
            // InternalQVTrelation.g:1028:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( ( ( ruleUnrestrictedName ) ) | (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' ) ) (otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) ) )? (otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) ) )? )
            {
            // InternalQVTrelation.g:1028:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( ( ( ruleUnrestrictedName ) ) | (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' ) ) (otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) ) )? (otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) ) )? )
            // InternalQVTrelation.g:1029:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( ( ( ruleUnrestrictedName ) ) | (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' ) ) (otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) ) )? (otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) ) )?
            {
            // InternalQVTrelation.g:1029:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:1030:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:1030:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:1031:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getModelDeclCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getModelDeclCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_31); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getModelDeclCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:1052:3: ( ( ( ruleUnrestrictedName ) ) | (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' ) )
            int alt25=2;
            int LA25_0 = input.LA(1);

            if ( ((LA25_0>=RULE_SIMPLE_ID && LA25_0<=RULE_ESCAPED_ID)||LA25_0==17||(LA25_0>=25 && LA25_0<=32)||(LA25_0>=35 && LA25_0<=43)||(LA25_0>=45 && LA25_0<=47)||(LA25_0>=49 && LA25_0<=59)||LA25_0==61||LA25_0==63||LA25_0==65||LA25_0==68||LA25_0==70||LA25_0==72||(LA25_0>=74 && LA25_0<=77)||(LA25_0>=79 && LA25_0<=84)||LA25_0==86||LA25_0==88||(LA25_0>=90 && LA25_0<=91)) ) {
                alt25=1;
            }
            else if ( (LA25_0==20) ) {
                alt25=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 25, 0, input);

                throw nvae;
            }
            switch (alt25) {
                case 1 :
                    // InternalQVTrelation.g:1053:4: ( ( ruleUnrestrictedName ) )
                    {
                    // InternalQVTrelation.g:1053:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:1054:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:1054:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:1055:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getModelDeclCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getModelDeclCSAccess().getMetamodelIdsNamespaceCrossReference_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_32);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:1073:4: (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' )
                    {
                    // InternalQVTrelation.g:1073:4: (otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}' )
                    // InternalQVTrelation.g:1074:5: otherlv_3= '{' ( ( ruleUnrestrictedName ) ) (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )* otherlv_7= '}'
                    {
                    otherlv_3=(Token)match(input,20,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_3, grammarAccess.getModelDeclCSAccess().getLeftCurlyBracketKeyword_2_1_0());

                    }
                    // InternalQVTrelation.g:1078:5: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:1079:6: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:1079:6: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:1080:7: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      							/* */

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getModelDeclCSRule());
                      							}

                    }
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getModelDeclCSAccess().getMetamodelIdsNamespaceCrossReference_2_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:1097:5: (otherlv_5= ',' ( ( ruleUnrestrictedName ) ) )*
                    loop24:
                    do {
                        int alt24=2;
                        int LA24_0 = input.LA(1);

                        if ( (LA24_0==23) ) {
                            alt24=1;
                        }


                        switch (alt24) {
                    	case 1 :
                    	    // InternalQVTrelation.g:1098:6: otherlv_5= ',' ( ( ruleUnrestrictedName ) )
                    	    {
                    	    otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_5, grammarAccess.getModelDeclCSAccess().getCommaKeyword_2_1_2_0());

                    	    }
                    	    // InternalQVTrelation.g:1102:6: ( ( ruleUnrestrictedName ) )
                    	    // InternalQVTrelation.g:1103:7: ( ruleUnrestrictedName )
                    	    {
                    	    // InternalQVTrelation.g:1103:7: ( ruleUnrestrictedName )
                    	    // InternalQVTrelation.g:1104:8: ruleUnrestrictedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								/* */

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElement(grammarAccess.getModelDeclCSRule());
                    	      								}

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getModelDeclCSAccess().getMetamodelIdsNamespaceCrossReference_2_1_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_28);
                    	    ruleUnrestrictedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop24;
                        }
                    } while (true);

                    otherlv_7=(Token)match(input,21,FollowSets000.FOLLOW_32); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_7, grammarAccess.getModelDeclCSAccess().getRightCurlyBracketKeyword_2_1_3());

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:1128:3: (otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) ) )?
            int alt29=2;
            int LA29_0 = input.LA(1);

            if ( (LA29_0==35) ) {
                alt29=1;
            }
            switch (alt29) {
                case 1 :
                    // InternalQVTrelation.g:1129:4: otherlv_8= 'dependsOn' ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) )
                    {
                    otherlv_8=(Token)match(input,35,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getModelDeclCSAccess().getDependsOnKeyword_3_0());

                    }
                    // InternalQVTrelation.g:1133:4: ( ( ( ruleUnrestrictedName ) ) | (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' ) )
                    int alt28=2;
                    int LA28_0 = input.LA(1);

                    if ( ((LA28_0>=RULE_SIMPLE_ID && LA28_0<=RULE_ESCAPED_ID)||LA28_0==17||(LA28_0>=25 && LA28_0<=32)||(LA28_0>=35 && LA28_0<=43)||(LA28_0>=45 && LA28_0<=47)||(LA28_0>=49 && LA28_0<=59)||LA28_0==61||LA28_0==63||LA28_0==65||LA28_0==68||LA28_0==70||LA28_0==72||(LA28_0>=74 && LA28_0<=77)||(LA28_0>=79 && LA28_0<=84)||LA28_0==86||LA28_0==88||(LA28_0>=90 && LA28_0<=91)) ) {
                        alt28=1;
                    }
                    else if ( (LA28_0==20) ) {
                        alt28=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 28, 0, input);

                        throw nvae;
                    }
                    switch (alt28) {
                        case 1 :
                            // InternalQVTrelation.g:1134:5: ( ( ruleUnrestrictedName ) )
                            {
                            // InternalQVTrelation.g:1134:5: ( ( ruleUnrestrictedName ) )
                            // InternalQVTrelation.g:1135:6: ( ruleUnrestrictedName )
                            {
                            // InternalQVTrelation.g:1135:6: ( ruleUnrestrictedName )
                            // InternalQVTrelation.g:1136:7: ruleUnrestrictedName
                            {
                            if ( state.backtracking==0 ) {

                              							/* */

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getModelDeclCSRule());
                              							}

                            }
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getModelDeclCSAccess().getDependsOnTypedModelCrossReference_3_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_33);
                            ruleUnrestrictedName();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:1154:5: (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' )
                            {
                            // InternalQVTrelation.g:1154:5: (otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}' )
                            // InternalQVTrelation.g:1155:6: otherlv_10= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_14= '}'
                            {
                            otherlv_10=(Token)match(input,20,FollowSets000.FOLLOW_26); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_10, grammarAccess.getModelDeclCSAccess().getLeftCurlyBracketKeyword_3_1_1_0());

                            }
                            // InternalQVTrelation.g:1159:6: ( ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )* )?
                            int alt27=2;
                            int LA27_0 = input.LA(1);

                            if ( ((LA27_0>=RULE_SIMPLE_ID && LA27_0<=RULE_ESCAPED_ID)||LA27_0==17||(LA27_0>=25 && LA27_0<=32)||(LA27_0>=35 && LA27_0<=43)||(LA27_0>=45 && LA27_0<=47)||(LA27_0>=49 && LA27_0<=59)||LA27_0==61||LA27_0==63||LA27_0==65||LA27_0==68||LA27_0==70||LA27_0==72||(LA27_0>=74 && LA27_0<=77)||(LA27_0>=79 && LA27_0<=84)||LA27_0==86||LA27_0==88||(LA27_0>=90 && LA27_0<=91)) ) {
                                alt27=1;
                            }
                            switch (alt27) {
                                case 1 :
                                    // InternalQVTrelation.g:1160:7: ( ( ruleUnrestrictedName ) ) (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )*
                                    {
                                    // InternalQVTrelation.g:1160:7: ( ( ruleUnrestrictedName ) )
                                    // InternalQVTrelation.g:1161:8: ( ruleUnrestrictedName )
                                    {
                                    // InternalQVTrelation.g:1161:8: ( ruleUnrestrictedName )
                                    // InternalQVTrelation.g:1162:9: ruleUnrestrictedName
                                    {
                                    if ( state.backtracking==0 ) {

                                      									/* */

                                    }
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElement(grammarAccess.getModelDeclCSRule());
                                      									}

                                    }
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getModelDeclCSAccess().getDependsOnTypedModelCrossReference_3_1_1_1_0_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_28);
                                    ruleUnrestrictedName();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }

                                    // InternalQVTrelation.g:1179:7: (otherlv_12= ',' ( ( ruleUnrestrictedName ) ) )*
                                    loop26:
                                    do {
                                        int alt26=2;
                                        int LA26_0 = input.LA(1);

                                        if ( (LA26_0==23) ) {
                                            alt26=1;
                                        }


                                        switch (alt26) {
                                    	case 1 :
                                    	    // InternalQVTrelation.g:1180:8: otherlv_12= ',' ( ( ruleUnrestrictedName ) )
                                    	    {
                                    	    otherlv_12=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      								newLeafNode(otherlv_12, grammarAccess.getModelDeclCSAccess().getCommaKeyword_3_1_1_1_1_0());

                                    	    }
                                    	    // InternalQVTrelation.g:1184:8: ( ( ruleUnrestrictedName ) )
                                    	    // InternalQVTrelation.g:1185:9: ( ruleUnrestrictedName )
                                    	    {
                                    	    // InternalQVTrelation.g:1185:9: ( ruleUnrestrictedName )
                                    	    // InternalQVTrelation.g:1186:10: ruleUnrestrictedName
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										/* */

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      										if (current==null) {
                                    	      											current = createModelElement(grammarAccess.getModelDeclCSRule());
                                    	      										}

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getModelDeclCSAccess().getDependsOnTypedModelCrossReference_3_1_1_1_1_1_0());

                                    	    }
                                    	    pushFollow(FollowSets000.FOLLOW_28);
                                    	    ruleUnrestrictedName();

                                    	    state._fsp--;
                                    	    if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      										afterParserOrEnumRuleCall();

                                    	    }

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

                                    	default :
                                    	    break loop26;
                                        }
                                    } while (true);


                                    }
                                    break;

                            }

                            otherlv_14=(Token)match(input,21,FollowSets000.FOLLOW_33); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_14, grammarAccess.getModelDeclCSAccess().getRightCurlyBracketKeyword_3_1_1_2());

                            }

                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:1212:3: (otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) ) )?
            int alt33=2;
            int LA33_0 = input.LA(1);

            if ( (LA33_0==36) ) {
                alt33=1;
            }
            switch (alt33) {
                case 1 :
                    // InternalQVTrelation.g:1213:4: otherlv_15= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) )
                    {
                    otherlv_15=(Token)match(input,36,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_15, grammarAccess.getModelDeclCSAccess().getIteratesKeyword_4_0());

                    }
                    // InternalQVTrelation.g:1217:4: ( ( ( ruleUnrestrictedName ) ) | (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' ) )
                    int alt32=2;
                    int LA32_0 = input.LA(1);

                    if ( ((LA32_0>=RULE_SIMPLE_ID && LA32_0<=RULE_ESCAPED_ID)||LA32_0==17||(LA32_0>=25 && LA32_0<=32)||(LA32_0>=35 && LA32_0<=43)||(LA32_0>=45 && LA32_0<=47)||(LA32_0>=49 && LA32_0<=59)||LA32_0==61||LA32_0==63||LA32_0==65||LA32_0==68||LA32_0==70||LA32_0==72||(LA32_0>=74 && LA32_0<=77)||(LA32_0>=79 && LA32_0<=84)||LA32_0==86||LA32_0==88||(LA32_0>=90 && LA32_0<=91)) ) {
                        alt32=1;
                    }
                    else if ( (LA32_0==20) ) {
                        alt32=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 32, 0, input);

                        throw nvae;
                    }
                    switch (alt32) {
                        case 1 :
                            // InternalQVTrelation.g:1218:5: ( ( ruleUnrestrictedName ) )
                            {
                            // InternalQVTrelation.g:1218:5: ( ( ruleUnrestrictedName ) )
                            // InternalQVTrelation.g:1219:6: ( ruleUnrestrictedName )
                            {
                            // InternalQVTrelation.g:1219:6: ( ruleUnrestrictedName )
                            // InternalQVTrelation.g:1220:7: ruleUnrestrictedName
                            {
                            if ( state.backtracking==0 ) {

                              							/* */

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getModelDeclCSRule());
                              							}

                            }
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getModelDeclCSAccess().getIteratesTypedModelCrossReference_4_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            ruleUnrestrictedName();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:1238:5: (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' )
                            {
                            // InternalQVTrelation.g:1238:5: (otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}' )
                            // InternalQVTrelation.g:1239:6: otherlv_17= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_21= '}'
                            {
                            otherlv_17=(Token)match(input,20,FollowSets000.FOLLOW_26); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_17, grammarAccess.getModelDeclCSAccess().getLeftCurlyBracketKeyword_4_1_1_0());

                            }
                            // InternalQVTrelation.g:1243:6: ( ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )* )?
                            int alt31=2;
                            int LA31_0 = input.LA(1);

                            if ( ((LA31_0>=RULE_SIMPLE_ID && LA31_0<=RULE_ESCAPED_ID)||LA31_0==17||(LA31_0>=25 && LA31_0<=32)||(LA31_0>=35 && LA31_0<=43)||(LA31_0>=45 && LA31_0<=47)||(LA31_0>=49 && LA31_0<=59)||LA31_0==61||LA31_0==63||LA31_0==65||LA31_0==68||LA31_0==70||LA31_0==72||(LA31_0>=74 && LA31_0<=77)||(LA31_0>=79 && LA31_0<=84)||LA31_0==86||LA31_0==88||(LA31_0>=90 && LA31_0<=91)) ) {
                                alt31=1;
                            }
                            switch (alt31) {
                                case 1 :
                                    // InternalQVTrelation.g:1244:7: ( ( ruleUnrestrictedName ) ) (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )*
                                    {
                                    // InternalQVTrelation.g:1244:7: ( ( ruleUnrestrictedName ) )
                                    // InternalQVTrelation.g:1245:8: ( ruleUnrestrictedName )
                                    {
                                    // InternalQVTrelation.g:1245:8: ( ruleUnrestrictedName )
                                    // InternalQVTrelation.g:1246:9: ruleUnrestrictedName
                                    {
                                    if ( state.backtracking==0 ) {

                                      									/* */

                                    }
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElement(grammarAccess.getModelDeclCSRule());
                                      									}

                                    }
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getModelDeclCSAccess().getIteratesTypedModelCrossReference_4_1_1_1_0_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_28);
                                    ruleUnrestrictedName();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }

                                    // InternalQVTrelation.g:1263:7: (otherlv_19= ',' ( ( ruleUnrestrictedName ) ) )*
                                    loop30:
                                    do {
                                        int alt30=2;
                                        int LA30_0 = input.LA(1);

                                        if ( (LA30_0==23) ) {
                                            alt30=1;
                                        }


                                        switch (alt30) {
                                    	case 1 :
                                    	    // InternalQVTrelation.g:1264:8: otherlv_19= ',' ( ( ruleUnrestrictedName ) )
                                    	    {
                                    	    otherlv_19=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      								newLeafNode(otherlv_19, grammarAccess.getModelDeclCSAccess().getCommaKeyword_4_1_1_1_1_0());

                                    	    }
                                    	    // InternalQVTrelation.g:1268:8: ( ( ruleUnrestrictedName ) )
                                    	    // InternalQVTrelation.g:1269:9: ( ruleUnrestrictedName )
                                    	    {
                                    	    // InternalQVTrelation.g:1269:9: ( ruleUnrestrictedName )
                                    	    // InternalQVTrelation.g:1270:10: ruleUnrestrictedName
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										/* */

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      										if (current==null) {
                                    	      											current = createModelElement(grammarAccess.getModelDeclCSRule());
                                    	      										}

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getModelDeclCSAccess().getIteratesTypedModelCrossReference_4_1_1_1_1_1_0());

                                    	    }
                                    	    pushFollow(FollowSets000.FOLLOW_28);
                                    	    ruleUnrestrictedName();

                                    	    state._fsp--;
                                    	    if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      										afterParserOrEnumRuleCall();

                                    	    }

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

                                    	default :
                                    	    break loop30;
                                        }
                                    } while (true);


                                    }
                                    break;

                            }

                            otherlv_21=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_21, grammarAccess.getModelDeclCSAccess().getRightCurlyBracketKeyword_4_1_1_2());

                            }

                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleModelDeclCS"


    // $ANTLR start "entryRuleObjectTemplateCS"
    // InternalQVTrelation.g:1300:1: entryRuleObjectTemplateCS returns [EObject current=null] : iv_ruleObjectTemplateCS= ruleObjectTemplateCS EOF ;
    public final EObject entryRuleObjectTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleObjectTemplateCS = null;


        try {
            // InternalQVTrelation.g:1300:57: (iv_ruleObjectTemplateCS= ruleObjectTemplateCS EOF )
            // InternalQVTrelation.g:1301:2: iv_ruleObjectTemplateCS= ruleObjectTemplateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getObjectTemplateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleObjectTemplateCS=ruleObjectTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleObjectTemplateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleObjectTemplateCS"


    // $ANTLR start "ruleObjectTemplateCS"
    // InternalQVTrelation.g:1307:1: ruleObjectTemplateCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedRefCS ) ) (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )? ) ;
    public final EObject ruleObjectTemplateCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedPropertyTemplates_4_0 = null;

        EObject lv_ownedPropertyTemplates_6_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1313:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedRefCS ) ) (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )? ) )
            // InternalQVTrelation.g:1314:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedRefCS ) ) (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )? )
            {
            // InternalQVTrelation.g:1314:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedRefCS ) ) (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )? )
            // InternalQVTrelation.g:1315:3: ( (lv_name_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedRefCS ) ) (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )?
            {
            // InternalQVTrelation.g:1315:3: ( (lv_name_0_0= ruleUnrestrictedName ) )?
            int alt34=2;
            int LA34_0 = input.LA(1);

            if ( ((LA34_0>=RULE_SIMPLE_ID && LA34_0<=RULE_ESCAPED_ID)||LA34_0==17||(LA34_0>=25 && LA34_0<=32)||(LA34_0>=35 && LA34_0<=43)||(LA34_0>=45 && LA34_0<=47)||(LA34_0>=49 && LA34_0<=59)||LA34_0==61||LA34_0==63||LA34_0==65||LA34_0==68||LA34_0==70||LA34_0==72||(LA34_0>=74 && LA34_0<=77)||(LA34_0>=79 && LA34_0<=84)||LA34_0==86||LA34_0==88||(LA34_0>=90 && LA34_0<=91)) ) {
                alt34=1;
            }
            switch (alt34) {
                case 1 :
                    // InternalQVTrelation.g:1316:4: (lv_name_0_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:1316:4: (lv_name_0_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:1317:5: lv_name_0_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getObjectTemplateCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_name_0_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getObjectTemplateCSRule());
                      					}
                      					set(
                      						current,
                      						"name",
                      						lv_name_0_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getObjectTemplateCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:1338:3: ( (lv_ownedType_2_0= ruleTypedRefCS ) )
            // InternalQVTrelation.g:1339:4: (lv_ownedType_2_0= ruleTypedRefCS )
            {
            // InternalQVTrelation.g:1339:4: (lv_ownedType_2_0= ruleTypedRefCS )
            // InternalQVTrelation.g:1340:5: lv_ownedType_2_0= ruleTypedRefCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getObjectTemplateCSAccess().getOwnedTypeTypedRefCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_13);
            lv_ownedType_2_0=ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getObjectTemplateCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:1357:3: (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )?
            int alt37=2;
            alt37 = dfa37.predict(input);
            switch (alt37) {
                case 1 :
                    // InternalQVTrelation.g:1358:4: otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}'
                    {
                    otherlv_3=(Token)match(input,20,FollowSets000.FOLLOW_26); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getObjectTemplateCSAccess().getLeftCurlyBracketKeyword_3_0());

                    }
                    // InternalQVTrelation.g:1362:4: ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )?
                    int alt36=2;
                    int LA36_0 = input.LA(1);

                    if ( ((LA36_0>=RULE_SIMPLE_ID && LA36_0<=RULE_ESCAPED_ID)||LA36_0==17||(LA36_0>=25 && LA36_0<=32)||(LA36_0>=35 && LA36_0<=43)||(LA36_0>=45 && LA36_0<=47)||(LA36_0>=49 && LA36_0<=59)||LA36_0==61||LA36_0==63||LA36_0==65||LA36_0==68||LA36_0==70||LA36_0==72||(LA36_0>=74 && LA36_0<=77)||(LA36_0>=79 && LA36_0<=84)||LA36_0==86||LA36_0==88||(LA36_0>=90 && LA36_0<=91)) ) {
                        alt36=1;
                    }
                    switch (alt36) {
                        case 1 :
                            // InternalQVTrelation.g:1363:5: ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )*
                            {
                            // InternalQVTrelation.g:1363:5: ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) )
                            // InternalQVTrelation.g:1364:6: (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS )
                            {
                            // InternalQVTrelation.g:1364:6: (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS )
                            // InternalQVTrelation.g:1365:7: lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getObjectTemplateCSAccess().getOwnedPropertyTemplatesPropertyTemplateCSParserRuleCall_3_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_28);
                            lv_ownedPropertyTemplates_4_0=rulePropertyTemplateCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getObjectTemplateCSRule());
                              							}
                              							add(
                              								current,
                              								"ownedPropertyTemplates",
                              								lv_ownedPropertyTemplates_4_0,
                              								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PropertyTemplateCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTrelation.g:1382:5: (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )*
                            loop35:
                            do {
                                int alt35=2;
                                int LA35_0 = input.LA(1);

                                if ( (LA35_0==23) ) {
                                    alt35=1;
                                }


                                switch (alt35) {
                            	case 1 :
                            	    // InternalQVTrelation.g:1383:6: otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) )
                            	    {
                            	    otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_5, grammarAccess.getObjectTemplateCSAccess().getCommaKeyword_3_1_1_0());

                            	    }
                            	    // InternalQVTrelation.g:1387:6: ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) )
                            	    // InternalQVTrelation.g:1388:7: (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS )
                            	    {
                            	    // InternalQVTrelation.g:1388:7: (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS )
                            	    // InternalQVTrelation.g:1389:8: lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getObjectTemplateCSAccess().getOwnedPropertyTemplatesPropertyTemplateCSParserRuleCall_3_1_1_1_0());

                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_28);
                            	    lv_ownedPropertyTemplates_6_0=rulePropertyTemplateCS();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getObjectTemplateCSRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"ownedPropertyTemplates",
                            	      									lv_ownedPropertyTemplates_6_0,
                            	      									"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PropertyTemplateCS");
                            	      								afterParserOrEnumRuleCall();

                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop35;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_7=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getObjectTemplateCSAccess().getRightCurlyBracketKeyword_3_2());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleObjectTemplateCS"


    // $ANTLR start "entryRuleParamDeclarationCS"
    // InternalQVTrelation.g:1417:1: entryRuleParamDeclarationCS returns [EObject current=null] : iv_ruleParamDeclarationCS= ruleParamDeclarationCS EOF ;
    public final EObject entryRuleParamDeclarationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParamDeclarationCS = null;


        try {
            // InternalQVTrelation.g:1417:59: (iv_ruleParamDeclarationCS= ruleParamDeclarationCS EOF )
            // InternalQVTrelation.g:1418:2: iv_ruleParamDeclarationCS= ruleParamDeclarationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParamDeclarationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParamDeclarationCS=ruleParamDeclarationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleParamDeclarationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleParamDeclarationCS"


    // $ANTLR start "ruleParamDeclarationCS"
    // InternalQVTrelation.g:1424:1: ruleParamDeclarationCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject ruleParamDeclarationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1430:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTrelation.g:1431:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTrelation.g:1431:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTrelation.g:1432:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTrelation.g:1432:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:1433:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:1433:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:1434:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getParamDeclarationCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getParamDeclarationCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getParamDeclarationCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:1455:3: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            // InternalQVTrelation.g:1456:4: (lv_ownedType_2_0= ruleTypeExpCS )
            {
            // InternalQVTrelation.g:1456:4: (lv_ownedType_2_0= ruleTypeExpCS )
            // InternalQVTrelation.g:1457:5: lv_ownedType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getParamDeclarationCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_2_0=ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getParamDeclarationCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleParamDeclarationCS"


    // $ANTLR start "entryRulePredicateCS"
    // InternalQVTrelation.g:1478:1: entryRulePredicateCS returns [EObject current=null] : iv_rulePredicateCS= rulePredicateCS EOF ;
    public final EObject entryRulePredicateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePredicateCS = null;


        try {
            // InternalQVTrelation.g:1478:52: (iv_rulePredicateCS= rulePredicateCS EOF )
            // InternalQVTrelation.g:1479:2: iv_rulePredicateCS= rulePredicateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPredicateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePredicateCS=rulePredicateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePredicateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePredicateCS"


    // $ANTLR start "rulePredicateCS"
    // InternalQVTrelation.g:1485:1: rulePredicateCS returns [EObject current=null] : ( ( (lv_ownedCondition_0_0= ruleExpCS ) ) otherlv_1= ';' ) ;
    public final EObject rulePredicateCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedCondition_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1491:2: ( ( ( (lv_ownedCondition_0_0= ruleExpCS ) ) otherlv_1= ';' ) )
            // InternalQVTrelation.g:1492:2: ( ( (lv_ownedCondition_0_0= ruleExpCS ) ) otherlv_1= ';' )
            {
            // InternalQVTrelation.g:1492:2: ( ( (lv_ownedCondition_0_0= ruleExpCS ) ) otherlv_1= ';' )
            // InternalQVTrelation.g:1493:3: ( (lv_ownedCondition_0_0= ruleExpCS ) ) otherlv_1= ';'
            {
            // InternalQVTrelation.g:1493:3: ( (lv_ownedCondition_0_0= ruleExpCS ) )
            // InternalQVTrelation.g:1494:4: (lv_ownedCondition_0_0= ruleExpCS )
            {
            // InternalQVTrelation.g:1494:4: (lv_ownedCondition_0_0= ruleExpCS )
            // InternalQVTrelation.g:1495:5: lv_ownedCondition_0_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPredicateCSAccess().getOwnedConditionExpCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_20);
            lv_ownedCondition_0_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPredicateCSRule());
              					}
              					set(
              						current,
              						"ownedCondition",
              						lv_ownedCondition_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getPredicateCSAccess().getSemicolonKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePredicateCS"


    // $ANTLR start "entryRulePrimitiveTypeDomainCS"
    // InternalQVTrelation.g:1520:1: entryRulePrimitiveTypeDomainCS returns [EObject current=null] : iv_rulePrimitiveTypeDomainCS= rulePrimitiveTypeDomainCS EOF ;
    public final EObject entryRulePrimitiveTypeDomainCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveTypeDomainCS = null;


        try {
            // InternalQVTrelation.g:1520:62: (iv_rulePrimitiveTypeDomainCS= rulePrimitiveTypeDomainCS EOF )
            // InternalQVTrelation.g:1521:2: iv_rulePrimitiveTypeDomainCS= rulePrimitiveTypeDomainCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveTypeDomainCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveTypeDomainCS=rulePrimitiveTypeDomainCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrimitiveTypeDomainCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrimitiveTypeDomainCS"


    // $ANTLR start "rulePrimitiveTypeDomainCS"
    // InternalQVTrelation.g:1527:1: rulePrimitiveTypeDomainCS returns [EObject current=null] : (otherlv_0= 'primitive' otherlv_1= 'domain' ( (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS ) ) (otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) ) )* otherlv_5= ';' ) ;
    public final EObject rulePrimitiveTypeDomainCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedPatterns_2_0 = null;

        EObject lv_ownedPatterns_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1533:2: ( (otherlv_0= 'primitive' otherlv_1= 'domain' ( (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS ) ) (otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) ) )* otherlv_5= ';' ) )
            // InternalQVTrelation.g:1534:2: (otherlv_0= 'primitive' otherlv_1= 'domain' ( (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS ) ) (otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) ) )* otherlv_5= ';' )
            {
            // InternalQVTrelation.g:1534:2: (otherlv_0= 'primitive' otherlv_1= 'domain' ( (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS ) ) (otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) ) )* otherlv_5= ';' )
            // InternalQVTrelation.g:1535:3: otherlv_0= 'primitive' otherlv_1= 'domain' ( (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS ) ) (otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) ) )* otherlv_5= ';'
            {
            otherlv_0=(Token)match(input,37,FollowSets000.FOLLOW_21); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getPrimitiveTypeDomainCSAccess().getPrimitiveKeyword_0());

            }
            otherlv_1=(Token)match(input,28,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getPrimitiveTypeDomainCSAccess().getDomainKeyword_1());

            }
            // InternalQVTrelation.g:1543:3: ( (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS ) )
            // InternalQVTrelation.g:1544:4: (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS )
            {
            // InternalQVTrelation.g:1544:4: (lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS )
            // InternalQVTrelation.g:1545:5: lv_ownedPatterns_2_0= rulePrimitiveTypeDomainPatternCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPrimitiveTypeDomainCSAccess().getOwnedPatternsPrimitiveTypeDomainPatternCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_34);
            lv_ownedPatterns_2_0=rulePrimitiveTypeDomainPatternCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPrimitiveTypeDomainCSRule());
              					}
              					add(
              						current,
              						"ownedPatterns",
              						lv_ownedPatterns_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PrimitiveTypeDomainPatternCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:1562:3: (otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) ) )*
            loop38:
            do {
                int alt38=2;
                int LA38_0 = input.LA(1);

                if ( (LA38_0==23) ) {
                    alt38=1;
                }


                switch (alt38) {
            	case 1 :
            	    // InternalQVTrelation.g:1563:4: otherlv_3= ',' ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) )
            	    {
            	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_3, grammarAccess.getPrimitiveTypeDomainCSAccess().getCommaKeyword_3_0());

            	    }
            	    // InternalQVTrelation.g:1567:4: ( (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS ) )
            	    // InternalQVTrelation.g:1568:5: (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS )
            	    {
            	    // InternalQVTrelation.g:1568:5: (lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS )
            	    // InternalQVTrelation.g:1569:6: lv_ownedPatterns_4_0= rulePrimitiveTypeDomainPatternCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getPrimitiveTypeDomainCSAccess().getOwnedPatternsPrimitiveTypeDomainPatternCSParserRuleCall_3_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_34);
            	    lv_ownedPatterns_4_0=rulePrimitiveTypeDomainPatternCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getPrimitiveTypeDomainCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedPatterns",
            	      							lv_ownedPatterns_4_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PrimitiveTypeDomainPatternCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop38;
                }
            } while (true);

            otherlv_5=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getPrimitiveTypeDomainCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrimitiveTypeDomainCS"


    // $ANTLR start "entryRulePrimitiveTypeDomainPatternCS"
    // InternalQVTrelation.g:1595:1: entryRulePrimitiveTypeDomainPatternCS returns [EObject current=null] : iv_rulePrimitiveTypeDomainPatternCS= rulePrimitiveTypeDomainPatternCS EOF ;
    public final EObject entryRulePrimitiveTypeDomainPatternCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveTypeDomainPatternCS = null;


        try {
            // InternalQVTrelation.g:1595:69: (iv_rulePrimitiveTypeDomainPatternCS= rulePrimitiveTypeDomainPatternCS EOF )
            // InternalQVTrelation.g:1596:2: iv_rulePrimitiveTypeDomainPatternCS= rulePrimitiveTypeDomainPatternCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveTypeDomainPatternCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveTypeDomainPatternCS=rulePrimitiveTypeDomainPatternCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrimitiveTypeDomainPatternCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrimitiveTypeDomainPatternCS"


    // $ANTLR start "rulePrimitiveTypeDomainPatternCS"
    // InternalQVTrelation.g:1602:1: rulePrimitiveTypeDomainPatternCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject rulePrimitiveTypeDomainPatternCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1608:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTrelation.g:1609:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTrelation.g:1609:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTrelation.g:1610:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTrelation.g:1610:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:1611:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:1611:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:1612:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPrimitiveTypeDomainPatternCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPrimitiveTypeDomainPatternCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getPrimitiveTypeDomainPatternCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:1633:3: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            // InternalQVTrelation.g:1634:4: (lv_ownedType_2_0= ruleTypeExpCS )
            {
            // InternalQVTrelation.g:1634:4: (lv_ownedType_2_0= ruleTypeExpCS )
            // InternalQVTrelation.g:1635:5: lv_ownedType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPrimitiveTypeDomainPatternCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_2_0=ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPrimitiveTypeDomainPatternCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrimitiveTypeDomainPatternCS"


    // $ANTLR start "entryRulePropertyTemplateCS"
    // InternalQVTrelation.g:1656:1: entryRulePropertyTemplateCS returns [EObject current=null] : iv_rulePropertyTemplateCS= rulePropertyTemplateCS EOF ;
    public final EObject entryRulePropertyTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePropertyTemplateCS = null;


        try {
            // InternalQVTrelation.g:1656:59: (iv_rulePropertyTemplateCS= rulePropertyTemplateCS EOF )
            // InternalQVTrelation.g:1657:2: iv_rulePropertyTemplateCS= rulePropertyTemplateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPropertyTemplateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePropertyTemplateCS=rulePropertyTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePropertyTemplateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePropertyTemplateCS"


    // $ANTLR start "rulePropertyTemplateCS"
    // InternalQVTrelation.g:1663:1: rulePropertyTemplateCS returns [EObject current=null] : ( ( ( ( ruleUnrestrictedName ) ) | (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' ) ) otherlv_5= '=' ( (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS ) ) ) ;
    public final EObject rulePropertyTemplateCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        EObject lv_ownedOppositePropertyId_3_0 = null;

        EObject lv_ownedExpression_6_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1669:2: ( ( ( ( ( ruleUnrestrictedName ) ) | (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' ) ) otherlv_5= '=' ( (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS ) ) ) )
            // InternalQVTrelation.g:1670:2: ( ( ( ( ruleUnrestrictedName ) ) | (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' ) ) otherlv_5= '=' ( (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS ) ) )
            {
            // InternalQVTrelation.g:1670:2: ( ( ( ( ruleUnrestrictedName ) ) | (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' ) ) otherlv_5= '=' ( (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS ) ) )
            // InternalQVTrelation.g:1671:3: ( ( ( ruleUnrestrictedName ) ) | (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' ) ) otherlv_5= '=' ( (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS ) )
            {
            // InternalQVTrelation.g:1671:3: ( ( ( ruleUnrestrictedName ) ) | (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' ) )
            int alt39=2;
            int LA39_0 = input.LA(1);

            if ( ((LA39_0>=RULE_SIMPLE_ID && LA39_0<=RULE_ESCAPED_ID)||LA39_0==17||(LA39_0>=25 && LA39_0<=31)||(LA39_0>=35 && LA39_0<=43)||(LA39_0>=45 && LA39_0<=47)||(LA39_0>=49 && LA39_0<=59)||LA39_0==61||LA39_0==63||LA39_0==65||LA39_0==68||LA39_0==70||LA39_0==72||(LA39_0>=74 && LA39_0<=77)||(LA39_0>=79 && LA39_0<=84)||LA39_0==86||LA39_0==88||(LA39_0>=90 && LA39_0<=91)) ) {
                alt39=1;
            }
            else if ( (LA39_0==32) ) {
                int LA39_2 = input.LA(2);

                if ( (LA39_2==19) ) {
                    alt39=1;
                }
                else if ( (LA39_2==33) ) {
                    alt39=2;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 39, 2, input);

                    throw nvae;
                }
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 39, 0, input);

                throw nvae;
            }
            switch (alt39) {
                case 1 :
                    // InternalQVTrelation.g:1672:4: ( ( ruleUnrestrictedName ) )
                    {
                    // InternalQVTrelation.g:1672:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:1673:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:1673:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:1674:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getPropertyTemplateCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPropertyTemplateCSAccess().getPropertyIdPropertyCrossReference_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_18);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:1692:4: (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' )
                    {
                    // InternalQVTrelation.g:1692:4: (otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')' )
                    // InternalQVTrelation.g:1693:5: otherlv_1= 'opposite' otherlv_2= '(' ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) ) otherlv_4= ')'
                    {
                    otherlv_1=(Token)match(input,32,FollowSets000.FOLLOW_29); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_1, grammarAccess.getPropertyTemplateCSAccess().getOppositeKeyword_0_1_0());

                    }
                    otherlv_2=(Token)match(input,33,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getPropertyTemplateCSAccess().getLeftParenthesisKeyword_0_1_1());

                    }
                    // InternalQVTrelation.g:1701:5: ( (lv_ownedOppositePropertyId_3_0= rulePathNameCS ) )
                    // InternalQVTrelation.g:1702:6: (lv_ownedOppositePropertyId_3_0= rulePathNameCS )
                    {
                    // InternalQVTrelation.g:1702:6: (lv_ownedOppositePropertyId_3_0= rulePathNameCS )
                    // InternalQVTrelation.g:1703:7: lv_ownedOppositePropertyId_3_0= rulePathNameCS
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getPropertyTemplateCSAccess().getOwnedOppositePropertyIdPathNameCSParserRuleCall_0_1_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_30);
                    lv_ownedOppositePropertyId_3_0=rulePathNameCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getPropertyTemplateCSRule());
                      							}
                      							set(
                      								current,
                      								"ownedOppositePropertyId",
                      								lv_ownedOppositePropertyId_3_0,
                      								"org.eclipse.ocl.xtext.base.Base.PathNameCS");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_18); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_4, grammarAccess.getPropertyTemplateCSAccess().getRightParenthesisKeyword_0_1_3());

                    }

                    }


                    }
                    break;

            }

            otherlv_5=(Token)match(input,19,FollowSets000.FOLLOW_35); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getPropertyTemplateCSAccess().getEqualsSignKeyword_1());

            }
            // InternalQVTrelation.g:1730:3: ( (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS ) )
            // InternalQVTrelation.g:1731:4: (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS )
            {
            // InternalQVTrelation.g:1731:4: (lv_ownedExpression_6_0= ruleExpCSOrTemplateCS )
            // InternalQVTrelation.g:1732:5: lv_ownedExpression_6_0= ruleExpCSOrTemplateCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPropertyTemplateCSAccess().getOwnedExpressionExpCSOrTemplateCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedExpression_6_0=ruleExpCSOrTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPropertyTemplateCSRule());
              					}
              					set(
              						current,
              						"ownedExpression",
              						lv_ownedExpression_6_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ExpCSOrTemplateCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePropertyTemplateCS"


    // $ANTLR start "entryRuleQueryCS"
    // InternalQVTrelation.g:1753:1: entryRuleQueryCS returns [EObject current=null] : iv_ruleQueryCS= ruleQueryCS EOF ;
    public final EObject entryRuleQueryCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleQueryCS = null;


        try {
            // InternalQVTrelation.g:1753:48: (iv_ruleQueryCS= ruleQueryCS EOF )
            // InternalQVTrelation.g:1754:2: iv_ruleQueryCS= ruleQueryCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQueryCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQueryCS=ruleQueryCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQueryCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQueryCS"


    // $ANTLR start "ruleQueryCS"
    // InternalQVTrelation.g:1760:1: ruleQueryCS returns [EObject current=null] : ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) ) ;
    public final EObject ruleQueryCS() throws RecognitionException {
        EObject current = null;

        Token lv_isTransient_0_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedParameters_4_0 = null;

        EObject lv_ownedParameters_6_0 = null;

        EObject lv_ownedType_9_0 = null;

        EObject lv_ownedExpression_12_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1766:2: ( ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) ) )
            // InternalQVTrelation.g:1767:2: ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) )
            {
            // InternalQVTrelation.g:1767:2: ( ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) ) )
            // InternalQVTrelation.g:1768:3: ( (lv_isTransient_0_0= 'transient' ) )? otherlv_1= 'query' ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )? otherlv_7= ')' otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypeExpCS ) ) (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) )
            {
            // InternalQVTrelation.g:1768:3: ( (lv_isTransient_0_0= 'transient' ) )?
            int alt40=2;
            int LA40_0 = input.LA(1);

            if ( (LA40_0==38) ) {
                alt40=1;
            }
            switch (alt40) {
                case 1 :
                    // InternalQVTrelation.g:1769:4: (lv_isTransient_0_0= 'transient' )
                    {
                    // InternalQVTrelation.g:1769:4: (lv_isTransient_0_0= 'transient' )
                    // InternalQVTrelation.g:1770:5: lv_isTransient_0_0= 'transient'
                    {
                    lv_isTransient_0_0=(Token)match(input,38,FollowSets000.FOLLOW_36); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_isTransient_0_0, grammarAccess.getQueryCSAccess().getIsTransientTransientKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getQueryCSRule());
                      					}
                      					setWithLastConsumed(current, "isTransient", lv_isTransient_0_0 != null, "transient");

                    }

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,39,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getQueryCSAccess().getQueryKeyword_1());

            }
            // InternalQVTrelation.g:1786:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:1787:4: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:1787:4: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:1788:5: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getQueryCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_29);
            lv_name_2_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getQueryCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_3=(Token)match(input,33,FollowSets000.FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getQueryCSAccess().getLeftParenthesisKeyword_3());

            }
            // InternalQVTrelation.g:1809:3: ( ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )* )?
            int alt42=2;
            int LA42_0 = input.LA(1);

            if ( ((LA42_0>=RULE_SIMPLE_ID && LA42_0<=RULE_ESCAPED_ID)||LA42_0==17||(LA42_0>=25 && LA42_0<=32)||(LA42_0>=35 && LA42_0<=43)||(LA42_0>=45 && LA42_0<=47)||(LA42_0>=49 && LA42_0<=59)||LA42_0==61||LA42_0==63||LA42_0==65||LA42_0==68||LA42_0==70||LA42_0==72||(LA42_0>=74 && LA42_0<=77)||(LA42_0>=79 && LA42_0<=84)||LA42_0==86||LA42_0==88||(LA42_0>=90 && LA42_0<=91)) ) {
                alt42=1;
            }
            switch (alt42) {
                case 1 :
                    // InternalQVTrelation.g:1810:4: ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) ) (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )*
                    {
                    // InternalQVTrelation.g:1810:4: ( (lv_ownedParameters_4_0= ruleParamDeclarationCS ) )
                    // InternalQVTrelation.g:1811:5: (lv_ownedParameters_4_0= ruleParamDeclarationCS )
                    {
                    // InternalQVTrelation.g:1811:5: (lv_ownedParameters_4_0= ruleParamDeclarationCS )
                    // InternalQVTrelation.g:1812:6: lv_ownedParameters_4_0= ruleParamDeclarationCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedParametersParamDeclarationCSParserRuleCall_4_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_38);
                    lv_ownedParameters_4_0=ruleParamDeclarationCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getQueryCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedParameters",
                      							lv_ownedParameters_4_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ParamDeclarationCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:1829:4: (otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) ) )*
                    loop41:
                    do {
                        int alt41=2;
                        int LA41_0 = input.LA(1);

                        if ( (LA41_0==23) ) {
                            alt41=1;
                        }


                        switch (alt41) {
                    	case 1 :
                    	    // InternalQVTrelation.g:1830:5: otherlv_5= ',' ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) )
                    	    {
                    	    otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_5, grammarAccess.getQueryCSAccess().getCommaKeyword_4_1_0());

                    	    }
                    	    // InternalQVTrelation.g:1834:5: ( (lv_ownedParameters_6_0= ruleParamDeclarationCS ) )
                    	    // InternalQVTrelation.g:1835:6: (lv_ownedParameters_6_0= ruleParamDeclarationCS )
                    	    {
                    	    // InternalQVTrelation.g:1835:6: (lv_ownedParameters_6_0= ruleParamDeclarationCS )
                    	    // InternalQVTrelation.g:1836:7: lv_ownedParameters_6_0= ruleParamDeclarationCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedParametersParamDeclarationCSParserRuleCall_4_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_38);
                    	    lv_ownedParameters_6_0=ruleParamDeclarationCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getQueryCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedParameters",
                    	      								lv_ownedParameters_6_0,
                    	      								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ParamDeclarationCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop41;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_7=(Token)match(input,34,FollowSets000.FOLLOW_11); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getQueryCSAccess().getRightParenthesisKeyword_5());

            }
            otherlv_8=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_8, grammarAccess.getQueryCSAccess().getColonKeyword_6());

            }
            // InternalQVTrelation.g:1863:3: ( (lv_ownedType_9_0= ruleTypeExpCS ) )
            // InternalQVTrelation.g:1864:4: (lv_ownedType_9_0= ruleTypeExpCS )
            {
            // InternalQVTrelation.g:1864:4: (lv_ownedType_9_0= ruleTypeExpCS )
            // InternalQVTrelation.g:1865:5: lv_ownedType_9_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedTypeTypeExpCSParserRuleCall_7_0());

            }
            pushFollow(FollowSets000.FOLLOW_39);
            lv_ownedType_9_0=ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getQueryCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_9_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:1882:3: (otherlv_10= ';' | (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' ) | (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' ) )
            int alt43=3;
            switch ( input.LA(1) ) {
            case 22:
                {
                alt43=1;
                }
                break;
            case 20:
                {
                alt43=2;
                }
                break;
            case 29:
                {
                alt43=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 43, 0, input);

                throw nvae;
            }

            switch (alt43) {
                case 1 :
                    // InternalQVTrelation.g:1883:4: otherlv_10= ';'
                    {
                    otherlv_10=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getQueryCSAccess().getSemicolonKeyword_8_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:1888:4: (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' )
                    {
                    // InternalQVTrelation.g:1888:4: (otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}' )
                    // InternalQVTrelation.g:1889:5: otherlv_11= '{' ( (lv_ownedExpression_12_0= ruleExpCS ) ) otherlv_13= '}'
                    {
                    otherlv_11=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_11, grammarAccess.getQueryCSAccess().getLeftCurlyBracketKeyword_8_1_0());

                    }
                    // InternalQVTrelation.g:1893:5: ( (lv_ownedExpression_12_0= ruleExpCS ) )
                    // InternalQVTrelation.g:1894:6: (lv_ownedExpression_12_0= ruleExpCS )
                    {
                    // InternalQVTrelation.g:1894:6: (lv_ownedExpression_12_0= ruleExpCS )
                    // InternalQVTrelation.g:1895:7: lv_ownedExpression_12_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getQueryCSAccess().getOwnedExpressionExpCSParserRuleCall_8_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_17);
                    lv_ownedExpression_12_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getQueryCSRule());
                      							}
                      							set(
                      								current,
                      								"ownedExpression",
                      								lv_ownedExpression_12_0,
                      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_13=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_13, grammarAccess.getQueryCSAccess().getRightCurlyBracketKeyword_8_1_2());

                    }

                    }


                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:1918:4: (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' )
                    {
                    // InternalQVTrelation.g:1918:4: (otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';' )
                    // InternalQVTrelation.g:1919:5: otherlv_14= 'implementedby' ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) ) otherlv_16= ';'
                    {
                    otherlv_14=(Token)match(input,29,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_14, grammarAccess.getQueryCSAccess().getImplementedbyKeyword_8_2_0());

                    }
                    // InternalQVTrelation.g:1923:5: ( (otherlv_15= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTrelation.g:1924:6: (otherlv_15= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTrelation.g:1924:6: (otherlv_15= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTrelation.g:1925:7: otherlv_15= RULE_SINGLE_QUOTED_STRING
                    {
                    if ( state.backtracking==0 ) {

                      							/* */

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getQueryCSRule());
                      							}

                    }
                    otherlv_15=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(otherlv_15, grammarAccess.getQueryCSAccess().getImplementationJavaClassCSCrossReference_8_2_1_0());

                    }

                    }


                    }

                    otherlv_16=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_16, grammarAccess.getQueryCSAccess().getSemicolonKeyword_8_2_2());

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQueryCS"


    // $ANTLR start "entryRuleRelationCS"
    // InternalQVTrelation.g:1949:1: entryRuleRelationCS returns [EObject current=null] : iv_ruleRelationCS= ruleRelationCS EOF ;
    public final EObject entryRuleRelationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRelationCS = null;


        try {
            // InternalQVTrelation.g:1949:51: (iv_ruleRelationCS= ruleRelationCS EOF )
            // InternalQVTrelation.g:1950:2: iv_ruleRelationCS= ruleRelationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRelationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRelationCS=ruleRelationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleRelationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleRelationCS"


    // $ANTLR start "ruleRelationCS"
    // InternalQVTrelation.g:1956:1: ruleRelationCS returns [EObject current=null] : ( ( (lv_isTop_0_0= 'top' ) )? ( (lv_isAbstract_1_0= 'abstract' ) )? otherlv_2= 'relation' ( (lv_name_3_0= ruleUnrestrictedName ) ) (otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) ) )? otherlv_6= '{' ( (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS ) )* ( ( (lv_ownedDomains_8_0= ruleDomainCS ) ) | ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) ) )+ ( (lv_ownedWhen_10_0= ruleWhenCS ) )? ( (lv_ownedWhere_11_0= ruleWhereCS ) )? otherlv_12= '}' ) ;
    public final EObject ruleRelationCS() throws RecognitionException {
        EObject current = null;

        Token lv_isTop_0_0=null;
        Token lv_isAbstract_1_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_12=null;
        AntlrDatatypeRuleToken lv_name_3_0 = null;

        EObject lv_ownedVarDeclarations_7_0 = null;

        EObject lv_ownedDomains_8_0 = null;

        EObject lv_ownedDomains_9_0 = null;

        EObject lv_ownedWhen_10_0 = null;

        EObject lv_ownedWhere_11_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:1962:2: ( ( ( (lv_isTop_0_0= 'top' ) )? ( (lv_isAbstract_1_0= 'abstract' ) )? otherlv_2= 'relation' ( (lv_name_3_0= ruleUnrestrictedName ) ) (otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) ) )? otherlv_6= '{' ( (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS ) )* ( ( (lv_ownedDomains_8_0= ruleDomainCS ) ) | ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) ) )+ ( (lv_ownedWhen_10_0= ruleWhenCS ) )? ( (lv_ownedWhere_11_0= ruleWhereCS ) )? otherlv_12= '}' ) )
            // InternalQVTrelation.g:1963:2: ( ( (lv_isTop_0_0= 'top' ) )? ( (lv_isAbstract_1_0= 'abstract' ) )? otherlv_2= 'relation' ( (lv_name_3_0= ruleUnrestrictedName ) ) (otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) ) )? otherlv_6= '{' ( (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS ) )* ( ( (lv_ownedDomains_8_0= ruleDomainCS ) ) | ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) ) )+ ( (lv_ownedWhen_10_0= ruleWhenCS ) )? ( (lv_ownedWhere_11_0= ruleWhereCS ) )? otherlv_12= '}' )
            {
            // InternalQVTrelation.g:1963:2: ( ( (lv_isTop_0_0= 'top' ) )? ( (lv_isAbstract_1_0= 'abstract' ) )? otherlv_2= 'relation' ( (lv_name_3_0= ruleUnrestrictedName ) ) (otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) ) )? otherlv_6= '{' ( (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS ) )* ( ( (lv_ownedDomains_8_0= ruleDomainCS ) ) | ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) ) )+ ( (lv_ownedWhen_10_0= ruleWhenCS ) )? ( (lv_ownedWhere_11_0= ruleWhereCS ) )? otherlv_12= '}' )
            // InternalQVTrelation.g:1964:3: ( (lv_isTop_0_0= 'top' ) )? ( (lv_isAbstract_1_0= 'abstract' ) )? otherlv_2= 'relation' ( (lv_name_3_0= ruleUnrestrictedName ) ) (otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) ) )? otherlv_6= '{' ( (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS ) )* ( ( (lv_ownedDomains_8_0= ruleDomainCS ) ) | ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) ) )+ ( (lv_ownedWhen_10_0= ruleWhenCS ) )? ( (lv_ownedWhere_11_0= ruleWhereCS ) )? otherlv_12= '}'
            {
            // InternalQVTrelation.g:1964:3: ( (lv_isTop_0_0= 'top' ) )?
            int alt44=2;
            int LA44_0 = input.LA(1);

            if ( (LA44_0==40) ) {
                alt44=1;
            }
            switch (alt44) {
                case 1 :
                    // InternalQVTrelation.g:1965:4: (lv_isTop_0_0= 'top' )
                    {
                    // InternalQVTrelation.g:1965:4: (lv_isTop_0_0= 'top' )
                    // InternalQVTrelation.g:1966:5: lv_isTop_0_0= 'top'
                    {
                    lv_isTop_0_0=(Token)match(input,40,FollowSets000.FOLLOW_40); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_isTop_0_0, grammarAccess.getRelationCSAccess().getIsTopTopKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getRelationCSRule());
                      					}
                      					setWithLastConsumed(current, "isTop", lv_isTop_0_0 != null, "top");

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:1978:3: ( (lv_isAbstract_1_0= 'abstract' ) )?
            int alt45=2;
            int LA45_0 = input.LA(1);

            if ( (LA45_0==41) ) {
                alt45=1;
            }
            switch (alt45) {
                case 1 :
                    // InternalQVTrelation.g:1979:4: (lv_isAbstract_1_0= 'abstract' )
                    {
                    // InternalQVTrelation.g:1979:4: (lv_isAbstract_1_0= 'abstract' )
                    // InternalQVTrelation.g:1980:5: lv_isAbstract_1_0= 'abstract'
                    {
                    lv_isAbstract_1_0=(Token)match(input,41,FollowSets000.FOLLOW_41); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_isAbstract_1_0, grammarAccess.getRelationCSAccess().getIsAbstractAbstractKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getRelationCSRule());
                      					}
                      					setWithLastConsumed(current, "isAbstract", lv_isAbstract_1_0 != null, "abstract");

                    }

                    }


                    }
                    break;

            }

            otherlv_2=(Token)match(input,42,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getRelationCSAccess().getRelationKeyword_2());

            }
            // InternalQVTrelation.g:1996:3: ( (lv_name_3_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:1997:4: (lv_name_3_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:1997:4: (lv_name_3_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:1998:5: lv_name_3_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getRelationCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_42);
            lv_name_3_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getRelationCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_3_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:2015:3: (otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) ) )?
            int alt46=2;
            int LA46_0 = input.LA(1);

            if ( (LA46_0==43) ) {
                alt46=1;
            }
            switch (alt46) {
                case 1 :
                    // InternalQVTrelation.g:2016:4: otherlv_4= 'overrides' ( ( ruleUnrestrictedName ) )
                    {
                    otherlv_4=(Token)match(input,43,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getRelationCSAccess().getOverridesKeyword_4_0());

                    }
                    // InternalQVTrelation.g:2020:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:2021:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:2021:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:2022:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getRelationCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getRelationCSAccess().getOverriddenRelationCrossReference_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_25);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getRelationCSAccess().getLeftCurlyBracketKeyword_5());

            }
            // InternalQVTrelation.g:2044:3: ( (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS ) )*
            loop47:
            do {
                int alt47=2;
                switch ( input.LA(1) ) {
                case 25:
                    {
                    int LA47_1 = input.LA(2);

                    if ( ((LA47_1>=18 && LA47_1<=19)||(LA47_1>=22 && LA47_1<=23)) ) {
                        alt47=1;
                    }


                    }
                    break;
                case 26:
                    {
                    int LA47_2 = input.LA(2);

                    if ( ((LA47_2>=18 && LA47_2<=19)||(LA47_2>=22 && LA47_2<=23)) ) {
                        alt47=1;
                    }


                    }
                    break;
                case 27:
                    {
                    int LA47_3 = input.LA(2);

                    if ( ((LA47_3>=18 && LA47_3<=19)||(LA47_3>=22 && LA47_3<=23)) ) {
                        alt47=1;
                    }


                    }
                    break;
                case 28:
                    {
                    int LA47_4 = input.LA(2);

                    if ( ((LA47_4>=18 && LA47_4<=19)||(LA47_4>=22 && LA47_4<=23)) ) {
                        alt47=1;
                    }


                    }
                    break;
                case 37:
                    {
                    int LA47_5 = input.LA(2);

                    if ( ((LA47_5>=18 && LA47_5<=19)||(LA47_5>=22 && LA47_5<=23)) ) {
                        alt47=1;
                    }


                    }
                    break;
                case RULE_SIMPLE_ID:
                case RULE_ESCAPED_ID:
                case 17:
                case 29:
                case 30:
                case 31:
                case 32:
                case 35:
                case 36:
                case 38:
                case 39:
                case 40:
                case 41:
                case 42:
                case 43:
                case 45:
                case 46:
                case 47:
                case 49:
                case 50:
                case 51:
                case 52:
                case 53:
                case 54:
                case 55:
                case 56:
                case 57:
                case 58:
                case 59:
                case 61:
                case 63:
                case 65:
                case 68:
                case 70:
                case 72:
                case 74:
                case 75:
                case 76:
                case 77:
                case 79:
                case 80:
                case 81:
                case 82:
                case 83:
                case 84:
                case 86:
                case 88:
                case 90:
                case 91:
                    {
                    alt47=1;
                    }
                    break;

                }

                switch (alt47) {
            	case 1 :
            	    // InternalQVTrelation.g:2045:4: (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS )
            	    {
            	    // InternalQVTrelation.g:2045:4: (lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS )
            	    // InternalQVTrelation.g:2046:5: lv_ownedVarDeclarations_7_0= ruleVarDeclarationCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getRelationCSAccess().getOwnedVarDeclarationsVarDeclarationCSParserRuleCall_6_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_5);
            	    lv_ownedVarDeclarations_7_0=ruleVarDeclarationCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getRelationCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedVarDeclarations",
            	      						lv_ownedVarDeclarations_7_0,
            	      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.VarDeclarationCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop47;
                }
            } while (true);

            // InternalQVTrelation.g:2063:3: ( ( (lv_ownedDomains_8_0= ruleDomainCS ) ) | ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) ) )+
            int cnt48=0;
            loop48:
            do {
                int alt48=3;
                int LA48_0 = input.LA(1);

                if ( ((LA48_0>=25 && LA48_0<=28)) ) {
                    alt48=1;
                }
                else if ( (LA48_0==37) ) {
                    alt48=2;
                }


                switch (alt48) {
            	case 1 :
            	    // InternalQVTrelation.g:2064:4: ( (lv_ownedDomains_8_0= ruleDomainCS ) )
            	    {
            	    // InternalQVTrelation.g:2064:4: ( (lv_ownedDomains_8_0= ruleDomainCS ) )
            	    // InternalQVTrelation.g:2065:5: (lv_ownedDomains_8_0= ruleDomainCS )
            	    {
            	    // InternalQVTrelation.g:2065:5: (lv_ownedDomains_8_0= ruleDomainCS )
            	    // InternalQVTrelation.g:2066:6: lv_ownedDomains_8_0= ruleDomainCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getRelationCSAccess().getOwnedDomainsDomainCSParserRuleCall_7_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_26);
            	    lv_ownedDomains_8_0=ruleDomainCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getRelationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedDomains",
            	      							lv_ownedDomains_8_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.DomainCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalQVTrelation.g:2084:4: ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) )
            	    {
            	    // InternalQVTrelation.g:2084:4: ( (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS ) )
            	    // InternalQVTrelation.g:2085:5: (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS )
            	    {
            	    // InternalQVTrelation.g:2085:5: (lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS )
            	    // InternalQVTrelation.g:2086:6: lv_ownedDomains_9_0= rulePrimitiveTypeDomainCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getRelationCSAccess().getOwnedDomainsPrimitiveTypeDomainCSParserRuleCall_7_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_26);
            	    lv_ownedDomains_9_0=rulePrimitiveTypeDomainCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getRelationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedDomains",
            	      							lv_ownedDomains_9_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PrimitiveTypeDomainCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt48 >= 1 ) break loop48;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(48, input);
                        throw eee;
                }
                cnt48++;
            } while (true);

            // InternalQVTrelation.g:2104:3: ( (lv_ownedWhen_10_0= ruleWhenCS ) )?
            int alt49=2;
            int LA49_0 = input.LA(1);

            if ( (LA49_0==49) ) {
                alt49=1;
            }
            switch (alt49) {
                case 1 :
                    // InternalQVTrelation.g:2105:4: (lv_ownedWhen_10_0= ruleWhenCS )
                    {
                    // InternalQVTrelation.g:2105:4: (lv_ownedWhen_10_0= ruleWhenCS )
                    // InternalQVTrelation.g:2106:5: lv_ownedWhen_10_0= ruleWhenCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getRelationCSAccess().getOwnedWhenWhenCSParserRuleCall_8_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_43);
                    lv_ownedWhen_10_0=ruleWhenCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getRelationCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedWhen",
                      						lv_ownedWhen_10_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.WhenCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:2123:3: ( (lv_ownedWhere_11_0= ruleWhereCS ) )?
            int alt50=2;
            int LA50_0 = input.LA(1);

            if ( (LA50_0==50) ) {
                alt50=1;
            }
            switch (alt50) {
                case 1 :
                    // InternalQVTrelation.g:2124:4: (lv_ownedWhere_11_0= ruleWhereCS )
                    {
                    // InternalQVTrelation.g:2124:4: (lv_ownedWhere_11_0= ruleWhereCS )
                    // InternalQVTrelation.g:2125:5: lv_ownedWhere_11_0= ruleWhereCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getRelationCSAccess().getOwnedWhereWhereCSParserRuleCall_9_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_17);
                    lv_ownedWhere_11_0=ruleWhereCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getRelationCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedWhere",
                      						lv_ownedWhere_11_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.WhereCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            otherlv_12=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_12, grammarAccess.getRelationCSAccess().getRightCurlyBracketKeyword_10());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleRelationCS"


    // $ANTLR start "entryRuleScopeNameCS"
    // InternalQVTrelation.g:2150:1: entryRuleScopeNameCS returns [EObject current=null] : iv_ruleScopeNameCS= ruleScopeNameCS EOF ;
    public final EObject entryRuleScopeNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleScopeNameCS = null;


        try {
            // InternalQVTrelation.g:2150:52: (iv_ruleScopeNameCS= ruleScopeNameCS EOF )
            // InternalQVTrelation.g:2151:2: iv_ruleScopeNameCS= ruleScopeNameCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getScopeNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleScopeNameCS=ruleScopeNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleScopeNameCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleScopeNameCS"


    // $ANTLR start "ruleScopeNameCS"
    // InternalQVTrelation.g:2157:1: ruleScopeNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* ) ;
    public final EObject ruleScopeNameCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedPathElements_0_0 = null;

        EObject lv_ownedPathElements_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2163:2: ( ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* ) )
            // InternalQVTrelation.g:2164:2: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* )
            {
            // InternalQVTrelation.g:2164:2: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )* )
            // InternalQVTrelation.g:2165:3: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) otherlv_1= '::' ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )*
            {
            // InternalQVTrelation.g:2165:3: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) )
            // InternalQVTrelation.g:2166:4: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            {
            // InternalQVTrelation.g:2166:4: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            // InternalQVTrelation.g:2167:5: lv_ownedPathElements_0_0= ruleFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getScopeNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_44);
            lv_ownedPathElements_0_0=ruleFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getScopeNameCSRule());
              					}
              					add(
              						current,
              						"ownedPathElements",
              						lv_ownedPathElements_0_0,
              						"org.eclipse.ocl.xtext.base.Base.FirstPathElementCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,44,FollowSets000.FOLLOW_45); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getScopeNameCSAccess().getColonColonKeyword_1());

            }
            // InternalQVTrelation.g:2188:3: ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )*
            loop51:
            do {
                int alt51=2;
                alt51 = dfa51.predict(input);
                switch (alt51) {
            	case 1 :
            	    // InternalQVTrelation.g:2189:4: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::'
            	    {
            	    // InternalQVTrelation.g:2189:4: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalQVTrelation.g:2190:5: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalQVTrelation.g:2190:5: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalQVTrelation.g:2191:6: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getScopeNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_2_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_44);
            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getScopeNameCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedPathElements",
            	      							lv_ownedPathElements_2_0,
            	      							"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }

            	    otherlv_3=(Token)match(input,44,FollowSets000.FOLLOW_45); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_3, grammarAccess.getScopeNameCSAccess().getColonColonKeyword_2_1());

            	    }

            	    }
            	    break;

            	default :
            	    break loop51;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleScopeNameCS"


    // $ANTLR start "entryRuleTemplateCS"
    // InternalQVTrelation.g:2217:1: entryRuleTemplateCS returns [EObject current=null] : iv_ruleTemplateCS= ruleTemplateCS EOF ;
    public final EObject entryRuleTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateCS = null;


        try {
            // InternalQVTrelation.g:2217:51: (iv_ruleTemplateCS= ruleTemplateCS EOF )
            // InternalQVTrelation.g:2218:2: iv_ruleTemplateCS= ruleTemplateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTemplateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTemplateCS=ruleTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTemplateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTemplateCS"


    // $ANTLR start "ruleTemplateCS"
    // InternalQVTrelation.g:2224:1: ruleTemplateCS returns [EObject current=null] : ( (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS ) (otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}' )? ) ;
    public final EObject ruleTemplateCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject this_CollectionTemplateCS_0 = null;

        EObject this_ObjectTemplateCS_1 = null;

        EObject lv_ownedGuardExpression_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2230:2: ( ( (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS ) (otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}' )? ) )
            // InternalQVTrelation.g:2231:2: ( (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS ) (otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}' )? )
            {
            // InternalQVTrelation.g:2231:2: ( (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS ) (otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}' )? )
            // InternalQVTrelation.g:2232:3: (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS ) (otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}' )?
            {
            // InternalQVTrelation.g:2232:3: (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS )
            int alt52=2;
            alt52 = dfa52.predict(input);
            switch (alt52) {
                case 1 :
                    // InternalQVTrelation.g:2233:4: this_CollectionTemplateCS_0= ruleCollectionTemplateCS
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getTemplateCSAccess().getCollectionTemplateCSParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_13);
                    this_CollectionTemplateCS_0=ruleCollectionTemplateCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_CollectionTemplateCS_0;
                      				afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:2245:4: this_ObjectTemplateCS_1= ruleObjectTemplateCS
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getTemplateCSAccess().getObjectTemplateCSParserRuleCall_0_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_13);
                    this_ObjectTemplateCS_1=ruleObjectTemplateCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_ObjectTemplateCS_1;
                      				afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:2257:3: (otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}' )?
            int alt53=2;
            int LA53_0 = input.LA(1);

            if ( (LA53_0==20) ) {
                alt53=1;
            }
            switch (alt53) {
                case 1 :
                    // InternalQVTrelation.g:2258:4: otherlv_2= '{' ( (lv_ownedGuardExpression_3_0= ruleExpCS ) ) otherlv_4= '}'
                    {
                    otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getTemplateCSAccess().getLeftCurlyBracketKeyword_1_0());

                    }
                    // InternalQVTrelation.g:2262:4: ( (lv_ownedGuardExpression_3_0= ruleExpCS ) )
                    // InternalQVTrelation.g:2263:5: (lv_ownedGuardExpression_3_0= ruleExpCS )
                    {
                    // InternalQVTrelation.g:2263:5: (lv_ownedGuardExpression_3_0= ruleExpCS )
                    // InternalQVTrelation.g:2264:6: lv_ownedGuardExpression_3_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getTemplateCSAccess().getOwnedGuardExpressionExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_17);
                    lv_ownedGuardExpression_3_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getTemplateCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedGuardExpression",
                      							lv_ownedGuardExpression_3_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getTemplateCSAccess().getRightCurlyBracketKeyword_1_2());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTemplateCS"


    // $ANTLR start "entryRuleTransformationCS"
    // InternalQVTrelation.g:2290:1: entryRuleTransformationCS returns [EObject current=null] : iv_ruleTransformationCS= ruleTransformationCS EOF ;
    public final EObject entryRuleTransformationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTransformationCS = null;


        try {
            // InternalQVTrelation.g:2290:57: (iv_ruleTransformationCS= ruleTransformationCS EOF )
            // InternalQVTrelation.g:2291:2: iv_ruleTransformationCS= ruleTransformationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTransformationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTransformationCS=ruleTransformationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTransformationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTransformationCS"


    // $ANTLR start "ruleTransformationCS"
    // InternalQVTrelation.g:2297:1: ruleTransformationCS returns [EObject current=null] : (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( (lv_ownedModelDecls_4_0= ruleModelDeclCS ) ) (otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) ) )* otherlv_7= ')' (otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_12= '{' ( (lv_ownedTargets_13_0= ruleTargetCS ) )* ( (lv_ownedKeyDecls_14_0= ruleKeyDeclCS ) )* ( ( (lv_ownedRelations_15_0= ruleRelationCS ) ) | ( (lv_ownedQueries_16_0= ruleQueryCS ) ) | ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) ) )* otherlv_18= '}' ) ;
    public final EObject ruleTransformationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_18=null;
        EObject lv_ownedPathName_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedModelDecls_4_0 = null;

        EObject lv_ownedModelDecls_6_0 = null;

        EObject lv_ownedTargets_13_0 = null;

        EObject lv_ownedKeyDecls_14_0 = null;

        EObject lv_ownedRelations_15_0 = null;

        EObject lv_ownedQueries_16_0 = null;

        EObject lv_ownedProperties_17_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2303:2: ( (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( (lv_ownedModelDecls_4_0= ruleModelDeclCS ) ) (otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) ) )* otherlv_7= ')' (otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_12= '{' ( (lv_ownedTargets_13_0= ruleTargetCS ) )* ( (lv_ownedKeyDecls_14_0= ruleKeyDeclCS ) )* ( ( (lv_ownedRelations_15_0= ruleRelationCS ) ) | ( (lv_ownedQueries_16_0= ruleQueryCS ) ) | ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) ) )* otherlv_18= '}' ) )
            // InternalQVTrelation.g:2304:2: (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( (lv_ownedModelDecls_4_0= ruleModelDeclCS ) ) (otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) ) )* otherlv_7= ')' (otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_12= '{' ( (lv_ownedTargets_13_0= ruleTargetCS ) )* ( (lv_ownedKeyDecls_14_0= ruleKeyDeclCS ) )* ( ( (lv_ownedRelations_15_0= ruleRelationCS ) ) | ( (lv_ownedQueries_16_0= ruleQueryCS ) ) | ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) ) )* otherlv_18= '}' )
            {
            // InternalQVTrelation.g:2304:2: (otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( (lv_ownedModelDecls_4_0= ruleModelDeclCS ) ) (otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) ) )* otherlv_7= ')' (otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_12= '{' ( (lv_ownedTargets_13_0= ruleTargetCS ) )* ( (lv_ownedKeyDecls_14_0= ruleKeyDeclCS ) )* ( ( (lv_ownedRelations_15_0= ruleRelationCS ) ) | ( (lv_ownedQueries_16_0= ruleQueryCS ) ) | ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) ) )* otherlv_18= '}' )
            // InternalQVTrelation.g:2305:3: otherlv_0= 'transformation' ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )? ( (lv_name_2_0= ruleUnrestrictedName ) ) otherlv_3= '(' ( (lv_ownedModelDecls_4_0= ruleModelDeclCS ) ) (otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) ) )* otherlv_7= ')' (otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_12= '{' ( (lv_ownedTargets_13_0= ruleTargetCS ) )* ( (lv_ownedKeyDecls_14_0= ruleKeyDeclCS ) )* ( ( (lv_ownedRelations_15_0= ruleRelationCS ) ) | ( (lv_ownedQueries_16_0= ruleQueryCS ) ) | ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) ) )* otherlv_18= '}'
            {
            otherlv_0=(Token)match(input,45,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTransformationCSAccess().getTransformationKeyword_0());

            }
            // InternalQVTrelation.g:2309:3: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?
            int alt54=2;
            alt54 = dfa54.predict(input);
            switch (alt54) {
                case 1 :
                    // InternalQVTrelation.g:2310:4: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    {
                    // InternalQVTrelation.g:2310:4: (lv_ownedPathName_1_0= ruleScopeNameCS )
                    // InternalQVTrelation.g:2311:5: lv_ownedPathName_1_0= ruleScopeNameCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedPathNameScopeNameCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_5);
                    lv_ownedPathName_1_0=ruleScopeNameCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getTransformationCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedPathName",
                      						lv_ownedPathName_1_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ScopeNameCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:2328:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:2329:4: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:2329:4: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:2330:5: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTransformationCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_29);
            lv_name_2_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTransformationCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_3=(Token)match(input,33,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getTransformationCSAccess().getLeftParenthesisKeyword_3());

            }
            // InternalQVTrelation.g:2351:3: ( (lv_ownedModelDecls_4_0= ruleModelDeclCS ) )
            // InternalQVTrelation.g:2352:4: (lv_ownedModelDecls_4_0= ruleModelDeclCS )
            {
            // InternalQVTrelation.g:2352:4: (lv_ownedModelDecls_4_0= ruleModelDeclCS )
            // InternalQVTrelation.g:2353:5: lv_ownedModelDecls_4_0= ruleModelDeclCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedModelDeclsModelDeclCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_38);
            lv_ownedModelDecls_4_0=ruleModelDeclCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTransformationCSRule());
              					}
              					add(
              						current,
              						"ownedModelDecls",
              						lv_ownedModelDecls_4_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ModelDeclCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:2370:3: (otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) ) )*
            loop55:
            do {
                int alt55=2;
                int LA55_0 = input.LA(1);

                if ( (LA55_0==23) ) {
                    alt55=1;
                }


                switch (alt55) {
            	case 1 :
            	    // InternalQVTrelation.g:2371:4: otherlv_5= ',' ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) )
            	    {
            	    otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_5, grammarAccess.getTransformationCSAccess().getCommaKeyword_5_0());

            	    }
            	    // InternalQVTrelation.g:2375:4: ( (lv_ownedModelDecls_6_0= ruleModelDeclCS ) )
            	    // InternalQVTrelation.g:2376:5: (lv_ownedModelDecls_6_0= ruleModelDeclCS )
            	    {
            	    // InternalQVTrelation.g:2376:5: (lv_ownedModelDecls_6_0= ruleModelDeclCS )
            	    // InternalQVTrelation.g:2377:6: lv_ownedModelDecls_6_0= ruleModelDeclCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedModelDeclsModelDeclCSParserRuleCall_5_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_38);
            	    lv_ownedModelDecls_6_0=ruleModelDeclCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedModelDecls",
            	      							lv_ownedModelDecls_6_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.ModelDeclCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop55;
                }
            } while (true);

            otherlv_7=(Token)match(input,34,FollowSets000.FOLLOW_46); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getTransformationCSAccess().getRightParenthesisKeyword_6());

            }
            // InternalQVTrelation.g:2399:3: (otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )* )?
            int alt57=2;
            int LA57_0 = input.LA(1);

            if ( (LA57_0==46) ) {
                alt57=1;
            }
            switch (alt57) {
                case 1 :
                    // InternalQVTrelation.g:2400:4: otherlv_8= 'extends' ( ( ruleUnrestrictedName ) ) (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )*
                    {
                    otherlv_8=(Token)match(input,46,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getTransformationCSAccess().getExtendsKeyword_7_0());

                    }
                    // InternalQVTrelation.g:2404:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:2405:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:2405:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:2406:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getTransformationCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getTransformationCSAccess().getExtendsTransformationCrossReference_7_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_47);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:2423:4: (otherlv_10= ',' ( ( ruleUnrestrictedName ) ) )*
                    loop56:
                    do {
                        int alt56=2;
                        int LA56_0 = input.LA(1);

                        if ( (LA56_0==23) ) {
                            alt56=1;
                        }


                        switch (alt56) {
                    	case 1 :
                    	    // InternalQVTrelation.g:2424:5: otherlv_10= ',' ( ( ruleUnrestrictedName ) )
                    	    {
                    	    otherlv_10=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_10, grammarAccess.getTransformationCSAccess().getCommaKeyword_7_2_0());

                    	    }
                    	    // InternalQVTrelation.g:2428:5: ( ( ruleUnrestrictedName ) )
                    	    // InternalQVTrelation.g:2429:6: ( ruleUnrestrictedName )
                    	    {
                    	    // InternalQVTrelation.g:2429:6: ( ruleUnrestrictedName )
                    	    // InternalQVTrelation.g:2430:7: ruleUnrestrictedName
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							/* */

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElement(grammarAccess.getTransformationCSRule());
                    	      							}

                    	    }
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getTransformationCSAccess().getExtendsTransformationCrossReference_7_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_47);
                    	    ruleUnrestrictedName();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop56;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_12=(Token)match(input,20,FollowSets000.FOLLOW_48); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_12, grammarAccess.getTransformationCSAccess().getLeftCurlyBracketKeyword_8());

            }
            // InternalQVTrelation.g:2453:3: ( (lv_ownedTargets_13_0= ruleTargetCS ) )*
            loop58:
            do {
                int alt58=2;
                int LA58_0 = input.LA(1);

                if ( (LA58_0==54) ) {
                    alt58=1;
                }


                switch (alt58) {
            	case 1 :
            	    // InternalQVTrelation.g:2454:4: (lv_ownedTargets_13_0= ruleTargetCS )
            	    {
            	    // InternalQVTrelation.g:2454:4: (lv_ownedTargets_13_0= ruleTargetCS )
            	    // InternalQVTrelation.g:2455:5: lv_ownedTargets_13_0= ruleTargetCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedTargetsTargetCSParserRuleCall_9_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_48);
            	    lv_ownedTargets_13_0=ruleTargetCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedTargets",
            	      						lv_ownedTargets_13_0,
            	      						"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TargetCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop58;
                }
            } while (true);

            // InternalQVTrelation.g:2472:3: ( (lv_ownedKeyDecls_14_0= ruleKeyDeclCS ) )*
            loop59:
            do {
                int alt59=2;
                int LA59_0 = input.LA(1);

                if ( (LA59_0==31) ) {
                    alt59=1;
                }


                switch (alt59) {
            	case 1 :
            	    // InternalQVTrelation.g:2473:4: (lv_ownedKeyDecls_14_0= ruleKeyDeclCS )
            	    {
            	    // InternalQVTrelation.g:2473:4: (lv_ownedKeyDecls_14_0= ruleKeyDeclCS )
            	    // InternalQVTrelation.g:2474:5: lv_ownedKeyDecls_14_0= ruleKeyDeclCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedKeyDeclsKeyDeclCSParserRuleCall_10_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_49);
            	    lv_ownedKeyDecls_14_0=ruleKeyDeclCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedKeyDecls",
            	      						lv_ownedKeyDecls_14_0,
            	      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.KeyDeclCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop59;
                }
            } while (true);

            // InternalQVTrelation.g:2491:3: ( ( (lv_ownedRelations_15_0= ruleRelationCS ) ) | ( (lv_ownedQueries_16_0= ruleQueryCS ) ) | ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) ) )*
            loop60:
            do {
                int alt60=4;
                switch ( input.LA(1) ) {
                case 40:
                case 41:
                case 42:
                    {
                    alt60=1;
                    }
                    break;
                case 38:
                case 39:
                    {
                    alt60=2;
                    }
                    break;
                case 56:
                case 57:
                case 58:
                case 84:
                    {
                    alt60=3;
                    }
                    break;

                }

                switch (alt60) {
            	case 1 :
            	    // InternalQVTrelation.g:2492:4: ( (lv_ownedRelations_15_0= ruleRelationCS ) )
            	    {
            	    // InternalQVTrelation.g:2492:4: ( (lv_ownedRelations_15_0= ruleRelationCS ) )
            	    // InternalQVTrelation.g:2493:5: (lv_ownedRelations_15_0= ruleRelationCS )
            	    {
            	    // InternalQVTrelation.g:2493:5: (lv_ownedRelations_15_0= ruleRelationCS )
            	    // InternalQVTrelation.g:2494:6: lv_ownedRelations_15_0= ruleRelationCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedRelationsRelationCSParserRuleCall_11_0_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_50);
            	    lv_ownedRelations_15_0=ruleRelationCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedRelations",
            	      							lv_ownedRelations_15_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.RelationCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // InternalQVTrelation.g:2512:4: ( (lv_ownedQueries_16_0= ruleQueryCS ) )
            	    {
            	    // InternalQVTrelation.g:2512:4: ( (lv_ownedQueries_16_0= ruleQueryCS ) )
            	    // InternalQVTrelation.g:2513:5: (lv_ownedQueries_16_0= ruleQueryCS )
            	    {
            	    // InternalQVTrelation.g:2513:5: (lv_ownedQueries_16_0= ruleQueryCS )
            	    // InternalQVTrelation.g:2514:6: lv_ownedQueries_16_0= ruleQueryCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedQueriesQueryCSParserRuleCall_11_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_50);
            	    lv_ownedQueries_16_0=ruleQueryCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedQueries",
            	      							lv_ownedQueries_16_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.QueryCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // InternalQVTrelation.g:2532:4: ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) )
            	    {
            	    // InternalQVTrelation.g:2532:4: ( (lv_ownedProperties_17_0= ruleStructuralFeatureCS ) )
            	    // InternalQVTrelation.g:2533:5: (lv_ownedProperties_17_0= ruleStructuralFeatureCS )
            	    {
            	    // InternalQVTrelation.g:2533:5: (lv_ownedProperties_17_0= ruleStructuralFeatureCS )
            	    // InternalQVTrelation.g:2534:6: lv_ownedProperties_17_0= ruleStructuralFeatureCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTransformationCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_11_2_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_50);
            	    lv_ownedProperties_17_0=ruleStructuralFeatureCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTransformationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedProperties",
            	      							lv_ownedProperties_17_0,
            	      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.StructuralFeatureCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop60;
                }
            } while (true);

            otherlv_18=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_18, grammarAccess.getTransformationCSAccess().getRightCurlyBracketKeyword_12());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTransformationCS"


    // $ANTLR start "entryRuleUnitCS"
    // InternalQVTrelation.g:2560:1: entryRuleUnitCS returns [EObject current=null] : iv_ruleUnitCS= ruleUnitCS EOF ;
    public final EObject entryRuleUnitCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnitCS = null;


        try {
            // InternalQVTrelation.g:2560:47: (iv_ruleUnitCS= ruleUnitCS EOF )
            // InternalQVTrelation.g:2561:2: iv_ruleUnitCS= ruleUnitCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnitCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnitCS=ruleUnitCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnitCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUnitCS"


    // $ANTLR start "ruleUnitCS"
    // InternalQVTrelation.g:2567:1: ruleUnitCS returns [EObject current=null] : (otherlv_0= 'import' ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) (otherlv_4= '::' ( (lv_isAll_5_0= '*' ) ) )? otherlv_6= ';' ) ;
    public final EObject ruleUnitCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token lv_isAll_5_0=null;
        Token otherlv_6=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedPathName_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2573:2: ( (otherlv_0= 'import' ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) (otherlv_4= '::' ( (lv_isAll_5_0= '*' ) ) )? otherlv_6= ';' ) )
            // InternalQVTrelation.g:2574:2: (otherlv_0= 'import' ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) (otherlv_4= '::' ( (lv_isAll_5_0= '*' ) ) )? otherlv_6= ';' )
            {
            // InternalQVTrelation.g:2574:2: (otherlv_0= 'import' ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) (otherlv_4= '::' ( (lv_isAll_5_0= '*' ) ) )? otherlv_6= ';' )
            // InternalQVTrelation.g:2575:3: otherlv_0= 'import' ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )? ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) ) (otherlv_4= '::' ( (lv_isAll_5_0= '*' ) ) )? otherlv_6= ';'
            {
            otherlv_0=(Token)match(input,47,FollowSets000.FOLLOW_51); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getUnitCSAccess().getImportKeyword_0());

            }
            // InternalQVTrelation.g:2579:3: ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )?
            int alt61=2;
            alt61 = dfa61.predict(input);
            switch (alt61) {
                case 1 :
                    // InternalQVTrelation.g:2580:4: ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':'
                    {
                    // InternalQVTrelation.g:2580:4: ( (lv_name_1_0= ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:2581:5: (lv_name_1_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:2581:5: (lv_name_1_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:2582:6: lv_name_1_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getUnitCSAccess().getNameUnrestrictedNameParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_name_1_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getUnitCSRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_1_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getUnitCSAccess().getColonKeyword_1_1());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:2604:3: ( (lv_ownedPathName_3_0= ruleURIPathNameCS ) )
            // InternalQVTrelation.g:2605:4: (lv_ownedPathName_3_0= ruleURIPathNameCS )
            {
            // InternalQVTrelation.g:2605:4: (lv_ownedPathName_3_0= ruleURIPathNameCS )
            // InternalQVTrelation.g:2606:5: lv_ownedPathName_3_0= ruleURIPathNameCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getUnitCSAccess().getOwnedPathNameURIPathNameCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_52);
            lv_ownedPathName_3_0=ruleURIPathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getUnitCSRule());
              					}
              					set(
              						current,
              						"ownedPathName",
              						lv_ownedPathName_3_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.URIPathNameCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:2623:3: (otherlv_4= '::' ( (lv_isAll_5_0= '*' ) ) )?
            int alt62=2;
            int LA62_0 = input.LA(1);

            if ( (LA62_0==44) ) {
                alt62=1;
            }
            switch (alt62) {
                case 1 :
                    // InternalQVTrelation.g:2624:4: otherlv_4= '::' ( (lv_isAll_5_0= '*' ) )
                    {
                    otherlv_4=(Token)match(input,44,FollowSets000.FOLLOW_53); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getUnitCSAccess().getColonColonKeyword_3_0());

                    }
                    // InternalQVTrelation.g:2628:4: ( (lv_isAll_5_0= '*' ) )
                    // InternalQVTrelation.g:2629:5: (lv_isAll_5_0= '*' )
                    {
                    // InternalQVTrelation.g:2629:5: (lv_isAll_5_0= '*' )
                    // InternalQVTrelation.g:2630:6: lv_isAll_5_0= '*'
                    {
                    lv_isAll_5_0=(Token)match(input,48,FollowSets000.FOLLOW_20); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isAll_5_0, grammarAccess.getUnitCSAccess().getIsAllAsteriskKeyword_3_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getUnitCSRule());
                      						}
                      						setWithLastConsumed(current, "isAll", lv_isAll_5_0 != null, "*");

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_6=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_6, grammarAccess.getUnitCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnitCS"


    // $ANTLR start "entryRuleVarDeclarationCS"
    // InternalQVTrelation.g:2651:1: entryRuleVarDeclarationCS returns [EObject current=null] : iv_ruleVarDeclarationCS= ruleVarDeclarationCS EOF ;
    public final EObject entryRuleVarDeclarationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleVarDeclarationCS = null;


        try {
            // InternalQVTrelation.g:2651:57: (iv_ruleVarDeclarationCS= ruleVarDeclarationCS EOF )
            // InternalQVTrelation.g:2652:2: iv_ruleVarDeclarationCS= ruleVarDeclarationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getVarDeclarationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleVarDeclarationCS=ruleVarDeclarationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleVarDeclarationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleVarDeclarationCS"


    // $ANTLR start "ruleVarDeclarationCS"
    // InternalQVTrelation.g:2658:1: ruleVarDeclarationCS returns [EObject current=null] : ( ( (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS ) ) (otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) ) )* (otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) ) )? (otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) ) )? otherlv_7= ';' ) ;
    public final EObject ruleVarDeclarationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedVarDeclarationIds_0_0 = null;

        EObject lv_ownedVarDeclarationIds_2_0 = null;

        EObject lv_ownedType_4_0 = null;

        EObject lv_ownedInitExpression_6_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2664:2: ( ( ( (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS ) ) (otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) ) )* (otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) ) )? (otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) ) )? otherlv_7= ';' ) )
            // InternalQVTrelation.g:2665:2: ( ( (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS ) ) (otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) ) )* (otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) ) )? (otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) ) )? otherlv_7= ';' )
            {
            // InternalQVTrelation.g:2665:2: ( ( (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS ) ) (otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) ) )* (otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) ) )? (otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) ) )? otherlv_7= ';' )
            // InternalQVTrelation.g:2666:3: ( (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS ) ) (otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) ) )* (otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) ) )? (otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) ) )? otherlv_7= ';'
            {
            // InternalQVTrelation.g:2666:3: ( (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS ) )
            // InternalQVTrelation.g:2667:4: (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS )
            {
            // InternalQVTrelation.g:2667:4: (lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS )
            // InternalQVTrelation.g:2668:5: lv_ownedVarDeclarationIds_0_0= ruleVarDeclarationIdCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getVarDeclarationCSAccess().getOwnedVarDeclarationIdsVarDeclarationIdCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_54);
            lv_ownedVarDeclarationIds_0_0=ruleVarDeclarationIdCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getVarDeclarationCSRule());
              					}
              					add(
              						current,
              						"ownedVarDeclarationIds",
              						lv_ownedVarDeclarationIds_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.VarDeclarationIdCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:2685:3: (otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) ) )*
            loop63:
            do {
                int alt63=2;
                int LA63_0 = input.LA(1);

                if ( (LA63_0==23) ) {
                    alt63=1;
                }


                switch (alt63) {
            	case 1 :
            	    // InternalQVTrelation.g:2686:4: otherlv_1= ',' ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) )
            	    {
            	    otherlv_1=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getVarDeclarationCSAccess().getCommaKeyword_1_0());

            	    }
            	    // InternalQVTrelation.g:2690:4: ( (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS ) )
            	    // InternalQVTrelation.g:2691:5: (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS )
            	    {
            	    // InternalQVTrelation.g:2691:5: (lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS )
            	    // InternalQVTrelation.g:2692:6: lv_ownedVarDeclarationIds_2_0= ruleVarDeclarationIdCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getVarDeclarationCSAccess().getOwnedVarDeclarationIdsVarDeclarationIdCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_54);
            	    lv_ownedVarDeclarationIds_2_0=ruleVarDeclarationIdCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getVarDeclarationCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedVarDeclarationIds",
            	      							lv_ownedVarDeclarationIds_2_0,
            	      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.VarDeclarationIdCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop63;
                }
            } while (true);

            // InternalQVTrelation.g:2710:3: (otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) ) )?
            int alt64=2;
            int LA64_0 = input.LA(1);

            if ( (LA64_0==18) ) {
                alt64=1;
            }
            switch (alt64) {
                case 1 :
                    // InternalQVTrelation.g:2711:4: otherlv_3= ':' ( (lv_ownedType_4_0= ruleTypeExpCS ) )
                    {
                    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getVarDeclarationCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTrelation.g:2715:4: ( (lv_ownedType_4_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:2716:5: (lv_ownedType_4_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:2716:5: (lv_ownedType_4_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:2717:6: lv_ownedType_4_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getVarDeclarationCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_55);
                    lv_ownedType_4_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getVarDeclarationCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_4_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:2735:3: (otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) ) )?
            int alt65=2;
            int LA65_0 = input.LA(1);

            if ( (LA65_0==19) ) {
                alt65=1;
            }
            switch (alt65) {
                case 1 :
                    // InternalQVTrelation.g:2736:4: otherlv_5= '=' ( (lv_ownedInitExpression_6_0= ruleExpCS ) )
                    {
                    otherlv_5=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getVarDeclarationCSAccess().getEqualsSignKeyword_3_0());

                    }
                    // InternalQVTrelation.g:2740:4: ( (lv_ownedInitExpression_6_0= ruleExpCS ) )
                    // InternalQVTrelation.g:2741:5: (lv_ownedInitExpression_6_0= ruleExpCS )
                    {
                    // InternalQVTrelation.g:2741:5: (lv_ownedInitExpression_6_0= ruleExpCS )
                    // InternalQVTrelation.g:2742:6: lv_ownedInitExpression_6_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getVarDeclarationCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_20);
                    lv_ownedInitExpression_6_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getVarDeclarationCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedInitExpression",
                      							lv_ownedInitExpression_6_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_7=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getVarDeclarationCSAccess().getSemicolonKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleVarDeclarationCS"


    // $ANTLR start "entryRuleVarDeclarationIdCS"
    // InternalQVTrelation.g:2768:1: entryRuleVarDeclarationIdCS returns [EObject current=null] : iv_ruleVarDeclarationIdCS= ruleVarDeclarationIdCS EOF ;
    public final EObject entryRuleVarDeclarationIdCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleVarDeclarationIdCS = null;


        try {
            // InternalQVTrelation.g:2768:59: (iv_ruleVarDeclarationIdCS= ruleVarDeclarationIdCS EOF )
            // InternalQVTrelation.g:2769:2: iv_ruleVarDeclarationIdCS= ruleVarDeclarationIdCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getVarDeclarationIdCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleVarDeclarationIdCS=ruleVarDeclarationIdCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleVarDeclarationIdCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleVarDeclarationIdCS"


    // $ANTLR start "ruleVarDeclarationIdCS"
    // InternalQVTrelation.g:2775:1: ruleVarDeclarationIdCS returns [EObject current=null] : ( (lv_name_0_0= ruleUnrestrictedName ) ) ;
    public final EObject ruleVarDeclarationIdCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2781:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) )
            // InternalQVTrelation.g:2782:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            {
            // InternalQVTrelation.g:2782:2: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:2783:3: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:2783:3: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:2784:4: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getVarDeclarationIdCSAccess().getNameUnrestrictedNameParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getVarDeclarationIdCSRule());
              				}
              				set(
              					current,
              					"name",
              					lv_name_0_0,
              					"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleVarDeclarationIdCS"


    // $ANTLR start "entryRuleWhenCS"
    // InternalQVTrelation.g:2804:1: entryRuleWhenCS returns [EObject current=null] : iv_ruleWhenCS= ruleWhenCS EOF ;
    public final EObject entryRuleWhenCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWhenCS = null;


        try {
            // InternalQVTrelation.g:2804:47: (iv_ruleWhenCS= ruleWhenCS EOF )
            // InternalQVTrelation.g:2805:2: iv_ruleWhenCS= ruleWhenCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getWhenCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleWhenCS=ruleWhenCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleWhenCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleWhenCS"


    // $ANTLR start "ruleWhenCS"
    // InternalQVTrelation.g:2811:1: ruleWhenCS returns [EObject current=null] : ( () otherlv_1= 'when' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' ) ;
    public final EObject ruleWhenCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedPredicates_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2817:2: ( ( () otherlv_1= 'when' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' ) )
            // InternalQVTrelation.g:2818:2: ( () otherlv_1= 'when' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' )
            {
            // InternalQVTrelation.g:2818:2: ( () otherlv_1= 'when' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' )
            // InternalQVTrelation.g:2819:3: () otherlv_1= 'when' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}'
            {
            // InternalQVTrelation.g:2819:3: ()
            // InternalQVTrelation.g:2820:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getWhenCSAccess().getPatternCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,49,FollowSets000.FOLLOW_25); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getWhenCSAccess().getWhenKeyword_1());

            }
            otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getWhenCSAccess().getLeftCurlyBracketKeyword_2());

            }
            // InternalQVTrelation.g:2837:3: ( (lv_ownedPredicates_3_0= rulePredicateCS ) )*
            loop66:
            do {
                int alt66=2;
                int LA66_0 = input.LA(1);

                if ( (LA66_0==RULE_SINGLE_QUOTED_STRING||(LA66_0>=RULE_INT && LA66_0<=RULE_ESCAPED_ID)||LA66_0==17||(LA66_0>=25 && LA66_0<=33)||(LA66_0>=35 && LA66_0<=43)||(LA66_0>=45 && LA66_0<=59)||LA66_0==61||LA66_0==63||LA66_0==65||LA66_0==68||LA66_0==70||LA66_0==72||(LA66_0>=74 && LA66_0<=77)||(LA66_0>=79 && LA66_0<=84)||LA66_0==86||LA66_0==88||(LA66_0>=90 && LA66_0<=94)||(LA66_0>=114 && LA66_0<=128)||LA66_0==130||(LA66_0>=132 && LA66_0<=135)||LA66_0==142||(LA66_0>=147 && LA66_0<=148)) ) {
                    alt66=1;
                }


                switch (alt66) {
            	case 1 :
            	    // InternalQVTrelation.g:2838:4: (lv_ownedPredicates_3_0= rulePredicateCS )
            	    {
            	    // InternalQVTrelation.g:2838:4: (lv_ownedPredicates_3_0= rulePredicateCS )
            	    // InternalQVTrelation.g:2839:5: lv_ownedPredicates_3_0= rulePredicateCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getWhenCSAccess().getOwnedPredicatesPredicateCSParserRuleCall_3_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_56);
            	    lv_ownedPredicates_3_0=rulePredicateCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getWhenCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedPredicates",
            	      						lv_ownedPredicates_3_0,
            	      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PredicateCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop66;
                }
            } while (true);

            otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getWhenCSAccess().getRightCurlyBracketKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleWhenCS"


    // $ANTLR start "entryRuleWhereCS"
    // InternalQVTrelation.g:2864:1: entryRuleWhereCS returns [EObject current=null] : iv_ruleWhereCS= ruleWhereCS EOF ;
    public final EObject entryRuleWhereCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWhereCS = null;


        try {
            // InternalQVTrelation.g:2864:48: (iv_ruleWhereCS= ruleWhereCS EOF )
            // InternalQVTrelation.g:2865:2: iv_ruleWhereCS= ruleWhereCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getWhereCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleWhereCS=ruleWhereCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleWhereCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleWhereCS"


    // $ANTLR start "ruleWhereCS"
    // InternalQVTrelation.g:2871:1: ruleWhereCS returns [EObject current=null] : ( () otherlv_1= 'where' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' ) ;
    public final EObject ruleWhereCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedPredicates_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2877:2: ( ( () otherlv_1= 'where' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' ) )
            // InternalQVTrelation.g:2878:2: ( () otherlv_1= 'where' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' )
            {
            // InternalQVTrelation.g:2878:2: ( () otherlv_1= 'where' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}' )
            // InternalQVTrelation.g:2879:3: () otherlv_1= 'where' otherlv_2= '{' ( (lv_ownedPredicates_3_0= rulePredicateCS ) )* otherlv_4= '}'
            {
            // InternalQVTrelation.g:2879:3: ()
            // InternalQVTrelation.g:2880:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getWhereCSAccess().getPatternCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,50,FollowSets000.FOLLOW_25); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getWhereCSAccess().getWhereKeyword_1());

            }
            otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getWhereCSAccess().getLeftCurlyBracketKeyword_2());

            }
            // InternalQVTrelation.g:2897:3: ( (lv_ownedPredicates_3_0= rulePredicateCS ) )*
            loop67:
            do {
                int alt67=2;
                int LA67_0 = input.LA(1);

                if ( (LA67_0==RULE_SINGLE_QUOTED_STRING||(LA67_0>=RULE_INT && LA67_0<=RULE_ESCAPED_ID)||LA67_0==17||(LA67_0>=25 && LA67_0<=33)||(LA67_0>=35 && LA67_0<=43)||(LA67_0>=45 && LA67_0<=59)||LA67_0==61||LA67_0==63||LA67_0==65||LA67_0==68||LA67_0==70||LA67_0==72||(LA67_0>=74 && LA67_0<=77)||(LA67_0>=79 && LA67_0<=84)||LA67_0==86||LA67_0==88||(LA67_0>=90 && LA67_0<=94)||(LA67_0>=114 && LA67_0<=128)||LA67_0==130||(LA67_0>=132 && LA67_0<=135)||LA67_0==142||(LA67_0>=147 && LA67_0<=148)) ) {
                    alt67=1;
                }


                switch (alt67) {
            	case 1 :
            	    // InternalQVTrelation.g:2898:4: (lv_ownedPredicates_3_0= rulePredicateCS )
            	    {
            	    // InternalQVTrelation.g:2898:4: (lv_ownedPredicates_3_0= rulePredicateCS )
            	    // InternalQVTrelation.g:2899:5: lv_ownedPredicates_3_0= rulePredicateCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getWhereCSAccess().getOwnedPredicatesPredicateCSParserRuleCall_3_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_56);
            	    lv_ownedPredicates_3_0=rulePredicateCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getWhereCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedPredicates",
            	      						lv_ownedPredicates_3_0,
            	      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.PredicateCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop67;
                }
            } while (true);

            otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getWhereCSAccess().getRightCurlyBracketKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleWhereCS"


    // $ANTLR start "entryRuleExpCSOrTemplateCS"
    // InternalQVTrelation.g:2924:1: entryRuleExpCSOrTemplateCS returns [EObject current=null] : iv_ruleExpCSOrTemplateCS= ruleExpCSOrTemplateCS EOF ;
    public final EObject entryRuleExpCSOrTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleExpCSOrTemplateCS = null;


        try {
            // InternalQVTrelation.g:2924:58: (iv_ruleExpCSOrTemplateCS= ruleExpCSOrTemplateCS EOF )
            // InternalQVTrelation.g:2925:2: iv_ruleExpCSOrTemplateCS= ruleExpCSOrTemplateCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getExpCSOrTemplateCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleExpCSOrTemplateCS=ruleExpCSOrTemplateCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleExpCSOrTemplateCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleExpCSOrTemplateCS"


    // $ANTLR start "ruleExpCSOrTemplateCS"
    // InternalQVTrelation.g:2931:1: ruleExpCSOrTemplateCS returns [EObject current=null] : (this_ExpCS_0= ruleExpCS | this_TemplateCS_1= ruleTemplateCS ) ;
    public final EObject ruleExpCSOrTemplateCS() throws RecognitionException {
        EObject current = null;

        EObject this_ExpCS_0 = null;

        EObject this_TemplateCS_1 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2937:2: ( (this_ExpCS_0= ruleExpCS | this_TemplateCS_1= ruleTemplateCS ) )
            // InternalQVTrelation.g:2938:2: (this_ExpCS_0= ruleExpCS | this_TemplateCS_1= ruleTemplateCS )
            {
            // InternalQVTrelation.g:2938:2: (this_ExpCS_0= ruleExpCS | this_TemplateCS_1= ruleTemplateCS )
            int alt68=2;
            alt68 = dfa68.predict(input);
            switch (alt68) {
                case 1 :
                    // InternalQVTrelation.g:2939:3: this_ExpCS_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getExpCSOrTemplateCSAccess().getExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ExpCS_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_ExpCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:2951:3: this_TemplateCS_1= ruleTemplateCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getExpCSOrTemplateCSAccess().getTemplateCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TemplateCS_1=ruleTemplateCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TemplateCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleExpCSOrTemplateCS"


    // $ANTLR start "entryRuleTypedTypeRefCS"
    // InternalQVTrelation.g:2966:1: entryRuleTypedTypeRefCS returns [EObject current=null] : iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF ;
    public final EObject entryRuleTypedTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedTypeRefCS = null;


        try {
            // InternalQVTrelation.g:2966:55: (iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF )
            // InternalQVTrelation.g:2967:2: iv_ruleTypedTypeRefCS= ruleTypedTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypedTypeRefCS=ruleTypedTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypedTypeRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypedTypeRefCS"


    // $ANTLR start "ruleTypedTypeRefCS"
    // InternalQVTrelation.g:2973:1: ruleTypedTypeRefCS returns [EObject current=null] : ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ;
    public final EObject ruleTypedTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedPathName_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:2979:2: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) )
            // InternalQVTrelation.g:2980:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            {
            // InternalQVTrelation.g:2980:2: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalQVTrelation.g:2981:3: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalQVTrelation.g:2981:3: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalQVTrelation.g:2982:4: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getTypedTypeRefCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedPathName_0_0=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getTypedTypeRefCSRule());
              				}
              				set(
              					current,
              					"ownedPathName",
              					lv_ownedPathName_0_0,
              					"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypedTypeRefCS"


    // $ANTLR start "entryRuleTypedRefCS"
    // InternalQVTrelation.g:3002:1: entryRuleTypedRefCS returns [EObject current=null] : iv_ruleTypedRefCS= ruleTypedRefCS EOF ;
    public final EObject entryRuleTypedRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedRefCS = null;


        try {
            // InternalQVTrelation.g:3002:51: (iv_ruleTypedRefCS= ruleTypedRefCS EOF )
            // InternalQVTrelation.g:3003:2: iv_ruleTypedRefCS= ruleTypedRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypedRefCS=ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypedRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypedRefCS"


    // $ANTLR start "ruleTypedRefCS"
    // InternalQVTrelation.g:3009:1: ruleTypedRefCS returns [EObject current=null] : ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) | (this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) | (this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )? ) ) ;
    public final EObject ruleTypedRefCS() throws RecognitionException {
        EObject current = null;

        EObject this_PrimitiveTypeCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;

        EObject this_CollectionTypeCS_2 = null;

        EObject lv_ownedMultiplicity_3_0 = null;

        EObject this_TypedTypeRefCS_4 = null;

        EObject lv_ownedMultiplicity_5_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:3015:2: ( ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) | (this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) | (this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )? ) ) )
            // InternalQVTrelation.g:3016:2: ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) | (this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) | (this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )? ) )
            {
            // InternalQVTrelation.g:3016:2: ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) | (this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? ) | (this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )? ) )
            int alt72=3;
            switch ( input.LA(1) ) {
            case 116:
            case 117:
            case 118:
            case 119:
            case 120:
            case 121:
            case 122:
            case 123:
                {
                alt72=1;
                }
                break;
            case 124:
            case 125:
            case 126:
            case 127:
            case 128:
                {
                alt72=2;
                }
                break;
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 25:
            case 26:
            case 27:
            case 28:
            case 29:
            case 30:
            case 31:
            case 32:
            case 35:
            case 36:
            case 37:
            case 38:
            case 39:
            case 40:
            case 41:
            case 42:
            case 43:
            case 45:
            case 46:
            case 47:
            case 49:
            case 50:
            case 51:
            case 52:
            case 53:
            case 54:
            case 55:
            case 56:
            case 57:
            case 58:
            case 59:
            case 61:
            case 63:
            case 65:
            case 68:
            case 70:
            case 72:
            case 74:
            case 75:
            case 76:
            case 77:
            case 79:
            case 80:
            case 81:
            case 82:
            case 83:
            case 84:
            case 86:
            case 88:
            case 90:
            case 91:
                {
                alt72=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 72, 0, input);

                throw nvae;
            }

            switch (alt72) {
                case 1 :
                    // InternalQVTrelation.g:3017:3: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
                    {
                    // InternalQVTrelation.g:3017:3: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
                    // InternalQVTrelation.g:3018:4: this_PrimitiveTypeCS_0= rulePrimitiveTypeCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getTypedRefCSAccess().getPrimitiveTypeCSParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_57);
                    this_PrimitiveTypeCS_0=rulePrimitiveTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_PrimitiveTypeCS_0;
                      				afterParserOrEnumRuleCall();

                    }
                    // InternalQVTrelation.g:3029:4: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
                    int alt69=2;
                    alt69 = dfa69.predict(input);
                    switch (alt69) {
                        case 1 :
                            // InternalQVTrelation.g:3030:5: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                            {
                            // InternalQVTrelation.g:3030:5: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                            // InternalQVTrelation.g:3031:6: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                            {
                            if ( state.backtracking==0 ) {

                              						newCompositeNode(grammarAccess.getTypedRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElementForParent(grammarAccess.getTypedRefCSRule());
                              						}
                              						set(
                              							current,
                              							"ownedMultiplicity",
                              							lv_ownedMultiplicity_1_0,
                              							"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                              						afterParserOrEnumRuleCall();

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:3050:3: (this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
                    {
                    // InternalQVTrelation.g:3050:3: (this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )? )
                    // InternalQVTrelation.g:3051:4: this_CollectionTypeCS_2= ruleCollectionTypeCS ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getTypedRefCSAccess().getCollectionTypeCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_57);
                    this_CollectionTypeCS_2=ruleCollectionTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_CollectionTypeCS_2;
                      				afterParserOrEnumRuleCall();

                    }
                    // InternalQVTrelation.g:3062:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?
                    int alt70=2;
                    alt70 = dfa70.predict(input);
                    switch (alt70) {
                        case 1 :
                            // InternalQVTrelation.g:3063:5: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                            {
                            // InternalQVTrelation.g:3063:5: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
                            // InternalQVTrelation.g:3064:6: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
                            {
                            if ( state.backtracking==0 ) {

                              						newCompositeNode(grammarAccess.getTypedRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedMultiplicity_3_0=ruleMultiplicityCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElementForParent(grammarAccess.getTypedRefCSRule());
                              						}
                              						set(
                              							current,
                              							"ownedMultiplicity",
                              							lv_ownedMultiplicity_3_0,
                              							"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                              						afterParserOrEnumRuleCall();

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:3083:3: (this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )? )
                    {
                    // InternalQVTrelation.g:3083:3: (this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )? )
                    // InternalQVTrelation.g:3084:4: this_TypedTypeRefCS_4= ruleTypedTypeRefCS ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getTypedRefCSAccess().getTypedTypeRefCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_57);
                    this_TypedTypeRefCS_4=ruleTypedTypeRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_TypedTypeRefCS_4;
                      				afterParserOrEnumRuleCall();

                    }
                    // InternalQVTrelation.g:3095:4: ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )?
                    int alt71=2;
                    alt71 = dfa71.predict(input);
                    switch (alt71) {
                        case 1 :
                            // InternalQVTrelation.g:3096:5: (lv_ownedMultiplicity_5_0= ruleMultiplicityCS )
                            {
                            // InternalQVTrelation.g:3096:5: (lv_ownedMultiplicity_5_0= ruleMultiplicityCS )
                            // InternalQVTrelation.g:3097:6: lv_ownedMultiplicity_5_0= ruleMultiplicityCS
                            {
                            if ( state.backtracking==0 ) {

                              						newCompositeNode(grammarAccess.getTypedRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedMultiplicity_5_0=ruleMultiplicityCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElementForParent(grammarAccess.getTypedRefCSRule());
                              						}
                              						set(
                              							current,
                              							"ownedMultiplicity",
                              							lv_ownedMultiplicity_5_0,
                              							"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                              						afterParserOrEnumRuleCall();

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypedRefCS"


    // $ANTLR start "entryRuleQVTrelationUnrestrictedName"
    // InternalQVTrelation.g:3119:1: entryRuleQVTrelationUnrestrictedName returns [String current=null] : iv_ruleQVTrelationUnrestrictedName= ruleQVTrelationUnrestrictedName EOF ;
    public final String entryRuleQVTrelationUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQVTrelationUnrestrictedName = null;


        try {
            // InternalQVTrelation.g:3119:67: (iv_ruleQVTrelationUnrestrictedName= ruleQVTrelationUnrestrictedName EOF )
            // InternalQVTrelation.g:3120:2: iv_ruleQVTrelationUnrestrictedName= ruleQVTrelationUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQVTrelationUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQVTrelationUnrestrictedName=ruleQVTrelationUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQVTrelationUnrestrictedName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQVTrelationUnrestrictedName"


    // $ANTLR start "ruleQVTrelationUnrestrictedName"
    // InternalQVTrelation.g:3126:1: ruleQVTrelationUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'abstract' | kw= 'checkonly' | kw= 'default_values' | kw= 'dependsOn' | kw= 'domain' | kw= 'enforce' | kw= 'extends' | kw= 'implementedby' | kw= 'import' | kw= 'input' | kw= 'iterates' | kw= 'library' | kw= 'key' | kw= 'opposite' | kw= 'output' | kw= 'overrides' | kw= 'package' | kw= 'primitive' | kw= 'query' | kw= 'relation' | kw= 'replace' | kw= 'target' | kw= 'top' | kw= 'transformation' | kw= 'via' | kw= 'when' | kw= 'where' ) ;
    public final AntlrDatatypeRuleToken ruleQVTrelationUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:3132:2: ( (kw= 'abstract' | kw= 'checkonly' | kw= 'default_values' | kw= 'dependsOn' | kw= 'domain' | kw= 'enforce' | kw= 'extends' | kw= 'implementedby' | kw= 'import' | kw= 'input' | kw= 'iterates' | kw= 'library' | kw= 'key' | kw= 'opposite' | kw= 'output' | kw= 'overrides' | kw= 'package' | kw= 'primitive' | kw= 'query' | kw= 'relation' | kw= 'replace' | kw= 'target' | kw= 'top' | kw= 'transformation' | kw= 'via' | kw= 'when' | kw= 'where' ) )
            // InternalQVTrelation.g:3133:2: (kw= 'abstract' | kw= 'checkonly' | kw= 'default_values' | kw= 'dependsOn' | kw= 'domain' | kw= 'enforce' | kw= 'extends' | kw= 'implementedby' | kw= 'import' | kw= 'input' | kw= 'iterates' | kw= 'library' | kw= 'key' | kw= 'opposite' | kw= 'output' | kw= 'overrides' | kw= 'package' | kw= 'primitive' | kw= 'query' | kw= 'relation' | kw= 'replace' | kw= 'target' | kw= 'top' | kw= 'transformation' | kw= 'via' | kw= 'when' | kw= 'where' )
            {
            // InternalQVTrelation.g:3133:2: (kw= 'abstract' | kw= 'checkonly' | kw= 'default_values' | kw= 'dependsOn' | kw= 'domain' | kw= 'enforce' | kw= 'extends' | kw= 'implementedby' | kw= 'import' | kw= 'input' | kw= 'iterates' | kw= 'library' | kw= 'key' | kw= 'opposite' | kw= 'output' | kw= 'overrides' | kw= 'package' | kw= 'primitive' | kw= 'query' | kw= 'relation' | kw= 'replace' | kw= 'target' | kw= 'top' | kw= 'transformation' | kw= 'via' | kw= 'when' | kw= 'where' )
            int alt73=27;
            switch ( input.LA(1) ) {
            case 41:
                {
                alt73=1;
                }
                break;
            case 25:
                {
                alt73=2;
                }
                break;
            case 30:
                {
                alt73=3;
                }
                break;
            case 35:
                {
                alt73=4;
                }
                break;
            case 28:
                {
                alt73=5;
                }
                break;
            case 26:
                {
                alt73=6;
                }
                break;
            case 46:
                {
                alt73=7;
                }
                break;
            case 29:
                {
                alt73=8;
                }
                break;
            case 47:
                {
                alt73=9;
                }
                break;
            case 51:
                {
                alt73=10;
                }
                break;
            case 36:
                {
                alt73=11;
                }
                break;
            case 52:
                {
                alt73=12;
                }
                break;
            case 31:
                {
                alt73=13;
                }
                break;
            case 32:
                {
                alt73=14;
                }
                break;
            case 53:
                {
                alt73=15;
                }
                break;
            case 43:
                {
                alt73=16;
                }
                break;
            case 17:
                {
                alt73=17;
                }
                break;
            case 37:
                {
                alt73=18;
                }
                break;
            case 39:
                {
                alt73=19;
                }
                break;
            case 42:
                {
                alt73=20;
                }
                break;
            case 27:
                {
                alt73=21;
                }
                break;
            case 54:
                {
                alt73=22;
                }
                break;
            case 40:
                {
                alt73=23;
                }
                break;
            case 45:
                {
                alt73=24;
                }
                break;
            case 55:
                {
                alt73=25;
                }
                break;
            case 49:
                {
                alt73=26;
                }
                break;
            case 50:
                {
                alt73=27;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 73, 0, input);

                throw nvae;
            }

            switch (alt73) {
                case 1 :
                    // InternalQVTrelation.g:3134:3: kw= 'abstract'
                    {
                    kw=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getAbstractKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:3140:3: kw= 'checkonly'
                    {
                    kw=(Token)match(input,25,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getCheckonlyKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:3146:3: kw= 'default_values'
                    {
                    kw=(Token)match(input,30,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getDefault_valuesKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:3152:3: kw= 'dependsOn'
                    {
                    kw=(Token)match(input,35,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getDependsOnKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:3158:3: kw= 'domain'
                    {
                    kw=(Token)match(input,28,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getDomainKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTrelation.g:3164:3: kw= 'enforce'
                    {
                    kw=(Token)match(input,26,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getEnforceKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTrelation.g:3170:3: kw= 'extends'
                    {
                    kw=(Token)match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getExtendsKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTrelation.g:3176:3: kw= 'implementedby'
                    {
                    kw=(Token)match(input,29,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getImplementedbyKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTrelation.g:3182:3: kw= 'import'
                    {
                    kw=(Token)match(input,47,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getImportKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTrelation.g:3188:3: kw= 'input'
                    {
                    kw=(Token)match(input,51,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getInputKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalQVTrelation.g:3194:3: kw= 'iterates'
                    {
                    kw=(Token)match(input,36,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getIteratesKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalQVTrelation.g:3200:3: kw= 'library'
                    {
                    kw=(Token)match(input,52,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getLibraryKeyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalQVTrelation.g:3206:3: kw= 'key'
                    {
                    kw=(Token)match(input,31,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getKeyKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalQVTrelation.g:3212:3: kw= 'opposite'
                    {
                    kw=(Token)match(input,32,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getOppositeKeyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalQVTrelation.g:3218:3: kw= 'output'
                    {
                    kw=(Token)match(input,53,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getOutputKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalQVTrelation.g:3224:3: kw= 'overrides'
                    {
                    kw=(Token)match(input,43,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getOverridesKeyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalQVTrelation.g:3230:3: kw= 'package'
                    {
                    kw=(Token)match(input,17,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getPackageKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalQVTrelation.g:3236:3: kw= 'primitive'
                    {
                    kw=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getPrimitiveKeyword_17());

                    }

                    }
                    break;
                case 19 :
                    // InternalQVTrelation.g:3242:3: kw= 'query'
                    {
                    kw=(Token)match(input,39,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getQueryKeyword_18());

                    }

                    }
                    break;
                case 20 :
                    // InternalQVTrelation.g:3248:3: kw= 'relation'
                    {
                    kw=(Token)match(input,42,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getRelationKeyword_19());

                    }

                    }
                    break;
                case 21 :
                    // InternalQVTrelation.g:3254:3: kw= 'replace'
                    {
                    kw=(Token)match(input,27,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getReplaceKeyword_20());

                    }

                    }
                    break;
                case 22 :
                    // InternalQVTrelation.g:3260:3: kw= 'target'
                    {
                    kw=(Token)match(input,54,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getTargetKeyword_21());

                    }

                    }
                    break;
                case 23 :
                    // InternalQVTrelation.g:3266:3: kw= 'top'
                    {
                    kw=(Token)match(input,40,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getTopKeyword_22());

                    }

                    }
                    break;
                case 24 :
                    // InternalQVTrelation.g:3272:3: kw= 'transformation'
                    {
                    kw=(Token)match(input,45,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getTransformationKeyword_23());

                    }

                    }
                    break;
                case 25 :
                    // InternalQVTrelation.g:3278:3: kw= 'via'
                    {
                    kw=(Token)match(input,55,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getViaKeyword_24());

                    }

                    }
                    break;
                case 26 :
                    // InternalQVTrelation.g:3284:3: kw= 'when'
                    {
                    kw=(Token)match(input,49,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getWhenKeyword_25());

                    }

                    }
                    break;
                case 27 :
                    // InternalQVTrelation.g:3290:3: kw= 'where'
                    {
                    kw=(Token)match(input,50,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTrelationUnrestrictedNameAccess().getWhereKeyword_26());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQVTrelationUnrestrictedName"


    // $ANTLR start "entryRuleUnrestrictedName"
    // InternalQVTrelation.g:3299:1: entryRuleUnrestrictedName returns [String current=null] : iv_ruleUnrestrictedName= ruleUnrestrictedName EOF ;
    public final String entryRuleUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnrestrictedName = null;


        try {
            // InternalQVTrelation.g:3299:56: (iv_ruleUnrestrictedName= ruleUnrestrictedName EOF )
            // InternalQVTrelation.g:3300:2: iv_ruleUnrestrictedName= ruleUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnrestrictedName=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnrestrictedName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUnrestrictedName"


    // $ANTLR start "ruleUnrestrictedName"
    // InternalQVTrelation.g:3306:1: ruleUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTrelationUnrestrictedName_2= ruleQVTrelationUnrestrictedName ) ;
    public final AntlrDatatypeRuleToken ruleUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnrestrictedName_0 = null;

        AntlrDatatypeRuleToken this_QVTbaseUnrestrictedName_1 = null;

        AntlrDatatypeRuleToken this_QVTrelationUnrestrictedName_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:3312:2: ( (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTrelationUnrestrictedName_2= ruleQVTrelationUnrestrictedName ) )
            // InternalQVTrelation.g:3313:2: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTrelationUnrestrictedName_2= ruleQVTrelationUnrestrictedName )
            {
            // InternalQVTrelation.g:3313:2: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName | this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName | this_QVTrelationUnrestrictedName_2= ruleQVTrelationUnrestrictedName )
            int alt74=3;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
                {
                alt74=1;
                }
                break;
            case 41:
                {
                int LA74_2 = input.LA(2);

                if ( (synpred109_InternalQVTrelation()) ) {
                    alt74=2;
                }
                else if ( (true) ) {
                    alt74=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 74, 2, input);

                    throw nvae;
                }
                }
                break;
            case 38:
            case 56:
            case 57:
            case 58:
            case 59:
            case 61:
            case 63:
            case 65:
            case 68:
            case 70:
            case 72:
            case 74:
            case 75:
            case 76:
            case 77:
            case 79:
            case 80:
            case 81:
            case 82:
            case 83:
            case 84:
            case 86:
            case 88:
            case 90:
            case 91:
                {
                alt74=2;
                }
                break;
            case 46:
                {
                int LA74_4 = input.LA(2);

                if ( (synpred109_InternalQVTrelation()) ) {
                    alt74=2;
                }
                else if ( (true) ) {
                    alt74=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 74, 4, input);

                    throw nvae;
                }
                }
                break;
            case 37:
                {
                int LA74_5 = input.LA(2);

                if ( (synpred109_InternalQVTrelation()) ) {
                    alt74=2;
                }
                else if ( (true) ) {
                    alt74=3;
                }
                else {
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 74, 5, input);

                    throw nvae;
                }
                }
                break;
            case 17:
            case 25:
            case 26:
            case 27:
            case 28:
            case 29:
            case 30:
            case 31:
            case 32:
            case 35:
            case 36:
            case 39:
            case 40:
            case 42:
            case 43:
            case 45:
            case 47:
            case 49:
            case 50:
            case 51:
            case 52:
            case 53:
            case 54:
            case 55:
                {
                alt74=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 74, 0, input);

                throw nvae;
            }

            switch (alt74) {
                case 1 :
                    // InternalQVTrelation.g:3314:3: this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EssentialOCLUnrestrictedName_0=ruleEssentialOCLUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_EssentialOCLUnrestrictedName_0);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:3325:3: this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getQVTbaseUnrestrictedNameParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_QVTbaseUnrestrictedName_1=ruleQVTbaseUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_QVTbaseUnrestrictedName_1);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:3336:3: this_QVTrelationUnrestrictedName_2= ruleQVTrelationUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getQVTrelationUnrestrictedNameParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_QVTrelationUnrestrictedName_2=ruleQVTrelationUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_QVTrelationUnrestrictedName_2);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnrestrictedName"


    // $ANTLR start "entryRuleAttributeCS"
    // InternalQVTrelation.g:3350:1: entryRuleAttributeCS returns [EObject current=null] : iv_ruleAttributeCS= ruleAttributeCS EOF ;
    public final EObject entryRuleAttributeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleAttributeCS = null;


        try {
            // InternalQVTrelation.g:3350:52: (iv_ruleAttributeCS= ruleAttributeCS EOF )
            // InternalQVTrelation.g:3351:2: iv_ruleAttributeCS= ruleAttributeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getAttributeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleAttributeCS=ruleAttributeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleAttributeCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleAttributeCS"


    // $ANTLR start "ruleAttributeCS"
    // InternalQVTrelation.g:3357:1: ruleAttributeCS returns [EObject current=null] : ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) ) ;
    public final EObject ruleAttributeCS() throws RecognitionException {
        EObject current = null;

        Token lv_qualifiers_0_0=null;
        Token lv_qualifiers_1_0=null;
        Token lv_qualifiers_2_0=null;
        Token lv_qualifiers_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token lv_default_9_0=null;
        Token otherlv_10=null;
        Token lv_qualifiers_11_0=null;
        Token lv_qualifiers_12_0=null;
        Token lv_qualifiers_13_0=null;
        Token lv_qualifiers_14_0=null;
        Token lv_qualifiers_15_0=null;
        Token lv_qualifiers_16_0=null;
        Token lv_qualifiers_17_0=null;
        Token lv_qualifiers_18_0=null;
        Token lv_qualifiers_19_0=null;
        Token lv_qualifiers_20_0=null;
        Token lv_qualifiers_21_0=null;
        Token lv_qualifiers_22_0=null;
        Token lv_qualifiers_23_0=null;
        Token lv_qualifiers_24_0=null;
        Token lv_qualifiers_25_0=null;
        Token lv_qualifiers_26_0=null;
        Token otherlv_27=null;
        Token otherlv_28=null;
        Token otherlv_29=null;
        Token otherlv_30=null;
        Token otherlv_32=null;
        Token otherlv_34=null;
        Token otherlv_35=null;
        Token otherlv_37=null;
        Token otherlv_39=null;
        Token otherlv_40=null;
        Token otherlv_41=null;
        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedDefaultExpressions_33_0 = null;

        EObject lv_ownedDefaultExpressions_38_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:3363:2: ( ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) ) )
            // InternalQVTrelation.g:3364:2: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) )
            {
            // InternalQVTrelation.g:3364:2: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' ) )
            // InternalQVTrelation.g:3365:3: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'attribute' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )? ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' )
            {
            // InternalQVTrelation.g:3365:3: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt77=3;
            int LA77_0 = input.LA(1);

            if ( (LA77_0==56) ) {
                alt77=1;
            }
            else if ( (LA77_0==57) ) {
                alt77=2;
            }
            switch (alt77) {
                case 1 :
                    // InternalQVTrelation.g:3366:4: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalQVTrelation.g:3366:4: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalQVTrelation.g:3367:5: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalQVTrelation.g:3367:5: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalQVTrelation.g:3368:6: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalQVTrelation.g:3368:6: (lv_qualifiers_0_0= 'static' )
                    // InternalQVTrelation.g:3369:7: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,56,FollowSets000.FOLLOW_58); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_qualifiers_0_0, grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getAttributeCSRule());
                      							}
                      							addWithLastConsumed(current, "qualifiers", lv_qualifiers_0_0, "static");

                    }

                    }


                    }

                    // InternalQVTrelation.g:3381:5: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt75=2;
                    int LA75_0 = input.LA(1);

                    if ( (LA75_0==57) ) {
                        alt75=1;
                    }
                    switch (alt75) {
                        case 1 :
                            // InternalQVTrelation.g:3382:6: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalQVTrelation.g:3382:6: (lv_qualifiers_1_0= 'definition' )
                            // InternalQVTrelation.g:3383:7: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,57,FollowSets000.FOLLOW_59); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_qualifiers_1_0, grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeCSRule());
                              							}
                              							addWithLastConsumed(current, "qualifiers", lv_qualifiers_1_0, "definition");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:3397:4: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalQVTrelation.g:3397:4: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalQVTrelation.g:3398:5: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalQVTrelation.g:3398:5: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalQVTrelation.g:3399:6: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalQVTrelation.g:3399:6: (lv_qualifiers_2_0= 'definition' )
                    // InternalQVTrelation.g:3400:7: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,57,FollowSets000.FOLLOW_60); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_qualifiers_2_0, grammarAccess.getAttributeCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getAttributeCSRule());
                      							}
                      							addWithLastConsumed(current, "qualifiers", lv_qualifiers_2_0, "definition");

                    }

                    }


                    }

                    // InternalQVTrelation.g:3412:5: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt76=2;
                    int LA76_0 = input.LA(1);

                    if ( (LA76_0==56) ) {
                        alt76=1;
                    }
                    switch (alt76) {
                        case 1 :
                            // InternalQVTrelation.g:3413:6: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalQVTrelation.g:3413:6: (lv_qualifiers_3_0= 'static' )
                            // InternalQVTrelation.g:3414:7: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,56,FollowSets000.FOLLOW_59); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_qualifiers_3_0, grammarAccess.getAttributeCSAccess().getQualifiersStaticKeyword_0_1_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getAttributeCSRule());
                              							}
                              							addWithLastConsumed(current, "qualifiers", lv_qualifiers_3_0, "static");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,58,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getAttributeCSAccess().getAttributeKeyword_1());

            }
            // InternalQVTrelation.g:3432:3: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:3433:4: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:3433:4: (lv_name_5_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:3434:5: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getAttributeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_6);
            lv_name_5_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getAttributeCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_5_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:3451:3: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt78=2;
            int LA78_0 = input.LA(1);

            if ( (LA78_0==18) ) {
                alt78=1;
            }
            switch (alt78) {
                case 1 :
                    // InternalQVTrelation.g:3452:4: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_6=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getAttributeCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTrelation.g:3456:4: ( (lv_ownedType_7_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTrelation.g:3457:5: (lv_ownedType_7_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTrelation.g:3457:5: (lv_ownedType_7_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTrelation.g:3458:6: lv_ownedType_7_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_7);
                    lv_ownedType_7_0=ruleTypedMultiplicityRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_7_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:3476:3: (otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt79=2;
            int LA79_0 = input.LA(1);

            if ( (LA79_0==19) ) {
                alt79=1;
            }
            switch (alt79) {
                case 1 :
                    // InternalQVTrelation.g:3477:4: otherlv_8= '=' ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_8=(Token)match(input,19,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getAttributeCSAccess().getEqualsSignKeyword_4_0());

                    }
                    // InternalQVTrelation.g:3481:4: ( (lv_default_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTrelation.g:3482:5: (lv_default_9_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTrelation.g:3482:5: (lv_default_9_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTrelation.g:3483:6: lv_default_9_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_default_9_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_default_9_0, grammarAccess.getAttributeCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getAttributeCSRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"default",
                      							lv_default_9_0,
                      							"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:3500:3: (otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}' )?
            int alt83=2;
            int LA83_0 = input.LA(1);

            if ( (LA83_0==20) ) {
                int LA83_1 = input.LA(2);

                if ( (LA83_1==38||(LA83_1>=59 && LA83_1<=73)) ) {
                    alt83=1;
                }
            }
            switch (alt83) {
                case 1 :
                    // InternalQVTrelation.g:3501:4: otherlv_10= '{' ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+ otherlv_28= '}'
                    {
                    otherlv_10=(Token)match(input,20,FollowSets000.FOLLOW_61); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_5_0());

                    }
                    // InternalQVTrelation.g:3505:4: ( ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )? )+
                    int cnt82=0;
                    loop82:
                    do {
                        int alt82=2;
                        int LA82_0 = input.LA(1);

                        if ( (LA82_0==38||(LA82_0>=59 && LA82_0<=73)) ) {
                            alt82=1;
                        }


                        switch (alt82) {
                    	case 1 :
                    	    // InternalQVTrelation.g:3506:5: ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) ) (otherlv_27= ',' )?
                    	    {
                    	    // InternalQVTrelation.g:3506:5: ( ( (lv_qualifiers_11_0= 'derived' ) ) | ( (lv_qualifiers_12_0= '!derived' ) ) | ( (lv_qualifiers_13_0= 'id' ) ) | ( (lv_qualifiers_14_0= '!id' ) ) | ( (lv_qualifiers_15_0= 'ordered' ) ) | ( (lv_qualifiers_16_0= '!ordered' ) ) | ( (lv_qualifiers_17_0= 'readonly' ) ) | ( (lv_qualifiers_18_0= '!readonly' ) ) | ( (lv_qualifiers_19_0= 'transient' ) ) | ( (lv_qualifiers_20_0= '!transient' ) ) | ( (lv_qualifiers_21_0= 'unique' ) ) | ( (lv_qualifiers_22_0= '!unique' ) ) | ( (lv_qualifiers_23_0= 'unsettable' ) ) | ( (lv_qualifiers_24_0= '!unsettable' ) ) | ( (lv_qualifiers_25_0= 'volatile' ) ) | ( (lv_qualifiers_26_0= '!volatile' ) ) )
                    	    int alt80=16;
                    	    switch ( input.LA(1) ) {
                    	    case 59:
                    	        {
                    	        alt80=1;
                    	        }
                    	        break;
                    	    case 60:
                    	        {
                    	        alt80=2;
                    	        }
                    	        break;
                    	    case 61:
                    	        {
                    	        alt80=3;
                    	        }
                    	        break;
                    	    case 62:
                    	        {
                    	        alt80=4;
                    	        }
                    	        break;
                    	    case 63:
                    	        {
                    	        alt80=5;
                    	        }
                    	        break;
                    	    case 64:
                    	        {
                    	        alt80=6;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt80=7;
                    	        }
                    	        break;
                    	    case 66:
                    	        {
                    	        alt80=8;
                    	        }
                    	        break;
                    	    case 38:
                    	        {
                    	        alt80=9;
                    	        }
                    	        break;
                    	    case 67:
                    	        {
                    	        alt80=10;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt80=11;
                    	        }
                    	        break;
                    	    case 69:
                    	        {
                    	        alt80=12;
                    	        }
                    	        break;
                    	    case 70:
                    	        {
                    	        alt80=13;
                    	        }
                    	        break;
                    	    case 71:
                    	        {
                    	        alt80=14;
                    	        }
                    	        break;
                    	    case 72:
                    	        {
                    	        alt80=15;
                    	        }
                    	        break;
                    	    case 73:
                    	        {
                    	        alt80=16;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 80, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt80) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:3507:6: ( (lv_qualifiers_11_0= 'derived' ) )
                    	            {
                    	            // InternalQVTrelation.g:3507:6: ( (lv_qualifiers_11_0= 'derived' ) )
                    	            // InternalQVTrelation.g:3508:7: (lv_qualifiers_11_0= 'derived' )
                    	            {
                    	            // InternalQVTrelation.g:3508:7: (lv_qualifiers_11_0= 'derived' )
                    	            // InternalQVTrelation.g:3509:8: lv_qualifiers_11_0= 'derived'
                    	            {
                    	            lv_qualifiers_11_0=(Token)match(input,59,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_11_0, grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_11_0, "derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTrelation.g:3522:6: ( (lv_qualifiers_12_0= '!derived' ) )
                    	            {
                    	            // InternalQVTrelation.g:3522:6: ( (lv_qualifiers_12_0= '!derived' ) )
                    	            // InternalQVTrelation.g:3523:7: (lv_qualifiers_12_0= '!derived' )
                    	            {
                    	            // InternalQVTrelation.g:3523:7: (lv_qualifiers_12_0= '!derived' )
                    	            // InternalQVTrelation.g:3524:8: lv_qualifiers_12_0= '!derived'
                    	            {
                    	            lv_qualifiers_12_0=(Token)match(input,60,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_12_0, grammarAccess.getAttributeCSAccess().getQualifiersDerivedKeyword_5_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_12_0, "!derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTrelation.g:3537:6: ( (lv_qualifiers_13_0= 'id' ) )
                    	            {
                    	            // InternalQVTrelation.g:3537:6: ( (lv_qualifiers_13_0= 'id' ) )
                    	            // InternalQVTrelation.g:3538:7: (lv_qualifiers_13_0= 'id' )
                    	            {
                    	            // InternalQVTrelation.g:3538:7: (lv_qualifiers_13_0= 'id' )
                    	            // InternalQVTrelation.g:3539:8: lv_qualifiers_13_0= 'id'
                    	            {
                    	            lv_qualifiers_13_0=(Token)match(input,61,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_13_0, grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_13_0, "id");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTrelation.g:3552:6: ( (lv_qualifiers_14_0= '!id' ) )
                    	            {
                    	            // InternalQVTrelation.g:3552:6: ( (lv_qualifiers_14_0= '!id' ) )
                    	            // InternalQVTrelation.g:3553:7: (lv_qualifiers_14_0= '!id' )
                    	            {
                    	            // InternalQVTrelation.g:3553:7: (lv_qualifiers_14_0= '!id' )
                    	            // InternalQVTrelation.g:3554:8: lv_qualifiers_14_0= '!id'
                    	            {
                    	            lv_qualifiers_14_0=(Token)match(input,62,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_14_0, grammarAccess.getAttributeCSAccess().getQualifiersIdKeyword_5_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_14_0, "!id");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 5 :
                    	            // InternalQVTrelation.g:3567:6: ( (lv_qualifiers_15_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:3567:6: ( (lv_qualifiers_15_0= 'ordered' ) )
                    	            // InternalQVTrelation.g:3568:7: (lv_qualifiers_15_0= 'ordered' )
                    	            {
                    	            // InternalQVTrelation.g:3568:7: (lv_qualifiers_15_0= 'ordered' )
                    	            // InternalQVTrelation.g:3569:8: lv_qualifiers_15_0= 'ordered'
                    	            {
                    	            lv_qualifiers_15_0=(Token)match(input,63,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_15_0, grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_15_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalQVTrelation.g:3582:6: ( (lv_qualifiers_16_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:3582:6: ( (lv_qualifiers_16_0= '!ordered' ) )
                    	            // InternalQVTrelation.g:3583:7: (lv_qualifiers_16_0= '!ordered' )
                    	            {
                    	            // InternalQVTrelation.g:3583:7: (lv_qualifiers_16_0= '!ordered' )
                    	            // InternalQVTrelation.g:3584:8: lv_qualifiers_16_0= '!ordered'
                    	            {
                    	            lv_qualifiers_16_0=(Token)match(input,64,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_16_0, grammarAccess.getAttributeCSAccess().getQualifiersOrderedKeyword_5_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_16_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 7 :
                    	            // InternalQVTrelation.g:3597:6: ( (lv_qualifiers_17_0= 'readonly' ) )
                    	            {
                    	            // InternalQVTrelation.g:3597:6: ( (lv_qualifiers_17_0= 'readonly' ) )
                    	            // InternalQVTrelation.g:3598:7: (lv_qualifiers_17_0= 'readonly' )
                    	            {
                    	            // InternalQVTrelation.g:3598:7: (lv_qualifiers_17_0= 'readonly' )
                    	            // InternalQVTrelation.g:3599:8: lv_qualifiers_17_0= 'readonly'
                    	            {
                    	            lv_qualifiers_17_0=(Token)match(input,65,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_17_0, grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_6_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_17_0, "readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 8 :
                    	            // InternalQVTrelation.g:3612:6: ( (lv_qualifiers_18_0= '!readonly' ) )
                    	            {
                    	            // InternalQVTrelation.g:3612:6: ( (lv_qualifiers_18_0= '!readonly' ) )
                    	            // InternalQVTrelation.g:3613:7: (lv_qualifiers_18_0= '!readonly' )
                    	            {
                    	            // InternalQVTrelation.g:3613:7: (lv_qualifiers_18_0= '!readonly' )
                    	            // InternalQVTrelation.g:3614:8: lv_qualifiers_18_0= '!readonly'
                    	            {
                    	            lv_qualifiers_18_0=(Token)match(input,66,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_18_0, grammarAccess.getAttributeCSAccess().getQualifiersReadonlyKeyword_5_1_0_7_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_18_0, "!readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 9 :
                    	            // InternalQVTrelation.g:3627:6: ( (lv_qualifiers_19_0= 'transient' ) )
                    	            {
                    	            // InternalQVTrelation.g:3627:6: ( (lv_qualifiers_19_0= 'transient' ) )
                    	            // InternalQVTrelation.g:3628:7: (lv_qualifiers_19_0= 'transient' )
                    	            {
                    	            // InternalQVTrelation.g:3628:7: (lv_qualifiers_19_0= 'transient' )
                    	            // InternalQVTrelation.g:3629:8: lv_qualifiers_19_0= 'transient'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,38,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_19_0, grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_8_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_19_0, "transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 10 :
                    	            // InternalQVTrelation.g:3642:6: ( (lv_qualifiers_20_0= '!transient' ) )
                    	            {
                    	            // InternalQVTrelation.g:3642:6: ( (lv_qualifiers_20_0= '!transient' ) )
                    	            // InternalQVTrelation.g:3643:7: (lv_qualifiers_20_0= '!transient' )
                    	            {
                    	            // InternalQVTrelation.g:3643:7: (lv_qualifiers_20_0= '!transient' )
                    	            // InternalQVTrelation.g:3644:8: lv_qualifiers_20_0= '!transient'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,67,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_20_0, grammarAccess.getAttributeCSAccess().getQualifiersTransientKeyword_5_1_0_9_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_20_0, "!transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 11 :
                    	            // InternalQVTrelation.g:3657:6: ( (lv_qualifiers_21_0= 'unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:3657:6: ( (lv_qualifiers_21_0= 'unique' ) )
                    	            // InternalQVTrelation.g:3658:7: (lv_qualifiers_21_0= 'unique' )
                    	            {
                    	            // InternalQVTrelation.g:3658:7: (lv_qualifiers_21_0= 'unique' )
                    	            // InternalQVTrelation.g:3659:8: lv_qualifiers_21_0= 'unique'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,68,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_21_0, grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_10_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_21_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 12 :
                    	            // InternalQVTrelation.g:3672:6: ( (lv_qualifiers_22_0= '!unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:3672:6: ( (lv_qualifiers_22_0= '!unique' ) )
                    	            // InternalQVTrelation.g:3673:7: (lv_qualifiers_22_0= '!unique' )
                    	            {
                    	            // InternalQVTrelation.g:3673:7: (lv_qualifiers_22_0= '!unique' )
                    	            // InternalQVTrelation.g:3674:8: lv_qualifiers_22_0= '!unique'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,69,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_22_0, grammarAccess.getAttributeCSAccess().getQualifiersUniqueKeyword_5_1_0_11_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_22_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 13 :
                    	            // InternalQVTrelation.g:3687:6: ( (lv_qualifiers_23_0= 'unsettable' ) )
                    	            {
                    	            // InternalQVTrelation.g:3687:6: ( (lv_qualifiers_23_0= 'unsettable' ) )
                    	            // InternalQVTrelation.g:3688:7: (lv_qualifiers_23_0= 'unsettable' )
                    	            {
                    	            // InternalQVTrelation.g:3688:7: (lv_qualifiers_23_0= 'unsettable' )
                    	            // InternalQVTrelation.g:3689:8: lv_qualifiers_23_0= 'unsettable'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,70,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_23_0, grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_12_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 14 :
                    	            // InternalQVTrelation.g:3702:6: ( (lv_qualifiers_24_0= '!unsettable' ) )
                    	            {
                    	            // InternalQVTrelation.g:3702:6: ( (lv_qualifiers_24_0= '!unsettable' ) )
                    	            // InternalQVTrelation.g:3703:7: (lv_qualifiers_24_0= '!unsettable' )
                    	            {
                    	            // InternalQVTrelation.g:3703:7: (lv_qualifiers_24_0= '!unsettable' )
                    	            // InternalQVTrelation.g:3704:8: lv_qualifiers_24_0= '!unsettable'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,71,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_24_0, grammarAccess.getAttributeCSAccess().getQualifiersUnsettableKeyword_5_1_0_13_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 15 :
                    	            // InternalQVTrelation.g:3717:6: ( (lv_qualifiers_25_0= 'volatile' ) )
                    	            {
                    	            // InternalQVTrelation.g:3717:6: ( (lv_qualifiers_25_0= 'volatile' ) )
                    	            // InternalQVTrelation.g:3718:7: (lv_qualifiers_25_0= 'volatile' )
                    	            {
                    	            // InternalQVTrelation.g:3718:7: (lv_qualifiers_25_0= 'volatile' )
                    	            // InternalQVTrelation.g:3719:8: lv_qualifiers_25_0= 'volatile'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,72,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_25_0, grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_14_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_25_0, "volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 16 :
                    	            // InternalQVTrelation.g:3732:6: ( (lv_qualifiers_26_0= '!volatile' ) )
                    	            {
                    	            // InternalQVTrelation.g:3732:6: ( (lv_qualifiers_26_0= '!volatile' ) )
                    	            // InternalQVTrelation.g:3733:7: (lv_qualifiers_26_0= '!volatile' )
                    	            {
                    	            // InternalQVTrelation.g:3733:7: (lv_qualifiers_26_0= '!volatile' )
                    	            // InternalQVTrelation.g:3734:8: lv_qualifiers_26_0= '!volatile'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,73,FollowSets000.FOLLOW_62); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_26_0, grammarAccess.getAttributeCSAccess().getQualifiersVolatileKeyword_5_1_0_15_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getAttributeCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_26_0, "!volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTrelation.g:3747:5: (otherlv_27= ',' )?
                    	    int alt81=2;
                    	    int LA81_0 = input.LA(1);

                    	    if ( (LA81_0==23) ) {
                    	        alt81=1;
                    	    }
                    	    switch (alt81) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:3748:6: otherlv_27= ','
                    	            {
                    	            otherlv_27=(Token)match(input,23,FollowSets000.FOLLOW_63); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_27, grammarAccess.getAttributeCSAccess().getCommaKeyword_5_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt82 >= 1 ) break loop82;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(82, input);
                                throw eee;
                        }
                        cnt82++;
                    } while (true);

                    otherlv_28=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_28, grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_5_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:3759:3: ( (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' ) | otherlv_41= ';' )
            int alt89=2;
            int LA89_0 = input.LA(1);

            if ( (LA89_0==20) ) {
                alt89=1;
            }
            else if ( (LA89_0==22) ) {
                alt89=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 89, 0, input);

                throw nvae;
            }
            switch (alt89) {
                case 1 :
                    // InternalQVTrelation.g:3760:4: (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' )
                    {
                    // InternalQVTrelation.g:3760:4: (otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}' )
                    // InternalQVTrelation.g:3761:5: otherlv_29= '{' ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )* otherlv_40= '}'
                    {
                    otherlv_29=(Token)match(input,20,FollowSets000.FOLLOW_64); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_29, grammarAccess.getAttributeCSAccess().getLeftCurlyBracketKeyword_6_0_0());

                    }
                    // InternalQVTrelation.g:3765:5: ( (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' ) | (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' ) )*
                    loop88:
                    do {
                        int alt88=3;
                        int LA88_0 = input.LA(1);

                        if ( (LA88_0==74) ) {
                            alt88=1;
                        }
                        else if ( (LA88_0==75) ) {
                            alt88=2;
                        }


                        switch (alt88) {
                    	case 1 :
                    	    // InternalQVTrelation.g:3766:6: (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' )
                    	    {
                    	    // InternalQVTrelation.g:3766:6: (otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';' )
                    	    // InternalQVTrelation.g:3767:7: otherlv_30= 'initial' ( ruleUnrestrictedName )? otherlv_32= ':' ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )? otherlv_34= ';'
                    	    {
                    	    otherlv_30=(Token)match(input,74,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_30, grammarAccess.getAttributeCSAccess().getInitialKeyword_6_0_1_0_0());

                    	    }
                    	    // InternalQVTrelation.g:3771:7: ( ruleUnrestrictedName )?
                    	    int alt84=2;
                    	    int LA84_0 = input.LA(1);

                    	    if ( ((LA84_0>=RULE_SIMPLE_ID && LA84_0<=RULE_ESCAPED_ID)||LA84_0==17||(LA84_0>=25 && LA84_0<=32)||(LA84_0>=35 && LA84_0<=43)||(LA84_0>=45 && LA84_0<=47)||(LA84_0>=49 && LA84_0<=59)||LA84_0==61||LA84_0==63||LA84_0==65||LA84_0==68||LA84_0==70||LA84_0==72||(LA84_0>=74 && LA84_0<=77)||(LA84_0>=79 && LA84_0<=84)||LA84_0==86||LA84_0==88||(LA84_0>=90 && LA84_0<=91)) ) {
                    	        alt84=1;
                    	    }
                    	    switch (alt84) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:3772:8: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								/* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_32=(Token)match(input,18,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_32, grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_0_2());

                    	    }
                    	    // InternalQVTrelation.g:3787:7: ( (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS ) )?
                    	    int alt85=2;
                    	    int LA85_0 = input.LA(1);

                    	    if ( ((LA85_0>=RULE_SINGLE_QUOTED_STRING && LA85_0<=RULE_ESCAPED_ID)||LA85_0==17||(LA85_0>=25 && LA85_0<=33)||(LA85_0>=35 && LA85_0<=43)||(LA85_0>=45 && LA85_0<=59)||LA85_0==61||LA85_0==63||LA85_0==65||LA85_0==68||LA85_0==70||LA85_0==72||(LA85_0>=74 && LA85_0<=77)||(LA85_0>=79 && LA85_0<=84)||LA85_0==86||LA85_0==88||(LA85_0>=90 && LA85_0<=94)||(LA85_0>=114 && LA85_0<=128)||LA85_0==130||(LA85_0>=132 && LA85_0<=135)||LA85_0==142||(LA85_0>=147 && LA85_0<=148)) ) {
                    	        alt85=1;
                    	    }
                    	    switch (alt85) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:3788:8: (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTrelation.g:3788:8: (lv_ownedDefaultExpressions_33_0= ruleSpecificationCS )
                    	            // InternalQVTrelation.g:3789:9: lv_ownedDefaultExpressions_33_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              									newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_0_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_20);
                    	            lv_ownedDefaultExpressions_33_0=ruleSpecificationCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              									if (current==null) {
                    	              										current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                    	              									}
                    	              									add(
                    	              										current,
                    	              										"ownedDefaultExpressions",
                    	              										lv_ownedDefaultExpressions_33_0,
                    	              										"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              									afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_34=(Token)match(input,22,FollowSets000.FOLLOW_64); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_34, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_0_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTrelation.g:3812:6: (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' )
                    	    {
                    	    // InternalQVTrelation.g:3812:6: (otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';' )
                    	    // InternalQVTrelation.g:3813:7: otherlv_35= 'derivation' ( ruleUnrestrictedName )? otherlv_37= ':' ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )? otherlv_39= ';'
                    	    {
                    	    otherlv_35=(Token)match(input,75,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_35, grammarAccess.getAttributeCSAccess().getDerivationKeyword_6_0_1_1_0());

                    	    }
                    	    // InternalQVTrelation.g:3817:7: ( ruleUnrestrictedName )?
                    	    int alt86=2;
                    	    int LA86_0 = input.LA(1);

                    	    if ( ((LA86_0>=RULE_SIMPLE_ID && LA86_0<=RULE_ESCAPED_ID)||LA86_0==17||(LA86_0>=25 && LA86_0<=32)||(LA86_0>=35 && LA86_0<=43)||(LA86_0>=45 && LA86_0<=47)||(LA86_0>=49 && LA86_0<=59)||LA86_0==61||LA86_0==63||LA86_0==65||LA86_0==68||LA86_0==70||LA86_0==72||(LA86_0>=74 && LA86_0<=77)||(LA86_0>=79 && LA86_0<=84)||LA86_0==86||LA86_0==88||(LA86_0>=90 && LA86_0<=91)) ) {
                    	        alt86=1;
                    	    }
                    	    switch (alt86) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:3818:8: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								/* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getAttributeCSAccess().getUnrestrictedNameParserRuleCall_6_0_1_1_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_37=(Token)match(input,18,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_37, grammarAccess.getAttributeCSAccess().getColonKeyword_6_0_1_1_2());

                    	    }
                    	    // InternalQVTrelation.g:3833:7: ( (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS ) )?
                    	    int alt87=2;
                    	    int LA87_0 = input.LA(1);

                    	    if ( ((LA87_0>=RULE_SINGLE_QUOTED_STRING && LA87_0<=RULE_ESCAPED_ID)||LA87_0==17||(LA87_0>=25 && LA87_0<=33)||(LA87_0>=35 && LA87_0<=43)||(LA87_0>=45 && LA87_0<=59)||LA87_0==61||LA87_0==63||LA87_0==65||LA87_0==68||LA87_0==70||LA87_0==72||(LA87_0>=74 && LA87_0<=77)||(LA87_0>=79 && LA87_0<=84)||LA87_0==86||LA87_0==88||(LA87_0>=90 && LA87_0<=94)||(LA87_0>=114 && LA87_0<=128)||LA87_0==130||(LA87_0>=132 && LA87_0<=135)||LA87_0==142||(LA87_0>=147 && LA87_0<=148)) ) {
                    	        alt87=1;
                    	    }
                    	    switch (alt87) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:3834:8: (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTrelation.g:3834:8: (lv_ownedDefaultExpressions_38_0= ruleSpecificationCS )
                    	            // InternalQVTrelation.g:3835:9: lv_ownedDefaultExpressions_38_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              									newCompositeNode(grammarAccess.getAttributeCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_6_0_1_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_20);
                    	            lv_ownedDefaultExpressions_38_0=ruleSpecificationCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              									if (current==null) {
                    	              										current = createModelElementForParent(grammarAccess.getAttributeCSRule());
                    	              									}
                    	              									add(
                    	              										current,
                    	              										"ownedDefaultExpressions",
                    	              										lv_ownedDefaultExpressions_38_0,
                    	              										"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              									afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_39=(Token)match(input,22,FollowSets000.FOLLOW_64); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_39, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_0_1_1_4());

                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop88;
                        }
                    } while (true);

                    otherlv_40=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_40, grammarAccess.getAttributeCSAccess().getRightCurlyBracketKeyword_6_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:3864:4: otherlv_41= ';'
                    {
                    otherlv_41=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_41, grammarAccess.getAttributeCSAccess().getSemicolonKeyword_6_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleAttributeCS"


    // $ANTLR start "entryRuleClassCS"
    // InternalQVTrelation.g:3873:1: entryRuleClassCS returns [EObject current=null] : iv_ruleClassCS= ruleClassCS EOF ;
    public final EObject entryRuleClassCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleClassCS = null;


        try {
            // InternalQVTrelation.g:3873:48: (iv_ruleClassCS= ruleClassCS EOF )
            // InternalQVTrelation.g:3874:2: iv_ruleClassCS= ruleClassCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getClassCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleClassCS=ruleClassCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleClassCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleClassCS"


    // $ANTLR start "ruleClassCS"
    // InternalQVTrelation.g:3880:1: ruleClassCS returns [EObject current=null] : (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS ) ;
    public final EObject ruleClassCS() throws RecognitionException {
        EObject current = null;

        EObject this_StructuredClassCS_0 = null;

        EObject this_DataTypeCS_1 = null;

        EObject this_EnumerationCS_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:3886:2: ( (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS ) )
            // InternalQVTrelation.g:3887:2: (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS )
            {
            // InternalQVTrelation.g:3887:2: (this_StructuredClassCS_0= ruleStructuredClassCS | this_DataTypeCS_1= ruleDataTypeCS | this_EnumerationCS_2= ruleEnumerationCS )
            int alt90=3;
            switch ( input.LA(1) ) {
            case 41:
            case 90:
                {
                alt90=1;
                }
                break;
            case 37:
            case 76:
                {
                alt90=2;
                }
                break;
            case 79:
                {
                alt90=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 90, 0, input);

                throw nvae;
            }

            switch (alt90) {
                case 1 :
                    // InternalQVTrelation.g:3888:3: this_StructuredClassCS_0= ruleStructuredClassCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getClassCSAccess().getStructuredClassCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StructuredClassCS_0=ruleStructuredClassCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_StructuredClassCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:3900:3: this_DataTypeCS_1= ruleDataTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getClassCSAccess().getDataTypeCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_DataTypeCS_1=ruleDataTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_DataTypeCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:3912:3: this_EnumerationCS_2= ruleEnumerationCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getClassCSAccess().getEnumerationCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_EnumerationCS_2=ruleEnumerationCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_EnumerationCS_2;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleClassCS"


    // $ANTLR start "entryRuleCompoundTargetElementCS"
    // InternalQVTrelation.g:3927:1: entryRuleCompoundTargetElementCS returns [EObject current=null] : iv_ruleCompoundTargetElementCS= ruleCompoundTargetElementCS EOF ;
    public final EObject entryRuleCompoundTargetElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCompoundTargetElementCS = null;


        try {
            // InternalQVTrelation.g:3927:64: (iv_ruleCompoundTargetElementCS= ruleCompoundTargetElementCS EOF )
            // InternalQVTrelation.g:3928:2: iv_ruleCompoundTargetElementCS= ruleCompoundTargetElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCompoundTargetElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCompoundTargetElementCS=ruleCompoundTargetElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCompoundTargetElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCompoundTargetElementCS"


    // $ANTLR start "ruleCompoundTargetElementCS"
    // InternalQVTrelation.g:3934:1: ruleCompoundTargetElementCS returns [EObject current=null] : (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? ) ;
    public final EObject ruleCompoundTargetElementCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        EObject lv_ownedTargetElements_1_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:3940:2: ( (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? ) )
            // InternalQVTrelation.g:3941:2: (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? )
            {
            // InternalQVTrelation.g:3941:2: (otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )? )
            // InternalQVTrelation.g:3942:3: otherlv_0= '{' ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )* otherlv_2= '}' (otherlv_3= ';' )?
            {
            otherlv_0=(Token)match(input,20,FollowSets000.FOLLOW_66); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getCompoundTargetElementCSAccess().getLeftCurlyBracketKeyword_0());

            }
            // InternalQVTrelation.g:3946:3: ( (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS ) )*
            loop91:
            do {
                int alt91=2;
                int LA91_0 = input.LA(1);

                if ( (LA91_0==51||LA91_0==53||LA91_0==55) ) {
                    alt91=1;
                }


                switch (alt91) {
            	case 1 :
            	    // InternalQVTrelation.g:3947:4: (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS )
            	    {
            	    // InternalQVTrelation.g:3947:4: (lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS )
            	    // InternalQVTrelation.g:3948:5: lv_ownedTargetElements_1_0= ruleSimpleTargetElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getCompoundTargetElementCSAccess().getOwnedTargetElementsSimpleTargetElementCSParserRuleCall_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_66);
            	    lv_ownedTargetElements_1_0=ruleSimpleTargetElementCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getCompoundTargetElementCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedTargetElements",
            	      						lv_ownedTargetElements_1_0,
            	      						"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SimpleTargetElementCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop91;
                }
            } while (true);

            otherlv_2=(Token)match(input,21,FollowSets000.FOLLOW_67); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getCompoundTargetElementCSAccess().getRightCurlyBracketKeyword_2());

            }
            // InternalQVTrelation.g:3969:3: (otherlv_3= ';' )?
            int alt92=2;
            int LA92_0 = input.LA(1);

            if ( (LA92_0==22) ) {
                alt92=1;
            }
            switch (alt92) {
                case 1 :
                    // InternalQVTrelation.g:3970:4: otherlv_3= ';'
                    {
                    otherlv_3=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getCompoundTargetElementCSAccess().getSemicolonKeyword_3());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCompoundTargetElementCS"


    // $ANTLR start "entryRuleDataTypeCS"
    // InternalQVTrelation.g:3979:1: entryRuleDataTypeCS returns [EObject current=null] : iv_ruleDataTypeCS= ruleDataTypeCS EOF ;
    public final EObject entryRuleDataTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDataTypeCS = null;


        try {
            // InternalQVTrelation.g:3979:51: (iv_ruleDataTypeCS= ruleDataTypeCS EOF )
            // InternalQVTrelation.g:3980:2: iv_ruleDataTypeCS= ruleDataTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDataTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleDataTypeCS=ruleDataTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleDataTypeCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleDataTypeCS"


    // $ANTLR start "ruleDataTypeCS"
    // InternalQVTrelation.g:3986:1: ruleDataTypeCS returns [EObject current=null] : ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
    public final EObject ruleDataTypeCS() throws RecognitionException {
        EObject current = null;

        Token lv_isPrimitive_0_0=null;
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token lv_instanceClassName_5_0=null;
        Token otherlv_6=null;
        Token lv_isSerializable_7_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedSignature_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:3992:2: ( ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) ) )
            // InternalQVTrelation.g:3993:2: ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) )
            {
            // InternalQVTrelation.g:3993:2: ( ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' ) )
            // InternalQVTrelation.g:3994:3: ( (lv_isPrimitive_0_0= 'primitive' ) )? otherlv_1= 'datatype' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )? ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' )
            {
            // InternalQVTrelation.g:3994:3: ( (lv_isPrimitive_0_0= 'primitive' ) )?
            int alt93=2;
            int LA93_0 = input.LA(1);

            if ( (LA93_0==37) ) {
                alt93=1;
            }
            switch (alt93) {
                case 1 :
                    // InternalQVTrelation.g:3995:4: (lv_isPrimitive_0_0= 'primitive' )
                    {
                    // InternalQVTrelation.g:3995:4: (lv_isPrimitive_0_0= 'primitive' )
                    // InternalQVTrelation.g:3996:5: lv_isPrimitive_0_0= 'primitive'
                    {
                    lv_isPrimitive_0_0=(Token)match(input,37,FollowSets000.FOLLOW_68); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_isPrimitive_0_0, grammarAccess.getDataTypeCSAccess().getIsPrimitivePrimitiveKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getDataTypeCSRule());
                      					}
                      					setWithLastConsumed(current, "isPrimitive", lv_isPrimitive_0_0 != null, "primitive");

                    }

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,76,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getDataTypeCSAccess().getDatatypeKeyword_1());

            }
            // InternalQVTrelation.g:4012:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:4013:4: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:4013:4: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:4014:5: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getDataTypeCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_69);
            lv_name_2_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getDataTypeCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:4031:3: ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )?
            int alt94=2;
            int LA94_0 = input.LA(1);

            if ( (LA94_0==33) ) {
                alt94=1;
            }
            switch (alt94) {
                case 1 :
                    // InternalQVTrelation.g:4032:4: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTrelation.g:4032:4: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    // InternalQVTrelation.g:4033:5: lv_ownedSignature_3_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getDataTypeCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_70);
                    lv_ownedSignature_3_0=ruleTemplateSignatureCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getDataTypeCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedSignature",
                      						lv_ownedSignature_3_0,
                      						"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4050:3: (otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt95=2;
            int LA95_0 = input.LA(1);

            if ( (LA95_0==18) ) {
                alt95=1;
            }
            switch (alt95) {
                case 1 :
                    // InternalQVTrelation.g:4051:4: otherlv_4= ':' ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_4=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getDataTypeCSAccess().getColonKeyword_4_0());

                    }
                    // InternalQVTrelation.g:4055:4: ( (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTrelation.g:4056:5: (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTrelation.g:4056:5: (lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTrelation.g:4057:6: lv_instanceClassName_5_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_5_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_instanceClassName_5_0, grammarAccess.getDataTypeCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_4_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getDataTypeCSRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"instanceClassName",
                      							lv_instanceClassName_5_0,
                      							"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4074:3: (otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}' )?
            int alt97=2;
            int LA97_0 = input.LA(1);

            if ( (LA97_0==20) ) {
                int LA97_1 = input.LA(2);

                if ( (LA97_1==21) ) {
                    int LA97_3 = input.LA(3);

                    if ( (LA97_3==20||LA97_3==22) ) {
                        alt97=1;
                    }
                }
                else if ( ((LA97_1>=77 && LA97_1<=78)) ) {
                    alt97=1;
                }
            }
            switch (alt97) {
                case 1 :
                    // InternalQVTrelation.g:4075:4: otherlv_6= '{' ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )? otherlv_9= '}'
                    {
                    otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_71); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_5_0());

                    }
                    // InternalQVTrelation.g:4079:4: ( ( (lv_isSerializable_7_0= 'serializable' ) ) | otherlv_8= '!serializable' )?
                    int alt96=3;
                    int LA96_0 = input.LA(1);

                    if ( (LA96_0==77) ) {
                        alt96=1;
                    }
                    else if ( (LA96_0==78) ) {
                        alt96=2;
                    }
                    switch (alt96) {
                        case 1 :
                            // InternalQVTrelation.g:4080:5: ( (lv_isSerializable_7_0= 'serializable' ) )
                            {
                            // InternalQVTrelation.g:4080:5: ( (lv_isSerializable_7_0= 'serializable' ) )
                            // InternalQVTrelation.g:4081:6: (lv_isSerializable_7_0= 'serializable' )
                            {
                            // InternalQVTrelation.g:4081:6: (lv_isSerializable_7_0= 'serializable' )
                            // InternalQVTrelation.g:4082:7: lv_isSerializable_7_0= 'serializable'
                            {
                            lv_isSerializable_7_0=(Token)match(input,77,FollowSets000.FOLLOW_17); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_isSerializable_7_0, grammarAccess.getDataTypeCSAccess().getIsSerializableSerializableKeyword_5_1_0_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getDataTypeCSRule());
                              							}
                              							setWithLastConsumed(current, "isSerializable", lv_isSerializable_7_0 != null, "serializable");

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:4095:5: otherlv_8= '!serializable'
                            {
                            otherlv_8=(Token)match(input,78,FollowSets000.FOLLOW_17); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_8, grammarAccess.getDataTypeCSAccess().getSerializableKeyword_5_1_1());

                            }

                            }
                            break;

                    }

                    otherlv_9=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_5_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:4105:3: ( (otherlv_10= '{' otherlv_11= '}' ) | otherlv_12= ';' )
            int alt98=2;
            int LA98_0 = input.LA(1);

            if ( (LA98_0==20) ) {
                alt98=1;
            }
            else if ( (LA98_0==22) ) {
                alt98=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 98, 0, input);

                throw nvae;
            }
            switch (alt98) {
                case 1 :
                    // InternalQVTrelation.g:4106:4: (otherlv_10= '{' otherlv_11= '}' )
                    {
                    // InternalQVTrelation.g:4106:4: (otherlv_10= '{' otherlv_11= '}' )
                    // InternalQVTrelation.g:4107:5: otherlv_10= '{' otherlv_11= '}'
                    {
                    otherlv_10=(Token)match(input,20,FollowSets000.FOLLOW_17); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_10, grammarAccess.getDataTypeCSAccess().getLeftCurlyBracketKeyword_6_0_0());

                    }
                    otherlv_11=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_11, grammarAccess.getDataTypeCSAccess().getRightCurlyBracketKeyword_6_0_1());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:4117:4: otherlv_12= ';'
                    {
                    otherlv_12=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getDataTypeCSAccess().getSemicolonKeyword_6_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleDataTypeCS"


    // $ANTLR start "entryRuleEnumerationCS"
    // InternalQVTrelation.g:4126:1: entryRuleEnumerationCS returns [EObject current=null] : iv_ruleEnumerationCS= ruleEnumerationCS EOF ;
    public final EObject entryRuleEnumerationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumerationCS = null;


        try {
            // InternalQVTrelation.g:4126:54: (iv_ruleEnumerationCS= ruleEnumerationCS EOF )
            // InternalQVTrelation.g:4127:2: iv_ruleEnumerationCS= ruleEnumerationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumerationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnumerationCS=ruleEnumerationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnumerationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnumerationCS"


    // $ANTLR start "ruleEnumerationCS"
    // InternalQVTrelation.g:4133:1: ruleEnumerationCS returns [EObject current=null] : (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) ;
    public final EObject ruleEnumerationCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token lv_instanceClassName_4_0=null;
        Token otherlv_5=null;
        Token lv_isSerializable_6_0=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedSignature_2_0 = null;

        EObject lv_ownedLiterals_10_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:4139:2: ( (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) ) )
            // InternalQVTrelation.g:4140:2: (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
            {
            // InternalQVTrelation.g:4140:2: (otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' ) )
            // InternalQVTrelation.g:4141:3: otherlv_0= 'enum' ( (lv_name_1_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )? (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )? ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' )
            {
            otherlv_0=(Token)match(input,79,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getEnumerationCSAccess().getEnumKeyword_0());

            }
            // InternalQVTrelation.g:4145:3: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:4146:4: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:4146:4: (lv_name_1_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:4147:5: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getEnumerationCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_69);
            lv_name_1_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:4164:3: ( (lv_ownedSignature_2_0= ruleTemplateSignatureCS ) )?
            int alt99=2;
            int LA99_0 = input.LA(1);

            if ( (LA99_0==33) ) {
                alt99=1;
            }
            switch (alt99) {
                case 1 :
                    // InternalQVTrelation.g:4165:4: (lv_ownedSignature_2_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTrelation.g:4165:4: (lv_ownedSignature_2_0= ruleTemplateSignatureCS )
                    // InternalQVTrelation.g:4166:5: lv_ownedSignature_2_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_70);
                    lv_ownedSignature_2_0=ruleTemplateSignatureCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedSignature",
                      						lv_ownedSignature_2_0,
                      						"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4183:3: (otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt100=2;
            int LA100_0 = input.LA(1);

            if ( (LA100_0==18) ) {
                alt100=1;
            }
            switch (alt100) {
                case 1 :
                    // InternalQVTrelation.g:4184:4: otherlv_3= ':' ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_3=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getEnumerationCSAccess().getColonKeyword_3_0());

                    }
                    // InternalQVTrelation.g:4188:4: ( (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTrelation.g:4189:5: (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTrelation.g:4189:5: (lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTrelation.g:4190:6: lv_instanceClassName_4_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_4_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_instanceClassName_4_0, grammarAccess.getEnumerationCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_3_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getEnumerationCSRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"instanceClassName",
                      							lv_instanceClassName_4_0,
                      							"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4207:3: (otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}' )?
            int alt102=2;
            int LA102_0 = input.LA(1);

            if ( (LA102_0==20) ) {
                int LA102_1 = input.LA(2);

                if ( ((LA102_1>=77 && LA102_1<=78)) ) {
                    alt102=1;
                }
                else if ( (LA102_1==21) ) {
                    int LA102_4 = input.LA(3);

                    if ( (LA102_4==20||LA102_4==22) ) {
                        alt102=1;
                    }
                }
            }
            switch (alt102) {
                case 1 :
                    // InternalQVTrelation.g:4208:4: otherlv_5= '{' ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )? otherlv_8= '}'
                    {
                    otherlv_5=(Token)match(input,20,FollowSets000.FOLLOW_71); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_4_0());

                    }
                    // InternalQVTrelation.g:4212:4: ( ( (lv_isSerializable_6_0= 'serializable' ) ) | otherlv_7= '!serializable' )?
                    int alt101=3;
                    int LA101_0 = input.LA(1);

                    if ( (LA101_0==77) ) {
                        alt101=1;
                    }
                    else if ( (LA101_0==78) ) {
                        alt101=2;
                    }
                    switch (alt101) {
                        case 1 :
                            // InternalQVTrelation.g:4213:5: ( (lv_isSerializable_6_0= 'serializable' ) )
                            {
                            // InternalQVTrelation.g:4213:5: ( (lv_isSerializable_6_0= 'serializable' ) )
                            // InternalQVTrelation.g:4214:6: (lv_isSerializable_6_0= 'serializable' )
                            {
                            // InternalQVTrelation.g:4214:6: (lv_isSerializable_6_0= 'serializable' )
                            // InternalQVTrelation.g:4215:7: lv_isSerializable_6_0= 'serializable'
                            {
                            lv_isSerializable_6_0=(Token)match(input,77,FollowSets000.FOLLOW_17); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_isSerializable_6_0, grammarAccess.getEnumerationCSAccess().getIsSerializableSerializableKeyword_4_1_0_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getEnumerationCSRule());
                              							}
                              							setWithLastConsumed(current, "isSerializable", lv_isSerializable_6_0 != null, "serializable");

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:4228:5: otherlv_7= '!serializable'
                            {
                            otherlv_7=(Token)match(input,78,FollowSets000.FOLLOW_17); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_7, grammarAccess.getEnumerationCSAccess().getSerializableKeyword_4_1_1());

                            }

                            }
                            break;

                    }

                    otherlv_8=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_4_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:4238:3: ( (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' ) | otherlv_12= ';' )
            int alt104=2;
            int LA104_0 = input.LA(1);

            if ( (LA104_0==20) ) {
                alt104=1;
            }
            else if ( (LA104_0==22) ) {
                alt104=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 104, 0, input);

                throw nvae;
            }
            switch (alt104) {
                case 1 :
                    // InternalQVTrelation.g:4239:4: (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' )
                    {
                    // InternalQVTrelation.g:4239:4: (otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}' )
                    // InternalQVTrelation.g:4240:5: otherlv_9= '{' ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )* otherlv_11= '}'
                    {
                    otherlv_9=(Token)match(input,20,FollowSets000.FOLLOW_72); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_9, grammarAccess.getEnumerationCSAccess().getLeftCurlyBracketKeyword_5_0_0());

                    }
                    // InternalQVTrelation.g:4244:5: ( (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS ) )*
                    loop103:
                    do {
                        int alt103=2;
                        int LA103_0 = input.LA(1);

                        if ( ((LA103_0>=RULE_SIMPLE_ID && LA103_0<=RULE_ESCAPED_ID)||LA103_0==80) ) {
                            alt103=1;
                        }


                        switch (alt103) {
                    	case 1 :
                    	    // InternalQVTrelation.g:4245:6: (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS )
                    	    {
                    	    // InternalQVTrelation.g:4245:6: (lv_ownedLiterals_10_0= ruleEnumerationLiteralCS )
                    	    // InternalQVTrelation.g:4246:7: lv_ownedLiterals_10_0= ruleEnumerationLiteralCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getEnumerationCSAccess().getOwnedLiteralsEnumerationLiteralCSParserRuleCall_5_0_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_72);
                    	    lv_ownedLiterals_10_0=ruleEnumerationLiteralCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getEnumerationCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedLiterals",
                    	      								lv_ownedLiterals_10_0,
                    	      								"org.eclipse.qvtd.xtext.qvtbase.QVTbase.EnumerationLiteralCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop103;
                        }
                    } while (true);

                    otherlv_11=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_11, grammarAccess.getEnumerationCSAccess().getRightCurlyBracketKeyword_5_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:4269:4: otherlv_12= ';'
                    {
                    otherlv_12=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getEnumerationCSAccess().getSemicolonKeyword_5_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnumerationCS"


    // $ANTLR start "entryRuleEnumerationLiteralCS"
    // InternalQVTrelation.g:4278:1: entryRuleEnumerationLiteralCS returns [EObject current=null] : iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF ;
    public final EObject entryRuleEnumerationLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleEnumerationLiteralCS = null;


        try {
            // InternalQVTrelation.g:4278:61: (iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF )
            // InternalQVTrelation.g:4279:2: iv_ruleEnumerationLiteralCS= ruleEnumerationLiteralCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumerationLiteralCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnumerationLiteralCS=ruleEnumerationLiteralCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnumerationLiteralCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnumerationLiteralCS"


    // $ANTLR start "ruleEnumerationLiteralCS"
    // InternalQVTrelation.g:4285:1: ruleEnumerationLiteralCS returns [EObject current=null] : ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) ) ;
    public final EObject ruleEnumerationLiteralCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        AntlrDatatypeRuleToken lv_value_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:4291:2: ( ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) ) )
            // InternalQVTrelation.g:4292:2: ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) )
            {
            // InternalQVTrelation.g:4292:2: ( ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' ) )
            // InternalQVTrelation.g:4293:3: ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) ) (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )? ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' )
            {
            // InternalQVTrelation.g:4293:3: ( (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) ) | ( (lv_name_2_0= ruleEnumerationLiteralName ) ) )
            int alt105=2;
            int LA105_0 = input.LA(1);

            if ( (LA105_0==80) ) {
                alt105=1;
            }
            else if ( ((LA105_0>=RULE_SIMPLE_ID && LA105_0<=RULE_ESCAPED_ID)) ) {
                alt105=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 105, 0, input);

                throw nvae;
            }
            switch (alt105) {
                case 1 :
                    // InternalQVTrelation.g:4294:4: (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) )
                    {
                    // InternalQVTrelation.g:4294:4: (otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) ) )
                    // InternalQVTrelation.g:4295:5: otherlv_0= 'literal' ( (lv_name_1_0= ruleUnrestrictedName ) )
                    {
                    otherlv_0=(Token)match(input,80,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_0, grammarAccess.getEnumerationLiteralCSAccess().getLiteralKeyword_0_0_0());

                    }
                    // InternalQVTrelation.g:4299:5: ( (lv_name_1_0= ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:4300:6: (lv_name_1_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:4300:6: (lv_name_1_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:4301:7: lv_name_1_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getNameUnrestrictedNameParserRuleCall_0_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_7);
                    lv_name_1_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                      							}
                      							set(
                      								current,
                      								"name",
                      								lv_name_1_0,
                      								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:4320:4: ( (lv_name_2_0= ruleEnumerationLiteralName ) )
                    {
                    // InternalQVTrelation.g:4320:4: ( (lv_name_2_0= ruleEnumerationLiteralName ) )
                    // InternalQVTrelation.g:4321:5: (lv_name_2_0= ruleEnumerationLiteralName )
                    {
                    // InternalQVTrelation.g:4321:5: (lv_name_2_0= ruleEnumerationLiteralName )
                    // InternalQVTrelation.g:4322:6: lv_name_2_0= ruleEnumerationLiteralName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getNameEnumerationLiteralNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_7);
                    lv_name_2_0=ruleEnumerationLiteralName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_2_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.EnumerationLiteralName");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4340:3: (otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) ) )?
            int alt106=2;
            int LA106_0 = input.LA(1);

            if ( (LA106_0==19) ) {
                alt106=1;
            }
            switch (alt106) {
                case 1 :
                    // InternalQVTrelation.g:4341:4: otherlv_3= '=' ( (lv_value_4_0= ruleSIGNED ) )
                    {
                    otherlv_3=(Token)match(input,19,FollowSets000.FOLLOW_73); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getEnumerationLiteralCSAccess().getEqualsSignKeyword_1_0());

                    }
                    // InternalQVTrelation.g:4345:4: ( (lv_value_4_0= ruleSIGNED ) )
                    // InternalQVTrelation.g:4346:5: (lv_value_4_0= ruleSIGNED )
                    {
                    // InternalQVTrelation.g:4346:5: (lv_value_4_0= ruleSIGNED )
                    // InternalQVTrelation.g:4347:6: lv_value_4_0= ruleSIGNED
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getEnumerationLiteralCSAccess().getValueSIGNEDParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_9);
                    lv_value_4_0=ruleSIGNED();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getEnumerationLiteralCSRule());
                      						}
                      						set(
                      							current,
                      							"value",
                      							lv_value_4_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SIGNED");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4365:3: ( (otherlv_5= '{' otherlv_6= '}' ) | otherlv_7= ';' )
            int alt107=2;
            int LA107_0 = input.LA(1);

            if ( (LA107_0==20) ) {
                alt107=1;
            }
            else if ( (LA107_0==22) ) {
                alt107=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 107, 0, input);

                throw nvae;
            }
            switch (alt107) {
                case 1 :
                    // InternalQVTrelation.g:4366:4: (otherlv_5= '{' otherlv_6= '}' )
                    {
                    // InternalQVTrelation.g:4366:4: (otherlv_5= '{' otherlv_6= '}' )
                    // InternalQVTrelation.g:4367:5: otherlv_5= '{' otherlv_6= '}'
                    {
                    otherlv_5=(Token)match(input,20,FollowSets000.FOLLOW_17); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_5, grammarAccess.getEnumerationLiteralCSAccess().getLeftCurlyBracketKeyword_2_0_0());

                    }
                    otherlv_6=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getEnumerationLiteralCSAccess().getRightCurlyBracketKeyword_2_0_1());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:4377:4: otherlv_7= ';'
                    {
                    otherlv_7=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_7, grammarAccess.getEnumerationLiteralCSAccess().getSemicolonKeyword_2_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnumerationLiteralCS"


    // $ANTLR start "entryRuleOperationCS"
    // InternalQVTrelation.g:4386:1: entryRuleOperationCS returns [EObject current=null] : iv_ruleOperationCS= ruleOperationCS EOF ;
    public final EObject entryRuleOperationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleOperationCS = null;


        try {
            // InternalQVTrelation.g:4386:52: (iv_ruleOperationCS= ruleOperationCS EOF )
            // InternalQVTrelation.g:4387:2: iv_ruleOperationCS= ruleOperationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getOperationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleOperationCS=ruleOperationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleOperationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleOperationCS"


    // $ANTLR start "ruleOperationCS"
    // InternalQVTrelation.g:4393:1: ruleOperationCS returns [EObject current=null] : ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) ) ;
    public final EObject ruleOperationCS() throws RecognitionException {
        EObject current = null;

        Token lv_qualifiers_0_0=null;
        Token lv_qualifiers_1_0=null;
        Token lv_qualifiers_2_0=null;
        Token lv_qualifiers_3_0=null;
        Token otherlv_4=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token lv_qualifiers_19_0=null;
        Token lv_qualifiers_20_0=null;
        Token lv_qualifiers_21_0=null;
        Token lv_qualifiers_22_0=null;
        Token lv_qualifiers_23_0=null;
        Token lv_qualifiers_24_0=null;
        Token otherlv_25=null;
        Token otherlv_26=null;
        Token otherlv_27=null;
        Token otherlv_28=null;
        Token otherlv_30=null;
        Token otherlv_32=null;
        Token otherlv_33=null;
        Token otherlv_34=null;
        EObject lv_ownedSignature_5_0 = null;

        AntlrDatatypeRuleToken lv_name_6_0 = null;

        EObject lv_ownedParameters_8_0 = null;

        EObject lv_ownedParameters_10_0 = null;

        EObject lv_ownedType_13_0 = null;

        EObject lv_ownedExceptions_15_0 = null;

        EObject lv_ownedExceptions_17_0 = null;

        EObject lv_ownedBodyExpressions_31_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:4399:2: ( ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) ) )
            // InternalQVTrelation.g:4400:2: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) )
            {
            // InternalQVTrelation.g:4400:2: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' ) )
            // InternalQVTrelation.g:4401:3: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'operation' ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )? ( (lv_name_6_0= ruleUnrestrictedName ) ) otherlv_7= '(' ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )? otherlv_11= ')' (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )? (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )? ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' )
            {
            // InternalQVTrelation.g:4401:3: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt110=3;
            int LA110_0 = input.LA(1);

            if ( (LA110_0==56) ) {
                alt110=1;
            }
            else if ( (LA110_0==57) ) {
                alt110=2;
            }
            switch (alt110) {
                case 1 :
                    // InternalQVTrelation.g:4402:4: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalQVTrelation.g:4402:4: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalQVTrelation.g:4403:5: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalQVTrelation.g:4403:5: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalQVTrelation.g:4404:6: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalQVTrelation.g:4404:6: (lv_qualifiers_0_0= 'static' )
                    // InternalQVTrelation.g:4405:7: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,56,FollowSets000.FOLLOW_74); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_qualifiers_0_0, grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getOperationCSRule());
                      							}
                      							addWithLastConsumed(current, "qualifiers", lv_qualifiers_0_0, "static");

                    }

                    }


                    }

                    // InternalQVTrelation.g:4417:5: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt108=2;
                    int LA108_0 = input.LA(1);

                    if ( (LA108_0==57) ) {
                        alt108=1;
                    }
                    switch (alt108) {
                        case 1 :
                            // InternalQVTrelation.g:4418:6: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalQVTrelation.g:4418:6: (lv_qualifiers_1_0= 'definition' )
                            // InternalQVTrelation.g:4419:7: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,57,FollowSets000.FOLLOW_75); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_qualifiers_1_0, grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getOperationCSRule());
                              							}
                              							addWithLastConsumed(current, "qualifiers", lv_qualifiers_1_0, "definition");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:4433:4: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalQVTrelation.g:4433:4: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalQVTrelation.g:4434:5: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalQVTrelation.g:4434:5: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalQVTrelation.g:4435:6: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalQVTrelation.g:4435:6: (lv_qualifiers_2_0= 'definition' )
                    // InternalQVTrelation.g:4436:7: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,57,FollowSets000.FOLLOW_76); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_qualifiers_2_0, grammarAccess.getOperationCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getOperationCSRule());
                      							}
                      							addWithLastConsumed(current, "qualifiers", lv_qualifiers_2_0, "definition");

                    }

                    }


                    }

                    // InternalQVTrelation.g:4448:5: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt109=2;
                    int LA109_0 = input.LA(1);

                    if ( (LA109_0==56) ) {
                        alt109=1;
                    }
                    switch (alt109) {
                        case 1 :
                            // InternalQVTrelation.g:4449:6: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalQVTrelation.g:4449:6: (lv_qualifiers_3_0= 'static' )
                            // InternalQVTrelation.g:4450:7: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,56,FollowSets000.FOLLOW_75); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_qualifiers_3_0, grammarAccess.getOperationCSAccess().getQualifiersStaticKeyword_0_1_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getOperationCSRule());
                              							}
                              							addWithLastConsumed(current, "qualifiers", lv_qualifiers_3_0, "static");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,81,FollowSets000.FOLLOW_77); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getOperationCSAccess().getOperationKeyword_1());

            }
            // InternalQVTrelation.g:4468:3: ( (lv_ownedSignature_5_0= ruleTemplateSignatureCS ) )?
            int alt111=2;
            int LA111_0 = input.LA(1);

            if ( (LA111_0==33) ) {
                alt111=1;
            }
            switch (alt111) {
                case 1 :
                    // InternalQVTrelation.g:4469:4: (lv_ownedSignature_5_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTrelation.g:4469:4: (lv_ownedSignature_5_0= ruleTemplateSignatureCS )
                    // InternalQVTrelation.g:4470:5: lv_ownedSignature_5_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_5);
                    lv_ownedSignature_5_0=ruleTemplateSignatureCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedSignature",
                      						lv_ownedSignature_5_0,
                      						"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4487:3: ( (lv_name_6_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:4488:4: (lv_name_6_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:4488:4: (lv_name_6_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:4489:5: lv_name_6_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getOperationCSAccess().getNameUnrestrictedNameParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_29);
            lv_name_6_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getOperationCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_6_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_7=(Token)match(input,33,FollowSets000.FOLLOW_37); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getOperationCSAccess().getLeftParenthesisKeyword_4());

            }
            // InternalQVTrelation.g:4510:3: ( ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )* )?
            int alt113=2;
            int LA113_0 = input.LA(1);

            if ( ((LA113_0>=RULE_SIMPLE_ID && LA113_0<=RULE_ESCAPED_ID)||LA113_0==17||(LA113_0>=25 && LA113_0<=32)||(LA113_0>=35 && LA113_0<=43)||(LA113_0>=45 && LA113_0<=47)||(LA113_0>=49 && LA113_0<=59)||LA113_0==61||LA113_0==63||LA113_0==65||LA113_0==68||LA113_0==70||LA113_0==72||(LA113_0>=74 && LA113_0<=77)||(LA113_0>=79 && LA113_0<=84)||LA113_0==86||LA113_0==88||(LA113_0>=90 && LA113_0<=91)) ) {
                alt113=1;
            }
            switch (alt113) {
                case 1 :
                    // InternalQVTrelation.g:4511:4: ( (lv_ownedParameters_8_0= ruleParameterCS ) ) (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )*
                    {
                    // InternalQVTrelation.g:4511:4: ( (lv_ownedParameters_8_0= ruleParameterCS ) )
                    // InternalQVTrelation.g:4512:5: (lv_ownedParameters_8_0= ruleParameterCS )
                    {
                    // InternalQVTrelation.g:4512:5: (lv_ownedParameters_8_0= ruleParameterCS )
                    // InternalQVTrelation.g:4513:6: lv_ownedParameters_8_0= ruleParameterCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_38);
                    lv_ownedParameters_8_0=ruleParameterCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedParameters",
                      							lv_ownedParameters_8_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.ParameterCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:4530:4: (otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) ) )*
                    loop112:
                    do {
                        int alt112=2;
                        int LA112_0 = input.LA(1);

                        if ( (LA112_0==23) ) {
                            alt112=1;
                        }


                        switch (alt112) {
                    	case 1 :
                    	    // InternalQVTrelation.g:4531:5: otherlv_9= ',' ( (lv_ownedParameters_10_0= ruleParameterCS ) )
                    	    {
                    	    otherlv_9=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_9, grammarAccess.getOperationCSAccess().getCommaKeyword_5_1_0());

                    	    }
                    	    // InternalQVTrelation.g:4535:5: ( (lv_ownedParameters_10_0= ruleParameterCS ) )
                    	    // InternalQVTrelation.g:4536:6: (lv_ownedParameters_10_0= ruleParameterCS )
                    	    {
                    	    // InternalQVTrelation.g:4536:6: (lv_ownedParameters_10_0= ruleParameterCS )
                    	    // InternalQVTrelation.g:4537:7: lv_ownedParameters_10_0= ruleParameterCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedParametersParameterCSParserRuleCall_5_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_38);
                    	    lv_ownedParameters_10_0=ruleParameterCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedParameters",
                    	      								lv_ownedParameters_10_0,
                    	      								"org.eclipse.qvtd.xtext.qvtbase.QVTbase.ParameterCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop112;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_11=(Token)match(input,34,FollowSets000.FOLLOW_78); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_11, grammarAccess.getOperationCSAccess().getRightParenthesisKeyword_6());

            }
            // InternalQVTrelation.g:4560:3: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt114=2;
            int LA114_0 = input.LA(1);

            if ( (LA114_0==18) ) {
                alt114=1;
            }
            switch (alt114) {
                case 1 :
                    // InternalQVTrelation.g:4561:4: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_12=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getOperationCSAccess().getColonKeyword_7_0());

                    }
                    // InternalQVTrelation.g:4565:4: ( (lv_ownedType_13_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTrelation.g:4566:5: (lv_ownedType_13_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTrelation.g:4566:5: (lv_ownedType_13_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTrelation.g:4567:6: lv_ownedType_13_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_7_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_79);
                    lv_ownedType_13_0=ruleTypedMultiplicityRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_13_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4585:3: (otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )* )?
            int alt116=2;
            int LA116_0 = input.LA(1);

            if ( (LA116_0==82) ) {
                alt116=1;
            }
            switch (alt116) {
                case 1 :
                    // InternalQVTrelation.g:4586:4: otherlv_14= 'throws' ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) ) (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_14=(Token)match(input,82,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_14, grammarAccess.getOperationCSAccess().getThrowsKeyword_8_0());

                    }
                    // InternalQVTrelation.g:4590:4: ( (lv_ownedExceptions_15_0= ruleTypedRefCS ) )
                    // InternalQVTrelation.g:4591:5: (lv_ownedExceptions_15_0= ruleTypedRefCS )
                    {
                    // InternalQVTrelation.g:4591:5: (lv_ownedExceptions_15_0= ruleTypedRefCS )
                    // InternalQVTrelation.g:4592:6: lv_ownedExceptions_15_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_80);
                    lv_ownedExceptions_15_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getOperationCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedExceptions",
                      							lv_ownedExceptions_15_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:4609:4: (otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) ) )*
                    loop115:
                    do {
                        int alt115=2;
                        int LA115_0 = input.LA(1);

                        if ( (LA115_0==23) ) {
                            alt115=1;
                        }


                        switch (alt115) {
                    	case 1 :
                    	    // InternalQVTrelation.g:4610:5: otherlv_16= ',' ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_16=(Token)match(input,23,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_16, grammarAccess.getOperationCSAccess().getCommaKeyword_8_2_0());

                    	    }
                    	    // InternalQVTrelation.g:4614:5: ( (lv_ownedExceptions_17_0= ruleTypedRefCS ) )
                    	    // InternalQVTrelation.g:4615:6: (lv_ownedExceptions_17_0= ruleTypedRefCS )
                    	    {
                    	    // InternalQVTrelation.g:4615:6: (lv_ownedExceptions_17_0= ruleTypedRefCS )
                    	    // InternalQVTrelation.g:4616:7: lv_ownedExceptions_17_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedExceptionsTypedRefCSParserRuleCall_8_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_80);
                    	    lv_ownedExceptions_17_0=ruleTypedRefCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedExceptions",
                    	      								lv_ownedExceptions_17_0,
                    	      								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop115;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalQVTrelation.g:4635:3: (otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}' )?
            int alt120=2;
            int LA120_0 = input.LA(1);

            if ( (LA120_0==20) ) {
                int LA120_1 = input.LA(2);

                if ( ((LA120_1>=59 && LA120_1<=60)||(LA120_1>=63 && LA120_1<=64)||(LA120_1>=68 && LA120_1<=69)) ) {
                    alt120=1;
                }
            }
            switch (alt120) {
                case 1 :
                    // InternalQVTrelation.g:4636:4: otherlv_18= '{' ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+ otherlv_26= '}'
                    {
                    otherlv_18=(Token)match(input,20,FollowSets000.FOLLOW_81); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_18, grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_9_0());

                    }
                    // InternalQVTrelation.g:4640:4: ( ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )? )+
                    int cnt119=0;
                    loop119:
                    do {
                        int alt119=2;
                        int LA119_0 = input.LA(1);

                        if ( ((LA119_0>=59 && LA119_0<=60)||(LA119_0>=63 && LA119_0<=64)||(LA119_0>=68 && LA119_0<=69)) ) {
                            alt119=1;
                        }


                        switch (alt119) {
                    	case 1 :
                    	    // InternalQVTrelation.g:4641:5: ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) ) (otherlv_25= ',' )?
                    	    {
                    	    // InternalQVTrelation.g:4641:5: ( ( (lv_qualifiers_19_0= 'derived' ) ) | ( (lv_qualifiers_20_0= '!derived' ) ) | ( (lv_qualifiers_21_0= 'ordered' ) ) | ( (lv_qualifiers_22_0= '!ordered' ) ) | ( (lv_qualifiers_23_0= 'unique' ) ) | ( (lv_qualifiers_24_0= '!unique' ) ) )
                    	    int alt117=6;
                    	    switch ( input.LA(1) ) {
                    	    case 59:
                    	        {
                    	        alt117=1;
                    	        }
                    	        break;
                    	    case 60:
                    	        {
                    	        alt117=2;
                    	        }
                    	        break;
                    	    case 63:
                    	        {
                    	        alt117=3;
                    	        }
                    	        break;
                    	    case 64:
                    	        {
                    	        alt117=4;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt117=5;
                    	        }
                    	        break;
                    	    case 69:
                    	        {
                    	        alt117=6;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 117, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt117) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:4642:6: ( (lv_qualifiers_19_0= 'derived' ) )
                    	            {
                    	            // InternalQVTrelation.g:4642:6: ( (lv_qualifiers_19_0= 'derived' ) )
                    	            // InternalQVTrelation.g:4643:7: (lv_qualifiers_19_0= 'derived' )
                    	            {
                    	            // InternalQVTrelation.g:4643:7: (lv_qualifiers_19_0= 'derived' )
                    	            // InternalQVTrelation.g:4644:8: lv_qualifiers_19_0= 'derived'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,59,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_19_0, grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_19_0, "derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTrelation.g:4657:6: ( (lv_qualifiers_20_0= '!derived' ) )
                    	            {
                    	            // InternalQVTrelation.g:4657:6: ( (lv_qualifiers_20_0= '!derived' ) )
                    	            // InternalQVTrelation.g:4658:7: (lv_qualifiers_20_0= '!derived' )
                    	            {
                    	            // InternalQVTrelation.g:4658:7: (lv_qualifiers_20_0= '!derived' )
                    	            // InternalQVTrelation.g:4659:8: lv_qualifiers_20_0= '!derived'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,60,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_20_0, grammarAccess.getOperationCSAccess().getQualifiersDerivedKeyword_9_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_20_0, "!derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTrelation.g:4672:6: ( (lv_qualifiers_21_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:4672:6: ( (lv_qualifiers_21_0= 'ordered' ) )
                    	            // InternalQVTrelation.g:4673:7: (lv_qualifiers_21_0= 'ordered' )
                    	            {
                    	            // InternalQVTrelation.g:4673:7: (lv_qualifiers_21_0= 'ordered' )
                    	            // InternalQVTrelation.g:4674:8: lv_qualifiers_21_0= 'ordered'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,63,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_21_0, grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_21_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTrelation.g:4687:6: ( (lv_qualifiers_22_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:4687:6: ( (lv_qualifiers_22_0= '!ordered' ) )
                    	            // InternalQVTrelation.g:4688:7: (lv_qualifiers_22_0= '!ordered' )
                    	            {
                    	            // InternalQVTrelation.g:4688:7: (lv_qualifiers_22_0= '!ordered' )
                    	            // InternalQVTrelation.g:4689:8: lv_qualifiers_22_0= '!ordered'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,64,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_22_0, grammarAccess.getOperationCSAccess().getQualifiersOrderedKeyword_9_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_22_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 5 :
                    	            // InternalQVTrelation.g:4702:6: ( (lv_qualifiers_23_0= 'unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:4702:6: ( (lv_qualifiers_23_0= 'unique' ) )
                    	            // InternalQVTrelation.g:4703:7: (lv_qualifiers_23_0= 'unique' )
                    	            {
                    	            // InternalQVTrelation.g:4703:7: (lv_qualifiers_23_0= 'unique' )
                    	            // InternalQVTrelation.g:4704:8: lv_qualifiers_23_0= 'unique'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,68,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_23_0, grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalQVTrelation.g:4717:6: ( (lv_qualifiers_24_0= '!unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:4717:6: ( (lv_qualifiers_24_0= '!unique' ) )
                    	            // InternalQVTrelation.g:4718:7: (lv_qualifiers_24_0= '!unique' )
                    	            {
                    	            // InternalQVTrelation.g:4718:7: (lv_qualifiers_24_0= '!unique' )
                    	            // InternalQVTrelation.g:4719:8: lv_qualifiers_24_0= '!unique'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,69,FollowSets000.FOLLOW_82); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_24_0, grammarAccess.getOperationCSAccess().getQualifiersUniqueKeyword_9_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTrelation.g:4732:5: (otherlv_25= ',' )?
                    	    int alt118=2;
                    	    int LA118_0 = input.LA(1);

                    	    if ( (LA118_0==23) ) {
                    	        alt118=1;
                    	    }
                    	    switch (alt118) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:4733:6: otherlv_25= ','
                    	            {
                    	            otherlv_25=(Token)match(input,23,FollowSets000.FOLLOW_83); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_25, grammarAccess.getOperationCSAccess().getCommaKeyword_9_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt119 >= 1 ) break loop119;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(119, input);
                                throw eee;
                        }
                        cnt119++;
                    } while (true);

                    otherlv_26=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_26, grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_9_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:4744:3: ( (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' ) | otherlv_34= ';' )
            int alt124=2;
            int LA124_0 = input.LA(1);

            if ( (LA124_0==20) ) {
                alt124=1;
            }
            else if ( (LA124_0==22) ) {
                alt124=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 124, 0, input);

                throw nvae;
            }
            switch (alt124) {
                case 1 :
                    // InternalQVTrelation.g:4745:4: (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' )
                    {
                    // InternalQVTrelation.g:4745:4: (otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}' )
                    // InternalQVTrelation.g:4746:5: otherlv_27= '{' (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )* otherlv_33= '}'
                    {
                    otherlv_27=(Token)match(input,20,FollowSets000.FOLLOW_84); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_27, grammarAccess.getOperationCSAccess().getLeftCurlyBracketKeyword_10_0_0());

                    }
                    // InternalQVTrelation.g:4750:5: (otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';' )*
                    loop123:
                    do {
                        int alt123=2;
                        int LA123_0 = input.LA(1);

                        if ( (LA123_0==83) ) {
                            alt123=1;
                        }


                        switch (alt123) {
                    	case 1 :
                    	    // InternalQVTrelation.g:4751:6: otherlv_28= 'body' ( ruleUnrestrictedName )? otherlv_30= ':' ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )? otherlv_32= ';'
                    	    {
                    	    otherlv_28=(Token)match(input,83,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_28, grammarAccess.getOperationCSAccess().getBodyKeyword_10_0_1_0());

                    	    }
                    	    // InternalQVTrelation.g:4755:6: ( ruleUnrestrictedName )?
                    	    int alt121=2;
                    	    int LA121_0 = input.LA(1);

                    	    if ( ((LA121_0>=RULE_SIMPLE_ID && LA121_0<=RULE_ESCAPED_ID)||LA121_0==17||(LA121_0>=25 && LA121_0<=32)||(LA121_0>=35 && LA121_0<=43)||(LA121_0>=45 && LA121_0<=47)||(LA121_0>=49 && LA121_0<=59)||LA121_0==61||LA121_0==63||LA121_0==65||LA121_0==68||LA121_0==70||LA121_0==72||(LA121_0>=74 && LA121_0<=77)||(LA121_0>=79 && LA121_0<=84)||LA121_0==86||LA121_0==88||(LA121_0>=90 && LA121_0<=91)) ) {
                    	        alt121=1;
                    	    }
                    	    switch (alt121) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:4756:7: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              							/* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              							newCompositeNode(grammarAccess.getOperationCSAccess().getUnrestrictedNameParserRuleCall_10_0_1_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_30=(Token)match(input,18,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_30, grammarAccess.getOperationCSAccess().getColonKeyword_10_0_1_2());

                    	    }
                    	    // InternalQVTrelation.g:4771:6: ( (lv_ownedBodyExpressions_31_0= ruleSpecificationCS ) )?
                    	    int alt122=2;
                    	    int LA122_0 = input.LA(1);

                    	    if ( ((LA122_0>=RULE_SINGLE_QUOTED_STRING && LA122_0<=RULE_ESCAPED_ID)||LA122_0==17||(LA122_0>=25 && LA122_0<=33)||(LA122_0>=35 && LA122_0<=43)||(LA122_0>=45 && LA122_0<=59)||LA122_0==61||LA122_0==63||LA122_0==65||LA122_0==68||LA122_0==70||LA122_0==72||(LA122_0>=74 && LA122_0<=77)||(LA122_0>=79 && LA122_0<=84)||LA122_0==86||LA122_0==88||(LA122_0>=90 && LA122_0<=94)||(LA122_0>=114 && LA122_0<=128)||LA122_0==130||(LA122_0>=132 && LA122_0<=135)||LA122_0==142||(LA122_0>=147 && LA122_0<=148)) ) {
                    	        alt122=1;
                    	    }
                    	    switch (alt122) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:4772:7: (lv_ownedBodyExpressions_31_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTrelation.g:4772:7: (lv_ownedBodyExpressions_31_0= ruleSpecificationCS )
                    	            // InternalQVTrelation.g:4773:8: lv_ownedBodyExpressions_31_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getOperationCSAccess().getOwnedBodyExpressionsSpecificationCSParserRuleCall_10_0_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_20);
                    	            lv_ownedBodyExpressions_31_0=ruleSpecificationCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElementForParent(grammarAccess.getOperationCSRule());
                    	              								}
                    	              								add(
                    	              									current,
                    	              									"ownedBodyExpressions",
                    	              									lv_ownedBodyExpressions_31_0,
                    	              									"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              								afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_32=(Token)match(input,22,FollowSets000.FOLLOW_84); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      						newLeafNode(otherlv_32, grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_0_1_4());

                    	    }

                    	    }
                    	    break;

                    	default :
                    	    break loop123;
                        }
                    } while (true);

                    otherlv_33=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_33, grammarAccess.getOperationCSAccess().getRightCurlyBracketKeyword_10_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:4801:4: otherlv_34= ';'
                    {
                    otherlv_34=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_34, grammarAccess.getOperationCSAccess().getSemicolonKeyword_10_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleOperationCS"


    // $ANTLR start "entryRuleParameterCS"
    // InternalQVTrelation.g:4810:1: entryRuleParameterCS returns [EObject current=null] : iv_ruleParameterCS= ruleParameterCS EOF ;
    public final EObject entryRuleParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleParameterCS = null;


        try {
            // InternalQVTrelation.g:4810:52: (iv_ruleParameterCS= ruleParameterCS EOF )
            // InternalQVTrelation.g:4811:2: iv_ruleParameterCS= ruleParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleParameterCS=ruleParameterCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleParameterCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleParameterCS"


    // $ANTLR start "ruleParameterCS"
    // InternalQVTrelation.g:4817:1: ruleParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? ) ;
    public final EObject ruleParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token lv_qualifiers_4_0=null;
        Token lv_qualifiers_5_0=null;
        Token lv_qualifiers_6_0=null;
        Token lv_qualifiers_7_0=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:4823:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? ) )
            // InternalQVTrelation.g:4824:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? )
            {
            // InternalQVTrelation.g:4824:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )? )
            // InternalQVTrelation.g:4825:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )? (otherlv_10= '{' otherlv_11= '}' )?
            {
            // InternalQVTrelation.g:4825:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:4826:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:4826:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:4827:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_85);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getParameterCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:4844:3: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt125=2;
            int LA125_0 = input.LA(1);

            if ( (LA125_0==18) ) {
                alt125=1;
            }
            switch (alt125) {
                case 1 :
                    // InternalQVTrelation.g:4845:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getParameterCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTrelation.g:4849:4: ( (lv_ownedType_2_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTrelation.g:4850:5: (lv_ownedType_2_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTrelation.g:4850:5: (lv_ownedType_2_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTrelation.g:4851:6: lv_ownedType_2_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getParameterCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_13);
                    lv_ownedType_2_0=ruleTypedMultiplicityRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getParameterCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_2_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:4869:3: (otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}' )?
            int alt129=2;
            int LA129_0 = input.LA(1);

            if ( (LA129_0==20) ) {
                int LA129_1 = input.LA(2);

                if ( ((LA129_1>=63 && LA129_1<=64)||(LA129_1>=68 && LA129_1<=69)) ) {
                    alt129=1;
                }
            }
            switch (alt129) {
                case 1 :
                    // InternalQVTrelation.g:4870:4: otherlv_3= '{' ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+ otherlv_9= '}'
                    {
                    otherlv_3=(Token)match(input,20,FollowSets000.FOLLOW_86); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_2_0());

                    }
                    // InternalQVTrelation.g:4874:4: ( ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )? )+
                    int cnt128=0;
                    loop128:
                    do {
                        int alt128=2;
                        int LA128_0 = input.LA(1);

                        if ( ((LA128_0>=63 && LA128_0<=64)||(LA128_0>=68 && LA128_0<=69)) ) {
                            alt128=1;
                        }


                        switch (alt128) {
                    	case 1 :
                    	    // InternalQVTrelation.g:4875:5: ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) ) (otherlv_8= ',' )?
                    	    {
                    	    // InternalQVTrelation.g:4875:5: ( ( (lv_qualifiers_4_0= 'ordered' ) ) | ( (lv_qualifiers_5_0= '!ordered' ) ) | ( (lv_qualifiers_6_0= 'unique' ) ) | ( (lv_qualifiers_7_0= '!unique' ) ) )
                    	    int alt126=4;
                    	    switch ( input.LA(1) ) {
                    	    case 63:
                    	        {
                    	        alt126=1;
                    	        }
                    	        break;
                    	    case 64:
                    	        {
                    	        alt126=2;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt126=3;
                    	        }
                    	        break;
                    	    case 69:
                    	        {
                    	        alt126=4;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 126, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt126) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:4876:6: ( (lv_qualifiers_4_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:4876:6: ( (lv_qualifiers_4_0= 'ordered' ) )
                    	            // InternalQVTrelation.g:4877:7: (lv_qualifiers_4_0= 'ordered' )
                    	            {
                    	            // InternalQVTrelation.g:4877:7: (lv_qualifiers_4_0= 'ordered' )
                    	            // InternalQVTrelation.g:4878:8: lv_qualifiers_4_0= 'ordered'
                    	            {
                    	            lv_qualifiers_4_0=(Token)match(input,63,FollowSets000.FOLLOW_87); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_4_0, grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getParameterCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_4_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTrelation.g:4891:6: ( (lv_qualifiers_5_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:4891:6: ( (lv_qualifiers_5_0= '!ordered' ) )
                    	            // InternalQVTrelation.g:4892:7: (lv_qualifiers_5_0= '!ordered' )
                    	            {
                    	            // InternalQVTrelation.g:4892:7: (lv_qualifiers_5_0= '!ordered' )
                    	            // InternalQVTrelation.g:4893:8: lv_qualifiers_5_0= '!ordered'
                    	            {
                    	            lv_qualifiers_5_0=(Token)match(input,64,FollowSets000.FOLLOW_87); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_5_0, grammarAccess.getParameterCSAccess().getQualifiersOrderedKeyword_2_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getParameterCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_5_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTrelation.g:4906:6: ( (lv_qualifiers_6_0= 'unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:4906:6: ( (lv_qualifiers_6_0= 'unique' ) )
                    	            // InternalQVTrelation.g:4907:7: (lv_qualifiers_6_0= 'unique' )
                    	            {
                    	            // InternalQVTrelation.g:4907:7: (lv_qualifiers_6_0= 'unique' )
                    	            // InternalQVTrelation.g:4908:8: lv_qualifiers_6_0= 'unique'
                    	            {
                    	            lv_qualifiers_6_0=(Token)match(input,68,FollowSets000.FOLLOW_87); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_6_0, grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getParameterCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_6_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTrelation.g:4921:6: ( (lv_qualifiers_7_0= '!unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:4921:6: ( (lv_qualifiers_7_0= '!unique' ) )
                    	            // InternalQVTrelation.g:4922:7: (lv_qualifiers_7_0= '!unique' )
                    	            {
                    	            // InternalQVTrelation.g:4922:7: (lv_qualifiers_7_0= '!unique' )
                    	            // InternalQVTrelation.g:4923:8: lv_qualifiers_7_0= '!unique'
                    	            {
                    	            lv_qualifiers_7_0=(Token)match(input,69,FollowSets000.FOLLOW_87); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_7_0, grammarAccess.getParameterCSAccess().getQualifiersUniqueKeyword_2_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getParameterCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_7_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTrelation.g:4936:5: (otherlv_8= ',' )?
                    	    int alt127=2;
                    	    int LA127_0 = input.LA(1);

                    	    if ( (LA127_0==23) ) {
                    	        alt127=1;
                    	    }
                    	    switch (alt127) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:4937:6: otherlv_8= ','
                    	            {
                    	            otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_88); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_8, grammarAccess.getParameterCSAccess().getCommaKeyword_2_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt128 >= 1 ) break loop128;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(128, input);
                                throw eee;
                        }
                        cnt128++;
                    } while (true);

                    otherlv_9=(Token)match(input,21,FollowSets000.FOLLOW_13); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_9, grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_2_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:4948:3: (otherlv_10= '{' otherlv_11= '}' )?
            int alt130=2;
            int LA130_0 = input.LA(1);

            if ( (LA130_0==20) ) {
                alt130=1;
            }
            switch (alt130) {
                case 1 :
                    // InternalQVTrelation.g:4949:4: otherlv_10= '{' otherlv_11= '}'
                    {
                    otherlv_10=(Token)match(input,20,FollowSets000.FOLLOW_17); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getParameterCSAccess().getLeftCurlyBracketKeyword_3_0());

                    }
                    otherlv_11=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_11, grammarAccess.getParameterCSAccess().getRightCurlyBracketKeyword_3_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleParameterCS"


    // $ANTLR start "entryRuleReferenceCS"
    // InternalQVTrelation.g:4962:1: entryRuleReferenceCS returns [EObject current=null] : iv_ruleReferenceCS= ruleReferenceCS EOF ;
    public final EObject entryRuleReferenceCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReferenceCS = null;


        try {
            // InternalQVTrelation.g:4962:52: (iv_ruleReferenceCS= ruleReferenceCS EOF )
            // InternalQVTrelation.g:4963:2: iv_ruleReferenceCS= ruleReferenceCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReferenceCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleReferenceCS=ruleReferenceCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleReferenceCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleReferenceCS"


    // $ANTLR start "ruleReferenceCS"
    // InternalQVTrelation.g:4969:1: ruleReferenceCS returns [EObject current=null] : ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) ) ;
    public final EObject ruleReferenceCS() throws RecognitionException {
        EObject current = null;

        Token lv_qualifiers_0_0=null;
        Token lv_qualifiers_1_0=null;
        Token lv_qualifiers_2_0=null;
        Token lv_qualifiers_3_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token lv_default_11_0=null;
        Token otherlv_12=null;
        Token lv_qualifiers_13_0=null;
        Token lv_qualifiers_14_0=null;
        Token lv_qualifiers_15_0=null;
        Token lv_qualifiers_16_0=null;
        Token lv_qualifiers_17_0=null;
        Token lv_qualifiers_18_0=null;
        Token lv_qualifiers_19_0=null;
        Token lv_qualifiers_20_0=null;
        Token lv_qualifiers_21_0=null;
        Token lv_qualifiers_22_0=null;
        Token lv_qualifiers_23_0=null;
        Token lv_qualifiers_24_0=null;
        Token lv_qualifiers_25_0=null;
        Token lv_qualifiers_26_0=null;
        Token lv_qualifiers_27_0=null;
        Token lv_qualifiers_28_0=null;
        Token lv_qualifiers_29_0=null;
        Token lv_qualifiers_30_0=null;
        Token otherlv_31=null;
        Token otherlv_32=null;
        Token otherlv_33=null;
        Token otherlv_34=null;
        Token otherlv_36=null;
        Token otherlv_38=null;
        Token otherlv_39=null;
        Token otherlv_41=null;
        Token otherlv_43=null;
        Token otherlv_44=null;
        Token otherlv_45=null;
        AntlrDatatypeRuleToken lv_name_5_0 = null;

        EObject lv_ownedType_9_0 = null;

        EObject lv_ownedDefaultExpressions_37_0 = null;

        EObject lv_ownedDefaultExpressions_42_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:4975:2: ( ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) ) )
            // InternalQVTrelation.g:4976:2: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) )
            {
            // InternalQVTrelation.g:4976:2: ( ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' ) )
            // InternalQVTrelation.g:4977:3: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )? otherlv_4= 'property' ( (lv_name_5_0= ruleUnrestrictedName ) ) (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )? (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )? (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )? ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' )
            {
            // InternalQVTrelation.g:4977:3: ( ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? ) | ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? ) )?
            int alt133=3;
            int LA133_0 = input.LA(1);

            if ( (LA133_0==56) ) {
                alt133=1;
            }
            else if ( (LA133_0==57) ) {
                alt133=2;
            }
            switch (alt133) {
                case 1 :
                    // InternalQVTrelation.g:4978:4: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    {
                    // InternalQVTrelation.g:4978:4: ( ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )? )
                    // InternalQVTrelation.g:4979:5: ( (lv_qualifiers_0_0= 'static' ) ) ( (lv_qualifiers_1_0= 'definition' ) )?
                    {
                    // InternalQVTrelation.g:4979:5: ( (lv_qualifiers_0_0= 'static' ) )
                    // InternalQVTrelation.g:4980:6: (lv_qualifiers_0_0= 'static' )
                    {
                    // InternalQVTrelation.g:4980:6: (lv_qualifiers_0_0= 'static' )
                    // InternalQVTrelation.g:4981:7: lv_qualifiers_0_0= 'static'
                    {
                    lv_qualifiers_0_0=(Token)match(input,56,FollowSets000.FOLLOW_89); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_qualifiers_0_0, grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getReferenceCSRule());
                      							}
                      							addWithLastConsumed(current, "qualifiers", lv_qualifiers_0_0, "static");

                    }

                    }


                    }

                    // InternalQVTrelation.g:4993:5: ( (lv_qualifiers_1_0= 'definition' ) )?
                    int alt131=2;
                    int LA131_0 = input.LA(1);

                    if ( (LA131_0==57) ) {
                        alt131=1;
                    }
                    switch (alt131) {
                        case 1 :
                            // InternalQVTrelation.g:4994:6: (lv_qualifiers_1_0= 'definition' )
                            {
                            // InternalQVTrelation.g:4994:6: (lv_qualifiers_1_0= 'definition' )
                            // InternalQVTrelation.g:4995:7: lv_qualifiers_1_0= 'definition'
                            {
                            lv_qualifiers_1_0=(Token)match(input,57,FollowSets000.FOLLOW_90); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_qualifiers_1_0, grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_0_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getReferenceCSRule());
                              							}
                              							addWithLastConsumed(current, "qualifiers", lv_qualifiers_1_0, "definition");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:5009:4: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    {
                    // InternalQVTrelation.g:5009:4: ( ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )? )
                    // InternalQVTrelation.g:5010:5: ( (lv_qualifiers_2_0= 'definition' ) ) ( (lv_qualifiers_3_0= 'static' ) )?
                    {
                    // InternalQVTrelation.g:5010:5: ( (lv_qualifiers_2_0= 'definition' ) )
                    // InternalQVTrelation.g:5011:6: (lv_qualifiers_2_0= 'definition' )
                    {
                    // InternalQVTrelation.g:5011:6: (lv_qualifiers_2_0= 'definition' )
                    // InternalQVTrelation.g:5012:7: lv_qualifiers_2_0= 'definition'
                    {
                    lv_qualifiers_2_0=(Token)match(input,57,FollowSets000.FOLLOW_91); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							newLeafNode(lv_qualifiers_2_0, grammarAccess.getReferenceCSAccess().getQualifiersDefinitionKeyword_0_1_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElement(grammarAccess.getReferenceCSRule());
                      							}
                      							addWithLastConsumed(current, "qualifiers", lv_qualifiers_2_0, "definition");

                    }

                    }


                    }

                    // InternalQVTrelation.g:5024:5: ( (lv_qualifiers_3_0= 'static' ) )?
                    int alt132=2;
                    int LA132_0 = input.LA(1);

                    if ( (LA132_0==56) ) {
                        alt132=1;
                    }
                    switch (alt132) {
                        case 1 :
                            // InternalQVTrelation.g:5025:6: (lv_qualifiers_3_0= 'static' )
                            {
                            // InternalQVTrelation.g:5025:6: (lv_qualifiers_3_0= 'static' )
                            // InternalQVTrelation.g:5026:7: lv_qualifiers_3_0= 'static'
                            {
                            lv_qualifiers_3_0=(Token)match(input,56,FollowSets000.FOLLOW_90); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							newLeafNode(lv_qualifiers_3_0, grammarAccess.getReferenceCSAccess().getQualifiersStaticKeyword_0_1_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getReferenceCSRule());
                              							}
                              							addWithLastConsumed(current, "qualifiers", lv_qualifiers_3_0, "static");

                            }

                            }


                            }
                            break;

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,84,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getReferenceCSAccess().getPropertyKeyword_1());

            }
            // InternalQVTrelation.g:5044:3: ( (lv_name_5_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:5045:4: (lv_name_5_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:5045:4: (lv_name_5_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:5046:5: lv_name_5_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getReferenceCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_92);
            lv_name_5_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getReferenceCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_5_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:5063:3: (otherlv_6= '#' ( ( ruleUnrestrictedName ) ) )?
            int alt134=2;
            int LA134_0 = input.LA(1);

            if ( (LA134_0==85) ) {
                alt134=1;
            }
            switch (alt134) {
                case 1 :
                    // InternalQVTrelation.g:5064:4: otherlv_6= '#' ( ( ruleUnrestrictedName ) )
                    {
                    otherlv_6=(Token)match(input,85,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_6, grammarAccess.getReferenceCSAccess().getNumberSignKeyword_3_0());

                    }
                    // InternalQVTrelation.g:5068:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:5069:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:5069:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:5070:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getReferenceCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getReferenceCSAccess().getReferredOppositePropertyCrossReference_3_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_6);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:5088:3: (otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) ) )?
            int alt135=2;
            int LA135_0 = input.LA(1);

            if ( (LA135_0==18) ) {
                alt135=1;
            }
            switch (alt135) {
                case 1 :
                    // InternalQVTrelation.g:5089:4: otherlv_8= ':' ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) )
                    {
                    otherlv_8=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getReferenceCSAccess().getColonKeyword_4_0());

                    }
                    // InternalQVTrelation.g:5093:4: ( (lv_ownedType_9_0= ruleTypedMultiplicityRefCS ) )
                    // InternalQVTrelation.g:5094:5: (lv_ownedType_9_0= ruleTypedMultiplicityRefCS )
                    {
                    // InternalQVTrelation.g:5094:5: (lv_ownedType_9_0= ruleTypedMultiplicityRefCS )
                    // InternalQVTrelation.g:5095:6: lv_ownedType_9_0= ruleTypedMultiplicityRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedTypeTypedMultiplicityRefCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_7);
                    lv_ownedType_9_0=ruleTypedMultiplicityRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_9_0,
                      							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.TypedMultiplicityRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:5113:3: (otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt136=2;
            int LA136_0 = input.LA(1);

            if ( (LA136_0==19) ) {
                alt136=1;
            }
            switch (alt136) {
                case 1 :
                    // InternalQVTrelation.g:5114:4: otherlv_10= '=' ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_10=(Token)match(input,19,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getReferenceCSAccess().getEqualsSignKeyword_5_0());

                    }
                    // InternalQVTrelation.g:5118:4: ( (lv_default_11_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTrelation.g:5119:5: (lv_default_11_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTrelation.g:5119:5: (lv_default_11_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTrelation.g:5120:6: lv_default_11_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_default_11_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_default_11_0, grammarAccess.getReferenceCSAccess().getDefaultSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getReferenceCSRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"default",
                      							lv_default_11_0,
                      							"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:5137:3: (otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}' )?
            int alt140=2;
            int LA140_0 = input.LA(1);

            if ( (LA140_0==20) ) {
                int LA140_1 = input.LA(2);

                if ( (LA140_1==38||(LA140_1>=59 && LA140_1<=60)||(LA140_1>=63 && LA140_1<=73)||(LA140_1>=86 && LA140_1<=89)) ) {
                    alt140=1;
                }
            }
            switch (alt140) {
                case 1 :
                    // InternalQVTrelation.g:5138:4: otherlv_12= '{' ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+ otherlv_32= '}'
                    {
                    otherlv_12=(Token)match(input,20,FollowSets000.FOLLOW_93); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_6_0());

                    }
                    // InternalQVTrelation.g:5142:4: ( ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )? )+
                    int cnt139=0;
                    loop139:
                    do {
                        int alt139=2;
                        int LA139_0 = input.LA(1);

                        if ( (LA139_0==38||(LA139_0>=59 && LA139_0<=60)||(LA139_0>=63 && LA139_0<=73)||(LA139_0>=86 && LA139_0<=89)) ) {
                            alt139=1;
                        }


                        switch (alt139) {
                    	case 1 :
                    	    // InternalQVTrelation.g:5143:5: ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) ) (otherlv_31= ',' )?
                    	    {
                    	    // InternalQVTrelation.g:5143:5: ( ( (lv_qualifiers_13_0= 'composes' ) ) | ( (lv_qualifiers_14_0= '!composes' ) ) | ( (lv_qualifiers_15_0= 'derived' ) ) | ( (lv_qualifiers_16_0= '!derived' ) ) | ( (lv_qualifiers_17_0= 'ordered' ) ) | ( (lv_qualifiers_18_0= '!ordered' ) ) | ( (lv_qualifiers_19_0= 'readonly' ) ) | ( (lv_qualifiers_20_0= '!readonly' ) ) | ( (lv_qualifiers_21_0= 'resolve' ) ) | ( (lv_qualifiers_22_0= '!resolve' ) ) | ( (lv_qualifiers_23_0= 'transient' ) ) | ( (lv_qualifiers_24_0= '!transient' ) ) | ( (lv_qualifiers_25_0= 'unique' ) ) | ( (lv_qualifiers_26_0= '!unique' ) ) | ( (lv_qualifiers_27_0= 'unsettable' ) ) | ( (lv_qualifiers_28_0= '!unsettable' ) ) | ( (lv_qualifiers_29_0= 'volatile' ) ) | ( (lv_qualifiers_30_0= '!volatile' ) ) )
                    	    int alt137=18;
                    	    switch ( input.LA(1) ) {
                    	    case 86:
                    	        {
                    	        alt137=1;
                    	        }
                    	        break;
                    	    case 87:
                    	        {
                    	        alt137=2;
                    	        }
                    	        break;
                    	    case 59:
                    	        {
                    	        alt137=3;
                    	        }
                    	        break;
                    	    case 60:
                    	        {
                    	        alt137=4;
                    	        }
                    	        break;
                    	    case 63:
                    	        {
                    	        alt137=5;
                    	        }
                    	        break;
                    	    case 64:
                    	        {
                    	        alt137=6;
                    	        }
                    	        break;
                    	    case 65:
                    	        {
                    	        alt137=7;
                    	        }
                    	        break;
                    	    case 66:
                    	        {
                    	        alt137=8;
                    	        }
                    	        break;
                    	    case 88:
                    	        {
                    	        alt137=9;
                    	        }
                    	        break;
                    	    case 89:
                    	        {
                    	        alt137=10;
                    	        }
                    	        break;
                    	    case 38:
                    	        {
                    	        alt137=11;
                    	        }
                    	        break;
                    	    case 67:
                    	        {
                    	        alt137=12;
                    	        }
                    	        break;
                    	    case 68:
                    	        {
                    	        alt137=13;
                    	        }
                    	        break;
                    	    case 69:
                    	        {
                    	        alt137=14;
                    	        }
                    	        break;
                    	    case 70:
                    	        {
                    	        alt137=15;
                    	        }
                    	        break;
                    	    case 71:
                    	        {
                    	        alt137=16;
                    	        }
                    	        break;
                    	    case 72:
                    	        {
                    	        alt137=17;
                    	        }
                    	        break;
                    	    case 73:
                    	        {
                    	        alt137=18;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 137, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt137) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:5144:6: ( (lv_qualifiers_13_0= 'composes' ) )
                    	            {
                    	            // InternalQVTrelation.g:5144:6: ( (lv_qualifiers_13_0= 'composes' ) )
                    	            // InternalQVTrelation.g:5145:7: (lv_qualifiers_13_0= 'composes' )
                    	            {
                    	            // InternalQVTrelation.g:5145:7: (lv_qualifiers_13_0= 'composes' )
                    	            // InternalQVTrelation.g:5146:8: lv_qualifiers_13_0= 'composes'
                    	            {
                    	            lv_qualifiers_13_0=(Token)match(input,86,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_13_0, grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_0_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_13_0, "composes");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTrelation.g:5159:6: ( (lv_qualifiers_14_0= '!composes' ) )
                    	            {
                    	            // InternalQVTrelation.g:5159:6: ( (lv_qualifiers_14_0= '!composes' ) )
                    	            // InternalQVTrelation.g:5160:7: (lv_qualifiers_14_0= '!composes' )
                    	            {
                    	            // InternalQVTrelation.g:5160:7: (lv_qualifiers_14_0= '!composes' )
                    	            // InternalQVTrelation.g:5161:8: lv_qualifiers_14_0= '!composes'
                    	            {
                    	            lv_qualifiers_14_0=(Token)match(input,87,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_14_0, grammarAccess.getReferenceCSAccess().getQualifiersComposesKeyword_6_1_0_1_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_14_0, "!composes");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTrelation.g:5174:6: ( (lv_qualifiers_15_0= 'derived' ) )
                    	            {
                    	            // InternalQVTrelation.g:5174:6: ( (lv_qualifiers_15_0= 'derived' ) )
                    	            // InternalQVTrelation.g:5175:7: (lv_qualifiers_15_0= 'derived' )
                    	            {
                    	            // InternalQVTrelation.g:5175:7: (lv_qualifiers_15_0= 'derived' )
                    	            // InternalQVTrelation.g:5176:8: lv_qualifiers_15_0= 'derived'
                    	            {
                    	            lv_qualifiers_15_0=(Token)match(input,59,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_15_0, grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_2_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_15_0, "derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 4 :
                    	            // InternalQVTrelation.g:5189:6: ( (lv_qualifiers_16_0= '!derived' ) )
                    	            {
                    	            // InternalQVTrelation.g:5189:6: ( (lv_qualifiers_16_0= '!derived' ) )
                    	            // InternalQVTrelation.g:5190:7: (lv_qualifiers_16_0= '!derived' )
                    	            {
                    	            // InternalQVTrelation.g:5190:7: (lv_qualifiers_16_0= '!derived' )
                    	            // InternalQVTrelation.g:5191:8: lv_qualifiers_16_0= '!derived'
                    	            {
                    	            lv_qualifiers_16_0=(Token)match(input,60,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_16_0, grammarAccess.getReferenceCSAccess().getQualifiersDerivedKeyword_6_1_0_3_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_16_0, "!derived");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 5 :
                    	            // InternalQVTrelation.g:5204:6: ( (lv_qualifiers_17_0= 'ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:5204:6: ( (lv_qualifiers_17_0= 'ordered' ) )
                    	            // InternalQVTrelation.g:5205:7: (lv_qualifiers_17_0= 'ordered' )
                    	            {
                    	            // InternalQVTrelation.g:5205:7: (lv_qualifiers_17_0= 'ordered' )
                    	            // InternalQVTrelation.g:5206:8: lv_qualifiers_17_0= 'ordered'
                    	            {
                    	            lv_qualifiers_17_0=(Token)match(input,63,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_17_0, grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_4_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_17_0, "ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 6 :
                    	            // InternalQVTrelation.g:5219:6: ( (lv_qualifiers_18_0= '!ordered' ) )
                    	            {
                    	            // InternalQVTrelation.g:5219:6: ( (lv_qualifiers_18_0= '!ordered' ) )
                    	            // InternalQVTrelation.g:5220:7: (lv_qualifiers_18_0= '!ordered' )
                    	            {
                    	            // InternalQVTrelation.g:5220:7: (lv_qualifiers_18_0= '!ordered' )
                    	            // InternalQVTrelation.g:5221:8: lv_qualifiers_18_0= '!ordered'
                    	            {
                    	            lv_qualifiers_18_0=(Token)match(input,64,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_18_0, grammarAccess.getReferenceCSAccess().getQualifiersOrderedKeyword_6_1_0_5_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_18_0, "!ordered");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 7 :
                    	            // InternalQVTrelation.g:5234:6: ( (lv_qualifiers_19_0= 'readonly' ) )
                    	            {
                    	            // InternalQVTrelation.g:5234:6: ( (lv_qualifiers_19_0= 'readonly' ) )
                    	            // InternalQVTrelation.g:5235:7: (lv_qualifiers_19_0= 'readonly' )
                    	            {
                    	            // InternalQVTrelation.g:5235:7: (lv_qualifiers_19_0= 'readonly' )
                    	            // InternalQVTrelation.g:5236:8: lv_qualifiers_19_0= 'readonly'
                    	            {
                    	            lv_qualifiers_19_0=(Token)match(input,65,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_19_0, grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_6_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_19_0, "readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 8 :
                    	            // InternalQVTrelation.g:5249:6: ( (lv_qualifiers_20_0= '!readonly' ) )
                    	            {
                    	            // InternalQVTrelation.g:5249:6: ( (lv_qualifiers_20_0= '!readonly' ) )
                    	            // InternalQVTrelation.g:5250:7: (lv_qualifiers_20_0= '!readonly' )
                    	            {
                    	            // InternalQVTrelation.g:5250:7: (lv_qualifiers_20_0= '!readonly' )
                    	            // InternalQVTrelation.g:5251:8: lv_qualifiers_20_0= '!readonly'
                    	            {
                    	            lv_qualifiers_20_0=(Token)match(input,66,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_20_0, grammarAccess.getReferenceCSAccess().getQualifiersReadonlyKeyword_6_1_0_7_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_20_0, "!readonly");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 9 :
                    	            // InternalQVTrelation.g:5264:6: ( (lv_qualifiers_21_0= 'resolve' ) )
                    	            {
                    	            // InternalQVTrelation.g:5264:6: ( (lv_qualifiers_21_0= 'resolve' ) )
                    	            // InternalQVTrelation.g:5265:7: (lv_qualifiers_21_0= 'resolve' )
                    	            {
                    	            // InternalQVTrelation.g:5265:7: (lv_qualifiers_21_0= 'resolve' )
                    	            // InternalQVTrelation.g:5266:8: lv_qualifiers_21_0= 'resolve'
                    	            {
                    	            lv_qualifiers_21_0=(Token)match(input,88,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_21_0, grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_8_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_21_0, "resolve");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 10 :
                    	            // InternalQVTrelation.g:5279:6: ( (lv_qualifiers_22_0= '!resolve' ) )
                    	            {
                    	            // InternalQVTrelation.g:5279:6: ( (lv_qualifiers_22_0= '!resolve' ) )
                    	            // InternalQVTrelation.g:5280:7: (lv_qualifiers_22_0= '!resolve' )
                    	            {
                    	            // InternalQVTrelation.g:5280:7: (lv_qualifiers_22_0= '!resolve' )
                    	            // InternalQVTrelation.g:5281:8: lv_qualifiers_22_0= '!resolve'
                    	            {
                    	            lv_qualifiers_22_0=(Token)match(input,89,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_22_0, grammarAccess.getReferenceCSAccess().getQualifiersResolveKeyword_6_1_0_9_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_22_0, "!resolve");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 11 :
                    	            // InternalQVTrelation.g:5294:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            {
                    	            // InternalQVTrelation.g:5294:6: ( (lv_qualifiers_23_0= 'transient' ) )
                    	            // InternalQVTrelation.g:5295:7: (lv_qualifiers_23_0= 'transient' )
                    	            {
                    	            // InternalQVTrelation.g:5295:7: (lv_qualifiers_23_0= 'transient' )
                    	            // InternalQVTrelation.g:5296:8: lv_qualifiers_23_0= 'transient'
                    	            {
                    	            lv_qualifiers_23_0=(Token)match(input,38,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_23_0, grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_10_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_23_0, "transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 12 :
                    	            // InternalQVTrelation.g:5309:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            {
                    	            // InternalQVTrelation.g:5309:6: ( (lv_qualifiers_24_0= '!transient' ) )
                    	            // InternalQVTrelation.g:5310:7: (lv_qualifiers_24_0= '!transient' )
                    	            {
                    	            // InternalQVTrelation.g:5310:7: (lv_qualifiers_24_0= '!transient' )
                    	            // InternalQVTrelation.g:5311:8: lv_qualifiers_24_0= '!transient'
                    	            {
                    	            lv_qualifiers_24_0=(Token)match(input,67,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_24_0, grammarAccess.getReferenceCSAccess().getQualifiersTransientKeyword_6_1_0_11_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_24_0, "!transient");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 13 :
                    	            // InternalQVTrelation.g:5324:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:5324:6: ( (lv_qualifiers_25_0= 'unique' ) )
                    	            // InternalQVTrelation.g:5325:7: (lv_qualifiers_25_0= 'unique' )
                    	            {
                    	            // InternalQVTrelation.g:5325:7: (lv_qualifiers_25_0= 'unique' )
                    	            // InternalQVTrelation.g:5326:8: lv_qualifiers_25_0= 'unique'
                    	            {
                    	            lv_qualifiers_25_0=(Token)match(input,68,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_25_0, grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_12_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_25_0, "unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 14 :
                    	            // InternalQVTrelation.g:5339:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            {
                    	            // InternalQVTrelation.g:5339:6: ( (lv_qualifiers_26_0= '!unique' ) )
                    	            // InternalQVTrelation.g:5340:7: (lv_qualifiers_26_0= '!unique' )
                    	            {
                    	            // InternalQVTrelation.g:5340:7: (lv_qualifiers_26_0= '!unique' )
                    	            // InternalQVTrelation.g:5341:8: lv_qualifiers_26_0= '!unique'
                    	            {
                    	            lv_qualifiers_26_0=(Token)match(input,69,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_26_0, grammarAccess.getReferenceCSAccess().getQualifiersUniqueKeyword_6_1_0_13_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_26_0, "!unique");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 15 :
                    	            // InternalQVTrelation.g:5354:6: ( (lv_qualifiers_27_0= 'unsettable' ) )
                    	            {
                    	            // InternalQVTrelation.g:5354:6: ( (lv_qualifiers_27_0= 'unsettable' ) )
                    	            // InternalQVTrelation.g:5355:7: (lv_qualifiers_27_0= 'unsettable' )
                    	            {
                    	            // InternalQVTrelation.g:5355:7: (lv_qualifiers_27_0= 'unsettable' )
                    	            // InternalQVTrelation.g:5356:8: lv_qualifiers_27_0= 'unsettable'
                    	            {
                    	            lv_qualifiers_27_0=(Token)match(input,70,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_27_0, grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_14_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_27_0, "unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 16 :
                    	            // InternalQVTrelation.g:5369:6: ( (lv_qualifiers_28_0= '!unsettable' ) )
                    	            {
                    	            // InternalQVTrelation.g:5369:6: ( (lv_qualifiers_28_0= '!unsettable' ) )
                    	            // InternalQVTrelation.g:5370:7: (lv_qualifiers_28_0= '!unsettable' )
                    	            {
                    	            // InternalQVTrelation.g:5370:7: (lv_qualifiers_28_0= '!unsettable' )
                    	            // InternalQVTrelation.g:5371:8: lv_qualifiers_28_0= '!unsettable'
                    	            {
                    	            lv_qualifiers_28_0=(Token)match(input,71,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_28_0, grammarAccess.getReferenceCSAccess().getQualifiersUnsettableKeyword_6_1_0_15_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_28_0, "!unsettable");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 17 :
                    	            // InternalQVTrelation.g:5384:6: ( (lv_qualifiers_29_0= 'volatile' ) )
                    	            {
                    	            // InternalQVTrelation.g:5384:6: ( (lv_qualifiers_29_0= 'volatile' ) )
                    	            // InternalQVTrelation.g:5385:7: (lv_qualifiers_29_0= 'volatile' )
                    	            {
                    	            // InternalQVTrelation.g:5385:7: (lv_qualifiers_29_0= 'volatile' )
                    	            // InternalQVTrelation.g:5386:8: lv_qualifiers_29_0= 'volatile'
                    	            {
                    	            lv_qualifiers_29_0=(Token)match(input,72,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_29_0, grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_16_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_29_0, "volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;
                    	        case 18 :
                    	            // InternalQVTrelation.g:5399:6: ( (lv_qualifiers_30_0= '!volatile' ) )
                    	            {
                    	            // InternalQVTrelation.g:5399:6: ( (lv_qualifiers_30_0= '!volatile' ) )
                    	            // InternalQVTrelation.g:5400:7: (lv_qualifiers_30_0= '!volatile' )
                    	            {
                    	            // InternalQVTrelation.g:5400:7: (lv_qualifiers_30_0= '!volatile' )
                    	            // InternalQVTrelation.g:5401:8: lv_qualifiers_30_0= '!volatile'
                    	            {
                    	            lv_qualifiers_30_0=(Token)match(input,73,FollowSets000.FOLLOW_94); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								newLeafNode(lv_qualifiers_30_0, grammarAccess.getReferenceCSAccess().getQualifiersVolatileKeyword_6_1_0_17_0());

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								if (current==null) {
                    	              									current = createModelElement(grammarAccess.getReferenceCSRule());
                    	              								}
                    	              								addWithLastConsumed(current, "qualifiers", lv_qualifiers_30_0, "!volatile");

                    	            }

                    	            }


                    	            }


                    	            }
                    	            break;

                    	    }

                    	    // InternalQVTrelation.g:5414:5: (otherlv_31= ',' )?
                    	    int alt138=2;
                    	    int LA138_0 = input.LA(1);

                    	    if ( (LA138_0==23) ) {
                    	        alt138=1;
                    	    }
                    	    switch (alt138) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:5415:6: otherlv_31= ','
                    	            {
                    	            otherlv_31=(Token)match(input,23,FollowSets000.FOLLOW_95); if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              						newLeafNode(otherlv_31, grammarAccess.getReferenceCSAccess().getCommaKeyword_6_1_1());

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    if ( cnt139 >= 1 ) break loop139;
                    	    if (state.backtracking>0) {state.failed=true; return current;}
                                EarlyExitException eee =
                                    new EarlyExitException(139, input);
                                throw eee;
                        }
                        cnt139++;
                    } while (true);

                    otherlv_32=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_32, grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_6_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:5426:3: ( (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' ) | otherlv_45= ';' )
            int alt146=2;
            int LA146_0 = input.LA(1);

            if ( (LA146_0==20) ) {
                alt146=1;
            }
            else if ( (LA146_0==22) ) {
                alt146=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 146, 0, input);

                throw nvae;
            }
            switch (alt146) {
                case 1 :
                    // InternalQVTrelation.g:5427:4: (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' )
                    {
                    // InternalQVTrelation.g:5427:4: (otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}' )
                    // InternalQVTrelation.g:5428:5: otherlv_33= '{' ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )* otherlv_44= '}'
                    {
                    otherlv_33=(Token)match(input,20,FollowSets000.FOLLOW_64); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_33, grammarAccess.getReferenceCSAccess().getLeftCurlyBracketKeyword_7_0_0());

                    }
                    // InternalQVTrelation.g:5432:5: ( (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' ) | (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' ) )*
                    loop145:
                    do {
                        int alt145=3;
                        int LA145_0 = input.LA(1);

                        if ( (LA145_0==74) ) {
                            alt145=1;
                        }
                        else if ( (LA145_0==75) ) {
                            alt145=2;
                        }


                        switch (alt145) {
                    	case 1 :
                    	    // InternalQVTrelation.g:5433:6: (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' )
                    	    {
                    	    // InternalQVTrelation.g:5433:6: (otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';' )
                    	    // InternalQVTrelation.g:5434:7: otherlv_34= 'initial' ( ruleUnrestrictedName )? otherlv_36= ':' ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )? otherlv_38= ';'
                    	    {
                    	    otherlv_34=(Token)match(input,74,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_34, grammarAccess.getReferenceCSAccess().getInitialKeyword_7_0_1_0_0());

                    	    }
                    	    // InternalQVTrelation.g:5438:7: ( ruleUnrestrictedName )?
                    	    int alt141=2;
                    	    int LA141_0 = input.LA(1);

                    	    if ( ((LA141_0>=RULE_SIMPLE_ID && LA141_0<=RULE_ESCAPED_ID)||LA141_0==17||(LA141_0>=25 && LA141_0<=32)||(LA141_0>=35 && LA141_0<=43)||(LA141_0>=45 && LA141_0<=47)||(LA141_0>=49 && LA141_0<=59)||LA141_0==61||LA141_0==63||LA141_0==65||LA141_0==68||LA141_0==70||LA141_0==72||(LA141_0>=74 && LA141_0<=77)||(LA141_0>=79 && LA141_0<=84)||LA141_0==86||LA141_0==88||(LA141_0>=90 && LA141_0<=91)) ) {
                    	        alt141=1;
                    	    }
                    	    switch (alt141) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:5439:8: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								/* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_36=(Token)match(input,18,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_36, grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_0_2());

                    	    }
                    	    // InternalQVTrelation.g:5454:7: ( (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS ) )?
                    	    int alt142=2;
                    	    int LA142_0 = input.LA(1);

                    	    if ( ((LA142_0>=RULE_SINGLE_QUOTED_STRING && LA142_0<=RULE_ESCAPED_ID)||LA142_0==17||(LA142_0>=25 && LA142_0<=33)||(LA142_0>=35 && LA142_0<=43)||(LA142_0>=45 && LA142_0<=59)||LA142_0==61||LA142_0==63||LA142_0==65||LA142_0==68||LA142_0==70||LA142_0==72||(LA142_0>=74 && LA142_0<=77)||(LA142_0>=79 && LA142_0<=84)||LA142_0==86||LA142_0==88||(LA142_0>=90 && LA142_0<=94)||(LA142_0>=114 && LA142_0<=128)||LA142_0==130||(LA142_0>=132 && LA142_0<=135)||LA142_0==142||(LA142_0>=147 && LA142_0<=148)) ) {
                    	        alt142=1;
                    	    }
                    	    switch (alt142) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:5455:8: (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTrelation.g:5455:8: (lv_ownedDefaultExpressions_37_0= ruleSpecificationCS )
                    	            // InternalQVTrelation.g:5456:9: lv_ownedDefaultExpressions_37_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              									newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_0_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_20);
                    	            lv_ownedDefaultExpressions_37_0=ruleSpecificationCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              									if (current==null) {
                    	              										current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                    	              									}
                    	              									add(
                    	              										current,
                    	              										"ownedDefaultExpressions",
                    	              										lv_ownedDefaultExpressions_37_0,
                    	              										"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              									afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_38=(Token)match(input,22,FollowSets000.FOLLOW_64); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_38, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_0_4());

                    	    }

                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTrelation.g:5479:6: (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' )
                    	    {
                    	    // InternalQVTrelation.g:5479:6: (otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';' )
                    	    // InternalQVTrelation.g:5480:7: otherlv_39= 'derivation' ( ruleUnrestrictedName )? otherlv_41= ':' ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )? otherlv_43= ';'
                    	    {
                    	    otherlv_39=(Token)match(input,75,FollowSets000.FOLLOW_16); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_39, grammarAccess.getReferenceCSAccess().getDerivationKeyword_7_0_1_1_0());

                    	    }
                    	    // InternalQVTrelation.g:5484:7: ( ruleUnrestrictedName )?
                    	    int alt143=2;
                    	    int LA143_0 = input.LA(1);

                    	    if ( ((LA143_0>=RULE_SIMPLE_ID && LA143_0<=RULE_ESCAPED_ID)||LA143_0==17||(LA143_0>=25 && LA143_0<=32)||(LA143_0>=35 && LA143_0<=43)||(LA143_0>=45 && LA143_0<=47)||(LA143_0>=49 && LA143_0<=59)||LA143_0==61||LA143_0==63||LA143_0==65||LA143_0==68||LA143_0==70||LA143_0==72||(LA143_0>=74 && LA143_0<=77)||(LA143_0>=79 && LA143_0<=84)||LA143_0==86||LA143_0==88||(LA143_0>=90 && LA143_0<=91)) ) {
                    	        alt143=1;
                    	    }
                    	    switch (alt143) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:5485:8: ruleUnrestrictedName
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              								/* */

                    	            }
                    	            if ( state.backtracking==0 ) {

                    	              								newCompositeNode(grammarAccess.getReferenceCSAccess().getUnrestrictedNameParserRuleCall_7_0_1_1_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_11);
                    	            ruleUnrestrictedName();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              								afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }

                    	    otherlv_41=(Token)match(input,18,FollowSets000.FOLLOW_65); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_41, grammarAccess.getReferenceCSAccess().getColonKeyword_7_0_1_1_2());

                    	    }
                    	    // InternalQVTrelation.g:5500:7: ( (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS ) )?
                    	    int alt144=2;
                    	    int LA144_0 = input.LA(1);

                    	    if ( ((LA144_0>=RULE_SINGLE_QUOTED_STRING && LA144_0<=RULE_ESCAPED_ID)||LA144_0==17||(LA144_0>=25 && LA144_0<=33)||(LA144_0>=35 && LA144_0<=43)||(LA144_0>=45 && LA144_0<=59)||LA144_0==61||LA144_0==63||LA144_0==65||LA144_0==68||LA144_0==70||LA144_0==72||(LA144_0>=74 && LA144_0<=77)||(LA144_0>=79 && LA144_0<=84)||LA144_0==86||LA144_0==88||(LA144_0>=90 && LA144_0<=94)||(LA144_0>=114 && LA144_0<=128)||LA144_0==130||(LA144_0>=132 && LA144_0<=135)||LA144_0==142||(LA144_0>=147 && LA144_0<=148)) ) {
                    	        alt144=1;
                    	    }
                    	    switch (alt144) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:5501:8: (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS )
                    	            {
                    	            // InternalQVTrelation.g:5501:8: (lv_ownedDefaultExpressions_42_0= ruleSpecificationCS )
                    	            // InternalQVTrelation.g:5502:9: lv_ownedDefaultExpressions_42_0= ruleSpecificationCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              									newCompositeNode(grammarAccess.getReferenceCSAccess().getOwnedDefaultExpressionsSpecificationCSParserRuleCall_7_0_1_1_3_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_20);
                    	            lv_ownedDefaultExpressions_42_0=ruleSpecificationCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              									if (current==null) {
                    	              										current = createModelElementForParent(grammarAccess.getReferenceCSRule());
                    	              									}
                    	              									add(
                    	              										current,
                    	              										"ownedDefaultExpressions",
                    	              										lv_ownedDefaultExpressions_42_0,
                    	              										"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SpecificationCS");
                    	              									afterParserOrEnumRuleCall();

                    	            }

                    	            }


                    	            }
                    	            break;

                    	    }

                    	    otherlv_43=(Token)match(input,22,FollowSets000.FOLLOW_64); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							newLeafNode(otherlv_43, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_0_1_1_4());

                    	    }

                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop145;
                        }
                    } while (true);

                    otherlv_44=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_44, grammarAccess.getReferenceCSAccess().getRightCurlyBracketKeyword_7_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:5531:4: otherlv_45= ';'
                    {
                    otherlv_45=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_45, grammarAccess.getReferenceCSAccess().getSemicolonKeyword_7_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleReferenceCS"


    // $ANTLR start "entryRuleSimpleTargetElementCS"
    // InternalQVTrelation.g:5540:1: entryRuleSimpleTargetElementCS returns [EObject current=null] : iv_ruleSimpleTargetElementCS= ruleSimpleTargetElementCS EOF ;
    public final EObject entryRuleSimpleTargetElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSimpleTargetElementCS = null;


        try {
            // InternalQVTrelation.g:5540:62: (iv_ruleSimpleTargetElementCS= ruleSimpleTargetElementCS EOF )
            // InternalQVTrelation.g:5541:2: iv_ruleSimpleTargetElementCS= ruleSimpleTargetElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSimpleTargetElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSimpleTargetElementCS=ruleSimpleTargetElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSimpleTargetElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSimpleTargetElementCS"


    // $ANTLR start "ruleSimpleTargetElementCS"
    // InternalQVTrelation.g:5547:1: ruleSimpleTargetElementCS returns [EObject current=null] : ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' ) ;
    public final EObject ruleSimpleTargetElementCS() throws RecognitionException {
        EObject current = null;

        Token lv_input_0_0=null;
        Token lv_output_1_0=null;
        Token lv_via_2_0=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_11=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:5553:2: ( ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' ) )
            // InternalQVTrelation.g:5554:2: ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' )
            {
            // InternalQVTrelation.g:5554:2: ( ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';' )
            // InternalQVTrelation.g:5555:3: ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) ) ( ( ruleUnrestrictedName ) ) (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )? otherlv_11= ';'
            {
            // InternalQVTrelation.g:5555:3: ( ( (lv_input_0_0= 'input' ) ) | ( (lv_output_1_0= 'output' ) ) | ( (lv_via_2_0= 'via' ) ) )
            int alt147=3;
            switch ( input.LA(1) ) {
            case 51:
                {
                alt147=1;
                }
                break;
            case 53:
                {
                alt147=2;
                }
                break;
            case 55:
                {
                alt147=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 147, 0, input);

                throw nvae;
            }

            switch (alt147) {
                case 1 :
                    // InternalQVTrelation.g:5556:4: ( (lv_input_0_0= 'input' ) )
                    {
                    // InternalQVTrelation.g:5556:4: ( (lv_input_0_0= 'input' ) )
                    // InternalQVTrelation.g:5557:5: (lv_input_0_0= 'input' )
                    {
                    // InternalQVTrelation.g:5557:5: (lv_input_0_0= 'input' )
                    // InternalQVTrelation.g:5558:6: lv_input_0_0= 'input'
                    {
                    lv_input_0_0=(Token)match(input,51,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_input_0_0, grammarAccess.getSimpleTargetElementCSAccess().getInputInputKeyword_0_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                      						}
                      						setWithLastConsumed(current, "input", lv_input_0_0 != null, "input");

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:5571:4: ( (lv_output_1_0= 'output' ) )
                    {
                    // InternalQVTrelation.g:5571:4: ( (lv_output_1_0= 'output' ) )
                    // InternalQVTrelation.g:5572:5: (lv_output_1_0= 'output' )
                    {
                    // InternalQVTrelation.g:5572:5: (lv_output_1_0= 'output' )
                    // InternalQVTrelation.g:5573:6: lv_output_1_0= 'output'
                    {
                    lv_output_1_0=(Token)match(input,53,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_output_1_0, grammarAccess.getSimpleTargetElementCSAccess().getOutputOutputKeyword_0_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                      						}
                      						setWithLastConsumed(current, "output", lv_output_1_0 != null, "output");

                    }

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:5586:4: ( (lv_via_2_0= 'via' ) )
                    {
                    // InternalQVTrelation.g:5586:4: ( (lv_via_2_0= 'via' ) )
                    // InternalQVTrelation.g:5587:5: (lv_via_2_0= 'via' )
                    {
                    // InternalQVTrelation.g:5587:5: (lv_via_2_0= 'via' )
                    // InternalQVTrelation.g:5588:6: lv_via_2_0= 'via'
                    {
                    lv_via_2_0=(Token)match(input,55,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_via_2_0, grammarAccess.getSimpleTargetElementCSAccess().getViaViaKeyword_0_2_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                      						}
                      						setWithLastConsumed(current, "via", lv_via_2_0 != null, "via");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:5601:3: ( ( ruleUnrestrictedName ) )
            // InternalQVTrelation.g:5602:4: ( ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:5602:4: ( ruleUnrestrictedName )
            // InternalQVTrelation.g:5603:5: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					/* */

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
              					}

            }
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getTypedModelTypedModelCrossReference_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_96);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:5620:3: (otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) ) )?
            int alt151=2;
            int LA151_0 = input.LA(1);

            if ( (LA151_0==36) ) {
                alt151=1;
            }
            switch (alt151) {
                case 1 :
                    // InternalQVTrelation.g:5621:4: otherlv_4= 'iterates' ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) )
                    {
                    otherlv_4=(Token)match(input,36,FollowSets000.FOLLOW_31); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getSimpleTargetElementCSAccess().getIteratesKeyword_2_0());

                    }
                    // InternalQVTrelation.g:5625:4: ( ( ( ruleUnrestrictedName ) ) | (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' ) )
                    int alt150=2;
                    int LA150_0 = input.LA(1);

                    if ( ((LA150_0>=RULE_SIMPLE_ID && LA150_0<=RULE_ESCAPED_ID)||LA150_0==17||(LA150_0>=25 && LA150_0<=32)||(LA150_0>=35 && LA150_0<=43)||(LA150_0>=45 && LA150_0<=47)||(LA150_0>=49 && LA150_0<=59)||LA150_0==61||LA150_0==63||LA150_0==65||LA150_0==68||LA150_0==70||LA150_0==72||(LA150_0>=74 && LA150_0<=77)||(LA150_0>=79 && LA150_0<=84)||LA150_0==86||LA150_0==88||(LA150_0>=90 && LA150_0<=91)) ) {
                        alt150=1;
                    }
                    else if ( (LA150_0==20) ) {
                        alt150=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 150, 0, input);

                        throw nvae;
                    }
                    switch (alt150) {
                        case 1 :
                            // InternalQVTrelation.g:5626:5: ( ( ruleUnrestrictedName ) )
                            {
                            // InternalQVTrelation.g:5626:5: ( ( ruleUnrestrictedName ) )
                            // InternalQVTrelation.g:5627:6: ( ruleUnrestrictedName )
                            {
                            // InternalQVTrelation.g:5627:6: ( ruleUnrestrictedName )
                            // InternalQVTrelation.g:5628:7: ruleUnrestrictedName
                            {
                            if ( state.backtracking==0 ) {

                              							/* */

                            }
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                              							}

                            }
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getIteratesTypedModelCrossReference_2_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_20);
                            ruleUnrestrictedName();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:5646:5: (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' )
                            {
                            // InternalQVTrelation.g:5646:5: (otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}' )
                            // InternalQVTrelation.g:5647:6: otherlv_6= '{' ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )? otherlv_10= '}'
                            {
                            otherlv_6=(Token)match(input,20,FollowSets000.FOLLOW_26); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_6, grammarAccess.getSimpleTargetElementCSAccess().getLeftCurlyBracketKeyword_2_1_1_0());

                            }
                            // InternalQVTrelation.g:5651:6: ( ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )* )?
                            int alt149=2;
                            int LA149_0 = input.LA(1);

                            if ( ((LA149_0>=RULE_SIMPLE_ID && LA149_0<=RULE_ESCAPED_ID)||LA149_0==17||(LA149_0>=25 && LA149_0<=32)||(LA149_0>=35 && LA149_0<=43)||(LA149_0>=45 && LA149_0<=47)||(LA149_0>=49 && LA149_0<=59)||LA149_0==61||LA149_0==63||LA149_0==65||LA149_0==68||LA149_0==70||LA149_0==72||(LA149_0>=74 && LA149_0<=77)||(LA149_0>=79 && LA149_0<=84)||LA149_0==86||LA149_0==88||(LA149_0>=90 && LA149_0<=91)) ) {
                                alt149=1;
                            }
                            switch (alt149) {
                                case 1 :
                                    // InternalQVTrelation.g:5652:7: ( ( ruleUnrestrictedName ) ) (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )*
                                    {
                                    // InternalQVTrelation.g:5652:7: ( ( ruleUnrestrictedName ) )
                                    // InternalQVTrelation.g:5653:8: ( ruleUnrestrictedName )
                                    {
                                    // InternalQVTrelation.g:5653:8: ( ruleUnrestrictedName )
                                    // InternalQVTrelation.g:5654:9: ruleUnrestrictedName
                                    {
                                    if ( state.backtracking==0 ) {

                                      									/* */

                                    }
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                                      									}

                                    }
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getIteratesTypedModelCrossReference_2_1_1_1_0_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_28);
                                    ruleUnrestrictedName();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }

                                    // InternalQVTrelation.g:5671:7: (otherlv_8= ',' ( ( ruleUnrestrictedName ) ) )*
                                    loop148:
                                    do {
                                        int alt148=2;
                                        int LA148_0 = input.LA(1);

                                        if ( (LA148_0==23) ) {
                                            alt148=1;
                                        }


                                        switch (alt148) {
                                    	case 1 :
                                    	    // InternalQVTrelation.g:5672:8: otherlv_8= ',' ( ( ruleUnrestrictedName ) )
                                    	    {
                                    	    otherlv_8=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      								newLeafNode(otherlv_8, grammarAccess.getSimpleTargetElementCSAccess().getCommaKeyword_2_1_1_1_1_0());

                                    	    }
                                    	    // InternalQVTrelation.g:5676:8: ( ( ruleUnrestrictedName ) )
                                    	    // InternalQVTrelation.g:5677:9: ( ruleUnrestrictedName )
                                    	    {
                                    	    // InternalQVTrelation.g:5677:9: ( ruleUnrestrictedName )
                                    	    // InternalQVTrelation.g:5678:10: ruleUnrestrictedName
                                    	    {
                                    	    if ( state.backtracking==0 ) {

                                    	      										/* */

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      										if (current==null) {
                                    	      											current = createModelElement(grammarAccess.getSimpleTargetElementCSRule());
                                    	      										}

                                    	    }
                                    	    if ( state.backtracking==0 ) {

                                    	      										newCompositeNode(grammarAccess.getSimpleTargetElementCSAccess().getIteratesTypedModelCrossReference_2_1_1_1_1_1_0());

                                    	    }
                                    	    pushFollow(FollowSets000.FOLLOW_28);
                                    	    ruleUnrestrictedName();

                                    	    state._fsp--;
                                    	    if (state.failed) return current;
                                    	    if ( state.backtracking==0 ) {

                                    	      										afterParserOrEnumRuleCall();

                                    	    }

                                    	    }


                                    	    }


                                    	    }
                                    	    break;

                                    	default :
                                    	    break loop148;
                                        }
                                    } while (true);


                                    }
                                    break;

                            }

                            otherlv_10=(Token)match(input,21,FollowSets000.FOLLOW_20); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_10, grammarAccess.getSimpleTargetElementCSAccess().getRightCurlyBracketKeyword_2_1_1_2());

                            }

                            }


                            }
                            break;

                    }


                    }
                    break;

            }

            otherlv_11=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_11, grammarAccess.getSimpleTargetElementCSAccess().getSemicolonKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSimpleTargetElementCS"


    // $ANTLR start "entryRuleSpecificationCS"
    // InternalQVTrelation.g:5712:1: entryRuleSpecificationCS returns [EObject current=null] : iv_ruleSpecificationCS= ruleSpecificationCS EOF ;
    public final EObject entryRuleSpecificationCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSpecificationCS = null;


        try {
            // InternalQVTrelation.g:5712:56: (iv_ruleSpecificationCS= ruleSpecificationCS EOF )
            // InternalQVTrelation.g:5713:2: iv_ruleSpecificationCS= ruleSpecificationCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSpecificationCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSpecificationCS=ruleSpecificationCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSpecificationCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSpecificationCS"


    // $ANTLR start "ruleSpecificationCS"
    // InternalQVTrelation.g:5719:1: ruleSpecificationCS returns [EObject current=null] : ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) ) ;
    public final EObject ruleSpecificationCS() throws RecognitionException {
        EObject current = null;

        Token lv_exprString_1_0=null;
        EObject lv_ownedExpression_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:5725:2: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) ) )
            // InternalQVTrelation.g:5726:2: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) )
            {
            // InternalQVTrelation.g:5726:2: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) | ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) ) )
            int alt152=2;
            int LA152_0 = input.LA(1);

            if ( (LA152_0==RULE_SINGLE_QUOTED_STRING||(LA152_0>=RULE_INT && LA152_0<=RULE_ESCAPED_ID)||LA152_0==17||(LA152_0>=25 && LA152_0<=33)||(LA152_0>=35 && LA152_0<=43)||(LA152_0>=45 && LA152_0<=59)||LA152_0==61||LA152_0==63||LA152_0==65||LA152_0==68||LA152_0==70||LA152_0==72||(LA152_0>=74 && LA152_0<=77)||(LA152_0>=79 && LA152_0<=84)||LA152_0==86||LA152_0==88||(LA152_0>=90 && LA152_0<=94)||(LA152_0>=114 && LA152_0<=128)||LA152_0==130||(LA152_0>=132 && LA152_0<=135)||LA152_0==142||(LA152_0>=147 && LA152_0<=148)) ) {
                alt152=1;
            }
            else if ( (LA152_0==RULE_UNQUOTED_STRING) ) {
                alt152=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 152, 0, input);

                throw nvae;
            }
            switch (alt152) {
                case 1 :
                    // InternalQVTrelation.g:5727:3: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    {
                    // InternalQVTrelation.g:5727:3: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    // InternalQVTrelation.g:5728:4: (lv_ownedExpression_0_0= ruleExpCS )
                    {
                    // InternalQVTrelation.g:5728:4: (lv_ownedExpression_0_0= ruleExpCS )
                    // InternalQVTrelation.g:5729:5: lv_ownedExpression_0_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getSpecificationCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedExpression_0_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getSpecificationCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedExpression",
                      						lv_ownedExpression_0_0,
                      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:5747:3: ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) )
                    {
                    // InternalQVTrelation.g:5747:3: ( (lv_exprString_1_0= RULE_UNQUOTED_STRING ) )
                    // InternalQVTrelation.g:5748:4: (lv_exprString_1_0= RULE_UNQUOTED_STRING )
                    {
                    // InternalQVTrelation.g:5748:4: (lv_exprString_1_0= RULE_UNQUOTED_STRING )
                    // InternalQVTrelation.g:5749:5: lv_exprString_1_0= RULE_UNQUOTED_STRING
                    {
                    lv_exprString_1_0=(Token)match(input,RULE_UNQUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_exprString_1_0, grammarAccess.getSpecificationCSAccess().getExprStringUNQUOTED_STRINGTerminalRuleCall_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getSpecificationCSRule());
                      					}
                      					setWithLastConsumed(
                      						current,
                      						"exprString",
                      						lv_exprString_1_0,
                      						"org.eclipse.qvtd.xtext.qvtbase.QVTbase.UNQUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSpecificationCS"


    // $ANTLR start "entryRuleStructuredClassCS"
    // InternalQVTrelation.g:5769:1: entryRuleStructuredClassCS returns [EObject current=null] : iv_ruleStructuredClassCS= ruleStructuredClassCS EOF ;
    public final EObject entryRuleStructuredClassCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStructuredClassCS = null;


        try {
            // InternalQVTrelation.g:5769:58: (iv_ruleStructuredClassCS= ruleStructuredClassCS EOF )
            // InternalQVTrelation.g:5770:2: iv_ruleStructuredClassCS= ruleStructuredClassCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStructuredClassCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStructuredClassCS=ruleStructuredClassCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStructuredClassCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStructuredClassCS"


    // $ANTLR start "ruleStructuredClassCS"
    // InternalQVTrelation.g:5776:1: ruleStructuredClassCS returns [EObject current=null] : ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) ) ;
    public final EObject ruleStructuredClassCS() throws RecognitionException {
        EObject current = null;

        Token lv_isAbstract_0_0=null;
        Token otherlv_1=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token lv_instanceClassName_9_0=null;
        Token otherlv_10=null;
        Token lv_isInterface_11_0=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_16=null;
        Token otherlv_17=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedSignature_3_0 = null;

        EObject lv_ownedSuperTypes_5_0 = null;

        EObject lv_ownedSuperTypes_7_0 = null;

        EObject lv_ownedOperations_14_0 = null;

        EObject lv_ownedProperties_15_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:5782:2: ( ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) ) )
            // InternalQVTrelation.g:5783:2: ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) )
            {
            // InternalQVTrelation.g:5783:2: ( ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' ) )
            // InternalQVTrelation.g:5784:3: ( (lv_isAbstract_0_0= 'abstract' ) )? otherlv_1= 'class' ( (lv_name_2_0= ruleUnrestrictedName ) ) ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )? (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )? (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )? (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )? ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' )
            {
            // InternalQVTrelation.g:5784:3: ( (lv_isAbstract_0_0= 'abstract' ) )?
            int alt153=2;
            int LA153_0 = input.LA(1);

            if ( (LA153_0==41) ) {
                alt153=1;
            }
            switch (alt153) {
                case 1 :
                    // InternalQVTrelation.g:5785:4: (lv_isAbstract_0_0= 'abstract' )
                    {
                    // InternalQVTrelation.g:5785:4: (lv_isAbstract_0_0= 'abstract' )
                    // InternalQVTrelation.g:5786:5: lv_isAbstract_0_0= 'abstract'
                    {
                    lv_isAbstract_0_0=(Token)match(input,41,FollowSets000.FOLLOW_97); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_isAbstract_0_0, grammarAccess.getStructuredClassCSAccess().getIsAbstractAbstractKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getStructuredClassCSRule());
                      					}
                      					setWithLastConsumed(current, "isAbstract", lv_isAbstract_0_0 != null, "abstract");

                    }

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,90,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getStructuredClassCSAccess().getClassKeyword_1());

            }
            // InternalQVTrelation.g:5802:3: ( (lv_name_2_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:5803:4: (lv_name_2_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:5803:4: (lv_name_2_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:5804:5: lv_name_2_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getStructuredClassCSAccess().getNameUnrestrictedNameParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_98);
            lv_name_2_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_2_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:5821:3: ( (lv_ownedSignature_3_0= ruleTemplateSignatureCS ) )?
            int alt154=2;
            int LA154_0 = input.LA(1);

            if ( (LA154_0==33) ) {
                alt154=1;
            }
            switch (alt154) {
                case 1 :
                    // InternalQVTrelation.g:5822:4: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    {
                    // InternalQVTrelation.g:5822:4: (lv_ownedSignature_3_0= ruleTemplateSignatureCS )
                    // InternalQVTrelation.g:5823:5: lv_ownedSignature_3_0= ruleTemplateSignatureCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSignatureTemplateSignatureCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_99);
                    lv_ownedSignature_3_0=ruleTemplateSignatureCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedSignature",
                      						lv_ownedSignature_3_0,
                      						"org.eclipse.ocl.xtext.base.Base.TemplateSignatureCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:5840:3: (otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )* )?
            int alt156=2;
            int LA156_0 = input.LA(1);

            if ( (LA156_0==46) ) {
                alt156=1;
            }
            switch (alt156) {
                case 1 :
                    // InternalQVTrelation.g:5841:4: otherlv_4= 'extends' ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) ) (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_4=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getStructuredClassCSAccess().getExtendsKeyword_4_0());

                    }
                    // InternalQVTrelation.g:5845:4: ( (lv_ownedSuperTypes_5_0= ruleTypedRefCS ) )
                    // InternalQVTrelation.g:5846:5: (lv_ownedSuperTypes_5_0= ruleTypedRefCS )
                    {
                    // InternalQVTrelation.g:5846:5: (lv_ownedSuperTypes_5_0= ruleTypedRefCS )
                    // InternalQVTrelation.g:5847:6: lv_ownedSuperTypes_5_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_100);
                    lv_ownedSuperTypes_5_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedSuperTypes",
                      							lv_ownedSuperTypes_5_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:5864:4: (otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) ) )*
                    loop155:
                    do {
                        int alt155=2;
                        int LA155_0 = input.LA(1);

                        if ( (LA155_0==23) ) {
                            alt155=1;
                        }


                        switch (alt155) {
                    	case 1 :
                    	    // InternalQVTrelation.g:5865:5: otherlv_6= ',' ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_6=(Token)match(input,23,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_6, grammarAccess.getStructuredClassCSAccess().getCommaKeyword_4_2_0());

                    	    }
                    	    // InternalQVTrelation.g:5869:5: ( (lv_ownedSuperTypes_7_0= ruleTypedRefCS ) )
                    	    // InternalQVTrelation.g:5870:6: (lv_ownedSuperTypes_7_0= ruleTypedRefCS )
                    	    {
                    	    // InternalQVTrelation.g:5870:6: (lv_ownedSuperTypes_7_0= ruleTypedRefCS )
                    	    // InternalQVTrelation.g:5871:7: lv_ownedSuperTypes_7_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedSuperTypesTypedRefCSParserRuleCall_4_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_100);
                    	    lv_ownedSuperTypes_7_0=ruleTypedRefCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedSuperTypes",
                    	      								lv_ownedSuperTypes_7_0,
                    	      								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop155;
                        }
                    } while (true);


                    }
                    break;

            }

            // InternalQVTrelation.g:5890:3: (otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) ) )?
            int alt157=2;
            int LA157_0 = input.LA(1);

            if ( (LA157_0==18) ) {
                alt157=1;
            }
            switch (alt157) {
                case 1 :
                    // InternalQVTrelation.g:5891:4: otherlv_8= ':' ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    {
                    otherlv_8=(Token)match(input,18,FollowSets000.FOLLOW_8); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_8, grammarAccess.getStructuredClassCSAccess().getColonKeyword_5_0());

                    }
                    // InternalQVTrelation.g:5895:4: ( (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING ) )
                    // InternalQVTrelation.g:5896:5: (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING )
                    {
                    // InternalQVTrelation.g:5896:5: (lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING )
                    // InternalQVTrelation.g:5897:6: lv_instanceClassName_9_0= RULE_SINGLE_QUOTED_STRING
                    {
                    lv_instanceClassName_9_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_instanceClassName_9_0, grammarAccess.getStructuredClassCSAccess().getInstanceClassNameSINGLE_QUOTED_STRINGTerminalRuleCall_5_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getStructuredClassCSRule());
                      						}
                      						setWithLastConsumed(
                      							current,
                      							"instanceClassName",
                      							lv_instanceClassName_9_0,
                      							"org.eclipse.ocl.xtext.base.Base.SINGLE_QUOTED_STRING");

                    }

                    }


                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:5914:3: (otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}' )?
            int alt159=2;
            int LA159_0 = input.LA(1);

            if ( (LA159_0==20) ) {
                int LA159_1 = input.LA(2);

                if ( (LA159_1==91) ) {
                    alt159=1;
                }
                else if ( (LA159_1==21) ) {
                    int LA159_4 = input.LA(3);

                    if ( (LA159_4==20||LA159_4==22) ) {
                        alt159=1;
                    }
                }
            }
            switch (alt159) {
                case 1 :
                    // InternalQVTrelation.g:5915:4: otherlv_10= '{' ( (lv_isInterface_11_0= 'interface' ) )? otherlv_12= '}'
                    {
                    otherlv_10=(Token)match(input,20,FollowSets000.FOLLOW_101); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_10, grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_6_0());

                    }
                    // InternalQVTrelation.g:5919:4: ( (lv_isInterface_11_0= 'interface' ) )?
                    int alt158=2;
                    int LA158_0 = input.LA(1);

                    if ( (LA158_0==91) ) {
                        alt158=1;
                    }
                    switch (alt158) {
                        case 1 :
                            // InternalQVTrelation.g:5920:5: (lv_isInterface_11_0= 'interface' )
                            {
                            // InternalQVTrelation.g:5920:5: (lv_isInterface_11_0= 'interface' )
                            // InternalQVTrelation.g:5921:6: lv_isInterface_11_0= 'interface'
                            {
                            lv_isInterface_11_0=(Token)match(input,91,FollowSets000.FOLLOW_17); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(lv_isInterface_11_0, grammarAccess.getStructuredClassCSAccess().getIsInterfaceInterfaceKeyword_6_1_0());

                            }
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElement(grammarAccess.getStructuredClassCSRule());
                              						}
                              						setWithLastConsumed(current, "isInterface", lv_isInterface_11_0 != null, "interface");

                            }

                            }


                            }
                            break;

                    }

                    otherlv_12=(Token)match(input,21,FollowSets000.FOLLOW_9); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_12, grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_6_2());

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:5938:3: ( (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' ) | otherlv_17= ';' )
            int alt161=2;
            int LA161_0 = input.LA(1);

            if ( (LA161_0==20) ) {
                alt161=1;
            }
            else if ( (LA161_0==22) ) {
                alt161=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 161, 0, input);

                throw nvae;
            }
            switch (alt161) {
                case 1 :
                    // InternalQVTrelation.g:5939:4: (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' )
                    {
                    // InternalQVTrelation.g:5939:4: (otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}' )
                    // InternalQVTrelation.g:5940:5: otherlv_13= '{' ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )* otherlv_16= '}'
                    {
                    otherlv_13=(Token)match(input,20,FollowSets000.FOLLOW_102); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_13, grammarAccess.getStructuredClassCSAccess().getLeftCurlyBracketKeyword_7_0_0());

                    }
                    // InternalQVTrelation.g:5944:5: ( ( (lv_ownedOperations_14_0= ruleOperationCS ) ) | ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) ) )*
                    loop160:
                    do {
                        int alt160=3;
                        switch ( input.LA(1) ) {
                        case 56:
                            {
                            switch ( input.LA(2) ) {
                            case 57:
                                {
                                int LA160_6 = input.LA(3);

                                if ( (LA160_6==58||LA160_6==84) ) {
                                    alt160=2;
                                }
                                else if ( (LA160_6==81) ) {
                                    alt160=1;
                                }


                                }
                                break;
                            case 58:
                            case 84:
                                {
                                alt160=2;
                                }
                                break;
                            case 81:
                                {
                                alt160=1;
                                }
                                break;

                            }

                            }
                            break;
                        case 57:
                            {
                            switch ( input.LA(2) ) {
                            case 56:
                                {
                                int LA160_7 = input.LA(3);

                                if ( (LA160_7==81) ) {
                                    alt160=1;
                                }
                                else if ( (LA160_7==58||LA160_7==84) ) {
                                    alt160=2;
                                }


                                }
                                break;
                            case 58:
                            case 84:
                                {
                                alt160=2;
                                }
                                break;
                            case 81:
                                {
                                alt160=1;
                                }
                                break;

                            }

                            }
                            break;
                        case 81:
                            {
                            alt160=1;
                            }
                            break;
                        case 58:
                        case 84:
                            {
                            alt160=2;
                            }
                            break;

                        }

                        switch (alt160) {
                    	case 1 :
                    	    // InternalQVTrelation.g:5945:6: ( (lv_ownedOperations_14_0= ruleOperationCS ) )
                    	    {
                    	    // InternalQVTrelation.g:5945:6: ( (lv_ownedOperations_14_0= ruleOperationCS ) )
                    	    // InternalQVTrelation.g:5946:7: (lv_ownedOperations_14_0= ruleOperationCS )
                    	    {
                    	    // InternalQVTrelation.g:5946:7: (lv_ownedOperations_14_0= ruleOperationCS )
                    	    // InternalQVTrelation.g:5947:8: lv_ownedOperations_14_0= ruleOperationCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedOperationsOperationCSParserRuleCall_7_0_1_0_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_102);
                    	    lv_ownedOperations_14_0=ruleOperationCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"ownedOperations",
                    	      									lv_ownedOperations_14_0,
                    	      									"org.eclipse.qvtd.xtext.qvtbase.QVTbase.OperationCS");
                    	      								afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;
                    	case 2 :
                    	    // InternalQVTrelation.g:5965:6: ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) )
                    	    {
                    	    // InternalQVTrelation.g:5965:6: ( (lv_ownedProperties_15_0= ruleStructuralFeatureCS ) )
                    	    // InternalQVTrelation.g:5966:7: (lv_ownedProperties_15_0= ruleStructuralFeatureCS )
                    	    {
                    	    // InternalQVTrelation.g:5966:7: (lv_ownedProperties_15_0= ruleStructuralFeatureCS )
                    	    // InternalQVTrelation.g:5967:8: lv_ownedProperties_15_0= ruleStructuralFeatureCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      								newCompositeNode(grammarAccess.getStructuredClassCSAccess().getOwnedPropertiesStructuralFeatureCSParserRuleCall_7_0_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_102);
                    	    lv_ownedProperties_15_0=ruleStructuralFeatureCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      								if (current==null) {
                    	      									current = createModelElementForParent(grammarAccess.getStructuredClassCSRule());
                    	      								}
                    	      								add(
                    	      									current,
                    	      									"ownedProperties",
                    	      									lv_ownedProperties_15_0,
                    	      									"org.eclipse.qvtd.xtext.qvtbase.QVTbase.StructuralFeatureCS");
                    	      								afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop160;
                        }
                    } while (true);

                    otherlv_16=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_16, grammarAccess.getStructuredClassCSAccess().getRightCurlyBracketKeyword_7_0_2());

                    }

                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:5991:4: otherlv_17= ';'
                    {
                    otherlv_17=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getStructuredClassCSAccess().getSemicolonKeyword_7_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStructuredClassCS"


    // $ANTLR start "entryRuleTargetCS"
    // InternalQVTrelation.g:6000:1: entryRuleTargetCS returns [EObject current=null] : iv_ruleTargetCS= ruleTargetCS EOF ;
    public final EObject entryRuleTargetCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTargetCS = null;


        try {
            // InternalQVTrelation.g:6000:49: (iv_ruleTargetCS= ruleTargetCS EOF )
            // InternalQVTrelation.g:6001:2: iv_ruleTargetCS= ruleTargetCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTargetCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTargetCS=ruleTargetCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTargetCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTargetCS"


    // $ANTLR start "ruleTargetCS"
    // InternalQVTrelation.g:6007:1: ruleTargetCS returns [EObject current=null] : (otherlv_0= 'target' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= '{' ( ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) ) )* otherlv_4= '}' (otherlv_5= ';' )? ) ;
    public final EObject ruleTargetCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedTargetElements_3_1 = null;

        EObject lv_ownedTargetElements_3_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6013:2: ( (otherlv_0= 'target' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= '{' ( ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) ) )* otherlv_4= '}' (otherlv_5= ';' )? ) )
            // InternalQVTrelation.g:6014:2: (otherlv_0= 'target' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= '{' ( ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) ) )* otherlv_4= '}' (otherlv_5= ';' )? )
            {
            // InternalQVTrelation.g:6014:2: (otherlv_0= 'target' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= '{' ( ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) ) )* otherlv_4= '}' (otherlv_5= ';' )? )
            // InternalQVTrelation.g:6015:3: otherlv_0= 'target' ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= '{' ( ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) ) )* otherlv_4= '}' (otherlv_5= ';' )?
            {
            otherlv_0=(Token)match(input,54,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTargetCSAccess().getTargetKeyword_0());

            }
            // InternalQVTrelation.g:6019:3: ( (lv_name_1_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:6020:4: (lv_name_1_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:6020:4: (lv_name_1_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:6021:5: lv_name_1_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTargetCSAccess().getNameUnrestrictedNameParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_name_1_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTargetCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_1_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_103); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getTargetCSAccess().getLeftCurlyBracketKeyword_2());

            }
            // InternalQVTrelation.g:6042:3: ( ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) ) )*
            loop163:
            do {
                int alt163=2;
                int LA163_0 = input.LA(1);

                if ( (LA163_0==20||LA163_0==51||LA163_0==53||LA163_0==55) ) {
                    alt163=1;
                }


                switch (alt163) {
            	case 1 :
            	    // InternalQVTrelation.g:6043:4: ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) )
            	    {
            	    // InternalQVTrelation.g:6043:4: ( (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS ) )
            	    // InternalQVTrelation.g:6044:5: (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS )
            	    {
            	    // InternalQVTrelation.g:6044:5: (lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS | lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS )
            	    int alt162=2;
            	    int LA162_0 = input.LA(1);

            	    if ( (LA162_0==51||LA162_0==53||LA162_0==55) ) {
            	        alt162=1;
            	    }
            	    else if ( (LA162_0==20) ) {
            	        alt162=2;
            	    }
            	    else {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        NoViableAltException nvae =
            	            new NoViableAltException("", 162, 0, input);

            	        throw nvae;
            	    }
            	    switch (alt162) {
            	        case 1 :
            	            // InternalQVTrelation.g:6045:6: lv_ownedTargetElements_3_1= ruleSimpleTargetElementCS
            	            {
            	            if ( state.backtracking==0 ) {

            	              						newCompositeNode(grammarAccess.getTargetCSAccess().getOwnedTargetElementsSimpleTargetElementCSParserRuleCall_3_0_0());

            	            }
            	            pushFollow(FollowSets000.FOLLOW_103);
            	            lv_ownedTargetElements_3_1=ruleSimpleTargetElementCS();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						if (current==null) {
            	              							current = createModelElementForParent(grammarAccess.getTargetCSRule());
            	              						}
            	              						add(
            	              							current,
            	              							"ownedTargetElements",
            	              							lv_ownedTargetElements_3_1,
            	              							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.SimpleTargetElementCS");
            	              						afterParserOrEnumRuleCall();

            	            }

            	            }
            	            break;
            	        case 2 :
            	            // InternalQVTrelation.g:6061:6: lv_ownedTargetElements_3_2= ruleCompoundTargetElementCS
            	            {
            	            if ( state.backtracking==0 ) {

            	              						newCompositeNode(grammarAccess.getTargetCSAccess().getOwnedTargetElementsCompoundTargetElementCSParserRuleCall_3_0_1());

            	            }
            	            pushFollow(FollowSets000.FOLLOW_103);
            	            lv_ownedTargetElements_3_2=ruleCompoundTargetElementCS();

            	            state._fsp--;
            	            if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              						if (current==null) {
            	              							current = createModelElementForParent(grammarAccess.getTargetCSRule());
            	              						}
            	              						add(
            	              							current,
            	              							"ownedTargetElements",
            	              							lv_ownedTargetElements_3_2,
            	              							"org.eclipse.qvtd.xtext.qvtbase.QVTbase.CompoundTargetElementCS");
            	              						afterParserOrEnumRuleCall();

            	            }

            	            }
            	            break;

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop163;
                }
            } while (true);

            otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_67); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getTargetCSAccess().getRightCurlyBracketKeyword_4());

            }
            // InternalQVTrelation.g:6083:3: (otherlv_5= ';' )?
            int alt164=2;
            int LA164_0 = input.LA(1);

            if ( (LA164_0==22) ) {
                alt164=1;
            }
            switch (alt164) {
                case 1 :
                    // InternalQVTrelation.g:6084:4: otherlv_5= ';'
                    {
                    otherlv_5=(Token)match(input,22,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getTargetCSAccess().getSemicolonKeyword_5());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTargetCS"


    // $ANTLR start "entryRuleTypedMultiplicityRefCS"
    // InternalQVTrelation.g:6093:1: entryRuleTypedMultiplicityRefCS returns [EObject current=null] : iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF ;
    public final EObject entryRuleTypedMultiplicityRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypedMultiplicityRefCS = null;


        try {
            // InternalQVTrelation.g:6093:63: (iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF )
            // InternalQVTrelation.g:6094:2: iv_ruleTypedMultiplicityRefCS= ruleTypedMultiplicityRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypedMultiplicityRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypedMultiplicityRefCS=ruleTypedMultiplicityRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypedMultiplicityRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypedMultiplicityRefCS"


    // $ANTLR start "ruleTypedMultiplicityRefCS"
    // InternalQVTrelation.g:6100:1: ruleTypedMultiplicityRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTypedMultiplicityRefCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypedRefCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6106:2: ( (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTrelation.g:6107:2: (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTrelation.g:6107:2: (this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalQVTrelation.g:6108:3: this_TypedRefCS_0= ruleTypedRefCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */

            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getTypedMultiplicityRefCSAccess().getTypedRefCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_57);
            this_TypedRefCS_0=ruleTypedRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_TypedRefCS_0;
              			afterParserOrEnumRuleCall();

            }
            // InternalQVTrelation.g:6119:3: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt165=2;
            int LA165_0 = input.LA(1);

            if ( (LA165_0==138) ) {
                alt165=1;
            }
            switch (alt165) {
                case 1 :
                    // InternalQVTrelation.g:6120:4: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalQVTrelation.g:6120:4: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalQVTrelation.g:6121:5: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getTypedMultiplicityRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getTypedMultiplicityRefCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedMultiplicity",
                      						lv_ownedMultiplicity_1_0,
                      						"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypedMultiplicityRefCS"


    // $ANTLR start "entryRuleStructuralFeatureCS"
    // InternalQVTrelation.g:6142:1: entryRuleStructuralFeatureCS returns [EObject current=null] : iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF ;
    public final EObject entryRuleStructuralFeatureCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStructuralFeatureCS = null;


        try {
            // InternalQVTrelation.g:6142:60: (iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF )
            // InternalQVTrelation.g:6143:2: iv_ruleStructuralFeatureCS= ruleStructuralFeatureCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStructuralFeatureCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStructuralFeatureCS=ruleStructuralFeatureCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStructuralFeatureCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStructuralFeatureCS"


    // $ANTLR start "ruleStructuralFeatureCS"
    // InternalQVTrelation.g:6149:1: ruleStructuralFeatureCS returns [EObject current=null] : (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS ) ;
    public final EObject ruleStructuralFeatureCS() throws RecognitionException {
        EObject current = null;

        EObject this_AttributeCS_0 = null;

        EObject this_ReferenceCS_1 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6155:2: ( (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS ) )
            // InternalQVTrelation.g:6156:2: (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS )
            {
            // InternalQVTrelation.g:6156:2: (this_AttributeCS_0= ruleAttributeCS | this_ReferenceCS_1= ruleReferenceCS )
            int alt166=2;
            switch ( input.LA(1) ) {
            case 56:
                {
                switch ( input.LA(2) ) {
                case 57:
                    {
                    int LA166_5 = input.LA(3);

                    if ( (LA166_5==58) ) {
                        alt166=1;
                    }
                    else if ( (LA166_5==84) ) {
                        alt166=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 166, 5, input);

                        throw nvae;
                    }
                    }
                    break;
                case 84:
                    {
                    alt166=2;
                    }
                    break;
                case 58:
                    {
                    alt166=1;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 166, 1, input);

                    throw nvae;
                }

                }
                break;
            case 57:
                {
                switch ( input.LA(2) ) {
                case 56:
                    {
                    int LA166_6 = input.LA(3);

                    if ( (LA166_6==58) ) {
                        alt166=1;
                    }
                    else if ( (LA166_6==84) ) {
                        alt166=2;
                    }
                    else {
                        if (state.backtracking>0) {state.failed=true; return current;}
                        NoViableAltException nvae =
                            new NoViableAltException("", 166, 6, input);

                        throw nvae;
                    }
                    }
                    break;
                case 58:
                    {
                    alt166=1;
                    }
                    break;
                case 84:
                    {
                    alt166=2;
                    }
                    break;
                default:
                    if (state.backtracking>0) {state.failed=true; return current;}
                    NoViableAltException nvae =
                        new NoViableAltException("", 166, 2, input);

                    throw nvae;
                }

                }
                break;
            case 58:
                {
                alt166=1;
                }
                break;
            case 84:
                {
                alt166=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 166, 0, input);

                throw nvae;
            }

            switch (alt166) {
                case 1 :
                    // InternalQVTrelation.g:6157:3: this_AttributeCS_0= ruleAttributeCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStructuralFeatureCSAccess().getAttributeCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_AttributeCS_0=ruleAttributeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_AttributeCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6169:3: this_ReferenceCS_1= ruleReferenceCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getStructuralFeatureCSAccess().getReferenceCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_ReferenceCS_1=ruleReferenceCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_ReferenceCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStructuralFeatureCS"


    // $ANTLR start "entryRuleEnumerationLiteralName"
    // InternalQVTrelation.g:6184:1: entryRuleEnumerationLiteralName returns [String current=null] : iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF ;
    public final String entryRuleEnumerationLiteralName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEnumerationLiteralName = null;


        try {
            // InternalQVTrelation.g:6184:62: (iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF )
            // InternalQVTrelation.g:6185:2: iv_ruleEnumerationLiteralName= ruleEnumerationLiteralName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEnumerationLiteralNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEnumerationLiteralName=ruleEnumerationLiteralName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEnumerationLiteralName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEnumerationLiteralName"


    // $ANTLR start "ruleEnumerationLiteralName"
    // InternalQVTrelation.g:6191:1: ruleEnumerationLiteralName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName ;
    public final AntlrDatatypeRuleToken ruleEnumerationLiteralName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnrestrictedName_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6197:2: (this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName )
            // InternalQVTrelation.g:6198:2: this_EssentialOCLUnrestrictedName_0= ruleEssentialOCLUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getEnumerationLiteralNameAccess().getEssentialOCLUnrestrictedNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLUnrestrictedName_0=ruleEssentialOCLUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_EssentialOCLUnrestrictedName_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEnumerationLiteralName"


    // $ANTLR start "entryRuleQVTbaseUnrestrictedName"
    // InternalQVTrelation.g:6211:1: entryRuleQVTbaseUnrestrictedName returns [String current=null] : iv_ruleQVTbaseUnrestrictedName= ruleQVTbaseUnrestrictedName EOF ;
    public final String entryRuleQVTbaseUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleQVTbaseUnrestrictedName = null;


        try {
            // InternalQVTrelation.g:6211:63: (iv_ruleQVTbaseUnrestrictedName= ruleQVTbaseUnrestrictedName EOF )
            // InternalQVTrelation.g:6212:2: iv_ruleQVTbaseUnrestrictedName= ruleQVTbaseUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getQVTbaseUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleQVTbaseUnrestrictedName=ruleQVTbaseUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleQVTbaseUnrestrictedName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleQVTbaseUnrestrictedName"


    // $ANTLR start "ruleQVTbaseUnrestrictedName"
    // InternalQVTrelation.g:6218:1: ruleQVTbaseUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' ) ;
    public final AntlrDatatypeRuleToken ruleQVTbaseUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:6224:2: ( (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' ) )
            // InternalQVTrelation.g:6225:2: (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' )
            {
            // InternalQVTrelation.g:6225:2: (kw= 'abstract' | kw= 'attribute' | kw= 'body' | kw= 'class' | kw= 'composes' | kw= 'datatype' | kw= 'definition' | kw= 'derived' | kw= 'derivation' | kw= 'enum' | kw= 'extends' | kw= 'id' | kw= 'initial' | kw= 'interface' | kw= 'literal' | kw= 'operation' | kw= 'ordered' | kw= 'primitive' | kw= 'property' | kw= 'readonly' | kw= 'resolve' | kw= 'serializable' | kw= 'static' | kw= 'throws' | kw= 'transient' | kw= 'unique' | kw= 'unsettable' | kw= 'volatile' )
            int alt167=28;
            switch ( input.LA(1) ) {
            case 41:
                {
                alt167=1;
                }
                break;
            case 58:
                {
                alt167=2;
                }
                break;
            case 83:
                {
                alt167=3;
                }
                break;
            case 90:
                {
                alt167=4;
                }
                break;
            case 86:
                {
                alt167=5;
                }
                break;
            case 76:
                {
                alt167=6;
                }
                break;
            case 57:
                {
                alt167=7;
                }
                break;
            case 59:
                {
                alt167=8;
                }
                break;
            case 75:
                {
                alt167=9;
                }
                break;
            case 79:
                {
                alt167=10;
                }
                break;
            case 46:
                {
                alt167=11;
                }
                break;
            case 61:
                {
                alt167=12;
                }
                break;
            case 74:
                {
                alt167=13;
                }
                break;
            case 91:
                {
                alt167=14;
                }
                break;
            case 80:
                {
                alt167=15;
                }
                break;
            case 81:
                {
                alt167=16;
                }
                break;
            case 63:
                {
                alt167=17;
                }
                break;
            case 37:
                {
                alt167=18;
                }
                break;
            case 84:
                {
                alt167=19;
                }
                break;
            case 65:
                {
                alt167=20;
                }
                break;
            case 88:
                {
                alt167=21;
                }
                break;
            case 77:
                {
                alt167=22;
                }
                break;
            case 56:
                {
                alt167=23;
                }
                break;
            case 82:
                {
                alt167=24;
                }
                break;
            case 38:
                {
                alt167=25;
                }
                break;
            case 68:
                {
                alt167=26;
                }
                break;
            case 70:
                {
                alt167=27;
                }
                break;
            case 72:
                {
                alt167=28;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 167, 0, input);

                throw nvae;
            }

            switch (alt167) {
                case 1 :
                    // InternalQVTrelation.g:6226:3: kw= 'abstract'
                    {
                    kw=(Token)match(input,41,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getAbstractKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6232:3: kw= 'attribute'
                    {
                    kw=(Token)match(input,58,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getAttributeKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:6238:3: kw= 'body'
                    {
                    kw=(Token)match(input,83,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getBodyKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:6244:3: kw= 'class'
                    {
                    kw=(Token)match(input,90,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getClassKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:6250:3: kw= 'composes'
                    {
                    kw=(Token)match(input,86,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getComposesKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTrelation.g:6256:3: kw= 'datatype'
                    {
                    kw=(Token)match(input,76,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDatatypeKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTrelation.g:6262:3: kw= 'definition'
                    {
                    kw=(Token)match(input,57,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDefinitionKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTrelation.g:6268:3: kw= 'derived'
                    {
                    kw=(Token)match(input,59,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDerivedKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTrelation.g:6274:3: kw= 'derivation'
                    {
                    kw=(Token)match(input,75,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getDerivationKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTrelation.g:6280:3: kw= 'enum'
                    {
                    kw=(Token)match(input,79,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getEnumKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalQVTrelation.g:6286:3: kw= 'extends'
                    {
                    kw=(Token)match(input,46,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getExtendsKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalQVTrelation.g:6292:3: kw= 'id'
                    {
                    kw=(Token)match(input,61,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getIdKeyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalQVTrelation.g:6298:3: kw= 'initial'
                    {
                    kw=(Token)match(input,74,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getInitialKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalQVTrelation.g:6304:3: kw= 'interface'
                    {
                    kw=(Token)match(input,91,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getInterfaceKeyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalQVTrelation.g:6310:3: kw= 'literal'
                    {
                    kw=(Token)match(input,80,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getLiteralKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalQVTrelation.g:6316:3: kw= 'operation'
                    {
                    kw=(Token)match(input,81,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getOperationKeyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalQVTrelation.g:6322:3: kw= 'ordered'
                    {
                    kw=(Token)match(input,63,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getOrderedKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalQVTrelation.g:6328:3: kw= 'primitive'
                    {
                    kw=(Token)match(input,37,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getPrimitiveKeyword_17());

                    }

                    }
                    break;
                case 19 :
                    // InternalQVTrelation.g:6334:3: kw= 'property'
                    {
                    kw=(Token)match(input,84,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getPropertyKeyword_18());

                    }

                    }
                    break;
                case 20 :
                    // InternalQVTrelation.g:6340:3: kw= 'readonly'
                    {
                    kw=(Token)match(input,65,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getReadonlyKeyword_19());

                    }

                    }
                    break;
                case 21 :
                    // InternalQVTrelation.g:6346:3: kw= 'resolve'
                    {
                    kw=(Token)match(input,88,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getResolveKeyword_20());

                    }

                    }
                    break;
                case 22 :
                    // InternalQVTrelation.g:6352:3: kw= 'serializable'
                    {
                    kw=(Token)match(input,77,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getSerializableKeyword_21());

                    }

                    }
                    break;
                case 23 :
                    // InternalQVTrelation.g:6358:3: kw= 'static'
                    {
                    kw=(Token)match(input,56,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getStaticKeyword_22());

                    }

                    }
                    break;
                case 24 :
                    // InternalQVTrelation.g:6364:3: kw= 'throws'
                    {
                    kw=(Token)match(input,82,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getThrowsKeyword_23());

                    }

                    }
                    break;
                case 25 :
                    // InternalQVTrelation.g:6370:3: kw= 'transient'
                    {
                    kw=(Token)match(input,38,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getTransientKeyword_24());

                    }

                    }
                    break;
                case 26 :
                    // InternalQVTrelation.g:6376:3: kw= 'unique'
                    {
                    kw=(Token)match(input,68,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getUniqueKeyword_25());

                    }

                    }
                    break;
                case 27 :
                    // InternalQVTrelation.g:6382:3: kw= 'unsettable'
                    {
                    kw=(Token)match(input,70,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getUnsettableKeyword_26());

                    }

                    }
                    break;
                case 28 :
                    // InternalQVTrelation.g:6388:3: kw= 'volatile'
                    {
                    kw=(Token)match(input,72,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getQVTbaseUnrestrictedNameAccess().getVolatileKeyword_27());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleQVTbaseUnrestrictedName"


    // $ANTLR start "entryRuleSIGNED"
    // InternalQVTrelation.g:6397:1: entryRuleSIGNED returns [String current=null] : iv_ruleSIGNED= ruleSIGNED EOF ;
    public final String entryRuleSIGNED() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleSIGNED = null;


        try {
            // InternalQVTrelation.g:6397:46: (iv_ruleSIGNED= ruleSIGNED EOF )
            // InternalQVTrelation.g:6398:2: iv_ruleSIGNED= ruleSIGNED EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSIGNEDRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSIGNED=ruleSIGNED();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSIGNED.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSIGNED"


    // $ANTLR start "ruleSIGNED"
    // InternalQVTrelation.g:6404:1: ruleSIGNED returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : ( (kw= '-' )? this_INT_1= RULE_INT ) ;
    public final AntlrDatatypeRuleToken ruleSIGNED() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        Token this_INT_1=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:6410:2: ( ( (kw= '-' )? this_INT_1= RULE_INT ) )
            // InternalQVTrelation.g:6411:2: ( (kw= '-' )? this_INT_1= RULE_INT )
            {
            // InternalQVTrelation.g:6411:2: ( (kw= '-' )? this_INT_1= RULE_INT )
            // InternalQVTrelation.g:6412:3: (kw= '-' )? this_INT_1= RULE_INT
            {
            // InternalQVTrelation.g:6412:3: (kw= '-' )?
            int alt168=2;
            int LA168_0 = input.LA(1);

            if ( (LA168_0==92) ) {
                alt168=1;
            }
            switch (alt168) {
                case 1 :
                    // InternalQVTrelation.g:6413:4: kw= '-'
                    {
                    kw=(Token)match(input,92,FollowSets000.FOLLOW_104); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current.merge(kw);
                      				newLeafNode(kw, grammarAccess.getSIGNEDAccess().getHyphenMinusKeyword_0());

                    }

                    }
                    break;

            }

            this_INT_1=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current.merge(this_INT_1);

            }
            if ( state.backtracking==0 ) {

              			newLeafNode(this_INT_1, grammarAccess.getSIGNEDAccess().getINTTerminalRuleCall_1());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSIGNED"


    // $ANTLR start "entryRuleEssentialOCLUnaryOperatorName"
    // InternalQVTrelation.g:6430:1: entryRuleEssentialOCLUnaryOperatorName returns [String current=null] : iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF ;
    public final String entryRuleEssentialOCLUnaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnaryOperatorName = null;


        try {
            // InternalQVTrelation.g:6430:69: (iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF )
            // InternalQVTrelation.g:6431:2: iv_ruleEssentialOCLUnaryOperatorName= ruleEssentialOCLUnaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLUnaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLUnaryOperatorName=ruleEssentialOCLUnaryOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEssentialOCLUnaryOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEssentialOCLUnaryOperatorName"


    // $ANTLR start "ruleEssentialOCLUnaryOperatorName"
    // InternalQVTrelation.g:6437:1: ruleEssentialOCLUnaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '-' | kw= 'not' | kw= 'not2' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:6443:2: ( (kw= '-' | kw= 'not' | kw= 'not2' ) )
            // InternalQVTrelation.g:6444:2: (kw= '-' | kw= 'not' | kw= 'not2' )
            {
            // InternalQVTrelation.g:6444:2: (kw= '-' | kw= 'not' | kw= 'not2' )
            int alt169=3;
            switch ( input.LA(1) ) {
            case 92:
                {
                alt169=1;
                }
                break;
            case 93:
                {
                alt169=2;
                }
                break;
            case 94:
                {
                alt169=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 169, 0, input);

                throw nvae;
            }

            switch (alt169) {
                case 1 :
                    // InternalQVTrelation.g:6445:3: kw= '-'
                    {
                    kw=(Token)match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getHyphenMinusKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6451:3: kw= 'not'
                    {
                    kw=(Token)match(input,93,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNotKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:6457:3: kw= 'not2'
                    {
                    kw=(Token)match(input,94,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLUnaryOperatorNameAccess().getNot2Keyword_2());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEssentialOCLUnaryOperatorName"


    // $ANTLR start "entryRuleEssentialOCLInfixOperatorName"
    // InternalQVTrelation.g:6466:1: entryRuleEssentialOCLInfixOperatorName returns [String current=null] : iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF ;
    public final String entryRuleEssentialOCLInfixOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLInfixOperatorName = null;


        try {
            // InternalQVTrelation.g:6466:69: (iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF )
            // InternalQVTrelation.g:6467:2: iv_ruleEssentialOCLInfixOperatorName= ruleEssentialOCLInfixOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLInfixOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLInfixOperatorName=ruleEssentialOCLInfixOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEssentialOCLInfixOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEssentialOCLInfixOperatorName"


    // $ANTLR start "ruleEssentialOCLInfixOperatorName"
    // InternalQVTrelation.g:6473:1: ruleEssentialOCLInfixOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLInfixOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:6479:2: ( (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' ) )
            // InternalQVTrelation.g:6480:2: (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' )
            {
            // InternalQVTrelation.g:6480:2: (kw= '*' | kw= '/' | kw= '+' | kw= '-' | kw= '>' | kw= '<' | kw= '>=' | kw= '<=' | kw= '=' | kw= '<>' | kw= 'and' | kw= 'and2' | kw= 'implies' | kw= 'implies2' | kw= 'or' | kw= 'or2' | kw= 'xor' | kw= 'xor2' )
            int alt170=18;
            switch ( input.LA(1) ) {
            case 48:
                {
                alt170=1;
                }
                break;
            case 95:
                {
                alt170=2;
                }
                break;
            case 96:
                {
                alt170=3;
                }
                break;
            case 92:
                {
                alt170=4;
                }
                break;
            case 97:
                {
                alt170=5;
                }
                break;
            case 98:
                {
                alt170=6;
                }
                break;
            case 99:
                {
                alt170=7;
                }
                break;
            case 100:
                {
                alt170=8;
                }
                break;
            case 19:
                {
                alt170=9;
                }
                break;
            case 101:
                {
                alt170=10;
                }
                break;
            case 102:
                {
                alt170=11;
                }
                break;
            case 103:
                {
                alt170=12;
                }
                break;
            case 104:
                {
                alt170=13;
                }
                break;
            case 105:
                {
                alt170=14;
                }
                break;
            case 106:
                {
                alt170=15;
                }
                break;
            case 107:
                {
                alt170=16;
                }
                break;
            case 108:
                {
                alt170=17;
                }
                break;
            case 109:
                {
                alt170=18;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 170, 0, input);

                throw nvae;
            }

            switch (alt170) {
                case 1 :
                    // InternalQVTrelation.g:6481:3: kw= '*'
                    {
                    kw=(Token)match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAsteriskKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6487:3: kw= '/'
                    {
                    kw=(Token)match(input,95,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getSolidusKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:6493:3: kw= '+'
                    {
                    kw=(Token)match(input,96,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getPlusSignKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:6499:3: kw= '-'
                    {
                    kw=(Token)match(input,92,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getHyphenMinusKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:6505:3: kw= '>'
                    {
                    kw=(Token)match(input,97,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTrelation.g:6511:3: kw= '<'
                    {
                    kw=(Token)match(input,98,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTrelation.g:6517:3: kw= '>='
                    {
                    kw=(Token)match(input,99,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getGreaterThanSignEqualsSignKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTrelation.g:6523:3: kw= '<='
                    {
                    kw=(Token)match(input,100,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignEqualsSignKeyword_7());

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTrelation.g:6529:3: kw= '='
                    {
                    kw=(Token)match(input,19,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getEqualsSignKeyword_8());

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTrelation.g:6535:3: kw= '<>'
                    {
                    kw=(Token)match(input,101,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getLessThanSignGreaterThanSignKeyword_9());

                    }

                    }
                    break;
                case 11 :
                    // InternalQVTrelation.g:6541:3: kw= 'and'
                    {
                    kw=(Token)match(input,102,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAndKeyword_10());

                    }

                    }
                    break;
                case 12 :
                    // InternalQVTrelation.g:6547:3: kw= 'and2'
                    {
                    kw=(Token)match(input,103,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getAnd2Keyword_11());

                    }

                    }
                    break;
                case 13 :
                    // InternalQVTrelation.g:6553:3: kw= 'implies'
                    {
                    kw=(Token)match(input,104,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImpliesKeyword_12());

                    }

                    }
                    break;
                case 14 :
                    // InternalQVTrelation.g:6559:3: kw= 'implies2'
                    {
                    kw=(Token)match(input,105,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getImplies2Keyword_13());

                    }

                    }
                    break;
                case 15 :
                    // InternalQVTrelation.g:6565:3: kw= 'or'
                    {
                    kw=(Token)match(input,106,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOrKeyword_14());

                    }

                    }
                    break;
                case 16 :
                    // InternalQVTrelation.g:6571:3: kw= 'or2'
                    {
                    kw=(Token)match(input,107,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getOr2Keyword_15());

                    }

                    }
                    break;
                case 17 :
                    // InternalQVTrelation.g:6577:3: kw= 'xor'
                    {
                    kw=(Token)match(input,108,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXorKeyword_16());

                    }

                    }
                    break;
                case 18 :
                    // InternalQVTrelation.g:6583:3: kw= 'xor2'
                    {
                    kw=(Token)match(input,109,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLInfixOperatorNameAccess().getXor2Keyword_17());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEssentialOCLInfixOperatorName"


    // $ANTLR start "entryRuleEssentialOCLNavigationOperatorName"
    // InternalQVTrelation.g:6592:1: entryRuleEssentialOCLNavigationOperatorName returns [String current=null] : iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF ;
    public final String entryRuleEssentialOCLNavigationOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLNavigationOperatorName = null;


        try {
            // InternalQVTrelation.g:6592:74: (iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF )
            // InternalQVTrelation.g:6593:2: iv_ruleEssentialOCLNavigationOperatorName= ruleEssentialOCLNavigationOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLNavigationOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLNavigationOperatorName=ruleEssentialOCLNavigationOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEssentialOCLNavigationOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEssentialOCLNavigationOperatorName"


    // $ANTLR start "ruleEssentialOCLNavigationOperatorName"
    // InternalQVTrelation.g:6599:1: ruleEssentialOCLNavigationOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLNavigationOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:6605:2: ( (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' ) )
            // InternalQVTrelation.g:6606:2: (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' )
            {
            // InternalQVTrelation.g:6606:2: (kw= '.' | kw= '->' | kw= '?.' | kw= '?->' )
            int alt171=4;
            switch ( input.LA(1) ) {
            case 110:
                {
                alt171=1;
                }
                break;
            case 111:
                {
                alt171=2;
                }
                break;
            case 112:
                {
                alt171=3;
                }
                break;
            case 113:
                {
                alt171=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 171, 0, input);

                throw nvae;
            }

            switch (alt171) {
                case 1 :
                    // InternalQVTrelation.g:6607:3: kw= '.'
                    {
                    kw=(Token)match(input,110,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getFullStopKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6613:3: kw= '->'
                    {
                    kw=(Token)match(input,111,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getHyphenMinusGreaterThanSignKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:6619:3: kw= '?.'
                    {
                    kw=(Token)match(input,112,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkFullStopKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:6625:3: kw= '?->'
                    {
                    kw=(Token)match(input,113,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLNavigationOperatorNameAccess().getQuestionMarkHyphenMinusGreaterThanSignKeyword_3());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEssentialOCLNavigationOperatorName"


    // $ANTLR start "entryRuleBinaryOperatorName"
    // InternalQVTrelation.g:6634:1: entryRuleBinaryOperatorName returns [String current=null] : iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF ;
    public final String entryRuleBinaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleBinaryOperatorName = null;


        try {
            // InternalQVTrelation.g:6634:58: (iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF )
            // InternalQVTrelation.g:6635:2: iv_ruleBinaryOperatorName= ruleBinaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBinaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBinaryOperatorName=ruleBinaryOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleBinaryOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleBinaryOperatorName"


    // $ANTLR start "ruleBinaryOperatorName"
    // InternalQVTrelation.g:6641:1: ruleBinaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName ) ;
    public final AntlrDatatypeRuleToken ruleBinaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_InfixOperatorName_0 = null;

        AntlrDatatypeRuleToken this_NavigationOperatorName_1 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6647:2: ( (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName ) )
            // InternalQVTrelation.g:6648:2: (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName )
            {
            // InternalQVTrelation.g:6648:2: (this_InfixOperatorName_0= ruleInfixOperatorName | this_NavigationOperatorName_1= ruleNavigationOperatorName )
            int alt172=2;
            int LA172_0 = input.LA(1);

            if ( (LA172_0==19||LA172_0==48||LA172_0==92||(LA172_0>=95 && LA172_0<=109)) ) {
                alt172=1;
            }
            else if ( ((LA172_0>=110 && LA172_0<=113)) ) {
                alt172=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 172, 0, input);

                throw nvae;
            }
            switch (alt172) {
                case 1 :
                    // InternalQVTrelation.g:6649:3: this_InfixOperatorName_0= ruleInfixOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getBinaryOperatorNameAccess().getInfixOperatorNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InfixOperatorName_0=ruleInfixOperatorName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_InfixOperatorName_0);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6660:3: this_NavigationOperatorName_1= ruleNavigationOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getBinaryOperatorNameAccess().getNavigationOperatorNameParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NavigationOperatorName_1=ruleNavigationOperatorName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_NavigationOperatorName_1);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleBinaryOperatorName"


    // $ANTLR start "entryRuleInfixOperatorName"
    // InternalQVTrelation.g:6674:1: entryRuleInfixOperatorName returns [String current=null] : iv_ruleInfixOperatorName= ruleInfixOperatorName EOF ;
    public final String entryRuleInfixOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleInfixOperatorName = null;


        try {
            // InternalQVTrelation.g:6674:57: (iv_ruleInfixOperatorName= ruleInfixOperatorName EOF )
            // InternalQVTrelation.g:6675:2: iv_ruleInfixOperatorName= ruleInfixOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInfixOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInfixOperatorName=ruleInfixOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleInfixOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleInfixOperatorName"


    // $ANTLR start "ruleInfixOperatorName"
    // InternalQVTrelation.g:6681:1: ruleInfixOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName ;
    public final AntlrDatatypeRuleToken ruleInfixOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLInfixOperatorName_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6687:2: (this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName )
            // InternalQVTrelation.g:6688:2: this_EssentialOCLInfixOperatorName_0= ruleEssentialOCLInfixOperatorName
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getInfixOperatorNameAccess().getEssentialOCLInfixOperatorNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLInfixOperatorName_0=ruleEssentialOCLInfixOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_EssentialOCLInfixOperatorName_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInfixOperatorName"


    // $ANTLR start "entryRuleNavigationOperatorName"
    // InternalQVTrelation.g:6701:1: entryRuleNavigationOperatorName returns [String current=null] : iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF ;
    public final String entryRuleNavigationOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNavigationOperatorName = null;


        try {
            // InternalQVTrelation.g:6701:62: (iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF )
            // InternalQVTrelation.g:6702:2: iv_ruleNavigationOperatorName= ruleNavigationOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigationOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigationOperatorName=ruleNavigationOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNavigationOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNavigationOperatorName"


    // $ANTLR start "ruleNavigationOperatorName"
    // InternalQVTrelation.g:6708:1: ruleNavigationOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName ;
    public final AntlrDatatypeRuleToken ruleNavigationOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLNavigationOperatorName_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6714:2: (this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName )
            // InternalQVTrelation.g:6715:2: this_EssentialOCLNavigationOperatorName_0= ruleEssentialOCLNavigationOperatorName
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getNavigationOperatorNameAccess().getEssentialOCLNavigationOperatorNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLNavigationOperatorName_0=ruleEssentialOCLNavigationOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_EssentialOCLNavigationOperatorName_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNavigationOperatorName"


    // $ANTLR start "entryRuleUnaryOperatorName"
    // InternalQVTrelation.g:6728:1: entryRuleUnaryOperatorName returns [String current=null] : iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF ;
    public final String entryRuleUnaryOperatorName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnaryOperatorName = null;


        try {
            // InternalQVTrelation.g:6728:57: (iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF )
            // InternalQVTrelation.g:6729:2: iv_ruleUnaryOperatorName= ruleUnaryOperatorName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnaryOperatorNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnaryOperatorName=ruleUnaryOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnaryOperatorName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUnaryOperatorName"


    // $ANTLR start "ruleUnaryOperatorName"
    // InternalQVTrelation.g:6735:1: ruleUnaryOperatorName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName ;
    public final AntlrDatatypeRuleToken ruleUnaryOperatorName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnaryOperatorName_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6741:2: (this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName )
            // InternalQVTrelation.g:6742:2: this_EssentialOCLUnaryOperatorName_0= ruleEssentialOCLUnaryOperatorName
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getUnaryOperatorNameAccess().getEssentialOCLUnaryOperatorNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLUnaryOperatorName_0=ruleEssentialOCLUnaryOperatorName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_EssentialOCLUnaryOperatorName_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnaryOperatorName"


    // $ANTLR start "entryRuleEssentialOCLUnrestrictedName"
    // InternalQVTrelation.g:6755:1: entryRuleEssentialOCLUnrestrictedName returns [String current=null] : iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF ;
    public final String entryRuleEssentialOCLUnrestrictedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnrestrictedName = null;


        try {
            // InternalQVTrelation.g:6755:68: (iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF )
            // InternalQVTrelation.g:6756:2: iv_ruleEssentialOCLUnrestrictedName= ruleEssentialOCLUnrestrictedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLUnrestrictedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLUnrestrictedName=ruleEssentialOCLUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEssentialOCLUnrestrictedName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEssentialOCLUnrestrictedName"


    // $ANTLR start "ruleEssentialOCLUnrestrictedName"
    // InternalQVTrelation.g:6762:1: ruleEssentialOCLUnrestrictedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_Identifier_0= ruleIdentifier ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnrestrictedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_Identifier_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6768:2: (this_Identifier_0= ruleIdentifier )
            // InternalQVTrelation.g:6769:2: this_Identifier_0= ruleIdentifier
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getEssentialOCLUnrestrictedNameAccess().getIdentifierParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_Identifier_0=ruleIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_Identifier_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEssentialOCLUnrestrictedName"


    // $ANTLR start "entryRuleEssentialOCLUnreservedName"
    // InternalQVTrelation.g:6782:1: entryRuleEssentialOCLUnreservedName returns [String current=null] : iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF ;
    public final String entryRuleEssentialOCLUnreservedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleEssentialOCLUnreservedName = null;


        try {
            // InternalQVTrelation.g:6782:66: (iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF )
            // InternalQVTrelation.g:6783:2: iv_ruleEssentialOCLUnreservedName= ruleEssentialOCLUnreservedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleEssentialOCLUnreservedName=ruleEssentialOCLUnreservedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleEssentialOCLUnreservedName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleEssentialOCLUnreservedName"


    // $ANTLR start "ruleEssentialOCLUnreservedName"
    // InternalQVTrelation.g:6789:1: ruleEssentialOCLUnreservedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' ) ;
    public final AntlrDatatypeRuleToken ruleEssentialOCLUnreservedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;
        AntlrDatatypeRuleToken this_UnrestrictedName_0 = null;

        AntlrDatatypeRuleToken this_CollectionTypeIdentifier_1 = null;

        AntlrDatatypeRuleToken this_PrimitiveTypeIdentifier_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6795:2: ( (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' ) )
            // InternalQVTrelation.g:6796:2: (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' )
            {
            // InternalQVTrelation.g:6796:2: (this_UnrestrictedName_0= ruleUnrestrictedName | this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier | this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier | kw= 'Map' | kw= 'Tuple' )
            int alt173=5;
            switch ( input.LA(1) ) {
            case RULE_SIMPLE_ID:
            case RULE_ESCAPED_ID:
            case 17:
            case 25:
            case 26:
            case 27:
            case 28:
            case 29:
            case 30:
            case 31:
            case 32:
            case 35:
            case 36:
            case 37:
            case 38:
            case 39:
            case 40:
            case 41:
            case 42:
            case 43:
            case 45:
            case 46:
            case 47:
            case 49:
            case 50:
            case 51:
            case 52:
            case 53:
            case 54:
            case 55:
            case 56:
            case 57:
            case 58:
            case 59:
            case 61:
            case 63:
            case 65:
            case 68:
            case 70:
            case 72:
            case 74:
            case 75:
            case 76:
            case 77:
            case 79:
            case 80:
            case 81:
            case 82:
            case 83:
            case 84:
            case 86:
            case 88:
            case 90:
            case 91:
                {
                alt173=1;
                }
                break;
            case 124:
            case 125:
            case 126:
            case 127:
            case 128:
                {
                alt173=2;
                }
                break;
            case 116:
            case 117:
            case 118:
            case 119:
            case 120:
            case 121:
            case 122:
            case 123:
                {
                alt173=3;
                }
                break;
            case 114:
                {
                alt173=4;
                }
                break;
            case 115:
                {
                alt173=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 173, 0, input);

                throw nvae;
            }

            switch (alt173) {
                case 1 :
                    // InternalQVTrelation.g:6797:3: this_UnrestrictedName_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameAccess().getUnrestrictedNameParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_UnrestrictedName_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_UnrestrictedName_0);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6808:3: this_CollectionTypeIdentifier_1= ruleCollectionTypeIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameAccess().getCollectionTypeIdentifierParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionTypeIdentifier_1=ruleCollectionTypeIdentifier();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_CollectionTypeIdentifier_1);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:6819:3: this_PrimitiveTypeIdentifier_2= rulePrimitiveTypeIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getEssentialOCLUnreservedNameAccess().getPrimitiveTypeIdentifierParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimitiveTypeIdentifier_2=rulePrimitiveTypeIdentifier();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_PrimitiveTypeIdentifier_2);

                    }
                    if ( state.backtracking==0 ) {

                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:6830:3: kw= 'Map'
                    {
                    kw=(Token)match(input,114,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLUnreservedNameAccess().getMapKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:6836:3: kw= 'Tuple'
                    {
                    kw=(Token)match(input,115,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getEssentialOCLUnreservedNameAccess().getTupleKeyword_4());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleEssentialOCLUnreservedName"


    // $ANTLR start "entryRuleUnreservedName"
    // InternalQVTrelation.g:6845:1: entryRuleUnreservedName returns [String current=null] : iv_ruleUnreservedName= ruleUnreservedName EOF ;
    public final String entryRuleUnreservedName() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnreservedName = null;


        try {
            // InternalQVTrelation.g:6845:54: (iv_ruleUnreservedName= ruleUnreservedName EOF )
            // InternalQVTrelation.g:6846:2: iv_ruleUnreservedName= ruleUnreservedName EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnreservedNameRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnreservedName=ruleUnreservedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnreservedName.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUnreservedName"


    // $ANTLR start "ruleUnreservedName"
    // InternalQVTrelation.g:6852:1: ruleUnreservedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName ;
    public final AntlrDatatypeRuleToken ruleUnreservedName() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_EssentialOCLUnreservedName_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6858:2: (this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName )
            // InternalQVTrelation.g:6859:2: this_EssentialOCLUnreservedName_0= ruleEssentialOCLUnreservedName
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getUnreservedNameAccess().getEssentialOCLUnreservedNameParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_EssentialOCLUnreservedName_0=ruleEssentialOCLUnreservedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_EssentialOCLUnreservedName_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnreservedName"


    // $ANTLR start "entryRuleURIPathNameCS"
    // InternalQVTrelation.g:6872:1: entryRuleURIPathNameCS returns [EObject current=null] : iv_ruleURIPathNameCS= ruleURIPathNameCS EOF ;
    public final EObject entryRuleURIPathNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleURIPathNameCS = null;


        try {
            // InternalQVTrelation.g:6872:54: (iv_ruleURIPathNameCS= ruleURIPathNameCS EOF )
            // InternalQVTrelation.g:6873:2: iv_ruleURIPathNameCS= ruleURIPathNameCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getURIPathNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleURIPathNameCS=ruleURIPathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleURIPathNameCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleURIPathNameCS"


    // $ANTLR start "ruleURIPathNameCS"
    // InternalQVTrelation.g:6879:1: ruleURIPathNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) ;
    public final EObject ruleURIPathNameCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedPathElements_0_0 = null;

        EObject lv_ownedPathElements_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:6885:2: ( ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
            // InternalQVTrelation.g:6886:2: ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            {
            // InternalQVTrelation.g:6886:2: ( ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            // InternalQVTrelation.g:6887:3: ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            {
            // InternalQVTrelation.g:6887:3: ( (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS ) )
            // InternalQVTrelation.g:6888:4: (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS )
            {
            // InternalQVTrelation.g:6888:4: (lv_ownedPathElements_0_0= ruleURIFirstPathElementCS )
            // InternalQVTrelation.g:6889:5: lv_ownedPathElements_0_0= ruleURIFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsURIFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_105);
            lv_ownedPathElements_0_0=ruleURIFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getURIPathNameCSRule());
              					}
              					add(
              						current,
              						"ownedPathElements",
              						lv_ownedPathElements_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.URIFirstPathElementCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:6906:3: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            loop174:
            do {
                int alt174=2;
                int LA174_0 = input.LA(1);

                if ( (LA174_0==44) ) {
                    int LA174_1 = input.LA(2);

                    if ( ((LA174_1>=RULE_SIMPLE_ID && LA174_1<=RULE_ESCAPED_ID)||LA174_1==17||(LA174_1>=25 && LA174_1<=32)||(LA174_1>=35 && LA174_1<=43)||(LA174_1>=45 && LA174_1<=47)||(LA174_1>=49 && LA174_1<=59)||LA174_1==61||LA174_1==63||LA174_1==65||LA174_1==68||LA174_1==70||LA174_1==72||(LA174_1>=74 && LA174_1<=77)||(LA174_1>=79 && LA174_1<=84)||LA174_1==86||LA174_1==88||(LA174_1>=90 && LA174_1<=91)||(LA174_1>=114 && LA174_1<=128)) ) {
                        alt174=1;
                    }


                }


                switch (alt174) {
            	case 1 :
            	    // InternalQVTrelation.g:6907:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    {
            	    otherlv_1=(Token)match(input,44,FollowSets000.FOLLOW_106); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getURIPathNameCSAccess().getColonColonKeyword_1_0());

            	    }
            	    // InternalQVTrelation.g:6911:4: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalQVTrelation.g:6912:5: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalQVTrelation.g:6912:5: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalQVTrelation.g:6913:6: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getURIPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_105);
            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getURIPathNameCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedPathElements",
            	      							lv_ownedPathElements_2_0,
            	      							"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop174;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleURIPathNameCS"


    // $ANTLR start "entryRuleURIFirstPathElementCS"
    // InternalQVTrelation.g:6935:1: entryRuleURIFirstPathElementCS returns [EObject current=null] : iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF ;
    public final EObject entryRuleURIFirstPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleURIFirstPathElementCS = null;


        try {
            // InternalQVTrelation.g:6935:62: (iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF )
            // InternalQVTrelation.g:6936:2: iv_ruleURIFirstPathElementCS= ruleURIFirstPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getURIFirstPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleURIFirstPathElementCS=ruleURIFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleURIFirstPathElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleURIFirstPathElementCS"


    // $ANTLR start "ruleURIFirstPathElementCS"
    // InternalQVTrelation.g:6942:1: ruleURIFirstPathElementCS returns [EObject current=null] : ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) ) ;
    public final EObject ruleURIFirstPathElementCS() throws RecognitionException {
        EObject current = null;


        	enterRule();

        try {
            // InternalQVTrelation.g:6948:2: ( ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) ) )
            // InternalQVTrelation.g:6949:2: ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) )
            {
            // InternalQVTrelation.g:6949:2: ( ( ( ruleUnrestrictedName ) ) | ( () ( ( ruleURI ) ) ) )
            int alt175=2;
            int LA175_0 = input.LA(1);

            if ( ((LA175_0>=RULE_SIMPLE_ID && LA175_0<=RULE_ESCAPED_ID)||LA175_0==17||(LA175_0>=25 && LA175_0<=32)||(LA175_0>=35 && LA175_0<=43)||(LA175_0>=45 && LA175_0<=47)||(LA175_0>=49 && LA175_0<=59)||LA175_0==61||LA175_0==63||LA175_0==65||LA175_0==68||LA175_0==70||LA175_0==72||(LA175_0>=74 && LA175_0<=77)||(LA175_0>=79 && LA175_0<=84)||LA175_0==86||LA175_0==88||(LA175_0>=90 && LA175_0<=91)) ) {
                alt175=1;
            }
            else if ( (LA175_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt175=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 175, 0, input);

                throw nvae;
            }
            switch (alt175) {
                case 1 :
                    // InternalQVTrelation.g:6950:3: ( ( ruleUnrestrictedName ) )
                    {
                    // InternalQVTrelation.g:6950:3: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:6951:4: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:6951:4: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:6952:5: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      					/* */

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getURIFirstPathElementCSRule());
                      					}

                    }
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:6970:3: ( () ( ( ruleURI ) ) )
                    {
                    // InternalQVTrelation.g:6970:3: ( () ( ( ruleURI ) ) )
                    // InternalQVTrelation.g:6971:4: () ( ( ruleURI ) )
                    {
                    // InternalQVTrelation.g:6971:4: ()
                    // InternalQVTrelation.g:6972:5:
                    {
                    if ( state.backtracking==0 ) {

                      					/* */

                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getURIFirstPathElementCSAccess().getPathElementWithURICSAction_1_0(),
                      						current);

                    }

                    }

                    // InternalQVTrelation.g:6981:4: ( ( ruleURI ) )
                    // InternalQVTrelation.g:6982:5: ( ruleURI )
                    {
                    // InternalQVTrelation.g:6982:5: ( ruleURI )
                    // InternalQVTrelation.g:6983:6: ruleURI
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getURIFirstPathElementCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getURIFirstPathElementCSAccess().getReferredElementNamespaceCrossReference_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    ruleURI();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleURIFirstPathElementCS"


    // $ANTLR start "entryRulePrimitiveTypeIdentifier"
    // InternalQVTrelation.g:7005:1: entryRulePrimitiveTypeIdentifier returns [String current=null] : iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF ;
    public final String entryRulePrimitiveTypeIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_rulePrimitiveTypeIdentifier = null;


        try {
            // InternalQVTrelation.g:7005:63: (iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF )
            // InternalQVTrelation.g:7006:2: iv_rulePrimitiveTypeIdentifier= rulePrimitiveTypeIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveTypeIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveTypeIdentifier=rulePrimitiveTypeIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrimitiveTypeIdentifier.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrimitiveTypeIdentifier"


    // $ANTLR start "rulePrimitiveTypeIdentifier"
    // InternalQVTrelation.g:7012:1: rulePrimitiveTypeIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' ) ;
    public final AntlrDatatypeRuleToken rulePrimitiveTypeIdentifier() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:7018:2: ( (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' ) )
            // InternalQVTrelation.g:7019:2: (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' )
            {
            // InternalQVTrelation.g:7019:2: (kw= 'Boolean' | kw= 'Integer' | kw= 'Real' | kw= 'String' | kw= 'UnlimitedNatural' | kw= 'OclAny' | kw= 'OclInvalid' | kw= 'OclVoid' )
            int alt176=8;
            switch ( input.LA(1) ) {
            case 116:
                {
                alt176=1;
                }
                break;
            case 117:
                {
                alt176=2;
                }
                break;
            case 118:
                {
                alt176=3;
                }
                break;
            case 119:
                {
                alt176=4;
                }
                break;
            case 120:
                {
                alt176=5;
                }
                break;
            case 121:
                {
                alt176=6;
                }
                break;
            case 122:
                {
                alt176=7;
                }
                break;
            case 123:
                {
                alt176=8;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 176, 0, input);

                throw nvae;
            }

            switch (alt176) {
                case 1 :
                    // InternalQVTrelation.g:7020:3: kw= 'Boolean'
                    {
                    kw=(Token)match(input,116,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getBooleanKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:7026:3: kw= 'Integer'
                    {
                    kw=(Token)match(input,117,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getIntegerKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:7032:3: kw= 'Real'
                    {
                    kw=(Token)match(input,118,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getRealKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:7038:3: kw= 'String'
                    {
                    kw=(Token)match(input,119,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getStringKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:7044:3: kw= 'UnlimitedNatural'
                    {
                    kw=(Token)match(input,120,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getUnlimitedNaturalKeyword_4());

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTrelation.g:7050:3: kw= 'OclAny'
                    {
                    kw=(Token)match(input,121,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclAnyKeyword_5());

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTrelation.g:7056:3: kw= 'OclInvalid'
                    {
                    kw=(Token)match(input,122,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclInvalidKeyword_6());

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTrelation.g:7062:3: kw= 'OclVoid'
                    {
                    kw=(Token)match(input,123,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getPrimitiveTypeIdentifierAccess().getOclVoidKeyword_7());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrimitiveTypeIdentifier"


    // $ANTLR start "entryRulePrimitiveTypeCS"
    // InternalQVTrelation.g:7071:1: entryRulePrimitiveTypeCS returns [EObject current=null] : iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF ;
    public final EObject entryRulePrimitiveTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveTypeCS = null;


        try {
            // InternalQVTrelation.g:7071:56: (iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF )
            // InternalQVTrelation.g:7072:2: iv_rulePrimitiveTypeCS= rulePrimitiveTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveTypeCS=rulePrimitiveTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrimitiveTypeCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrimitiveTypeCS"


    // $ANTLR start "rulePrimitiveTypeCS"
    // InternalQVTrelation.g:7078:1: rulePrimitiveTypeCS returns [EObject current=null] : ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) ) ;
    public final EObject rulePrimitiveTypeCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7084:2: ( ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) ) )
            // InternalQVTrelation.g:7085:2: ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) )
            {
            // InternalQVTrelation.g:7085:2: ( (lv_name_0_0= rulePrimitiveTypeIdentifier ) )
            // InternalQVTrelation.g:7086:3: (lv_name_0_0= rulePrimitiveTypeIdentifier )
            {
            // InternalQVTrelation.g:7086:3: (lv_name_0_0= rulePrimitiveTypeIdentifier )
            // InternalQVTrelation.g:7087:4: lv_name_0_0= rulePrimitiveTypeIdentifier
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getPrimitiveTypeCSAccess().getNamePrimitiveTypeIdentifierParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_name_0_0=rulePrimitiveTypeIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getPrimitiveTypeCSRule());
              				}
              				set(
              					current,
              					"name",
              					lv_name_0_0,
              					"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PrimitiveTypeIdentifier");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrimitiveTypeCS"


    // $ANTLR start "entryRuleCollectionTypeIdentifier"
    // InternalQVTrelation.g:7107:1: entryRuleCollectionTypeIdentifier returns [String current=null] : iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF ;
    public final String entryRuleCollectionTypeIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleCollectionTypeIdentifier = null;


        try {
            // InternalQVTrelation.g:7107:64: (iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF )
            // InternalQVTrelation.g:7108:2: iv_ruleCollectionTypeIdentifier= ruleCollectionTypeIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionTypeIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionTypeIdentifier=ruleCollectionTypeIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCollectionTypeIdentifier.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCollectionTypeIdentifier"


    // $ANTLR start "ruleCollectionTypeIdentifier"
    // InternalQVTrelation.g:7114:1: ruleCollectionTypeIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' ) ;
    public final AntlrDatatypeRuleToken ruleCollectionTypeIdentifier() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:7120:2: ( (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' ) )
            // InternalQVTrelation.g:7121:2: (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' )
            {
            // InternalQVTrelation.g:7121:2: (kw= 'Set' | kw= 'Bag' | kw= 'Sequence' | kw= 'Collection' | kw= 'OrderedSet' )
            int alt177=5;
            switch ( input.LA(1) ) {
            case 124:
                {
                alt177=1;
                }
                break;
            case 125:
                {
                alt177=2;
                }
                break;
            case 126:
                {
                alt177=3;
                }
                break;
            case 127:
                {
                alt177=4;
                }
                break;
            case 128:
                {
                alt177=5;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 177, 0, input);

                throw nvae;
            }

            switch (alt177) {
                case 1 :
                    // InternalQVTrelation.g:7122:3: kw= 'Set'
                    {
                    kw=(Token)match(input,124,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getSetKeyword_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:7128:3: kw= 'Bag'
                    {
                    kw=(Token)match(input,125,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getBagKeyword_1());

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:7134:3: kw= 'Sequence'
                    {
                    kw=(Token)match(input,126,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getSequenceKeyword_2());

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:7140:3: kw= 'Collection'
                    {
                    kw=(Token)match(input,127,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getCollectionKeyword_3());

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:7146:3: kw= 'OrderedSet'
                    {
                    kw=(Token)match(input,128,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getCollectionTypeIdentifierAccess().getOrderedSetKeyword_4());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCollectionTypeIdentifier"


    // $ANTLR start "entryRuleCollectionTypeCS"
    // InternalQVTrelation.g:7155:1: entryRuleCollectionTypeCS returns [EObject current=null] : iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF ;
    public final EObject entryRuleCollectionTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionTypeCS = null;


        try {
            // InternalQVTrelation.g:7155:57: (iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF )
            // InternalQVTrelation.g:7156:2: iv_ruleCollectionTypeCS= ruleCollectionTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionTypeCS=ruleCollectionTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCollectionTypeCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCollectionTypeCS"


    // $ANTLR start "ruleCollectionTypeCS"
    // InternalQVTrelation.g:7162:1: ruleCollectionTypeCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? ) ;
    public final EObject ruleCollectionTypeCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedCollectionMultiplicity_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7168:2: ( ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? ) )
            // InternalQVTrelation.g:7169:2: ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? )
            {
            // InternalQVTrelation.g:7169:2: ( ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )? )
            // InternalQVTrelation.g:7170:3: ( (lv_name_0_0= ruleCollectionTypeIdentifier ) ) (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )?
            {
            // InternalQVTrelation.g:7170:3: ( (lv_name_0_0= ruleCollectionTypeIdentifier ) )
            // InternalQVTrelation.g:7171:4: (lv_name_0_0= ruleCollectionTypeIdentifier )
            {
            // InternalQVTrelation.g:7171:4: (lv_name_0_0= ruleCollectionTypeIdentifier )
            // InternalQVTrelation.g:7172:5: lv_name_0_0= ruleCollectionTypeIdentifier
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getNameCollectionTypeIdentifierParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_107);
            lv_name_0_0=ruleCollectionTypeIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCollectionTypeCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeIdentifier");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:7189:3: (otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')' )?
            int alt179=2;
            int LA179_0 = input.LA(1);

            if ( (LA179_0==33) ) {
                alt179=1;
            }
            switch (alt179) {
                case 1 :
                    // InternalQVTrelation.g:7190:4: otherlv_1= '(' ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) ) ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )? otherlv_4= ')'
                    {
                    otherlv_1=(Token)match(input,33,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getCollectionTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTrelation.g:7194:4: ( (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS ) )
                    // InternalQVTrelation.g:7195:5: (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS )
                    {
                    // InternalQVTrelation.g:7195:5: (lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS )
                    // InternalQVTrelation.g:7196:6: lv_ownedType_2_0= ruleTypeExpWithoutMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getOwnedTypeTypeExpWithoutMultiplicityCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_108);
                    lv_ownedType_2_0=ruleTypeExpWithoutMultiplicityCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCollectionTypeCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpWithoutMultiplicityCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:7213:4: ( (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS ) )?
                    int alt178=2;
                    int LA178_0 = input.LA(1);

                    if ( (LA178_0==138) ) {
                        alt178=1;
                    }
                    switch (alt178) {
                        case 1 :
                            // InternalQVTrelation.g:7214:5: (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS )
                            {
                            // InternalQVTrelation.g:7214:5: (lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS )
                            // InternalQVTrelation.g:7215:6: lv_ownedCollectionMultiplicity_3_0= ruleMultiplicityCS
                            {
                            if ( state.backtracking==0 ) {

                              						newCompositeNode(grammarAccess.getCollectionTypeCSAccess().getOwnedCollectionMultiplicityMultiplicityCSParserRuleCall_1_2_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_30);
                            lv_ownedCollectionMultiplicity_3_0=ruleMultiplicityCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						if (current==null) {
                              							current = createModelElementForParent(grammarAccess.getCollectionTypeCSRule());
                              						}
                              						set(
                              							current,
                              							"ownedCollectionMultiplicity",
                              							lv_ownedCollectionMultiplicity_3_0,
                              							"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                              						afterParserOrEnumRuleCall();

                            }

                            }


                            }
                            break;

                    }

                    otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_4, grammarAccess.getCollectionTypeCSAccess().getRightParenthesisKeyword_1_3());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCollectionTypeCS"


    // $ANTLR start "entryRuleMapTypeCS"
    // InternalQVTrelation.g:7241:1: entryRuleMapTypeCS returns [EObject current=null] : iv_ruleMapTypeCS= ruleMapTypeCS EOF ;
    public final EObject entryRuleMapTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapTypeCS = null;


        try {
            // InternalQVTrelation.g:7241:50: (iv_ruleMapTypeCS= ruleMapTypeCS EOF )
            // InternalQVTrelation.g:7242:2: iv_ruleMapTypeCS= ruleMapTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMapTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMapTypeCS=ruleMapTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMapTypeCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMapTypeCS"


    // $ANTLR start "ruleMapTypeCS"
    // InternalQVTrelation.g:7248:1: ruleMapTypeCS returns [EObject current=null] : ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? ) ;
    public final EObject ruleMapTypeCS() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedKeyType_2_0 = null;

        EObject lv_ownedValueType_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7254:2: ( ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? ) )
            // InternalQVTrelation.g:7255:2: ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? )
            {
            // InternalQVTrelation.g:7255:2: ( ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )? )
            // InternalQVTrelation.g:7256:3: ( (lv_name_0_0= 'Map' ) ) (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )?
            {
            // InternalQVTrelation.g:7256:3: ( (lv_name_0_0= 'Map' ) )
            // InternalQVTrelation.g:7257:4: (lv_name_0_0= 'Map' )
            {
            // InternalQVTrelation.g:7257:4: (lv_name_0_0= 'Map' )
            // InternalQVTrelation.g:7258:5: lv_name_0_0= 'Map'
            {
            lv_name_0_0=(Token)match(input,114,FollowSets000.FOLLOW_107); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_0_0, grammarAccess.getMapTypeCSAccess().getNameMapKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getMapTypeCSRule());
              					}
              					setWithLastConsumed(current, "name", lv_name_0_0, "Map");

            }

            }


            }

            // InternalQVTrelation.g:7270:3: (otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')' )?
            int alt180=2;
            int LA180_0 = input.LA(1);

            if ( (LA180_0==33) ) {
                alt180=1;
            }
            switch (alt180) {
                case 1 :
                    // InternalQVTrelation.g:7271:4: otherlv_1= '(' ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) ) otherlv_3= ',' ( (lv_ownedValueType_4_0= ruleTypeExpCS ) ) otherlv_5= ')'
                    {
                    otherlv_1=(Token)match(input,33,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getMapTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTrelation.g:7275:4: ( (lv_ownedKeyType_2_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:7276:5: (lv_ownedKeyType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:7276:5: (lv_ownedKeyType_2_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:7277:6: lv_ownedKeyType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getMapTypeCSAccess().getOwnedKeyTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_109);
                    lv_ownedKeyType_2_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getMapTypeCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedKeyType",
                      							lv_ownedKeyType_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getMapTypeCSAccess().getCommaKeyword_1_2());

                    }
                    // InternalQVTrelation.g:7298:4: ( (lv_ownedValueType_4_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:7299:5: (lv_ownedValueType_4_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:7299:5: (lv_ownedValueType_4_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:7300:6: lv_ownedValueType_4_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getMapTypeCSAccess().getOwnedValueTypeTypeExpCSParserRuleCall_1_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_30);
                    lv_ownedValueType_4_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getMapTypeCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedValueType",
                      							lv_ownedValueType_4_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_5=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getMapTypeCSAccess().getRightParenthesisKeyword_1_4());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMapTypeCS"


    // $ANTLR start "entryRuleTupleTypeCS"
    // InternalQVTrelation.g:7326:1: entryRuleTupleTypeCS returns [EObject current=null] : iv_ruleTupleTypeCS= ruleTupleTypeCS EOF ;
    public final EObject entryRuleTupleTypeCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleTypeCS = null;


        try {
            // InternalQVTrelation.g:7326:52: (iv_ruleTupleTypeCS= ruleTupleTypeCS EOF )
            // InternalQVTrelation.g:7327:2: iv_ruleTupleTypeCS= ruleTupleTypeCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleTypeCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleTypeCS=ruleTupleTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTupleTypeCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTupleTypeCS"


    // $ANTLR start "ruleTupleTypeCS"
    // InternalQVTrelation.g:7333:1: ruleTupleTypeCS returns [EObject current=null] : ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? ) ;
    public final EObject ruleTupleTypeCS() throws RecognitionException {
        EObject current = null;

        Token lv_name_0_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7339:2: ( ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? ) )
            // InternalQVTrelation.g:7340:2: ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? )
            {
            // InternalQVTrelation.g:7340:2: ( ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )? )
            // InternalQVTrelation.g:7341:3: ( (lv_name_0_0= 'Tuple' ) ) (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )?
            {
            // InternalQVTrelation.g:7341:3: ( (lv_name_0_0= 'Tuple' ) )
            // InternalQVTrelation.g:7342:4: (lv_name_0_0= 'Tuple' )
            {
            // InternalQVTrelation.g:7342:4: (lv_name_0_0= 'Tuple' )
            // InternalQVTrelation.g:7343:5: lv_name_0_0= 'Tuple'
            {
            lv_name_0_0=(Token)match(input,115,FollowSets000.FOLLOW_107); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_name_0_0, grammarAccess.getTupleTypeCSAccess().getNameTupleKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getTupleTypeCSRule());
              					}
              					setWithLastConsumed(current, "name", lv_name_0_0, "Tuple");

            }

            }


            }

            // InternalQVTrelation.g:7355:3: (otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')' )?
            int alt183=2;
            int LA183_0 = input.LA(1);

            if ( (LA183_0==33) ) {
                alt183=1;
            }
            switch (alt183) {
                case 1 :
                    // InternalQVTrelation.g:7356:4: otherlv_1= '(' ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )? otherlv_5= ')'
                    {
                    otherlv_1=(Token)match(input,33,FollowSets000.FOLLOW_37); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getTupleTypeCSAccess().getLeftParenthesisKeyword_1_0());

                    }
                    // InternalQVTrelation.g:7360:4: ( ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )* )?
                    int alt182=2;
                    int LA182_0 = input.LA(1);

                    if ( ((LA182_0>=RULE_SIMPLE_ID && LA182_0<=RULE_ESCAPED_ID)||LA182_0==17||(LA182_0>=25 && LA182_0<=32)||(LA182_0>=35 && LA182_0<=43)||(LA182_0>=45 && LA182_0<=47)||(LA182_0>=49 && LA182_0<=59)||LA182_0==61||LA182_0==63||LA182_0==65||LA182_0==68||LA182_0==70||LA182_0==72||(LA182_0>=74 && LA182_0<=77)||(LA182_0>=79 && LA182_0<=84)||LA182_0==86||LA182_0==88||(LA182_0>=90 && LA182_0<=91)) ) {
                        alt182=1;
                    }
                    switch (alt182) {
                        case 1 :
                            // InternalQVTrelation.g:7361:5: ( (lv_ownedParts_2_0= ruleTuplePartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )*
                            {
                            // InternalQVTrelation.g:7361:5: ( (lv_ownedParts_2_0= ruleTuplePartCS ) )
                            // InternalQVTrelation.g:7362:6: (lv_ownedParts_2_0= ruleTuplePartCS )
                            {
                            // InternalQVTrelation.g:7362:6: (lv_ownedParts_2_0= ruleTuplePartCS )
                            // InternalQVTrelation.g:7363:7: lv_ownedParts_2_0= ruleTuplePartCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_38);
                            lv_ownedParts_2_0=ruleTuplePartCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getTupleTypeCSRule());
                              							}
                              							add(
                              								current,
                              								"ownedParts",
                              								lv_ownedParts_2_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TuplePartCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTrelation.g:7380:5: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) ) )*
                            loop181:
                            do {
                                int alt181=2;
                                int LA181_0 = input.LA(1);

                                if ( (LA181_0==23) ) {
                                    alt181=1;
                                }


                                switch (alt181) {
                            	case 1 :
                            	    // InternalQVTrelation.g:7381:6: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                            	    {
                            	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      						newLeafNode(otherlv_3, grammarAccess.getTupleTypeCSAccess().getCommaKeyword_1_1_1_0());

                            	    }
                            	    // InternalQVTrelation.g:7385:6: ( (lv_ownedParts_4_0= ruleTuplePartCS ) )
                            	    // InternalQVTrelation.g:7386:7: (lv_ownedParts_4_0= ruleTuplePartCS )
                            	    {
                            	    // InternalQVTrelation.g:7386:7: (lv_ownedParts_4_0= ruleTuplePartCS )
                            	    // InternalQVTrelation.g:7387:8: lv_ownedParts_4_0= ruleTuplePartCS
                            	    {
                            	    if ( state.backtracking==0 ) {

                            	      								newCompositeNode(grammarAccess.getTupleTypeCSAccess().getOwnedPartsTuplePartCSParserRuleCall_1_1_1_1_0());

                            	    }
                            	    pushFollow(FollowSets000.FOLLOW_38);
                            	    lv_ownedParts_4_0=ruleTuplePartCS();

                            	    state._fsp--;
                            	    if (state.failed) return current;
                            	    if ( state.backtracking==0 ) {

                            	      								if (current==null) {
                            	      									current = createModelElementForParent(grammarAccess.getTupleTypeCSRule());
                            	      								}
                            	      								add(
                            	      									current,
                            	      									"ownedParts",
                            	      									lv_ownedParts_4_0,
                            	      									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TuplePartCS");
                            	      								afterParserOrEnumRuleCall();

                            	    }

                            	    }


                            	    }


                            	    }
                            	    break;

                            	default :
                            	    break loop181;
                                }
                            } while (true);


                            }
                            break;

                    }

                    otherlv_5=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getTupleTypeCSAccess().getRightParenthesisKeyword_1_2());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTupleTypeCS"


    // $ANTLR start "entryRuleTuplePartCS"
    // InternalQVTrelation.g:7415:1: entryRuleTuplePartCS returns [EObject current=null] : iv_ruleTuplePartCS= ruleTuplePartCS EOF ;
    public final EObject entryRuleTuplePartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTuplePartCS = null;


        try {
            // InternalQVTrelation.g:7415:52: (iv_ruleTuplePartCS= ruleTuplePartCS EOF )
            // InternalQVTrelation.g:7416:2: iv_ruleTuplePartCS= ruleTuplePartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTuplePartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTuplePartCS=ruleTuplePartCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTuplePartCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTuplePartCS"


    // $ANTLR start "ruleTuplePartCS"
    // InternalQVTrelation.g:7422:1: ruleTuplePartCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject ruleTuplePartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7428:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTrelation.g:7429:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTrelation.g:7429:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTrelation.g:7430:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTrelation.g:7430:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:7431:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:7431:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:7432:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTuplePartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_11);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTuplePartCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getTuplePartCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:7453:3: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
            // InternalQVTrelation.g:7454:4: (lv_ownedType_2_0= ruleTypeExpCS )
            {
            // InternalQVTrelation.g:7454:4: (lv_ownedType_2_0= ruleTypeExpCS )
            // InternalQVTrelation.g:7455:5: lv_ownedType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTuplePartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_2_0=ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTuplePartCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTuplePartCS"


    // $ANTLR start "entryRuleCollectionLiteralExpCS"
    // InternalQVTrelation.g:7476:1: entryRuleCollectionLiteralExpCS returns [EObject current=null] : iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF ;
    public final EObject entryRuleCollectionLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:7476:63: (iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF )
            // InternalQVTrelation.g:7477:2: iv_ruleCollectionLiteralExpCS= ruleCollectionLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionLiteralExpCS=ruleCollectionLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCollectionLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCollectionLiteralExpCS"


    // $ANTLR start "ruleCollectionLiteralExpCS"
    // InternalQVTrelation.g:7483:1: ruleCollectionLiteralExpCS returns [EObject current=null] : ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' ) ;
    public final EObject ruleCollectionLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedType_0_0 = null;

        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7489:2: ( ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalQVTrelation.g:7490:2: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalQVTrelation.g:7490:2: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}' )
            // InternalQVTrelation.g:7491:3: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalQVTrelation.g:7491:3: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) )
            // InternalQVTrelation.g:7492:4: (lv_ownedType_0_0= ruleCollectionTypeCS )
            {
            // InternalQVTrelation.g:7492:4: (lv_ownedType_0_0= ruleCollectionTypeCS )
            // InternalQVTrelation.g:7493:5: lv_ownedType_0_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_ownedType_0_0=ruleCollectionTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_110); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTrelation.g:7514:3: ( ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )* )?
            int alt185=2;
            int LA185_0 = input.LA(1);

            if ( (LA185_0==RULE_SINGLE_QUOTED_STRING||(LA185_0>=RULE_INT && LA185_0<=RULE_ESCAPED_ID)||(LA185_0>=17 && LA185_0<=18)||(LA185_0>=25 && LA185_0<=33)||(LA185_0>=35 && LA185_0<=43)||(LA185_0>=45 && LA185_0<=59)||LA185_0==61||LA185_0==63||LA185_0==65||LA185_0==68||LA185_0==70||LA185_0==72||(LA185_0>=74 && LA185_0<=77)||(LA185_0>=79 && LA185_0<=84)||LA185_0==86||LA185_0==88||(LA185_0>=90 && LA185_0<=94)||(LA185_0>=114 && LA185_0<=128)||LA185_0==130||(LA185_0>=132 && LA185_0<=135)||LA185_0==142||(LA185_0>=147 && LA185_0<=148)) ) {
                alt185=1;
            }
            switch (alt185) {
                case 1 :
                    // InternalQVTrelation.g:7515:4: ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )*
                    {
                    // InternalQVTrelation.g:7515:4: ( (lv_ownedParts_2_0= ruleCollectionLiteralPartCS ) )
                    // InternalQVTrelation.g:7516:5: (lv_ownedParts_2_0= ruleCollectionLiteralPartCS )
                    {
                    // InternalQVTrelation.g:7516:5: (lv_ownedParts_2_0= ruleCollectionLiteralPartCS )
                    // InternalQVTrelation.g:7517:6: lv_ownedParts_2_0= ruleCollectionLiteralPartCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    lv_ownedParts_2_0=ruleCollectionLiteralPartCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedParts",
                      							lv_ownedParts_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionLiteralPartCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:7534:4: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) ) )*
                    loop184:
                    do {
                        int alt184=2;
                        int LA184_0 = input.LA(1);

                        if ( (LA184_0==23) ) {
                            alt184=1;
                        }


                        switch (alt184) {
                    	case 1 :
                    	    // InternalQVTrelation.g:7535:5: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_35); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getCollectionLiteralExpCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTrelation.g:7539:5: ( (lv_ownedParts_4_0= ruleCollectionLiteralPartCS ) )
                    	    // InternalQVTrelation.g:7540:6: (lv_ownedParts_4_0= ruleCollectionLiteralPartCS )
                    	    {
                    	    // InternalQVTrelation.g:7540:6: (lv_ownedParts_4_0= ruleCollectionLiteralPartCS )
                    	    // InternalQVTrelation.g:7541:7: lv_ownedParts_4_0= ruleCollectionLiteralPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getCollectionLiteralExpCSAccess().getOwnedPartsCollectionLiteralPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_28);
                    	    lv_ownedParts_4_0=ruleCollectionLiteralPartCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getCollectionLiteralExpCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedParts",
                    	      								lv_ownedParts_4_0,
                    	      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionLiteralPartCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop184;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_5=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getCollectionLiteralExpCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCollectionLiteralExpCS"


    // $ANTLR start "entryRuleCollectionLiteralPartCS"
    // InternalQVTrelation.g:7568:1: entryRuleCollectionLiteralPartCS returns [EObject current=null] : iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF ;
    public final EObject entryRuleCollectionLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionLiteralPartCS = null;


        try {
            // InternalQVTrelation.g:7568:64: (iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF )
            // InternalQVTrelation.g:7569:2: iv_ruleCollectionLiteralPartCS= ruleCollectionLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionLiteralPartCS=ruleCollectionLiteralPartCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCollectionLiteralPartCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCollectionLiteralPartCS"


    // $ANTLR start "ruleCollectionLiteralPartCS"
    // InternalQVTrelation.g:7575:1: ruleCollectionLiteralPartCS returns [EObject current=null] : ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) ) ;
    public final EObject ruleCollectionLiteralPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedExpression_0_0 = null;

        EObject lv_ownedLastExpression_2_0 = null;

        EObject lv_ownedExpression_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7581:2: ( ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) ) )
            // InternalQVTrelation.g:7582:2: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )
            {
            // InternalQVTrelation.g:7582:2: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )
            int alt187=2;
            alt187 = dfa187.predict(input);
            switch (alt187) {
                case 1 :
                    // InternalQVTrelation.g:7583:3: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTrelation.g:7583:3: ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? )
                    // InternalQVTrelation.g:7584:4: ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )?
                    {
                    // InternalQVTrelation.g:7584:4: ( (lv_ownedExpression_0_0= ruleExpCS ) )
                    // InternalQVTrelation.g:7585:5: (lv_ownedExpression_0_0= ruleExpCS )
                    {
                    // InternalQVTrelation.g:7585:5: (lv_ownedExpression_0_0= ruleExpCS )
                    // InternalQVTrelation.g:7586:6: lv_ownedExpression_0_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionExpCSParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_111);
                    lv_ownedExpression_0_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedExpression",
                      							lv_ownedExpression_0_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:7603:4: (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )?
                    int alt186=2;
                    int LA186_0 = input.LA(1);

                    if ( (LA186_0==129) ) {
                        alt186=1;
                    }
                    switch (alt186) {
                        case 1 :
                            // InternalQVTrelation.g:7604:5: otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) )
                            {
                            otherlv_1=(Token)match(input,129,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_1, grammarAccess.getCollectionLiteralPartCSAccess().getFullStopFullStopKeyword_0_1_0());

                            }
                            // InternalQVTrelation.g:7608:5: ( (lv_ownedLastExpression_2_0= ruleExpCS ) )
                            // InternalQVTrelation.g:7609:6: (lv_ownedLastExpression_2_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:7609:6: (lv_ownedLastExpression_2_0= ruleExpCS )
                            // InternalQVTrelation.g:7610:7: lv_ownedLastExpression_2_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedLastExpressionExpCSParserRuleCall_0_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedLastExpression_2_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedLastExpression",
                              								lv_ownedLastExpression_2_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:7630:3: ( (lv_ownedExpression_3_0= rulePatternExpCS ) )
                    {
                    // InternalQVTrelation.g:7630:3: ( (lv_ownedExpression_3_0= rulePatternExpCS ) )
                    // InternalQVTrelation.g:7631:4: (lv_ownedExpression_3_0= rulePatternExpCS )
                    {
                    // InternalQVTrelation.g:7631:4: (lv_ownedExpression_3_0= rulePatternExpCS )
                    // InternalQVTrelation.g:7632:5: lv_ownedExpression_3_0= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getCollectionLiteralPartCSAccess().getOwnedExpressionPatternExpCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedExpression_3_0=rulePatternExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getCollectionLiteralPartCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedExpression",
                      						lv_ownedExpression_3_0,
                      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCollectionLiteralPartCS"


    // $ANTLR start "entryRuleCollectionPatternCS"
    // InternalQVTrelation.g:7653:1: entryRuleCollectionPatternCS returns [EObject current=null] : iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF ;
    public final EObject entryRuleCollectionPatternCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCollectionPatternCS = null;


        try {
            // InternalQVTrelation.g:7653:60: (iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF )
            // InternalQVTrelation.g:7654:2: iv_ruleCollectionPatternCS= ruleCollectionPatternCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCollectionPatternCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCollectionPatternCS=ruleCollectionPatternCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCollectionPatternCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCollectionPatternCS"


    // $ANTLR start "ruleCollectionPatternCS"
    // InternalQVTrelation.g:7660:1: ruleCollectionPatternCS returns [EObject current=null] : ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' ) ;
    public final EObject ruleCollectionPatternCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedType_0_0 = null;

        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;

        AntlrDatatypeRuleToken lv_restVariableName_6_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7666:2: ( ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' ) )
            // InternalQVTrelation.g:7667:2: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' )
            {
            // InternalQVTrelation.g:7667:2: ( ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}' )
            // InternalQVTrelation.g:7668:3: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )? otherlv_7= '}'
            {
            // InternalQVTrelation.g:7668:3: ( (lv_ownedType_0_0= ruleCollectionTypeCS ) )
            // InternalQVTrelation.g:7669:4: (lv_ownedType_0_0= ruleCollectionTypeCS )
            {
            // InternalQVTrelation.g:7669:4: (lv_ownedType_0_0= ruleCollectionTypeCS )
            // InternalQVTrelation.g:7670:5: lv_ownedType_0_0= ruleCollectionTypeCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedTypeCollectionTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_ownedType_0_0=ruleCollectionTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CollectionTypeCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_110); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getCollectionPatternCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTrelation.g:7691:3: ( ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) ) )?
            int alt189=2;
            int LA189_0 = input.LA(1);

            if ( ((LA189_0>=RULE_SIMPLE_ID && LA189_0<=RULE_ESCAPED_ID)||(LA189_0>=17 && LA189_0<=18)||(LA189_0>=25 && LA189_0<=32)||(LA189_0>=35 && LA189_0<=43)||(LA189_0>=45 && LA189_0<=47)||(LA189_0>=49 && LA189_0<=59)||LA189_0==61||LA189_0==63||LA189_0==65||LA189_0==68||LA189_0==70||LA189_0==72||(LA189_0>=74 && LA189_0<=77)||(LA189_0>=79 && LA189_0<=84)||LA189_0==86||LA189_0==88||(LA189_0>=90 && LA189_0<=91)) ) {
                alt189=1;
            }
            switch (alt189) {
                case 1 :
                    // InternalQVTrelation.g:7692:4: ( (lv_ownedParts_2_0= rulePatternExpCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )* (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) )
                    {
                    // InternalQVTrelation.g:7692:4: ( (lv_ownedParts_2_0= rulePatternExpCS ) )
                    // InternalQVTrelation.g:7693:5: (lv_ownedParts_2_0= rulePatternExpCS )
                    {
                    // InternalQVTrelation.g:7693:5: (lv_ownedParts_2_0= rulePatternExpCS )
                    // InternalQVTrelation.g:7694:6: lv_ownedParts_2_0= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_15);
                    lv_ownedParts_2_0=rulePatternExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedParts",
                      							lv_ownedParts_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:7711:4: (otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) ) )*
                    loop188:
                    do {
                        int alt188=2;
                        int LA188_0 = input.LA(1);

                        if ( (LA188_0==23) ) {
                            alt188=1;
                        }


                        switch (alt188) {
                    	case 1 :
                    	    // InternalQVTrelation.g:7712:5: otherlv_3= ',' ( (lv_ownedParts_4_0= rulePatternExpCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_35); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getCollectionPatternCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTrelation.g:7716:5: ( (lv_ownedParts_4_0= rulePatternExpCS ) )
                    	    // InternalQVTrelation.g:7717:6: (lv_ownedParts_4_0= rulePatternExpCS )
                    	    {
                    	    // InternalQVTrelation.g:7717:6: (lv_ownedParts_4_0= rulePatternExpCS )
                    	    // InternalQVTrelation.g:7718:7: lv_ownedParts_4_0= rulePatternExpCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getOwnedPartsPatternExpCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_15);
                    	    lv_ownedParts_4_0=rulePatternExpCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedParts",
                    	      								lv_ownedParts_4_0,
                    	      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop188;
                        }
                    } while (true);

                    // InternalQVTrelation.g:7736:4: (otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) ) )
                    // InternalQVTrelation.g:7737:5: otherlv_5= '++' ( (lv_restVariableName_6_0= ruleIdentifier ) )
                    {
                    otherlv_5=(Token)match(input,24,FollowSets000.FOLLOW_112); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_5, grammarAccess.getCollectionPatternCSAccess().getPlusSignPlusSignKeyword_2_2_0());

                    }
                    // InternalQVTrelation.g:7741:5: ( (lv_restVariableName_6_0= ruleIdentifier ) )
                    // InternalQVTrelation.g:7742:6: (lv_restVariableName_6_0= ruleIdentifier )
                    {
                    // InternalQVTrelation.g:7742:6: (lv_restVariableName_6_0= ruleIdentifier )
                    // InternalQVTrelation.g:7743:7: lv_restVariableName_6_0= ruleIdentifier
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getCollectionPatternCSAccess().getRestVariableNameIdentifierParserRuleCall_2_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_17);
                    lv_restVariableName_6_0=ruleIdentifier();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getCollectionPatternCSRule());
                      							}
                      							set(
                      								current,
                      								"restVariableName",
                      								lv_restVariableName_6_0,
                      								"org.eclipse.ocl.xtext.base.Base.Identifier");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }

            otherlv_7=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getCollectionPatternCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCollectionPatternCS"


    // $ANTLR start "entryRuleShadowPartCS"
    // InternalQVTrelation.g:7770:1: entryRuleShadowPartCS returns [EObject current=null] : iv_ruleShadowPartCS= ruleShadowPartCS EOF ;
    public final EObject entryRuleShadowPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleShadowPartCS = null;


        try {
            // InternalQVTrelation.g:7770:53: (iv_ruleShadowPartCS= ruleShadowPartCS EOF )
            // InternalQVTrelation.g:7771:2: iv_ruleShadowPartCS= ruleShadowPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getShadowPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleShadowPartCS=ruleShadowPartCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleShadowPartCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleShadowPartCS"


    // $ANTLR start "ruleShadowPartCS"
    // InternalQVTrelation.g:7777:1: ruleShadowPartCS returns [EObject current=null] : ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) ) ;
    public final EObject ruleShadowPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedInitExpression_2_1 = null;

        EObject lv_ownedInitExpression_2_2 = null;

        EObject lv_ownedInitExpression_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7783:2: ( ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) ) )
            // InternalQVTrelation.g:7784:2: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) )
            {
            // InternalQVTrelation.g:7784:2: ( ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) ) | ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) ) )
            int alt191=2;
            int LA191_0 = input.LA(1);

            if ( ((LA191_0>=RULE_SIMPLE_ID && LA191_0<=RULE_ESCAPED_ID)||LA191_0==17||(LA191_0>=25 && LA191_0<=32)||(LA191_0>=35 && LA191_0<=43)||(LA191_0>=45 && LA191_0<=47)||(LA191_0>=49 && LA191_0<=59)||LA191_0==61||LA191_0==63||LA191_0==65||LA191_0==68||LA191_0==70||LA191_0==72||(LA191_0>=74 && LA191_0<=77)||(LA191_0>=79 && LA191_0<=84)||LA191_0==86||LA191_0==88||(LA191_0>=90 && LA191_0<=91)) ) {
                alt191=1;
            }
            else if ( (LA191_0==RULE_SINGLE_QUOTED_STRING) ) {
                alt191=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 191, 0, input);

                throw nvae;
            }
            switch (alt191) {
                case 1 :
                    // InternalQVTrelation.g:7785:3: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) )
                    {
                    // InternalQVTrelation.g:7785:3: ( ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) ) )
                    // InternalQVTrelation.g:7786:4: ( ( ruleUnrestrictedName ) ) otherlv_1= '=' ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) )
                    {
                    // InternalQVTrelation.g:7786:4: ( ( ruleUnrestrictedName ) )
                    // InternalQVTrelation.g:7787:5: ( ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:7787:5: ( ruleUnrestrictedName )
                    // InternalQVTrelation.g:7788:6: ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      						/* */

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getShadowPartCSRule());
                      						}

                    }
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getShadowPartCSAccess().getReferredPropertyPropertyCrossReference_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_18);
                    ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    otherlv_1=(Token)match(input,19,FollowSets000.FOLLOW_35); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getShadowPartCSAccess().getEqualsSignKeyword_0_1());

                    }
                    // InternalQVTrelation.g:7809:4: ( ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) ) )
                    // InternalQVTrelation.g:7810:5: ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) )
                    {
                    // InternalQVTrelation.g:7810:5: ( (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS ) )
                    // InternalQVTrelation.g:7811:6: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )
                    {
                    // InternalQVTrelation.g:7811:6: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )
                    int alt190=2;
                    alt190 = dfa190.predict(input);
                    switch (alt190) {
                        case 1 :
                            // InternalQVTrelation.g:7812:7: lv_ownedInitExpression_2_1= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_2_0_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_2_1=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getShadowPartCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedInitExpression",
                              								lv_ownedInitExpression_2_1,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:7828:7: lv_ownedInitExpression_2_2= rulePatternExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionPatternExpCSParserRuleCall_0_2_0_1());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_2_2=rulePatternExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getShadowPartCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedInitExpression",
                              								lv_ownedInitExpression_2_2,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }
                            break;

                    }


                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:7848:3: ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) )
                    {
                    // InternalQVTrelation.g:7848:3: ( (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS ) )
                    // InternalQVTrelation.g:7849:4: (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS )
                    {
                    // InternalQVTrelation.g:7849:4: (lv_ownedInitExpression_3_0= ruleStringLiteralExpCS )
                    // InternalQVTrelation.g:7850:5: lv_ownedInitExpression_3_0= ruleStringLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getShadowPartCSAccess().getOwnedInitExpressionStringLiteralExpCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedInitExpression_3_0=ruleStringLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getShadowPartCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedInitExpression",
                      						lv_ownedInitExpression_3_0,
                      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.StringLiteralExpCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleShadowPartCS"


    // $ANTLR start "entryRulePatternExpCS"
    // InternalQVTrelation.g:7871:1: entryRulePatternExpCS returns [EObject current=null] : iv_rulePatternExpCS= rulePatternExpCS EOF ;
    public final EObject entryRulePatternExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePatternExpCS = null;


        try {
            // InternalQVTrelation.g:7871:53: (iv_rulePatternExpCS= rulePatternExpCS EOF )
            // InternalQVTrelation.g:7872:2: iv_rulePatternExpCS= rulePatternExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPatternExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePatternExpCS=rulePatternExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePatternExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePatternExpCS"


    // $ANTLR start "rulePatternExpCS"
    // InternalQVTrelation.g:7878:1: rulePatternExpCS returns [EObject current=null] : ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) ) ;
    public final EObject rulePatternExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_patternVariableName_0_0 = null;

        EObject lv_ownedPatternType_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7884:2: ( ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) ) )
            // InternalQVTrelation.g:7885:2: ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) )
            {
            // InternalQVTrelation.g:7885:2: ( ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) ) )
            // InternalQVTrelation.g:7886:3: ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )? otherlv_1= ':' ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) )
            {
            // InternalQVTrelation.g:7886:3: ( (lv_patternVariableName_0_0= ruleUnrestrictedName ) )?
            int alt192=2;
            int LA192_0 = input.LA(1);

            if ( ((LA192_0>=RULE_SIMPLE_ID && LA192_0<=RULE_ESCAPED_ID)||LA192_0==17||(LA192_0>=25 && LA192_0<=32)||(LA192_0>=35 && LA192_0<=43)||(LA192_0>=45 && LA192_0<=47)||(LA192_0>=49 && LA192_0<=59)||LA192_0==61||LA192_0==63||LA192_0==65||LA192_0==68||LA192_0==70||LA192_0==72||(LA192_0>=74 && LA192_0<=77)||(LA192_0>=79 && LA192_0<=84)||LA192_0==86||LA192_0==88||(LA192_0>=90 && LA192_0<=91)) ) {
                alt192=1;
            }
            switch (alt192) {
                case 1 :
                    // InternalQVTrelation.g:7887:4: (lv_patternVariableName_0_0= ruleUnrestrictedName )
                    {
                    // InternalQVTrelation.g:7887:4: (lv_patternVariableName_0_0= ruleUnrestrictedName )
                    // InternalQVTrelation.g:7888:5: lv_patternVariableName_0_0= ruleUnrestrictedName
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getPatternExpCSAccess().getPatternVariableNameUnrestrictedNameParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_11);
                    lv_patternVariableName_0_0=ruleUnrestrictedName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getPatternExpCSRule());
                      					}
                      					set(
                      						current,
                      						"patternVariableName",
                      						lv_patternVariableName_0_0,
                      						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getPatternExpCSAccess().getColonKeyword_1());

            }
            // InternalQVTrelation.g:7909:3: ( (lv_ownedPatternType_2_0= ruleTypeExpCS ) )
            // InternalQVTrelation.g:7910:4: (lv_ownedPatternType_2_0= ruleTypeExpCS )
            {
            // InternalQVTrelation.g:7910:4: (lv_ownedPatternType_2_0= ruleTypeExpCS )
            // InternalQVTrelation.g:7911:5: lv_ownedPatternType_2_0= ruleTypeExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPatternExpCSAccess().getOwnedPatternTypeTypeExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedPatternType_2_0=ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPatternExpCSRule());
              					}
              					set(
              						current,
              						"ownedPatternType",
              						lv_ownedPatternType_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePatternExpCS"


    // $ANTLR start "entryRuleLambdaLiteralExpCS"
    // InternalQVTrelation.g:7932:1: entryRuleLambdaLiteralExpCS returns [EObject current=null] : iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF ;
    public final EObject entryRuleLambdaLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLambdaLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:7932:59: (iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF )
            // InternalQVTrelation.g:7933:2: iv_ruleLambdaLiteralExpCS= ruleLambdaLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLambdaLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLambdaLiteralExpCS=ruleLambdaLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLambdaLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLambdaLiteralExpCS"


    // $ANTLR start "ruleLambdaLiteralExpCS"
    // InternalQVTrelation.g:7939:1: ruleLambdaLiteralExpCS returns [EObject current=null] : (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' ) ;
    public final EObject ruleLambdaLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedExpressionCS_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7945:2: ( (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' ) )
            // InternalQVTrelation.g:7946:2: (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' )
            {
            // InternalQVTrelation.g:7946:2: (otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}' )
            // InternalQVTrelation.g:7947:3: otherlv_0= 'Lambda' otherlv_1= '{' ( (lv_ownedExpressionCS_2_0= ruleExpCS ) ) otherlv_3= '}'
            {
            otherlv_0=(Token)match(input,130,FollowSets000.FOLLOW_25); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getLambdaLiteralExpCSAccess().getLambdaKeyword_0());

            }
            otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getLambdaLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTrelation.g:7955:3: ( (lv_ownedExpressionCS_2_0= ruleExpCS ) )
            // InternalQVTrelation.g:7956:4: (lv_ownedExpressionCS_2_0= ruleExpCS )
            {
            // InternalQVTrelation.g:7956:4: (lv_ownedExpressionCS_2_0= ruleExpCS )
            // InternalQVTrelation.g:7957:5: lv_ownedExpressionCS_2_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLambdaLiteralExpCSAccess().getOwnedExpressionCSExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_17);
            lv_ownedExpressionCS_2_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLambdaLiteralExpCSRule());
              					}
              					set(
              						current,
              						"ownedExpressionCS",
              						lv_ownedExpressionCS_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_3=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getLambdaLiteralExpCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLambdaLiteralExpCS"


    // $ANTLR start "entryRuleMapLiteralExpCS"
    // InternalQVTrelation.g:7982:1: entryRuleMapLiteralExpCS returns [EObject current=null] : iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF ;
    public final EObject entryRuleMapLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:7982:56: (iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF )
            // InternalQVTrelation.g:7983:2: iv_ruleMapLiteralExpCS= ruleMapLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMapLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMapLiteralExpCS=ruleMapLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMapLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMapLiteralExpCS"


    // $ANTLR start "ruleMapLiteralExpCS"
    // InternalQVTrelation.g:7989:1: ruleMapLiteralExpCS returns [EObject current=null] : ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' ) ;
    public final EObject ruleMapLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedType_0_0 = null;

        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:7995:2: ( ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalQVTrelation.g:7996:2: ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalQVTrelation.g:7996:2: ( ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}' )
            // InternalQVTrelation.g:7997:3: ( (lv_ownedType_0_0= ruleMapTypeCS ) ) otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalQVTrelation.g:7997:3: ( (lv_ownedType_0_0= ruleMapTypeCS ) )
            // InternalQVTrelation.g:7998:4: (lv_ownedType_0_0= ruleMapTypeCS )
            {
            // InternalQVTrelation.g:7998:4: (lv_ownedType_0_0= ruleMapTypeCS )
            // InternalQVTrelation.g:7999:5: lv_ownedType_0_0= ruleMapTypeCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedTypeMapTypeCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_25);
            lv_ownedType_0_0=ruleMapTypeCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMapLiteralExpCSRule());
              					}
              					set(
              						current,
              						"ownedType",
              						lv_ownedType_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.MapTypeCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_56); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getMapLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTrelation.g:8020:3: ( ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )* )?
            int alt194=2;
            int LA194_0 = input.LA(1);

            if ( (LA194_0==RULE_SINGLE_QUOTED_STRING||(LA194_0>=RULE_INT && LA194_0<=RULE_ESCAPED_ID)||LA194_0==17||(LA194_0>=25 && LA194_0<=33)||(LA194_0>=35 && LA194_0<=43)||(LA194_0>=45 && LA194_0<=59)||LA194_0==61||LA194_0==63||LA194_0==65||LA194_0==68||LA194_0==70||LA194_0==72||(LA194_0>=74 && LA194_0<=77)||(LA194_0>=79 && LA194_0<=84)||LA194_0==86||LA194_0==88||(LA194_0>=90 && LA194_0<=94)||(LA194_0>=114 && LA194_0<=128)||LA194_0==130||(LA194_0>=132 && LA194_0<=135)||LA194_0==142||(LA194_0>=147 && LA194_0<=148)) ) {
                alt194=1;
            }
            switch (alt194) {
                case 1 :
                    // InternalQVTrelation.g:8021:4: ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )*
                    {
                    // InternalQVTrelation.g:8021:4: ( (lv_ownedParts_2_0= ruleMapLiteralPartCS ) )
                    // InternalQVTrelation.g:8022:5: (lv_ownedParts_2_0= ruleMapLiteralPartCS )
                    {
                    // InternalQVTrelation.g:8022:5: (lv_ownedParts_2_0= ruleMapLiteralPartCS )
                    // InternalQVTrelation.g:8023:6: lv_ownedParts_2_0= ruleMapLiteralPartCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    lv_ownedParts_2_0=ruleMapLiteralPartCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getMapLiteralExpCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedParts",
                      							lv_ownedParts_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.MapLiteralPartCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:8040:4: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) ) )*
                    loop193:
                    do {
                        int alt193=2;
                        int LA193_0 = input.LA(1);

                        if ( (LA193_0==23) ) {
                            alt193=1;
                        }


                        switch (alt193) {
                    	case 1 :
                    	    // InternalQVTrelation.g:8041:5: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getMapLiteralExpCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTrelation.g:8045:5: ( (lv_ownedParts_4_0= ruleMapLiteralPartCS ) )
                    	    // InternalQVTrelation.g:8046:6: (lv_ownedParts_4_0= ruleMapLiteralPartCS )
                    	    {
                    	    // InternalQVTrelation.g:8046:6: (lv_ownedParts_4_0= ruleMapLiteralPartCS )
                    	    // InternalQVTrelation.g:8047:7: lv_ownedParts_4_0= ruleMapLiteralPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getMapLiteralExpCSAccess().getOwnedPartsMapLiteralPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_28);
                    	    lv_ownedParts_4_0=ruleMapLiteralPartCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getMapLiteralExpCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedParts",
                    	      								lv_ownedParts_4_0,
                    	      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.MapLiteralPartCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop193;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_5=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getMapLiteralExpCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMapLiteralExpCS"


    // $ANTLR start "entryRuleMapLiteralPartCS"
    // InternalQVTrelation.g:8074:1: entryRuleMapLiteralPartCS returns [EObject current=null] : iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF ;
    public final EObject entryRuleMapLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMapLiteralPartCS = null;


        try {
            // InternalQVTrelation.g:8074:57: (iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF )
            // InternalQVTrelation.g:8075:2: iv_ruleMapLiteralPartCS= ruleMapLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMapLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMapLiteralPartCS=ruleMapLiteralPartCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMapLiteralPartCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMapLiteralPartCS"


    // $ANTLR start "ruleMapLiteralPartCS"
    // InternalQVTrelation.g:8081:1: ruleMapLiteralPartCS returns [EObject current=null] : ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) ) ;
    public final EObject ruleMapLiteralPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedKey_0_0 = null;

        EObject lv_ownedValue_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8087:2: ( ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) ) )
            // InternalQVTrelation.g:8088:2: ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) )
            {
            // InternalQVTrelation.g:8088:2: ( ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) ) )
            // InternalQVTrelation.g:8089:3: ( (lv_ownedKey_0_0= ruleExpCS ) ) otherlv_1= '<-' ( (lv_ownedValue_2_0= ruleExpCS ) )
            {
            // InternalQVTrelation.g:8089:3: ( (lv_ownedKey_0_0= ruleExpCS ) )
            // InternalQVTrelation.g:8090:4: (lv_ownedKey_0_0= ruleExpCS )
            {
            // InternalQVTrelation.g:8090:4: (lv_ownedKey_0_0= ruleExpCS )
            // InternalQVTrelation.g:8091:5: lv_ownedKey_0_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMapLiteralPartCSAccess().getOwnedKeyExpCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_113);
            lv_ownedKey_0_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMapLiteralPartCSRule());
              					}
              					set(
              						current,
              						"ownedKey",
              						lv_ownedKey_0_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_1=(Token)match(input,131,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getMapLiteralPartCSAccess().getLessThanSignHyphenMinusKeyword_1());

            }
            // InternalQVTrelation.g:8112:3: ( (lv_ownedValue_2_0= ruleExpCS ) )
            // InternalQVTrelation.g:8113:4: (lv_ownedValue_2_0= ruleExpCS )
            {
            // InternalQVTrelation.g:8113:4: (lv_ownedValue_2_0= ruleExpCS )
            // InternalQVTrelation.g:8114:5: lv_ownedValue_2_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMapLiteralPartCSAccess().getOwnedValueExpCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedValue_2_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMapLiteralPartCSRule());
              					}
              					set(
              						current,
              						"ownedValue",
              						lv_ownedValue_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMapLiteralPartCS"


    // $ANTLR start "entryRulePrimitiveLiteralExpCS"
    // InternalQVTrelation.g:8135:1: entryRulePrimitiveLiteralExpCS returns [EObject current=null] : iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF ;
    public final EObject entryRulePrimitiveLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimitiveLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8135:62: (iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF )
            // InternalQVTrelation.g:8136:2: iv_rulePrimitiveLiteralExpCS= rulePrimitiveLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimitiveLiteralExpCS=rulePrimitiveLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrimitiveLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrimitiveLiteralExpCS"


    // $ANTLR start "rulePrimitiveLiteralExpCS"
    // InternalQVTrelation.g:8142:1: rulePrimitiveLiteralExpCS returns [EObject current=null] : (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS ) ;
    public final EObject rulePrimitiveLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_NumberLiteralExpCS_0 = null;

        EObject this_StringLiteralExpCS_1 = null;

        EObject this_BooleanLiteralExpCS_2 = null;

        EObject this_UnlimitedNaturalLiteralExpCS_3 = null;

        EObject this_InvalidLiteralExpCS_4 = null;

        EObject this_NullLiteralExpCS_5 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8148:2: ( (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS ) )
            // InternalQVTrelation.g:8149:2: (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS )
            {
            // InternalQVTrelation.g:8149:2: (this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS | this_StringLiteralExpCS_1= ruleStringLiteralExpCS | this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS | this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS | this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS | this_NullLiteralExpCS_5= ruleNullLiteralExpCS )
            int alt195=6;
            switch ( input.LA(1) ) {
            case RULE_INT:
                {
                alt195=1;
                }
                break;
            case RULE_SINGLE_QUOTED_STRING:
                {
                alt195=2;
                }
                break;
            case 132:
            case 133:
                {
                alt195=3;
                }
                break;
            case 48:
                {
                alt195=4;
                }
                break;
            case 134:
                {
                alt195=5;
                }
                break;
            case 135:
                {
                alt195=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 195, 0, input);

                throw nvae;
            }

            switch (alt195) {
                case 1 :
                    // InternalQVTrelation.g:8150:3: this_NumberLiteralExpCS_0= ruleNumberLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getNumberLiteralExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NumberLiteralExpCS_0=ruleNumberLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_NumberLiteralExpCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:8162:3: this_StringLiteralExpCS_1= ruleStringLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getStringLiteralExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_StringLiteralExpCS_1=ruleStringLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_StringLiteralExpCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:8174:3: this_BooleanLiteralExpCS_2= ruleBooleanLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getBooleanLiteralExpCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_BooleanLiteralExpCS_2=ruleBooleanLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_BooleanLiteralExpCS_2;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:8186:3: this_UnlimitedNaturalLiteralExpCS_3= ruleUnlimitedNaturalLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_UnlimitedNaturalLiteralExpCS_3=ruleUnlimitedNaturalLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_UnlimitedNaturalLiteralExpCS_3;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:8198:3: this_InvalidLiteralExpCS_4= ruleInvalidLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getInvalidLiteralExpCSParserRuleCall_4());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_InvalidLiteralExpCS_4=ruleInvalidLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_InvalidLiteralExpCS_4;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTrelation.g:8210:3: this_NullLiteralExpCS_5= ruleNullLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimitiveLiteralExpCSAccess().getNullLiteralExpCSParserRuleCall_5());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NullLiteralExpCS_5=ruleNullLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_NullLiteralExpCS_5;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrimitiveLiteralExpCS"


    // $ANTLR start "entryRuleTupleLiteralExpCS"
    // InternalQVTrelation.g:8225:1: entryRuleTupleLiteralExpCS returns [EObject current=null] : iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF ;
    public final EObject entryRuleTupleLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8225:58: (iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF )
            // InternalQVTrelation.g:8226:2: iv_ruleTupleLiteralExpCS= ruleTupleLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleLiteralExpCS=ruleTupleLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTupleLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTupleLiteralExpCS"


    // $ANTLR start "ruleTupleLiteralExpCS"
    // InternalQVTrelation.g:8232:1: ruleTupleLiteralExpCS returns [EObject current=null] : (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' ) ;
    public final EObject ruleTupleLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8238:2: ( (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' ) )
            // InternalQVTrelation.g:8239:2: (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' )
            {
            // InternalQVTrelation.g:8239:2: (otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}' )
            // InternalQVTrelation.g:8240:3: otherlv_0= 'Tuple' otherlv_1= '{' ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )* otherlv_5= '}'
            {
            otherlv_0=(Token)match(input,115,FollowSets000.FOLLOW_25); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTupleLiteralExpCSAccess().getTupleKeyword_0());

            }
            otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getTupleLiteralExpCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTrelation.g:8248:3: ( (lv_ownedParts_2_0= ruleTupleLiteralPartCS ) )
            // InternalQVTrelation.g:8249:4: (lv_ownedParts_2_0= ruleTupleLiteralPartCS )
            {
            // InternalQVTrelation.g:8249:4: (lv_ownedParts_2_0= ruleTupleLiteralPartCS )
            // InternalQVTrelation.g:8250:5: lv_ownedParts_2_0= ruleTupleLiteralPartCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_2_0());

            }
            pushFollow(FollowSets000.FOLLOW_28);
            lv_ownedParts_2_0=ruleTupleLiteralPartCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTupleLiteralExpCSRule());
              					}
              					add(
              						current,
              						"ownedParts",
              						lv_ownedParts_2_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TupleLiteralPartCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:8267:3: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) ) )*
            loop196:
            do {
                int alt196=2;
                int LA196_0 = input.LA(1);

                if ( (LA196_0==23) ) {
                    alt196=1;
                }


                switch (alt196) {
            	case 1 :
            	    // InternalQVTrelation.g:8268:4: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
            	    {
            	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_3, grammarAccess.getTupleLiteralExpCSAccess().getCommaKeyword_3_0());

            	    }
            	    // InternalQVTrelation.g:8272:4: ( (lv_ownedParts_4_0= ruleTupleLiteralPartCS ) )
            	    // InternalQVTrelation.g:8273:5: (lv_ownedParts_4_0= ruleTupleLiteralPartCS )
            	    {
            	    // InternalQVTrelation.g:8273:5: (lv_ownedParts_4_0= ruleTupleLiteralPartCS )
            	    // InternalQVTrelation.g:8274:6: lv_ownedParts_4_0= ruleTupleLiteralPartCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTupleLiteralExpCSAccess().getOwnedPartsTupleLiteralPartCSParserRuleCall_3_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_28);
            	    lv_ownedParts_4_0=ruleTupleLiteralPartCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTupleLiteralExpCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedParts",
            	      							lv_ownedParts_4_0,
            	      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TupleLiteralPartCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop196;
                }
            } while (true);

            otherlv_5=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getTupleLiteralExpCSAccess().getRightCurlyBracketKeyword_4());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTupleLiteralExpCS"


    // $ANTLR start "entryRuleTupleLiteralPartCS"
    // InternalQVTrelation.g:8300:1: entryRuleTupleLiteralPartCS returns [EObject current=null] : iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF ;
    public final EObject entryRuleTupleLiteralPartCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTupleLiteralPartCS = null;


        try {
            // InternalQVTrelation.g:8300:59: (iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF )
            // InternalQVTrelation.g:8301:2: iv_ruleTupleLiteralPartCS= ruleTupleLiteralPartCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTupleLiteralPartCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTupleLiteralPartCS=ruleTupleLiteralPartCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTupleLiteralPartCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTupleLiteralPartCS"


    // $ANTLR start "ruleTupleLiteralPartCS"
    // InternalQVTrelation.g:8307:1: ruleTupleLiteralPartCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) ) ;
    public final EObject ruleTupleLiteralPartCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8313:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) ) )
            // InternalQVTrelation.g:8314:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )
            {
            // InternalQVTrelation.g:8314:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )
            // InternalQVTrelation.g:8315:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
            {
            // InternalQVTrelation.g:8315:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:8316:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:8316:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:8317:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_114);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTupleLiteralPartCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:8334:3: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt197=2;
            int LA197_0 = input.LA(1);

            if ( (LA197_0==18) ) {
                alt197=1;
            }
            switch (alt197) {
                case 1 :
                    // InternalQVTrelation.g:8335:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getTupleLiteralPartCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTrelation.g:8339:4: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:8340:5: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:8340:5: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:8341:6: lv_ownedType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_18);
                    lv_ownedType_2_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getTupleLiteralPartCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_3=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_3, grammarAccess.getTupleLiteralPartCSAccess().getEqualsSignKeyword_2());

            }
            // InternalQVTrelation.g:8363:3: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
            // InternalQVTrelation.g:8364:4: (lv_ownedInitExpression_4_0= ruleExpCS )
            {
            // InternalQVTrelation.g:8364:4: (lv_ownedInitExpression_4_0= ruleExpCS )
            // InternalQVTrelation.g:8365:5: lv_ownedInitExpression_4_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTupleLiteralPartCSAccess().getOwnedInitExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedInitExpression_4_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTupleLiteralPartCSRule());
              					}
              					set(
              						current,
              						"ownedInitExpression",
              						lv_ownedInitExpression_4_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTupleLiteralPartCS"


    // $ANTLR start "entryRuleNumberLiteralExpCS"
    // InternalQVTrelation.g:8386:1: entryRuleNumberLiteralExpCS returns [EObject current=null] : iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF ;
    public final EObject entryRuleNumberLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNumberLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8386:59: (iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF )
            // InternalQVTrelation.g:8387:2: iv_ruleNumberLiteralExpCS= ruleNumberLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNumberLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNumberLiteralExpCS=ruleNumberLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNumberLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNumberLiteralExpCS"


    // $ANTLR start "ruleNumberLiteralExpCS"
    // InternalQVTrelation.g:8393:1: ruleNumberLiteralExpCS returns [EObject current=null] : ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) ) ;
    public final EObject ruleNumberLiteralExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_symbol_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8399:2: ( ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) ) )
            // InternalQVTrelation.g:8400:2: ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) )
            {
            // InternalQVTrelation.g:8400:2: ( (lv_symbol_0_0= ruleNUMBER_LITERAL ) )
            // InternalQVTrelation.g:8401:3: (lv_symbol_0_0= ruleNUMBER_LITERAL )
            {
            // InternalQVTrelation.g:8401:3: (lv_symbol_0_0= ruleNUMBER_LITERAL )
            // InternalQVTrelation.g:8402:4: lv_symbol_0_0= ruleNUMBER_LITERAL
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getNumberLiteralExpCSAccess().getSymbolNUMBER_LITERALParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_symbol_0_0=ruleNUMBER_LITERAL();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getNumberLiteralExpCSRule());
              				}
              				set(
              					current,
              					"symbol",
              					lv_symbol_0_0,
              					"org.eclipse.ocl.xtext.base.Base.NUMBER_LITERAL");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNumberLiteralExpCS"


    // $ANTLR start "entryRuleStringLiteralExpCS"
    // InternalQVTrelation.g:8422:1: entryRuleStringLiteralExpCS returns [EObject current=null] : iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF ;
    public final EObject entryRuleStringLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStringLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8422:59: (iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF )
            // InternalQVTrelation.g:8423:2: iv_ruleStringLiteralExpCS= ruleStringLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStringLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStringLiteralExpCS=ruleStringLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStringLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStringLiteralExpCS"


    // $ANTLR start "ruleStringLiteralExpCS"
    // InternalQVTrelation.g:8429:1: ruleStringLiteralExpCS returns [EObject current=null] : ( (lv_segments_0_0= ruleStringLiteral ) )+ ;
    public final EObject ruleStringLiteralExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_segments_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8435:2: ( ( (lv_segments_0_0= ruleStringLiteral ) )+ )
            // InternalQVTrelation.g:8436:2: ( (lv_segments_0_0= ruleStringLiteral ) )+
            {
            // InternalQVTrelation.g:8436:2: ( (lv_segments_0_0= ruleStringLiteral ) )+
            int cnt198=0;
            loop198:
            do {
                int alt198=2;
                int LA198_0 = input.LA(1);

                if ( (LA198_0==RULE_SINGLE_QUOTED_STRING) ) {
                    alt198=1;
                }


                switch (alt198) {
            	case 1 :
            	    // InternalQVTrelation.g:8437:3: (lv_segments_0_0= ruleStringLiteral )
            	    {
            	    // InternalQVTrelation.g:8437:3: (lv_segments_0_0= ruleStringLiteral )
            	    // InternalQVTrelation.g:8438:4: lv_segments_0_0= ruleStringLiteral
            	    {
            	    if ( state.backtracking==0 ) {

            	      				newCompositeNode(grammarAccess.getStringLiteralExpCSAccess().getSegmentsStringLiteralParserRuleCall_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_115);
            	    lv_segments_0_0=ruleStringLiteral();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				if (current==null) {
            	      					current = createModelElementForParent(grammarAccess.getStringLiteralExpCSRule());
            	      				}
            	      				add(
            	      					current,
            	      					"segments",
            	      					lv_segments_0_0,
            	      					"org.eclipse.ocl.xtext.base.Base.StringLiteral");
            	      				afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    if ( cnt198 >= 1 ) break loop198;
            	    if (state.backtracking>0) {state.failed=true; return current;}
                        EarlyExitException eee =
                            new EarlyExitException(198, input);
                        throw eee;
                }
                cnt198++;
            } while (true);


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStringLiteralExpCS"


    // $ANTLR start "entryRuleBooleanLiteralExpCS"
    // InternalQVTrelation.g:8458:1: entryRuleBooleanLiteralExpCS returns [EObject current=null] : iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF ;
    public final EObject entryRuleBooleanLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBooleanLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8458:60: (iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF )
            // InternalQVTrelation.g:8459:2: iv_ruleBooleanLiteralExpCS= ruleBooleanLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBooleanLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleBooleanLiteralExpCS=ruleBooleanLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleBooleanLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleBooleanLiteralExpCS"


    // $ANTLR start "ruleBooleanLiteralExpCS"
    // InternalQVTrelation.g:8465:1: ruleBooleanLiteralExpCS returns [EObject current=null] : ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) ) ;
    public final EObject ruleBooleanLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token lv_symbol_0_0=null;
        Token lv_symbol_1_0=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:8471:2: ( ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) ) )
            // InternalQVTrelation.g:8472:2: ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) )
            {
            // InternalQVTrelation.g:8472:2: ( ( (lv_symbol_0_0= 'true' ) ) | ( (lv_symbol_1_0= 'false' ) ) )
            int alt199=2;
            int LA199_0 = input.LA(1);

            if ( (LA199_0==132) ) {
                alt199=1;
            }
            else if ( (LA199_0==133) ) {
                alt199=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 199, 0, input);

                throw nvae;
            }
            switch (alt199) {
                case 1 :
                    // InternalQVTrelation.g:8473:3: ( (lv_symbol_0_0= 'true' ) )
                    {
                    // InternalQVTrelation.g:8473:3: ( (lv_symbol_0_0= 'true' ) )
                    // InternalQVTrelation.g:8474:4: (lv_symbol_0_0= 'true' )
                    {
                    // InternalQVTrelation.g:8474:4: (lv_symbol_0_0= 'true' )
                    // InternalQVTrelation.g:8475:5: lv_symbol_0_0= 'true'
                    {
                    lv_symbol_0_0=(Token)match(input,132,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_symbol_0_0, grammarAccess.getBooleanLiteralExpCSAccess().getSymbolTrueKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getBooleanLiteralExpCSRule());
                      					}
                      					setWithLastConsumed(current, "symbol", lv_symbol_0_0, "true");

                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:8488:3: ( (lv_symbol_1_0= 'false' ) )
                    {
                    // InternalQVTrelation.g:8488:3: ( (lv_symbol_1_0= 'false' ) )
                    // InternalQVTrelation.g:8489:4: (lv_symbol_1_0= 'false' )
                    {
                    // InternalQVTrelation.g:8489:4: (lv_symbol_1_0= 'false' )
                    // InternalQVTrelation.g:8490:5: lv_symbol_1_0= 'false'
                    {
                    lv_symbol_1_0=(Token)match(input,133,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_symbol_1_0, grammarAccess.getBooleanLiteralExpCSAccess().getSymbolFalseKeyword_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getBooleanLiteralExpCSRule());
                      					}
                      					setWithLastConsumed(current, "symbol", lv_symbol_1_0, "false");

                    }

                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleBooleanLiteralExpCS"


    // $ANTLR start "entryRuleUnlimitedNaturalLiteralExpCS"
    // InternalQVTrelation.g:8506:1: entryRuleUnlimitedNaturalLiteralExpCS returns [EObject current=null] : iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF ;
    public final EObject entryRuleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUnlimitedNaturalLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8506:69: (iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF )
            // InternalQVTrelation.g:8507:2: iv_ruleUnlimitedNaturalLiteralExpCS= ruleUnlimitedNaturalLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnlimitedNaturalLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUnlimitedNaturalLiteralExpCS=ruleUnlimitedNaturalLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnlimitedNaturalLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUnlimitedNaturalLiteralExpCS"


    // $ANTLR start "ruleUnlimitedNaturalLiteralExpCS"
    // InternalQVTrelation.g:8513:1: ruleUnlimitedNaturalLiteralExpCS returns [EObject current=null] : ( () otherlv_1= '*' ) ;
    public final EObject ruleUnlimitedNaturalLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:8519:2: ( ( () otherlv_1= '*' ) )
            // InternalQVTrelation.g:8520:2: ( () otherlv_1= '*' )
            {
            // InternalQVTrelation.g:8520:2: ( () otherlv_1= '*' )
            // InternalQVTrelation.g:8521:3: () otherlv_1= '*'
            {
            // InternalQVTrelation.g:8521:3: ()
            // InternalQVTrelation.g:8522:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getUnlimitedNaturalLiteralExpCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getUnlimitedNaturalLiteralExpCSAccess().getAsteriskKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnlimitedNaturalLiteralExpCS"


    // $ANTLR start "entryRuleInvalidLiteralExpCS"
    // InternalQVTrelation.g:8539:1: entryRuleInvalidLiteralExpCS returns [EObject current=null] : iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF ;
    public final EObject entryRuleInvalidLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleInvalidLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8539:60: (iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF )
            // InternalQVTrelation.g:8540:2: iv_ruleInvalidLiteralExpCS= ruleInvalidLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getInvalidLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleInvalidLiteralExpCS=ruleInvalidLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleInvalidLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleInvalidLiteralExpCS"


    // $ANTLR start "ruleInvalidLiteralExpCS"
    // InternalQVTrelation.g:8546:1: ruleInvalidLiteralExpCS returns [EObject current=null] : ( () otherlv_1= 'invalid' ) ;
    public final EObject ruleInvalidLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:8552:2: ( ( () otherlv_1= 'invalid' ) )
            // InternalQVTrelation.g:8553:2: ( () otherlv_1= 'invalid' )
            {
            // InternalQVTrelation.g:8553:2: ( () otherlv_1= 'invalid' )
            // InternalQVTrelation.g:8554:3: () otherlv_1= 'invalid'
            {
            // InternalQVTrelation.g:8554:3: ()
            // InternalQVTrelation.g:8555:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getInvalidLiteralExpCSAccess().getInvalidLiteralExpCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,134,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getInvalidLiteralExpCSAccess().getInvalidKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleInvalidLiteralExpCS"


    // $ANTLR start "entryRuleNullLiteralExpCS"
    // InternalQVTrelation.g:8572:1: entryRuleNullLiteralExpCS returns [EObject current=null] : iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF ;
    public final EObject entryRuleNullLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNullLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8572:57: (iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF )
            // InternalQVTrelation.g:8573:2: iv_ruleNullLiteralExpCS= ruleNullLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNullLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNullLiteralExpCS=ruleNullLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNullLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNullLiteralExpCS"


    // $ANTLR start "ruleNullLiteralExpCS"
    // InternalQVTrelation.g:8579:1: ruleNullLiteralExpCS returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
    public final EObject ruleNullLiteralExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:8585:2: ( ( () otherlv_1= 'null' ) )
            // InternalQVTrelation.g:8586:2: ( () otherlv_1= 'null' )
            {
            // InternalQVTrelation.g:8586:2: ( () otherlv_1= 'null' )
            // InternalQVTrelation.g:8587:3: () otherlv_1= 'null'
            {
            // InternalQVTrelation.g:8587:3: ()
            // InternalQVTrelation.g:8588:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getNullLiteralExpCSAccess().getNullLiteralExpCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,135,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getNullLiteralExpCSAccess().getNullKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNullLiteralExpCS"


    // $ANTLR start "entryRuleTypeLiteralCS"
    // InternalQVTrelation.g:8605:1: entryRuleTypeLiteralCS returns [EObject current=null] : iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF ;
    public final EObject entryRuleTypeLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralCS = null;


        try {
            // InternalQVTrelation.g:8605:54: (iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF )
            // InternalQVTrelation.g:8606:2: iv_ruleTypeLiteralCS= ruleTypeLiteralCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeLiteralCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeLiteralCS=ruleTypeLiteralCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeLiteralCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeLiteralCS"


    // $ANTLR start "ruleTypeLiteralCS"
    // InternalQVTrelation.g:8612:1: ruleTypeLiteralCS returns [EObject current=null] : (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS ) ;
    public final EObject ruleTypeLiteralCS() throws RecognitionException {
        EObject current = null;

        EObject this_PrimitiveTypeCS_0 = null;

        EObject this_CollectionTypeCS_1 = null;

        EObject this_MapTypeCS_2 = null;

        EObject this_TupleTypeCS_3 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8618:2: ( (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS ) )
            // InternalQVTrelation.g:8619:2: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS )
            {
            // InternalQVTrelation.g:8619:2: (this_PrimitiveTypeCS_0= rulePrimitiveTypeCS | this_CollectionTypeCS_1= ruleCollectionTypeCS | this_MapTypeCS_2= ruleMapTypeCS | this_TupleTypeCS_3= ruleTupleTypeCS )
            int alt200=4;
            switch ( input.LA(1) ) {
            case 116:
            case 117:
            case 118:
            case 119:
            case 120:
            case 121:
            case 122:
            case 123:
                {
                alt200=1;
                }
                break;
            case 124:
            case 125:
            case 126:
            case 127:
            case 128:
                {
                alt200=2;
                }
                break;
            case 114:
                {
                alt200=3;
                }
                break;
            case 115:
                {
                alt200=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 200, 0, input);

                throw nvae;
            }

            switch (alt200) {
                case 1 :
                    // InternalQVTrelation.g:8620:3: this_PrimitiveTypeCS_0= rulePrimitiveTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getPrimitiveTypeCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimitiveTypeCS_0=rulePrimitiveTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_PrimitiveTypeCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:8632:3: this_CollectionTypeCS_1= ruleCollectionTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getCollectionTypeCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionTypeCS_1=ruleCollectionTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_CollectionTypeCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:8644:3: this_MapTypeCS_2= ruleMapTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getMapTypeCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MapTypeCS_2=ruleMapTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_MapTypeCS_2;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:8656:3: this_TupleTypeCS_3= ruleTupleTypeCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeLiteralCSAccess().getTupleTypeCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TupleTypeCS_3=ruleTupleTypeCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TupleTypeCS_3;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeLiteralCS"


    // $ANTLR start "entryRuleTypeLiteralWithMultiplicityCS"
    // InternalQVTrelation.g:8671:1: entryRuleTypeLiteralWithMultiplicityCS returns [EObject current=null] : iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF ;
    public final EObject entryRuleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralWithMultiplicityCS = null;


        try {
            // InternalQVTrelation.g:8671:70: (iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF )
            // InternalQVTrelation.g:8672:2: iv_ruleTypeLiteralWithMultiplicityCS= ruleTypeLiteralWithMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeLiteralWithMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeLiteralWithMultiplicityCS=ruleTypeLiteralWithMultiplicityCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeLiteralWithMultiplicityCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeLiteralWithMultiplicityCS"


    // $ANTLR start "ruleTypeLiteralWithMultiplicityCS"
    // InternalQVTrelation.g:8678:1: ruleTypeLiteralWithMultiplicityCS returns [EObject current=null] : (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTypeLiteralWithMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeLiteralCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8684:2: ( (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTrelation.g:8685:2: (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTrelation.g:8685:2: (this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalQVTrelation.g:8686:3: this_TypeLiteralCS_0= ruleTypeLiteralCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */

            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_57);
            this_TypeLiteralCS_0=ruleTypeLiteralCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_TypeLiteralCS_0;
              			afterParserOrEnumRuleCall();

            }
            // InternalQVTrelation.g:8697:3: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt201=2;
            int LA201_0 = input.LA(1);

            if ( (LA201_0==138) ) {
                alt201=1;
            }
            switch (alt201) {
                case 1 :
                    // InternalQVTrelation.g:8698:4: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalQVTrelation.g:8698:4: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalQVTrelation.g:8699:5: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getTypeLiteralWithMultiplicityCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getTypeLiteralWithMultiplicityCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedMultiplicity",
                      						lv_ownedMultiplicity_1_0,
                      						"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeLiteralWithMultiplicityCS"


    // $ANTLR start "entryRuleTypeLiteralExpCS"
    // InternalQVTrelation.g:8720:1: entryRuleTypeLiteralExpCS returns [EObject current=null] : iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF ;
    public final EObject entryRuleTypeLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeLiteralExpCS = null;


        try {
            // InternalQVTrelation.g:8720:57: (iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF )
            // InternalQVTrelation.g:8721:2: iv_ruleTypeLiteralExpCS= ruleTypeLiteralExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeLiteralExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeLiteralExpCS=ruleTypeLiteralExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeLiteralExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeLiteralExpCS"


    // $ANTLR start "ruleTypeLiteralExpCS"
    // InternalQVTrelation.g:8727:1: ruleTypeLiteralExpCS returns [EObject current=null] : ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) ) ;
    public final EObject ruleTypeLiteralExpCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedType_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8733:2: ( ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) ) )
            // InternalQVTrelation.g:8734:2: ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) )
            {
            // InternalQVTrelation.g:8734:2: ( (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS ) )
            // InternalQVTrelation.g:8735:3: (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS )
            {
            // InternalQVTrelation.g:8735:3: (lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS )
            // InternalQVTrelation.g:8736:4: lv_ownedType_0_0= ruleTypeLiteralWithMultiplicityCS
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getTypeLiteralExpCSAccess().getOwnedTypeTypeLiteralWithMultiplicityCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedType_0_0=ruleTypeLiteralWithMultiplicityCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getTypeLiteralExpCSRule());
              				}
              				set(
              					current,
              					"ownedType",
              					lv_ownedType_0_0,
              					"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeLiteralWithMultiplicityCS");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeLiteralExpCS"


    // $ANTLR start "entryRuleTypeNameExpCS"
    // InternalQVTrelation.g:8756:1: entryRuleTypeNameExpCS returns [EObject current=null] : iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF ;
    public final EObject entryRuleTypeNameExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeNameExpCS = null;


        try {
            // InternalQVTrelation.g:8756:54: (iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF )
            // InternalQVTrelation.g:8757:2: iv_ruleTypeNameExpCS= ruleTypeNameExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeNameExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeNameExpCS=ruleTypeNameExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeNameExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeNameExpCS"


    // $ANTLR start "ruleTypeNameExpCS"
    // InternalQVTrelation.g:8763:1: ruleTypeNameExpCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? ) ;
    public final EObject ruleTypeNameExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedPathName_0_0 = null;

        EObject lv_ownedCurlyBracketedClause_1_0 = null;

        EObject lv_ownedPatternGuard_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8769:2: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? ) )
            // InternalQVTrelation.g:8770:2: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? )
            {
            // InternalQVTrelation.g:8770:2: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )? )
            // InternalQVTrelation.g:8771:3: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?
            {
            // InternalQVTrelation.g:8771:3: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalQVTrelation.g:8772:4: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalQVTrelation.g:8772:4: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalQVTrelation.g:8773:5: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_13);
            lv_ownedPathName_0_0=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTypeNameExpCSRule());
              					}
              					set(
              						current,
              						"ownedPathName",
              						lv_ownedPathName_0_0,
              						"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:8790:3: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?
            int alt203=2;
            alt203 = dfa203.predict(input);
            switch (alt203) {
                case 1 :
                    // InternalQVTrelation.g:8791:4: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
                    {
                    // InternalQVTrelation.g:8791:4: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) )
                    // InternalQVTrelation.g:8792:5: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
                    {
                    // InternalQVTrelation.g:8792:5: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
                    // InternalQVTrelation.g:8793:6: lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_13);
                    lv_ownedCurlyBracketedClause_1_0=ruleCurlyBracketedClauseCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getTypeNameExpCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedCurlyBracketedClause",
                      							lv_ownedCurlyBracketedClause_1_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CurlyBracketedClauseCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:8810:4: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
                    int alt202=2;
                    alt202 = dfa202.predict(input);
                    switch (alt202) {
                        case 1 :
                            // InternalQVTrelation.g:8811:5: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
                            {
                            otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_2, grammarAccess.getTypeNameExpCSAccess().getLeftCurlyBracketKeyword_1_1_0());

                            }
                            // InternalQVTrelation.g:8815:5: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
                            // InternalQVTrelation.g:8816:6: (lv_ownedPatternGuard_3_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:8816:6: (lv_ownedPatternGuard_3_0= ruleExpCS )
                            // InternalQVTrelation.g:8817:7: lv_ownedPatternGuard_3_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_17);
                            lv_ownedPatternGuard_3_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getTypeNameExpCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedPatternGuard",
                              								lv_ownedPatternGuard_3_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_4, grammarAccess.getTypeNameExpCSAccess().getRightCurlyBracketKeyword_1_1_2());

                            }

                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeNameExpCS"


    // $ANTLR start "entryRuleTypeExpWithoutMultiplicityCS"
    // InternalQVTrelation.g:8844:1: entryRuleTypeExpWithoutMultiplicityCS returns [EObject current=null] : iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF ;
    public final EObject entryRuleTypeExpWithoutMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeExpWithoutMultiplicityCS = null;


        try {
            // InternalQVTrelation.g:8844:69: (iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF )
            // InternalQVTrelation.g:8845:2: iv_ruleTypeExpWithoutMultiplicityCS= ruleTypeExpWithoutMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeExpWithoutMultiplicityCS=ruleTypeExpWithoutMultiplicityCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeExpWithoutMultiplicityCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeExpWithoutMultiplicityCS"


    // $ANTLR start "ruleTypeExpWithoutMultiplicityCS"
    // InternalQVTrelation.g:8851:1: ruleTypeExpWithoutMultiplicityCS returns [EObject current=null] : (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS ) ;
    public final EObject ruleTypeExpWithoutMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeNameExpCS_0 = null;

        EObject this_TypeLiteralCS_1 = null;

        EObject this_CollectionPatternCS_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8857:2: ( (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS ) )
            // InternalQVTrelation.g:8858:2: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )
            {
            // InternalQVTrelation.g:8858:2: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )
            int alt204=3;
            alt204 = dfa204.predict(input);
            switch (alt204) {
                case 1 :
                    // InternalQVTrelation.g:8859:3: this_TypeNameExpCS_0= ruleTypeNameExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeNameExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeNameExpCS_0=ruleTypeNameExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TypeNameExpCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:8871:3: this_TypeLiteralCS_1= ruleTypeLiteralCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getTypeLiteralCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeLiteralCS_1=ruleTypeLiteralCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TypeLiteralCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:8883:3: this_CollectionPatternCS_2= ruleCollectionPatternCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeExpWithoutMultiplicityCSAccess().getCollectionPatternCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionPatternCS_2=ruleCollectionPatternCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_CollectionPatternCS_2;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeExpWithoutMultiplicityCS"


    // $ANTLR start "entryRuleTypeExpCS"
    // InternalQVTrelation.g:8898:1: entryRuleTypeExpCS returns [EObject current=null] : iv_ruleTypeExpCS= ruleTypeExpCS EOF ;
    public final EObject entryRuleTypeExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeExpCS = null;


        try {
            // InternalQVTrelation.g:8898:50: (iv_ruleTypeExpCS= ruleTypeExpCS EOF )
            // InternalQVTrelation.g:8899:2: iv_ruleTypeExpCS= ruleTypeExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeExpCS=ruleTypeExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeExpCS"


    // $ANTLR start "ruleTypeExpCS"
    // InternalQVTrelation.g:8905:1: ruleTypeExpCS returns [EObject current=null] : (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) ;
    public final EObject ruleTypeExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypeExpWithoutMultiplicityCS_0 = null;

        EObject lv_ownedMultiplicity_1_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8911:2: ( (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? ) )
            // InternalQVTrelation.g:8912:2: (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            {
            // InternalQVTrelation.g:8912:2: (this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )? )
            // InternalQVTrelation.g:8913:3: this_TypeExpWithoutMultiplicityCS_0= ruleTypeExpWithoutMultiplicityCS ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            {
            if ( state.backtracking==0 ) {

              			/* */

            }
            if ( state.backtracking==0 ) {

              			newCompositeNode(grammarAccess.getTypeExpCSAccess().getTypeExpWithoutMultiplicityCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_57);
            this_TypeExpWithoutMultiplicityCS_0=ruleTypeExpWithoutMultiplicityCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			current = this_TypeExpWithoutMultiplicityCS_0;
              			afterParserOrEnumRuleCall();

            }
            // InternalQVTrelation.g:8924:3: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?
            int alt205=2;
            int LA205_0 = input.LA(1);

            if ( (LA205_0==138) ) {
                alt205=1;
            }
            switch (alt205) {
                case 1 :
                    // InternalQVTrelation.g:8925:4: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    {
                    // InternalQVTrelation.g:8925:4: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
                    // InternalQVTrelation.g:8926:5: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getTypeExpCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getTypeExpCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedMultiplicity",
                      						lv_ownedMultiplicity_1_0,
                      						"org.eclipse.ocl.xtext.base.Base.MultiplicityCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeExpCS"


    // $ANTLR start "entryRuleExpCS"
    // InternalQVTrelation.g:8947:1: entryRuleExpCS returns [EObject current=null] : iv_ruleExpCS= ruleExpCS EOF ;
    public final EObject entryRuleExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleExpCS = null;


        try {
            // InternalQVTrelation.g:8947:46: (iv_ruleExpCS= ruleExpCS EOF )
            // InternalQVTrelation.g:8948:2: iv_ruleExpCS= ruleExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleExpCS=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleExpCS"


    // $ANTLR start "ruleExpCS"
    // InternalQVTrelation.g:8954:1: ruleExpCS returns [EObject current=null] : ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS ) ;
    public final EObject ruleExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_PrefixedPrimaryExpCS_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedRight_3_0 = null;

        EObject this_PrefixedLetExpCS_4 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:8960:2: ( ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS ) )
            // InternalQVTrelation.g:8961:2: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )
            {
            // InternalQVTrelation.g:8961:2: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )
            int alt207=2;
            alt207 = dfa207.predict(input);
            switch (alt207) {
                case 1 :
                    // InternalQVTrelation.g:8962:3: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTrelation.g:8962:3: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
                    // InternalQVTrelation.g:8963:4: this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getExpCSAccess().getPrefixedPrimaryExpCSParserRuleCall_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_116);
                    this_PrefixedPrimaryExpCS_0=rulePrefixedPrimaryExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_PrefixedPrimaryExpCS_0;
                      				afterParserOrEnumRuleCall();

                    }
                    // InternalQVTrelation.g:8974:4: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
                    int alt206=2;
                    int LA206_0 = input.LA(1);

                    if ( (LA206_0==19||LA206_0==48||LA206_0==92||(LA206_0>=95 && LA206_0<=113)) ) {
                        alt206=1;
                    }
                    switch (alt206) {
                        case 1 :
                            // InternalQVTrelation.g:8975:5: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                            {
                            // InternalQVTrelation.g:8975:5: ()
                            // InternalQVTrelation.g:8976:6:
                            {
                            if ( state.backtracking==0 ) {

                              						/* */

                            }
                            if ( state.backtracking==0 ) {

                              						current = forceCreateModelElementAndSet(
                              							grammarAccess.getExpCSAccess().getInfixExpCSOwnedLeftAction_0_1_0(),
                              							current);

                            }

                            }

                            // InternalQVTrelation.g:8985:5: ( (lv_name_2_0= ruleBinaryOperatorName ) )
                            // InternalQVTrelation.g:8986:6: (lv_name_2_0= ruleBinaryOperatorName )
                            {
                            // InternalQVTrelation.g:8986:6: (lv_name_2_0= ruleBinaryOperatorName )
                            // InternalQVTrelation.g:8987:7: lv_name_2_0= ruleBinaryOperatorName
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_19);
                            lv_name_2_0=ruleBinaryOperatorName();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getExpCSRule());
                              							}
                              							set(
                              								current,
                              								"name",
                              								lv_name_2_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.BinaryOperatorName");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTrelation.g:9004:5: ( (lv_ownedRight_3_0= ruleExpCS ) )
                            // InternalQVTrelation.g:9005:6: (lv_ownedRight_3_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:9005:6: (lv_ownedRight_3_0= ruleExpCS )
                            // InternalQVTrelation.g:9006:7: lv_ownedRight_3_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedRight_3_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getExpCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedRight",
                              								lv_ownedRight_3_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:9026:3: this_PrefixedLetExpCS_4= rulePrefixedLetExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getExpCSAccess().getPrefixedLetExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrefixedLetExpCS_4=rulePrefixedLetExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_PrefixedLetExpCS_4;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleExpCS"


    // $ANTLR start "entryRulePrefixedLetExpCS"
    // InternalQVTrelation.g:9041:1: entryRulePrefixedLetExpCS returns [EObject current=null] : iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF ;
    public final EObject entryRulePrefixedLetExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrefixedLetExpCS = null;


        try {
            // InternalQVTrelation.g:9041:57: (iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF )
            // InternalQVTrelation.g:9042:2: iv_rulePrefixedLetExpCS= rulePrefixedLetExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrefixedLetExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrefixedLetExpCS=rulePrefixedLetExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrefixedLetExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrefixedLetExpCS"


    // $ANTLR start "rulePrefixedLetExpCS"
    // InternalQVTrelation.g:9048:1: rulePrefixedLetExpCS returns [EObject current=null] : ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS ) ;
    public final EObject rulePrefixedLetExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedRight_2_0 = null;

        EObject this_LetExpCS_3 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9054:2: ( ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS ) )
            // InternalQVTrelation.g:9055:2: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS )
            {
            // InternalQVTrelation.g:9055:2: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) ) | this_LetExpCS_3= ruleLetExpCS )
            int alt208=2;
            int LA208_0 = input.LA(1);

            if ( ((LA208_0>=92 && LA208_0<=94)) ) {
                alt208=1;
            }
            else if ( (LA208_0==147) ) {
                alt208=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 208, 0, input);

                throw nvae;
            }
            switch (alt208) {
                case 1 :
                    // InternalQVTrelation.g:9056:3: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) )
                    {
                    // InternalQVTrelation.g:9056:3: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) ) )
                    // InternalQVTrelation.g:9057:4: () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) )
                    {
                    // InternalQVTrelation.g:9057:4: ()
                    // InternalQVTrelation.g:9058:5:
                    {
                    if ( state.backtracking==0 ) {

                      					/* */

                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getPrefixedLetExpCSAccess().getPrefixExpCSAction_0_0(),
                      						current);

                    }

                    }

                    // InternalQVTrelation.g:9067:4: ( (lv_name_1_0= ruleUnaryOperatorName ) )
                    // InternalQVTrelation.g:9068:5: (lv_name_1_0= ruleUnaryOperatorName )
                    {
                    // InternalQVTrelation.g:9068:5: (lv_name_1_0= ruleUnaryOperatorName )
                    // InternalQVTrelation.g:9069:6: lv_name_1_0= ruleUnaryOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_19);
                    lv_name_1_0=ruleUnaryOperatorName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPrefixedLetExpCSRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_1_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.UnaryOperatorName");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:9086:4: ( (lv_ownedRight_2_0= rulePrefixedLetExpCS ) )
                    // InternalQVTrelation.g:9087:5: (lv_ownedRight_2_0= rulePrefixedLetExpCS )
                    {
                    // InternalQVTrelation.g:9087:5: (lv_ownedRight_2_0= rulePrefixedLetExpCS )
                    // InternalQVTrelation.g:9088:6: lv_ownedRight_2_0= rulePrefixedLetExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getOwnedRightPrefixedLetExpCSParserRuleCall_0_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedRight_2_0=rulePrefixedLetExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPrefixedLetExpCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedRight",
                      							lv_ownedRight_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PrefixedLetExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:9107:3: this_LetExpCS_3= ruleLetExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrefixedLetExpCSAccess().getLetExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LetExpCS_3=ruleLetExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_LetExpCS_3;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrefixedLetExpCS"


    // $ANTLR start "entryRulePrefixedPrimaryExpCS"
    // InternalQVTrelation.g:9122:1: entryRulePrefixedPrimaryExpCS returns [EObject current=null] : iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF ;
    public final EObject entryRulePrefixedPrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrefixedPrimaryExpCS = null;


        try {
            // InternalQVTrelation.g:9122:61: (iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF )
            // InternalQVTrelation.g:9123:2: iv_rulePrefixedPrimaryExpCS= rulePrefixedPrimaryExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrefixedPrimaryExpCS=rulePrefixedPrimaryExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrefixedPrimaryExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrefixedPrimaryExpCS"


    // $ANTLR start "rulePrefixedPrimaryExpCS"
    // InternalQVTrelation.g:9129:1: rulePrefixedPrimaryExpCS returns [EObject current=null] : ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS ) ;
    public final EObject rulePrefixedPrimaryExpCS() throws RecognitionException {
        EObject current = null;

        AntlrDatatypeRuleToken lv_name_1_0 = null;

        EObject lv_ownedRight_2_0 = null;

        EObject this_PrimaryExpCS_3 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9135:2: ( ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS ) )
            // InternalQVTrelation.g:9136:2: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS )
            {
            // InternalQVTrelation.g:9136:2: ( ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) ) | this_PrimaryExpCS_3= rulePrimaryExpCS )
            int alt209=2;
            int LA209_0 = input.LA(1);

            if ( ((LA209_0>=92 && LA209_0<=94)) ) {
                alt209=1;
            }
            else if ( (LA209_0==RULE_SINGLE_QUOTED_STRING||(LA209_0>=RULE_INT && LA209_0<=RULE_ESCAPED_ID)||LA209_0==17||(LA209_0>=25 && LA209_0<=33)||(LA209_0>=35 && LA209_0<=43)||(LA209_0>=45 && LA209_0<=59)||LA209_0==61||LA209_0==63||LA209_0==65||LA209_0==68||LA209_0==70||LA209_0==72||(LA209_0>=74 && LA209_0<=77)||(LA209_0>=79 && LA209_0<=84)||LA209_0==86||LA209_0==88||(LA209_0>=90 && LA209_0<=91)||(LA209_0>=114 && LA209_0<=128)||LA209_0==130||(LA209_0>=132 && LA209_0<=135)||LA209_0==142||LA209_0==148) ) {
                alt209=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 209, 0, input);

                throw nvae;
            }
            switch (alt209) {
                case 1 :
                    // InternalQVTrelation.g:9137:3: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) )
                    {
                    // InternalQVTrelation.g:9137:3: ( () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) ) )
                    // InternalQVTrelation.g:9138:4: () ( (lv_name_1_0= ruleUnaryOperatorName ) ) ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) )
                    {
                    // InternalQVTrelation.g:9138:4: ()
                    // InternalQVTrelation.g:9139:5:
                    {
                    if ( state.backtracking==0 ) {

                      					/* */

                    }
                    if ( state.backtracking==0 ) {

                      					current = forceCreateModelElement(
                      						grammarAccess.getPrefixedPrimaryExpCSAccess().getPrefixExpCSAction_0_0(),
                      						current);

                    }

                    }

                    // InternalQVTrelation.g:9148:4: ( (lv_name_1_0= ruleUnaryOperatorName ) )
                    // InternalQVTrelation.g:9149:5: (lv_name_1_0= ruleUnaryOperatorName )
                    {
                    // InternalQVTrelation.g:9149:5: (lv_name_1_0= ruleUnaryOperatorName )
                    // InternalQVTrelation.g:9150:6: lv_name_1_0= ruleUnaryOperatorName
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getNameUnaryOperatorNameParserRuleCall_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_27);
                    lv_name_1_0=ruleUnaryOperatorName();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPrefixedPrimaryExpCSRule());
                      						}
                      						set(
                      							current,
                      							"name",
                      							lv_name_1_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.UnaryOperatorName");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:9167:4: ( (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS ) )
                    // InternalQVTrelation.g:9168:5: (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS )
                    {
                    // InternalQVTrelation.g:9168:5: (lv_ownedRight_2_0= rulePrefixedPrimaryExpCS )
                    // InternalQVTrelation.g:9169:6: lv_ownedRight_2_0= rulePrefixedPrimaryExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getOwnedRightPrefixedPrimaryExpCSParserRuleCall_0_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedRight_2_0=rulePrefixedPrimaryExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getPrefixedPrimaryExpCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedRight",
                      							lv_ownedRight_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PrefixedPrimaryExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:9188:3: this_PrimaryExpCS_3= rulePrimaryExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrefixedPrimaryExpCSAccess().getPrimaryExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimaryExpCS_3=rulePrimaryExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_PrimaryExpCS_3;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrefixedPrimaryExpCS"


    // $ANTLR start "entryRulePrimaryExpCS"
    // InternalQVTrelation.g:9203:1: entryRulePrimaryExpCS returns [EObject current=null] : iv_rulePrimaryExpCS= rulePrimaryExpCS EOF ;
    public final EObject entryRulePrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePrimaryExpCS = null;


        try {
            // InternalQVTrelation.g:9203:53: (iv_rulePrimaryExpCS= rulePrimaryExpCS EOF )
            // InternalQVTrelation.g:9204:2: iv_rulePrimaryExpCS= rulePrimaryExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPrimaryExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePrimaryExpCS=rulePrimaryExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePrimaryExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePrimaryExpCS"


    // $ANTLR start "rulePrimaryExpCS"
    // InternalQVTrelation.g:9210:1: rulePrimaryExpCS returns [EObject current=null] : (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS ) ;
    public final EObject rulePrimaryExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_NestedExpCS_0 = null;

        EObject this_IfExpCS_1 = null;

        EObject this_SelfExpCS_2 = null;

        EObject this_PrimitiveLiteralExpCS_3 = null;

        EObject this_TupleLiteralExpCS_4 = null;

        EObject this_MapLiteralExpCS_5 = null;

        EObject this_CollectionLiteralExpCS_6 = null;

        EObject this_LambdaLiteralExpCS_7 = null;

        EObject this_TypeLiteralExpCS_8 = null;

        EObject this_NameExpCS_9 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9216:2: ( (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS ) )
            // InternalQVTrelation.g:9217:2: (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS )
            {
            // InternalQVTrelation.g:9217:2: (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS )
            int alt210=10;
            alt210 = dfa210.predict(input);
            switch (alt210) {
                case 1 :
                    // InternalQVTrelation.g:9218:3: this_NestedExpCS_0= ruleNestedExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getNestedExpCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NestedExpCS_0=ruleNestedExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_NestedExpCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:9230:3: this_IfExpCS_1= ruleIfExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getIfExpCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_IfExpCS_1=ruleIfExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_IfExpCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:9242:3: this_SelfExpCS_2= ruleSelfExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getSelfExpCSParserRuleCall_2());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_SelfExpCS_2=ruleSelfExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_SelfExpCS_2;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 4 :
                    // InternalQVTrelation.g:9254:3: this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getPrimitiveLiteralExpCSParserRuleCall_3());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_PrimitiveLiteralExpCS_3=rulePrimitiveLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_PrimitiveLiteralExpCS_3;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 5 :
                    // InternalQVTrelation.g:9266:3: this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getTupleLiteralExpCSParserRuleCall_4());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TupleLiteralExpCS_4=ruleTupleLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TupleLiteralExpCS_4;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 6 :
                    // InternalQVTrelation.g:9278:3: this_MapLiteralExpCS_5= ruleMapLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getMapLiteralExpCSParserRuleCall_5());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_MapLiteralExpCS_5=ruleMapLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_MapLiteralExpCS_5;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 7 :
                    // InternalQVTrelation.g:9290:3: this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getCollectionLiteralExpCSParserRuleCall_6());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_CollectionLiteralExpCS_6=ruleCollectionLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_CollectionLiteralExpCS_6;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 8 :
                    // InternalQVTrelation.g:9302:3: this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getLambdaLiteralExpCSParserRuleCall_7());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_LambdaLiteralExpCS_7=ruleLambdaLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_LambdaLiteralExpCS_7;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 9 :
                    // InternalQVTrelation.g:9314:3: this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getTypeLiteralExpCSParserRuleCall_8());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypeLiteralExpCS_8=ruleTypeLiteralExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TypeLiteralExpCS_8;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 10 :
                    // InternalQVTrelation.g:9326:3: this_NameExpCS_9= ruleNameExpCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getPrimaryExpCSAccess().getNameExpCSParserRuleCall_9());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_NameExpCS_9=ruleNameExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_NameExpCS_9;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePrimaryExpCS"


    // $ANTLR start "entryRuleNameExpCS"
    // InternalQVTrelation.g:9341:1: entryRuleNameExpCS returns [EObject current=null] : iv_ruleNameExpCS= ruleNameExpCS EOF ;
    public final EObject entryRuleNameExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNameExpCS = null;


        try {
            // InternalQVTrelation.g:9341:50: (iv_ruleNameExpCS= ruleNameExpCS EOF )
            // InternalQVTrelation.g:9342:2: iv_ruleNameExpCS= ruleNameExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNameExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNameExpCS=ruleNameExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNameExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNameExpCS"


    // $ANTLR start "ruleNameExpCS"
    // InternalQVTrelation.g:9348:1: ruleNameExpCS returns [EObject current=null] : ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? ) ;
    public final EObject ruleNameExpCS() throws RecognitionException {
        EObject current = null;

        Token lv_isPre_4_0=null;
        Token otherlv_5=null;
        EObject lv_ownedPathName_0_0 = null;

        EObject lv_ownedSquareBracketedClauses_1_0 = null;

        EObject lv_ownedRoundBracketedClause_2_0 = null;

        EObject lv_ownedCurlyBracketedClause_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9354:2: ( ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? ) )
            // InternalQVTrelation.g:9355:2: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? )
            {
            // InternalQVTrelation.g:9355:2: ( ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )? )
            // InternalQVTrelation.g:9356:3: ( (lv_ownedPathName_0_0= rulePathNameCS ) ) ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )* ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )? ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )? ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )?
            {
            // InternalQVTrelation.g:9356:3: ( (lv_ownedPathName_0_0= rulePathNameCS ) )
            // InternalQVTrelation.g:9357:4: (lv_ownedPathName_0_0= rulePathNameCS )
            {
            // InternalQVTrelation.g:9357:4: (lv_ownedPathName_0_0= rulePathNameCS )
            // InternalQVTrelation.g:9358:5: lv_ownedPathName_0_0= rulePathNameCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedPathNamePathNameCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_117);
            lv_ownedPathName_0_0=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getNameExpCSRule());
              					}
              					set(
              						current,
              						"ownedPathName",
              						lv_ownedPathName_0_0,
              						"org.eclipse.ocl.xtext.base.Base.PathNameCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:9375:3: ( (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS ) )*
            loop211:
            do {
                int alt211=2;
                int LA211_0 = input.LA(1);

                if ( (LA211_0==138) ) {
                    alt211=1;
                }


                switch (alt211) {
            	case 1 :
            	    // InternalQVTrelation.g:9376:4: (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS )
            	    {
            	    // InternalQVTrelation.g:9376:4: (lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS )
            	    // InternalQVTrelation.g:9377:5: lv_ownedSquareBracketedClauses_1_0= ruleSquareBracketedClauseCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedSquareBracketedClausesSquareBracketedClauseCSParserRuleCall_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_117);
            	    lv_ownedSquareBracketedClauses_1_0=ruleSquareBracketedClauseCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getNameExpCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedSquareBracketedClauses",
            	      						lv_ownedSquareBracketedClauses_1_0,
            	      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.SquareBracketedClauseCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop211;
                }
            } while (true);

            // InternalQVTrelation.g:9394:3: ( (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS ) )?
            int alt212=2;
            int LA212_0 = input.LA(1);

            if ( (LA212_0==33) ) {
                alt212=1;
            }
            switch (alt212) {
                case 1 :
                    // InternalQVTrelation.g:9395:4: (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS )
                    {
                    // InternalQVTrelation.g:9395:4: (lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS )
                    // InternalQVTrelation.g:9396:5: lv_ownedRoundBracketedClause_2_0= ruleRoundBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_2_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_118);
                    lv_ownedRoundBracketedClause_2_0=ruleRoundBracketedClauseCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getNameExpCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedRoundBracketedClause",
                      						lv_ownedRoundBracketedClause_2_0,
                      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.RoundBracketedClauseCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:9413:3: ( (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS ) )?
            int alt213=2;
            int LA213_0 = input.LA(1);

            if ( (LA213_0==20) ) {
                alt213=1;
            }
            switch (alt213) {
                case 1 :
                    // InternalQVTrelation.g:9414:4: (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS )
                    {
                    // InternalQVTrelation.g:9414:4: (lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS )
                    // InternalQVTrelation.g:9415:5: lv_ownedCurlyBracketedClause_3_0= ruleCurlyBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_119);
                    lv_ownedCurlyBracketedClause_3_0=ruleCurlyBracketedClauseCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getNameExpCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedCurlyBracketedClause",
                      						lv_ownedCurlyBracketedClause_3_0,
                      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CurlyBracketedClauseCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:9432:3: ( ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre' )?
            int alt214=2;
            int LA214_0 = input.LA(1);

            if ( (LA214_0==136) ) {
                alt214=1;
            }
            switch (alt214) {
                case 1 :
                    // InternalQVTrelation.g:9433:4: ( (lv_isPre_4_0= '@' ) ) otherlv_5= 'pre'
                    {
                    // InternalQVTrelation.g:9433:4: ( (lv_isPre_4_0= '@' ) )
                    // InternalQVTrelation.g:9434:5: (lv_isPre_4_0= '@' )
                    {
                    // InternalQVTrelation.g:9434:5: (lv_isPre_4_0= '@' )
                    // InternalQVTrelation.g:9435:6: lv_isPre_4_0= '@'
                    {
                    lv_isPre_4_0=(Token)match(input,136,FollowSets000.FOLLOW_120); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isPre_4_0, grammarAccess.getNameExpCSAccess().getIsPreCommercialAtKeyword_4_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getNameExpCSRule());
                      						}
                      						setWithLastConsumed(current, "isPre", lv_isPre_4_0 != null, "@");

                    }

                    }


                    }

                    otherlv_5=(Token)match(input,137,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_5, grammarAccess.getNameExpCSAccess().getPreKeyword_4_1());

                    }

                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNameExpCS"


    // $ANTLR start "entryRuleCurlyBracketedClauseCS"
    // InternalQVTrelation.g:9456:1: entryRuleCurlyBracketedClauseCS returns [EObject current=null] : iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF ;
    public final EObject entryRuleCurlyBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCurlyBracketedClauseCS = null;


        try {
            // InternalQVTrelation.g:9456:63: (iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF )
            // InternalQVTrelation.g:9457:2: iv_ruleCurlyBracketedClauseCS= ruleCurlyBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCurlyBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCurlyBracketedClauseCS=ruleCurlyBracketedClauseCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCurlyBracketedClauseCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCurlyBracketedClauseCS"


    // $ANTLR start "ruleCurlyBracketedClauseCS"
    // InternalQVTrelation.g:9463:1: ruleCurlyBracketedClauseCS returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' ) ;
    public final EObject ruleCurlyBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        EObject lv_ownedParts_2_0 = null;

        EObject lv_ownedParts_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9469:2: ( ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' ) )
            // InternalQVTrelation.g:9470:2: ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' )
            {
            // InternalQVTrelation.g:9470:2: ( () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}' )
            // InternalQVTrelation.g:9471:3: () otherlv_1= '{' ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )? otherlv_5= '}'
            {
            // InternalQVTrelation.g:9471:3: ()
            // InternalQVTrelation.g:9472:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getCurlyBracketedClauseCSAccess().getCurlyBracketedClauseCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,20,FollowSets000.FOLLOW_121); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getCurlyBracketedClauseCSAccess().getLeftCurlyBracketKeyword_1());

            }
            // InternalQVTrelation.g:9485:3: ( ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )* )?
            int alt216=2;
            int LA216_0 = input.LA(1);

            if ( (LA216_0==RULE_SINGLE_QUOTED_STRING||(LA216_0>=RULE_SIMPLE_ID && LA216_0<=RULE_ESCAPED_ID)||LA216_0==17||(LA216_0>=25 && LA216_0<=32)||(LA216_0>=35 && LA216_0<=43)||(LA216_0>=45 && LA216_0<=47)||(LA216_0>=49 && LA216_0<=59)||LA216_0==61||LA216_0==63||LA216_0==65||LA216_0==68||LA216_0==70||LA216_0==72||(LA216_0>=74 && LA216_0<=77)||(LA216_0>=79 && LA216_0<=84)||LA216_0==86||LA216_0==88||(LA216_0>=90 && LA216_0<=91)) ) {
                alt216=1;
            }
            switch (alt216) {
                case 1 :
                    // InternalQVTrelation.g:9486:4: ( (lv_ownedParts_2_0= ruleShadowPartCS ) ) (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )*
                    {
                    // InternalQVTrelation.g:9486:4: ( (lv_ownedParts_2_0= ruleShadowPartCS ) )
                    // InternalQVTrelation.g:9487:5: (lv_ownedParts_2_0= ruleShadowPartCS )
                    {
                    // InternalQVTrelation.g:9487:5: (lv_ownedParts_2_0= ruleShadowPartCS )
                    // InternalQVTrelation.g:9488:6: lv_ownedParts_2_0= ruleShadowPartCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_28);
                    lv_ownedParts_2_0=ruleShadowPartCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCurlyBracketedClauseCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedParts",
                      							lv_ownedParts_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ShadowPartCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:9505:4: (otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) ) )*
                    loop215:
                    do {
                        int alt215=2;
                        int LA215_0 = input.LA(1);

                        if ( (LA215_0==23) ) {
                            alt215=1;
                        }


                        switch (alt215) {
                    	case 1 :
                    	    // InternalQVTrelation.g:9506:5: otherlv_3= ',' ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,23,FollowSets000.FOLLOW_51); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getCurlyBracketedClauseCSAccess().getCommaKeyword_2_1_0());

                    	    }
                    	    // InternalQVTrelation.g:9510:5: ( (lv_ownedParts_4_0= ruleShadowPartCS ) )
                    	    // InternalQVTrelation.g:9511:6: (lv_ownedParts_4_0= ruleShadowPartCS )
                    	    {
                    	    // InternalQVTrelation.g:9511:6: (lv_ownedParts_4_0= ruleShadowPartCS )
                    	    // InternalQVTrelation.g:9512:7: lv_ownedParts_4_0= ruleShadowPartCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getCurlyBracketedClauseCSAccess().getOwnedPartsShadowPartCSParserRuleCall_2_1_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_28);
                    	    lv_ownedParts_4_0=ruleShadowPartCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getCurlyBracketedClauseCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedParts",
                    	      								lv_ownedParts_4_0,
                    	      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ShadowPartCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop215;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_5=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getCurlyBracketedClauseCSAccess().getRightCurlyBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCurlyBracketedClauseCS"


    // $ANTLR start "entryRuleRoundBracketedClauseCS"
    // InternalQVTrelation.g:9539:1: entryRuleRoundBracketedClauseCS returns [EObject current=null] : iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF ;
    public final EObject entryRuleRoundBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleRoundBracketedClauseCS = null;


        try {
            // InternalQVTrelation.g:9539:63: (iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF )
            // InternalQVTrelation.g:9540:2: iv_ruleRoundBracketedClauseCS= ruleRoundBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getRoundBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleRoundBracketedClauseCS=ruleRoundBracketedClauseCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleRoundBracketedClauseCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleRoundBracketedClauseCS"


    // $ANTLR start "ruleRoundBracketedClauseCS"
    // InternalQVTrelation.g:9546:1: ruleRoundBracketedClauseCS returns [EObject current=null] : ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' ) ;
    public final EObject ruleRoundBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_4=null;
        EObject lv_ownedArguments_2_0 = null;

        EObject lv_ownedArguments_3_1 = null;

        EObject lv_ownedArguments_3_2 = null;

        EObject lv_ownedArguments_3_3 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9552:2: ( ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' ) )
            // InternalQVTrelation.g:9553:2: ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' )
            {
            // InternalQVTrelation.g:9553:2: ( () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')' )
            // InternalQVTrelation.g:9554:3: () otherlv_1= '(' ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )? otherlv_4= ')'
            {
            // InternalQVTrelation.g:9554:3: ()
            // InternalQVTrelation.g:9555:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getRoundBracketedClauseCSAccess().getRoundBracketedClauseCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,33,FollowSets000.FOLLOW_122); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getRoundBracketedClauseCSAccess().getLeftParenthesisKeyword_1());

            }
            // InternalQVTrelation.g:9568:3: ( ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )* )?
            int alt219=2;
            int LA219_0 = input.LA(1);

            if ( (LA219_0==RULE_SINGLE_QUOTED_STRING||(LA219_0>=RULE_INT && LA219_0<=RULE_ESCAPED_ID)||(LA219_0>=17 && LA219_0<=18)||(LA219_0>=25 && LA219_0<=33)||(LA219_0>=35 && LA219_0<=43)||(LA219_0>=45 && LA219_0<=59)||LA219_0==61||LA219_0==63||LA219_0==65||LA219_0==68||LA219_0==70||LA219_0==72||(LA219_0>=74 && LA219_0<=77)||(LA219_0>=79 && LA219_0<=84)||LA219_0==86||LA219_0==88||(LA219_0>=90 && LA219_0<=94)||(LA219_0>=114 && LA219_0<=128)||LA219_0==130||(LA219_0>=132 && LA219_0<=135)||LA219_0==142||(LA219_0>=147 && LA219_0<=148)) ) {
                alt219=1;
            }
            switch (alt219) {
                case 1 :
                    // InternalQVTrelation.g:9569:4: ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) ) ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )*
                    {
                    // InternalQVTrelation.g:9569:4: ( (lv_ownedArguments_2_0= ruleNavigatingArgCS ) )
                    // InternalQVTrelation.g:9570:5: (lv_ownedArguments_2_0= ruleNavigatingArgCS )
                    {
                    // InternalQVTrelation.g:9570:5: (lv_ownedArguments_2_0= ruleNavigatingArgCS )
                    // InternalQVTrelation.g:9571:6: lv_ownedArguments_2_0= ruleNavigatingArgCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingArgCSParserRuleCall_2_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_123);
                    lv_ownedArguments_2_0=ruleNavigatingArgCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedArguments",
                      							lv_ownedArguments_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:9588:4: ( ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) ) )*
                    loop218:
                    do {
                        int alt218=2;
                        int LA218_0 = input.LA(1);

                        if ( ((LA218_0>=22 && LA218_0<=23)||LA218_0==141) ) {
                            alt218=1;
                        }


                        switch (alt218) {
                    	case 1 :
                    	    // InternalQVTrelation.g:9589:5: ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) )
                    	    {
                    	    // InternalQVTrelation.g:9589:5: ( (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS ) )
                    	    // InternalQVTrelation.g:9590:6: (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS )
                    	    {
                    	    // InternalQVTrelation.g:9590:6: (lv_ownedArguments_3_1= ruleNavigatingCommaArgCS | lv_ownedArguments_3_2= ruleNavigatingSemiArgCS | lv_ownedArguments_3_3= ruleNavigatingBarArgCS )
                    	    int alt217=3;
                    	    switch ( input.LA(1) ) {
                    	    case 23:
                    	        {
                    	        alt217=1;
                    	        }
                    	        break;
                    	    case 22:
                    	        {
                    	        alt217=2;
                    	        }
                    	        break;
                    	    case 141:
                    	        {
                    	        alt217=3;
                    	        }
                    	        break;
                    	    default:
                    	        if (state.backtracking>0) {state.failed=true; return current;}
                    	        NoViableAltException nvae =
                    	            new NoViableAltException("", 217, 0, input);

                    	        throw nvae;
                    	    }

                    	    switch (alt217) {
                    	        case 1 :
                    	            // InternalQVTrelation.g:9591:7: lv_ownedArguments_3_1= ruleNavigatingCommaArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              							newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingCommaArgCSParserRuleCall_2_1_0_0());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_123);
                    	            lv_ownedArguments_3_1=ruleNavigatingCommaArgCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							if (current==null) {
                    	              								current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                    	              							}
                    	              							add(
                    	              								current,
                    	              								"ownedArguments",
                    	              								lv_ownedArguments_3_1,
                    	              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingCommaArgCS");
                    	              							afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;
                    	        case 2 :
                    	            // InternalQVTrelation.g:9607:7: lv_ownedArguments_3_2= ruleNavigatingSemiArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              							newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingSemiArgCSParserRuleCall_2_1_0_1());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_123);
                    	            lv_ownedArguments_3_2=ruleNavigatingSemiArgCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							if (current==null) {
                    	              								current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                    	              							}
                    	              							add(
                    	              								current,
                    	              								"ownedArguments",
                    	              								lv_ownedArguments_3_2,
                    	              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingSemiArgCS");
                    	              							afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;
                    	        case 3 :
                    	            // InternalQVTrelation.g:9623:7: lv_ownedArguments_3_3= ruleNavigatingBarArgCS
                    	            {
                    	            if ( state.backtracking==0 ) {

                    	              							newCompositeNode(grammarAccess.getRoundBracketedClauseCSAccess().getOwnedArgumentsNavigatingBarArgCSParserRuleCall_2_1_0_2());

                    	            }
                    	            pushFollow(FollowSets000.FOLLOW_123);
                    	            lv_ownedArguments_3_3=ruleNavigatingBarArgCS();

                    	            state._fsp--;
                    	            if (state.failed) return current;
                    	            if ( state.backtracking==0 ) {

                    	              							if (current==null) {
                    	              								current = createModelElementForParent(grammarAccess.getRoundBracketedClauseCSRule());
                    	              							}
                    	              							add(
                    	              								current,
                    	              								"ownedArguments",
                    	              								lv_ownedArguments_3_3,
                    	              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingBarArgCS");
                    	              							afterParserOrEnumRuleCall();

                    	            }

                    	            }
                    	            break;

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop218;
                        }
                    } while (true);


                    }
                    break;

            }

            otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getRoundBracketedClauseCSAccess().getRightParenthesisKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleRoundBracketedClauseCS"


    // $ANTLR start "entryRuleSquareBracketedClauseCS"
    // InternalQVTrelation.g:9650:1: entryRuleSquareBracketedClauseCS returns [EObject current=null] : iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF ;
    public final EObject entryRuleSquareBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSquareBracketedClauseCS = null;


        try {
            // InternalQVTrelation.g:9650:64: (iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF )
            // InternalQVTrelation.g:9651:2: iv_ruleSquareBracketedClauseCS= ruleSquareBracketedClauseCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSquareBracketedClauseCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSquareBracketedClauseCS=ruleSquareBracketedClauseCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSquareBracketedClauseCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSquareBracketedClauseCS"


    // $ANTLR start "ruleSquareBracketedClauseCS"
    // InternalQVTrelation.g:9657:1: ruleSquareBracketedClauseCS returns [EObject current=null] : (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' ) ;
    public final EObject ruleSquareBracketedClauseCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedTerms_1_0 = null;

        EObject lv_ownedTerms_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9663:2: ( (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' ) )
            // InternalQVTrelation.g:9664:2: (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' )
            {
            // InternalQVTrelation.g:9664:2: (otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']' )
            // InternalQVTrelation.g:9665:3: otherlv_0= '[' ( (lv_ownedTerms_1_0= ruleExpCS ) ) (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )* otherlv_4= ']'
            {
            otherlv_0=(Token)match(input,138,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getSquareBracketedClauseCSAccess().getLeftSquareBracketKeyword_0());

            }
            // InternalQVTrelation.g:9669:3: ( (lv_ownedTerms_1_0= ruleExpCS ) )
            // InternalQVTrelation.g:9670:4: (lv_ownedTerms_1_0= ruleExpCS )
            {
            // InternalQVTrelation.g:9670:4: (lv_ownedTerms_1_0= ruleExpCS )
            // InternalQVTrelation.g:9671:5: lv_ownedTerms_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_124);
            lv_ownedTerms_1_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getSquareBracketedClauseCSRule());
              					}
              					add(
              						current,
              						"ownedTerms",
              						lv_ownedTerms_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:9688:3: (otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) ) )*
            loop220:
            do {
                int alt220=2;
                int LA220_0 = input.LA(1);

                if ( (LA220_0==23) ) {
                    alt220=1;
                }


                switch (alt220) {
            	case 1 :
            	    // InternalQVTrelation.g:9689:4: otherlv_2= ',' ( (lv_ownedTerms_3_0= ruleExpCS ) )
            	    {
            	    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_19); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getSquareBracketedClauseCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTrelation.g:9693:4: ( (lv_ownedTerms_3_0= ruleExpCS ) )
            	    // InternalQVTrelation.g:9694:5: (lv_ownedTerms_3_0= ruleExpCS )
            	    {
            	    // InternalQVTrelation.g:9694:5: (lv_ownedTerms_3_0= ruleExpCS )
            	    // InternalQVTrelation.g:9695:6: lv_ownedTerms_3_0= ruleExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getSquareBracketedClauseCSAccess().getOwnedTermsExpCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_124);
            	    lv_ownedTerms_3_0=ruleExpCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getSquareBracketedClauseCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedTerms",
            	      							lv_ownedTerms_3_0,
            	      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop220;
                }
            } while (true);

            otherlv_4=(Token)match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getSquareBracketedClauseCSAccess().getRightSquareBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSquareBracketedClauseCS"


    // $ANTLR start "entryRuleNavigatingArgCS"
    // InternalQVTrelation.g:9721:1: entryRuleNavigatingArgCS returns [EObject current=null] : iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF ;
    public final EObject entryRuleNavigatingArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingArgCS = null;


        try {
            // InternalQVTrelation.g:9721:56: (iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF )
            // InternalQVTrelation.g:9722:2: iv_ruleNavigatingArgCS= ruleNavigatingArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingArgCS=ruleNavigatingArgCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNavigatingArgCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNavigatingArgCS"


    // $ANTLR start "ruleNavigatingArgCS"
    // InternalQVTrelation.g:9728:1: ruleNavigatingArgCS returns [EObject current=null] : ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) ) ;
    public final EObject ruleNavigatingArgCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        Token otherlv_17=null;
        EObject lv_ownedNameExpression_0_0 = null;

        EObject lv_ownedCoIterator_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;

        EObject lv_ownedType_6_0 = null;

        EObject lv_ownedCoIterator_8_0 = null;

        EObject lv_ownedInitExpression_10_0 = null;

        EObject lv_ownedType_12_0 = null;

        EObject lv_ownedCoIterator_14_0 = null;

        EObject lv_ownedInitExpression_16_0 = null;

        EObject lv_ownedType_18_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:9734:2: ( ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) ) )
            // InternalQVTrelation.g:9735:2: ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) )
            {
            // InternalQVTrelation.g:9735:2: ( ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? ) | (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) ) )
            int alt227=2;
            int LA227_0 = input.LA(1);

            if ( (LA227_0==RULE_SINGLE_QUOTED_STRING||(LA227_0>=RULE_INT && LA227_0<=RULE_ESCAPED_ID)||LA227_0==17||(LA227_0>=25 && LA227_0<=33)||(LA227_0>=35 && LA227_0<=43)||(LA227_0>=45 && LA227_0<=59)||LA227_0==61||LA227_0==63||LA227_0==65||LA227_0==68||LA227_0==70||LA227_0==72||(LA227_0>=74 && LA227_0<=77)||(LA227_0>=79 && LA227_0<=84)||LA227_0==86||LA227_0==88||(LA227_0>=90 && LA227_0<=94)||(LA227_0>=114 && LA227_0<=128)||LA227_0==130||(LA227_0>=132 && LA227_0<=135)||LA227_0==142||(LA227_0>=147 && LA227_0<=148)) ) {
                alt227=1;
            }
            else if ( (LA227_0==18) ) {
                alt227=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 227, 0, input);

                throw nvae;
            }
            switch (alt227) {
                case 1 :
                    // InternalQVTrelation.g:9736:3: ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? )
                    {
                    // InternalQVTrelation.g:9736:3: ( ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )? )
                    // InternalQVTrelation.g:9737:4: ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) ) ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )?
                    {
                    // InternalQVTrelation.g:9737:4: ( (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS ) )
                    // InternalQVTrelation.g:9738:5: (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS )
                    {
                    // InternalQVTrelation.g:9738:5: (lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS )
                    // InternalQVTrelation.g:9739:6: lv_ownedNameExpression_0_0= ruleNavigatingArgExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_0_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_125);
                    lv_ownedNameExpression_0_0=ruleNavigatingArgExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedNameExpression",
                      							lv_ownedNameExpression_0_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:9756:4: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )?
                    int alt226=4;
                    alt226 = dfa226.predict(input);
                    switch (alt226) {
                        case 1 :
                            // InternalQVTrelation.g:9757:5: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                            {
                            // InternalQVTrelation.g:9757:5: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
                            // InternalQVTrelation.g:9758:6: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                            {
                            otherlv_1=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_1, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_0_0());

                            }
                            // InternalQVTrelation.g:9762:6: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
                            // InternalQVTrelation.g:9763:7: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
                            {
                            // InternalQVTrelation.g:9763:7: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
                            // InternalQVTrelation.g:9764:8: lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_126);
                            lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedCoIterator",
                              									lv_ownedCoIterator_2_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTrelation.g:9781:6: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
                            int alt221=2;
                            int LA221_0 = input.LA(1);

                            if ( (LA221_0==19) ) {
                                alt221=1;
                            }
                            switch (alt221) {
                                case 1 :
                                    // InternalQVTrelation.g:9782:7: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                                    {
                                    otherlv_3=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(otherlv_3, grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_0_2_0());

                                    }
                                    // InternalQVTrelation.g:9786:7: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                                    // InternalQVTrelation.g:9787:8: (lv_ownedInitExpression_4_0= ruleExpCS )
                                    {
                                    // InternalQVTrelation.g:9787:8: (lv_ownedInitExpression_4_0= ruleExpCS )
                                    // InternalQVTrelation.g:9788:9: lv_ownedInitExpression_4_0= ruleExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_ownedInitExpression_4_0=ruleExpCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      									}
                                      									set(
                                      										current,
                                      										"ownedInitExpression",
                                      										lv_ownedInitExpression_4_0,
                                      										"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 2 :
                            // InternalQVTrelation.g:9808:5: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                            {
                            // InternalQVTrelation.g:9808:5: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
                            // InternalQVTrelation.g:9809:6: otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
                            {
                            otherlv_5=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_5, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_1_0());

                            }
                            // InternalQVTrelation.g:9813:6: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
                            // InternalQVTrelation.g:9814:7: (lv_ownedType_6_0= ruleTypeExpCS )
                            {
                            // InternalQVTrelation.g:9814:7: (lv_ownedType_6_0= ruleTypeExpCS )
                            // InternalQVTrelation.g:9815:8: lv_ownedType_6_0= ruleTypeExpCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_127);
                            lv_ownedType_6_0=ruleTypeExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedType",
                              									lv_ownedType_6_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }

                            // InternalQVTrelation.g:9832:6: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
                            int alt222=2;
                            int LA222_0 = input.LA(1);

                            if ( (LA222_0==131) ) {
                                alt222=1;
                            }
                            switch (alt222) {
                                case 1 :
                                    // InternalQVTrelation.g:9833:7: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                    {
                                    otherlv_7=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(otherlv_7, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_1_2_0());

                                    }
                                    // InternalQVTrelation.g:9837:7: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                                    // InternalQVTrelation.g:9838:8: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                                    {
                                    // InternalQVTrelation.g:9838:8: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                                    // InternalQVTrelation.g:9839:9: lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_126);
                                    lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      									}
                                      									set(
                                      										current,
                                      										"ownedCoIterator",
                                      										lv_ownedCoIterator_8_0,
                                      										"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalQVTrelation.g:9857:6: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
                            int alt223=2;
                            int LA223_0 = input.LA(1);

                            if ( (LA223_0==19) ) {
                                alt223=1;
                            }
                            switch (alt223) {
                                case 1 :
                                    // InternalQVTrelation.g:9858:7: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                                    {
                                    otherlv_9=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(otherlv_9, grammarAccess.getNavigatingArgCSAccess().getEqualsSignKeyword_0_1_1_3_0());

                                    }
                                    // InternalQVTrelation.g:9862:7: ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                                    // InternalQVTrelation.g:9863:8: (lv_ownedInitExpression_10_0= ruleExpCS )
                                    {
                                    // InternalQVTrelation.g:9863:8: (lv_ownedInitExpression_10_0= ruleExpCS )
                                    // InternalQVTrelation.g:9864:9: lv_ownedInitExpression_10_0= ruleExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_2);
                                    lv_ownedInitExpression_10_0=ruleExpCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      									}
                                      									set(
                                      										current,
                                      										"ownedInitExpression",
                                      										lv_ownedInitExpression_10_0,
                                      										"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }


                            }
                            break;
                        case 3 :
                            // InternalQVTrelation.g:9884:5: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
                            {
                            // InternalQVTrelation.g:9884:5: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
                            // InternalQVTrelation.g:9885:6: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
                            {
                            // InternalQVTrelation.g:9885:6: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
                            int alt224=2;
                            int LA224_0 = input.LA(1);

                            if ( (LA224_0==18) ) {
                                alt224=1;
                            }
                            switch (alt224) {
                                case 1 :
                                    // InternalQVTrelation.g:9886:7: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                    {
                                    otherlv_11=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(otherlv_11, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_0_1_2_0_0());

                                    }
                                    // InternalQVTrelation.g:9890:7: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                                    // InternalQVTrelation.g:9891:8: (lv_ownedType_12_0= ruleTypeExpCS )
                                    {
                                    // InternalQVTrelation.g:9891:8: (lv_ownedType_12_0= ruleTypeExpCS )
                                    // InternalQVTrelation.g:9892:9: lv_ownedType_12_0= ruleTypeExpCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_128);
                                    lv_ownedType_12_0=ruleTypeExpCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      									}
                                      									set(
                                      										current,
                                      										"ownedType",
                                      										lv_ownedType_12_0,
                                      										"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            // InternalQVTrelation.g:9910:6: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
                            int alt225=2;
                            int LA225_0 = input.LA(1);

                            if ( (LA225_0==131) ) {
                                alt225=1;
                            }
                            switch (alt225) {
                                case 1 :
                                    // InternalQVTrelation.g:9911:7: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                    {
                                    otherlv_13=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      							newLeafNode(otherlv_13, grammarAccess.getNavigatingArgCSAccess().getLessThanSignHyphenMinusKeyword_0_1_2_1_0());

                                    }
                                    // InternalQVTrelation.g:9915:7: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                                    // InternalQVTrelation.g:9916:8: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                                    {
                                    // InternalQVTrelation.g:9916:8: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                                    // InternalQVTrelation.g:9917:9: lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS
                                    {
                                    if ( state.backtracking==0 ) {

                                      									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());

                                    }
                                    pushFollow(FollowSets000.FOLLOW_129);
                                    lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();

                                    state._fsp--;
                                    if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      									if (current==null) {
                                      										current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                                      									}
                                      									set(
                                      										current,
                                      										"ownedCoIterator",
                                      										lv_ownedCoIterator_14_0,
                                      										"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                                      									afterParserOrEnumRuleCall();

                                    }

                                    }


                                    }


                                    }
                                    break;

                            }

                            otherlv_15=(Token)match(input,140,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_15, grammarAccess.getNavigatingArgCSAccess().getInKeyword_0_1_2_2());

                            }
                            // InternalQVTrelation.g:9939:6: ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
                            // InternalQVTrelation.g:9940:7: (lv_ownedInitExpression_16_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:9940:7: (lv_ownedInitExpression_16_0= ruleExpCS )
                            // InternalQVTrelation.g:9941:8: lv_ownedInitExpression_16_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_16_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedInitExpression",
                              									lv_ownedInitExpression_16_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:9962:3: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                    {
                    // InternalQVTrelation.g:9962:3: (otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) ) )
                    // InternalQVTrelation.g:9963:4: otherlv_17= ':' ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                    {
                    otherlv_17=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_17, grammarAccess.getNavigatingArgCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTrelation.g:9967:4: ( (lv_ownedType_18_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:9968:5: (lv_ownedType_18_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:9968:5: (lv_ownedType_18_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:9969:6: lv_ownedType_18_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedType_18_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getNavigatingArgCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_18_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNavigatingArgCS"


    // $ANTLR start "entryRuleNavigatingBarArgCS"
    // InternalQVTrelation.g:9991:1: entryRuleNavigatingBarArgCS returns [EObject current=null] : iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF ;
    public final EObject entryRuleNavigatingBarArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingBarArgCS = null;


        try {
            // InternalQVTrelation.g:9991:59: (iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF )
            // InternalQVTrelation.g:9992:2: iv_ruleNavigatingBarArgCS= ruleNavigatingBarArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingBarArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingBarArgCS=ruleNavigatingBarArgCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNavigatingBarArgCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNavigatingBarArgCS"


    // $ANTLR start "ruleNavigatingBarArgCS"
    // InternalQVTrelation.g:9998:1: ruleNavigatingBarArgCS returns [EObject current=null] : ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) ;
    public final EObject ruleNavigatingBarArgCS() throws RecognitionException {
        EObject current = null;

        Token lv_prefix_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedNameExpression_1_0 = null;

        EObject lv_ownedType_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10004:2: ( ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) )
            // InternalQVTrelation.g:10005:2: ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            {
            // InternalQVTrelation.g:10005:2: ( ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            // InternalQVTrelation.g:10006:3: ( (lv_prefix_0_0= '|' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            {
            // InternalQVTrelation.g:10006:3: ( (lv_prefix_0_0= '|' ) )
            // InternalQVTrelation.g:10007:4: (lv_prefix_0_0= '|' )
            {
            // InternalQVTrelation.g:10007:4: (lv_prefix_0_0= '|' )
            // InternalQVTrelation.g:10008:5: lv_prefix_0_0= '|'
            {
            lv_prefix_0_0=(Token)match(input,141,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingBarArgCSAccess().getPrefixVerticalLineKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getNavigatingBarArgCSRule());
              					}
              					setWithLastConsumed(current, "prefix", lv_prefix_0_0, "|");

            }

            }


            }

            // InternalQVTrelation.g:10020:3: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalQVTrelation.g:10021:4: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalQVTrelation.g:10021:4: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalQVTrelation.g:10022:5: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_130);
            lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getNavigatingBarArgCSRule());
              					}
              					set(
              						current,
              						"ownedNameExpression",
              						lv_ownedNameExpression_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10039:3: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            int alt229=2;
            int LA229_0 = input.LA(1);

            if ( (LA229_0==18) ) {
                alt229=1;
            }
            switch (alt229) {
                case 1 :
                    // InternalQVTrelation.g:10040:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getNavigatingBarArgCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTrelation.g:10044:4: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:10045:5: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:10045:5: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:10046:6: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_126);
                    lv_ownedType_3_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getNavigatingBarArgCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_3_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:10063:4: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt228=2;
                    int LA228_0 = input.LA(1);

                    if ( (LA228_0==19) ) {
                        alt228=1;
                    }
                    switch (alt228) {
                        case 1 :
                            // InternalQVTrelation.g:10064:5: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_4, grammarAccess.getNavigatingBarArgCSAccess().getEqualsSignKeyword_2_2_0());

                            }
                            // InternalQVTrelation.g:10068:5: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalQVTrelation.g:10069:6: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:10069:6: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalQVTrelation.g:10070:7: lv_ownedInitExpression_5_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getNavigatingBarArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_5_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getNavigatingBarArgCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedInitExpression",
                              								lv_ownedInitExpression_5_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNavigatingBarArgCS"


    // $ANTLR start "entryRuleNavigatingCommaArgCS"
    // InternalQVTrelation.g:10093:1: entryRuleNavigatingCommaArgCS returns [EObject current=null] : iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF ;
    public final EObject entryRuleNavigatingCommaArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingCommaArgCS = null;


        try {
            // InternalQVTrelation.g:10093:61: (iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF )
            // InternalQVTrelation.g:10094:2: iv_ruleNavigatingCommaArgCS= ruleNavigatingCommaArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingCommaArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingCommaArgCS=ruleNavigatingCommaArgCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNavigatingCommaArgCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNavigatingCommaArgCS"


    // $ANTLR start "ruleNavigatingCommaArgCS"
    // InternalQVTrelation.g:10100:1: ruleNavigatingCommaArgCS returns [EObject current=null] : ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? ) ;
    public final EObject ruleNavigatingCommaArgCS() throws RecognitionException {
        EObject current = null;

        Token lv_prefix_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        EObject lv_ownedNameExpression_1_0 = null;

        EObject lv_ownedCoIterator_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;

        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedCoIterator_9_0 = null;

        EObject lv_ownedInitExpression_11_0 = null;

        EObject lv_ownedType_13_0 = null;

        EObject lv_ownedCoIterator_15_0 = null;

        EObject lv_ownedInitExpression_17_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10106:2: ( ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? ) )
            // InternalQVTrelation.g:10107:2: ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? )
            {
            // InternalQVTrelation.g:10107:2: ( ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )? )
            // InternalQVTrelation.g:10108:3: ( (lv_prefix_0_0= ',' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )?
            {
            // InternalQVTrelation.g:10108:3: ( (lv_prefix_0_0= ',' ) )
            // InternalQVTrelation.g:10109:4: (lv_prefix_0_0= ',' )
            {
            // InternalQVTrelation.g:10109:4: (lv_prefix_0_0= ',' )
            // InternalQVTrelation.g:10110:5: lv_prefix_0_0= ','
            {
            lv_prefix_0_0=(Token)match(input,23,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingCommaArgCSAccess().getPrefixCommaKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getNavigatingCommaArgCSRule());
              					}
              					setWithLastConsumed(current, "prefix", lv_prefix_0_0, ",");

            }

            }


            }

            // InternalQVTrelation.g:10122:3: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalQVTrelation.g:10123:4: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalQVTrelation.g:10123:4: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalQVTrelation.g:10124:5: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_125);
            lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
              					}
              					set(
              						current,
              						"ownedNameExpression",
              						lv_ownedNameExpression_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10141:3: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )?
            int alt235=4;
            alt235 = dfa235.predict(input);
            switch (alt235) {
                case 1 :
                    // InternalQVTrelation.g:10142:4: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTrelation.g:10142:4: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
                    // InternalQVTrelation.g:10143:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_2, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_0_0());

                    }
                    // InternalQVTrelation.g:10147:5: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
                    // InternalQVTrelation.g:10148:6: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
                    {
                    // InternalQVTrelation.g:10148:6: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
                    // InternalQVTrelation.g:10149:7: lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_126);
                    lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                      							}
                      							set(
                      								current,
                      								"ownedCoIterator",
                      								lv_ownedCoIterator_3_0,
                      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:10166:5: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt230=2;
                    int LA230_0 = input.LA(1);

                    if ( (LA230_0==19) ) {
                        alt230=1;
                    }
                    switch (alt230) {
                        case 1 :
                            // InternalQVTrelation.g:10167:6: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_4, grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_0_2_0());

                            }
                            // InternalQVTrelation.g:10171:6: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalQVTrelation.g:10172:7: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:10172:7: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalQVTrelation.g:10173:8: lv_ownedInitExpression_5_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_5_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedInitExpression",
                              									lv_ownedInitExpression_5_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:10193:4: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                    {
                    // InternalQVTrelation.g:10193:4: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
                    // InternalQVTrelation.g:10194:5: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
                    {
                    otherlv_6=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_6, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_1_0());

                    }
                    // InternalQVTrelation.g:10198:5: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:10199:6: (lv_ownedType_7_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:10199:6: (lv_ownedType_7_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:10200:7: lv_ownedType_7_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_127);
                    lv_ownedType_7_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                      							}
                      							set(
                      								current,
                      								"ownedType",
                      								lv_ownedType_7_0,
                      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:10217:5: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
                    int alt231=2;
                    int LA231_0 = input.LA(1);

                    if ( (LA231_0==131) ) {
                        alt231=1;
                    }
                    switch (alt231) {
                        case 1 :
                            // InternalQVTrelation.g:10218:6: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                            {
                            otherlv_8=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_8, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_1_2_0());

                            }
                            // InternalQVTrelation.g:10222:6: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                            // InternalQVTrelation.g:10223:7: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                            {
                            // InternalQVTrelation.g:10223:7: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                            // InternalQVTrelation.g:10224:8: lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_126);
                            lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedCoIterator",
                              									lv_ownedCoIterator_9_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalQVTrelation.g:10242:5: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
                    int alt232=2;
                    int LA232_0 = input.LA(1);

                    if ( (LA232_0==19) ) {
                        alt232=1;
                    }
                    switch (alt232) {
                        case 1 :
                            // InternalQVTrelation.g:10243:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                            {
                            otherlv_10=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_10, grammarAccess.getNavigatingCommaArgCSAccess().getEqualsSignKeyword_2_1_3_0());

                            }
                            // InternalQVTrelation.g:10247:6: ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                            // InternalQVTrelation.g:10248:7: (lv_ownedInitExpression_11_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:10248:7: (lv_ownedInitExpression_11_0= ruleExpCS )
                            // InternalQVTrelation.g:10249:8: lv_ownedInitExpression_11_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_11_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedInitExpression",
                              									lv_ownedInitExpression_11_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }


                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:10269:4: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
                    {
                    // InternalQVTrelation.g:10269:4: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
                    // InternalQVTrelation.g:10270:5: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
                    {
                    // InternalQVTrelation.g:10270:5: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
                    int alt233=2;
                    int LA233_0 = input.LA(1);

                    if ( (LA233_0==18) ) {
                        alt233=1;
                    }
                    switch (alt233) {
                        case 1 :
                            // InternalQVTrelation.g:10271:6: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                            {
                            otherlv_12=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_12, grammarAccess.getNavigatingCommaArgCSAccess().getColonKeyword_2_2_0_0());

                            }
                            // InternalQVTrelation.g:10275:6: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                            // InternalQVTrelation.g:10276:7: (lv_ownedType_13_0= ruleTypeExpCS )
                            {
                            // InternalQVTrelation.g:10276:7: (lv_ownedType_13_0= ruleTypeExpCS )
                            // InternalQVTrelation.g:10277:8: lv_ownedType_13_0= ruleTypeExpCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_128);
                            lv_ownedType_13_0=ruleTypeExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedType",
                              									lv_ownedType_13_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    // InternalQVTrelation.g:10295:5: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
                    int alt234=2;
                    int LA234_0 = input.LA(1);

                    if ( (LA234_0==131) ) {
                        alt234=1;
                    }
                    switch (alt234) {
                        case 1 :
                            // InternalQVTrelation.g:10296:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                            {
                            otherlv_14=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              						newLeafNode(otherlv_14, grammarAccess.getNavigatingCommaArgCSAccess().getLessThanSignHyphenMinusKeyword_2_2_1_0());

                            }
                            // InternalQVTrelation.g:10300:6: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                            // InternalQVTrelation.g:10301:7: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                            {
                            // InternalQVTrelation.g:10301:7: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                            // InternalQVTrelation.g:10302:8: lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS
                            {
                            if ( state.backtracking==0 ) {

                              								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_129);
                            lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              								if (current==null) {
                              									current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                              								}
                              								set(
                              									current,
                              									"ownedCoIterator",
                              									lv_ownedCoIterator_15_0,
                              									"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.CoIteratorVariableCS");
                              								afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }

                    otherlv_16=(Token)match(input,140,FollowSets000.FOLLOW_19); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(otherlv_16, grammarAccess.getNavigatingCommaArgCSAccess().getInKeyword_2_2_2());

                    }
                    // InternalQVTrelation.g:10324:5: ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
                    // InternalQVTrelation.g:10325:6: (lv_ownedInitExpression_17_0= ruleExpCS )
                    {
                    // InternalQVTrelation.g:10325:6: (lv_ownedInitExpression_17_0= ruleExpCS )
                    // InternalQVTrelation.g:10326:7: lv_ownedInitExpression_17_0= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      							newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedInitExpression_17_0=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      							if (current==null) {
                      								current = createModelElementForParent(grammarAccess.getNavigatingCommaArgCSRule());
                      							}
                      							set(
                      								current,
                      								"ownedInitExpression",
                      								lv_ownedInitExpression_17_0,
                      								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      							afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNavigatingCommaArgCS"


    // $ANTLR start "entryRuleNavigatingSemiArgCS"
    // InternalQVTrelation.g:10349:1: entryRuleNavigatingSemiArgCS returns [EObject current=null] : iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF ;
    public final EObject entryRuleNavigatingSemiArgCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingSemiArgCS = null;


        try {
            // InternalQVTrelation.g:10349:60: (iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF )
            // InternalQVTrelation.g:10350:2: iv_ruleNavigatingSemiArgCS= ruleNavigatingSemiArgCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingSemiArgCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingSemiArgCS=ruleNavigatingSemiArgCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNavigatingSemiArgCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNavigatingSemiArgCS"


    // $ANTLR start "ruleNavigatingSemiArgCS"
    // InternalQVTrelation.g:10356:1: ruleNavigatingSemiArgCS returns [EObject current=null] : ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) ;
    public final EObject ruleNavigatingSemiArgCS() throws RecognitionException {
        EObject current = null;

        Token lv_prefix_0_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedNameExpression_1_0 = null;

        EObject lv_ownedType_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10362:2: ( ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? ) )
            // InternalQVTrelation.g:10363:2: ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            {
            // InternalQVTrelation.g:10363:2: ( ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )? )
            // InternalQVTrelation.g:10364:3: ( (lv_prefix_0_0= ';' ) ) ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) ) (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            {
            // InternalQVTrelation.g:10364:3: ( (lv_prefix_0_0= ';' ) )
            // InternalQVTrelation.g:10365:4: (lv_prefix_0_0= ';' )
            {
            // InternalQVTrelation.g:10365:4: (lv_prefix_0_0= ';' )
            // InternalQVTrelation.g:10366:5: lv_prefix_0_0= ';'
            {
            lv_prefix_0_0=(Token)match(input,22,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					newLeafNode(lv_prefix_0_0, grammarAccess.getNavigatingSemiArgCSAccess().getPrefixSemicolonKeyword_0_0());

            }
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElement(grammarAccess.getNavigatingSemiArgCSRule());
              					}
              					setWithLastConsumed(current, "prefix", lv_prefix_0_0, ";");

            }

            }


            }

            // InternalQVTrelation.g:10378:3: ( (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS ) )
            // InternalQVTrelation.g:10379:4: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            {
            // InternalQVTrelation.g:10379:4: (lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS )
            // InternalQVTrelation.g:10380:5: lv_ownedNameExpression_1_0= ruleNavigatingArgExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedNameExpressionNavigatingArgExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_130);
            lv_ownedNameExpression_1_0=ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getNavigatingSemiArgCSRule());
              					}
              					set(
              						current,
              						"ownedNameExpression",
              						lv_ownedNameExpression_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.NavigatingArgExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10397:3: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )?
            int alt237=2;
            int LA237_0 = input.LA(1);

            if ( (LA237_0==18) ) {
                alt237=1;
            }
            switch (alt237) {
                case 1 :
                    // InternalQVTrelation.g:10398:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    {
                    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getNavigatingSemiArgCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTrelation.g:10402:4: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:10403:5: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:10403:5: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:10404:6: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_126);
                    lv_ownedType_3_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getNavigatingSemiArgCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_3_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:10421:4: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
                    int alt236=2;
                    int LA236_0 = input.LA(1);

                    if ( (LA236_0==19) ) {
                        alt236=1;
                    }
                    switch (alt236) {
                        case 1 :
                            // InternalQVTrelation.g:10422:5: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            {
                            otherlv_4=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              					newLeafNode(otherlv_4, grammarAccess.getNavigatingSemiArgCSAccess().getEqualsSignKeyword_2_2_0());

                            }
                            // InternalQVTrelation.g:10426:5: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                            // InternalQVTrelation.g:10427:6: (lv_ownedInitExpression_5_0= ruleExpCS )
                            {
                            // InternalQVTrelation.g:10427:6: (lv_ownedInitExpression_5_0= ruleExpCS )
                            // InternalQVTrelation.g:10428:7: lv_ownedInitExpression_5_0= ruleExpCS
                            {
                            if ( state.backtracking==0 ) {

                              							newCompositeNode(grammarAccess.getNavigatingSemiArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_1_0());

                            }
                            pushFollow(FollowSets000.FOLLOW_2);
                            lv_ownedInitExpression_5_0=ruleExpCS();

                            state._fsp--;
                            if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              							if (current==null) {
                              								current = createModelElementForParent(grammarAccess.getNavigatingSemiArgCSRule());
                              							}
                              							set(
                              								current,
                              								"ownedInitExpression",
                              								lv_ownedInitExpression_5_0,
                              								"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                              							afterParserOrEnumRuleCall();

                            }

                            }


                            }


                            }
                            break;

                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNavigatingSemiArgCS"


    // $ANTLR start "entryRuleNavigatingArgExpCS"
    // InternalQVTrelation.g:10451:1: entryRuleNavigatingArgExpCS returns [EObject current=null] : iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF ;
    public final EObject entryRuleNavigatingArgExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNavigatingArgExpCS = null;


        try {
            // InternalQVTrelation.g:10451:59: (iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF )
            // InternalQVTrelation.g:10452:2: iv_ruleNavigatingArgExpCS= ruleNavigatingArgExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNavigatingArgExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNavigatingArgExpCS=ruleNavigatingArgExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNavigatingArgExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNavigatingArgExpCS"


    // $ANTLR start "ruleNavigatingArgExpCS"
    // InternalQVTrelation.g:10458:1: ruleNavigatingArgExpCS returns [EObject current=null] : this_ExpCS_0= ruleExpCS ;
    public final EObject ruleNavigatingArgExpCS() throws RecognitionException {
        EObject current = null;

        EObject this_ExpCS_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10464:2: (this_ExpCS_0= ruleExpCS )
            // InternalQVTrelation.g:10465:2: this_ExpCS_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              		/* */

            }
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getNavigatingArgExpCSAccess().getExpCSParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_ExpCS_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current = this_ExpCS_0;
              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNavigatingArgExpCS"


    // $ANTLR start "entryRuleCoIteratorVariableCS"
    // InternalQVTrelation.g:10479:1: entryRuleCoIteratorVariableCS returns [EObject current=null] : iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF ;
    public final EObject entryRuleCoIteratorVariableCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCoIteratorVariableCS = null;


        try {
            // InternalQVTrelation.g:10479:61: (iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF )
            // InternalQVTrelation.g:10480:2: iv_ruleCoIteratorVariableCS= ruleCoIteratorVariableCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCoIteratorVariableCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleCoIteratorVariableCS=ruleCoIteratorVariableCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleCoIteratorVariableCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleCoIteratorVariableCS"


    // $ANTLR start "ruleCoIteratorVariableCS"
    // InternalQVTrelation.g:10486:1: ruleCoIteratorVariableCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) ;
    public final EObject ruleCoIteratorVariableCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedType_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10492:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? ) )
            // InternalQVTrelation.g:10493:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            {
            // InternalQVTrelation.g:10493:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )? )
            // InternalQVTrelation.g:10494:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            {
            // InternalQVTrelation.g:10494:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:10495:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:10495:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:10496:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getCoIteratorVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_130);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getCoIteratorVariableCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10513:3: (otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) ) )?
            int alt238=2;
            int LA238_0 = input.LA(1);

            if ( (LA238_0==18) ) {
                alt238=1;
            }
            switch (alt238) {
                case 1 :
                    // InternalQVTrelation.g:10514:4: otherlv_1= ':' ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    {
                    otherlv_1=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getCoIteratorVariableCSAccess().getColonKeyword_1_0());

                    }
                    // InternalQVTrelation.g:10518:4: ( (lv_ownedType_2_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:10519:5: (lv_ownedType_2_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:10519:5: (lv_ownedType_2_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:10520:6: lv_ownedType_2_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getCoIteratorVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedType_2_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getCoIteratorVariableCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_2_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCoIteratorVariableCS"


    // $ANTLR start "entryRuleIfExpCS"
    // InternalQVTrelation.g:10542:1: entryRuleIfExpCS returns [EObject current=null] : iv_ruleIfExpCS= ruleIfExpCS EOF ;
    public final EObject entryRuleIfExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleIfExpCS = null;


        try {
            // InternalQVTrelation.g:10542:48: (iv_ruleIfExpCS= ruleIfExpCS EOF )
            // InternalQVTrelation.g:10543:2: iv_ruleIfExpCS= ruleIfExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIfExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIfExpCS=ruleIfExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleIfExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleIfExpCS"


    // $ANTLR start "ruleIfExpCS"
    // InternalQVTrelation.g:10549:1: ruleIfExpCS returns [EObject current=null] : (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' ) ;
    public final EObject ruleIfExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedCondition_1_1 = null;

        EObject lv_ownedCondition_1_2 = null;

        EObject lv_ownedThenExpression_3_0 = null;

        EObject lv_ownedIfThenExpressions_4_0 = null;

        EObject lv_ownedElseExpression_6_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10555:2: ( (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' ) )
            // InternalQVTrelation.g:10556:2: (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' )
            {
            // InternalQVTrelation.g:10556:2: (otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif' )
            // InternalQVTrelation.g:10557:3: otherlv_0= 'if' ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )* otherlv_5= 'else' ( (lv_ownedElseExpression_6_0= ruleExpCS ) ) otherlv_7= 'endif'
            {
            otherlv_0=(Token)match(input,142,FollowSets000.FOLLOW_35); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getIfExpCSAccess().getIfKeyword_0());

            }
            // InternalQVTrelation.g:10561:3: ( ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) ) )
            // InternalQVTrelation.g:10562:4: ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) )
            {
            // InternalQVTrelation.g:10562:4: ( (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS ) )
            // InternalQVTrelation.g:10563:5: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )
            {
            // InternalQVTrelation.g:10563:5: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )
            int alt239=2;
            alt239 = dfa239.predict(input);
            switch (alt239) {
                case 1 :
                    // InternalQVTrelation.g:10564:6: lv_ownedCondition_1_1= ruleExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_131);
                    lv_ownedCondition_1_1=ruleExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getIfExpCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedCondition",
                      							lv_ownedCondition_1_1,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:10580:6: lv_ownedCondition_1_2= rulePatternExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedConditionPatternExpCSParserRuleCall_1_0_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_131);
                    lv_ownedCondition_1_2=rulePatternExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getIfExpCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedCondition",
                      							lv_ownedCondition_1_2,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.PatternExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }


            }

            otherlv_2=(Token)match(input,143,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getIfExpCSAccess().getThenKeyword_2());

            }
            // InternalQVTrelation.g:10602:3: ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            // InternalQVTrelation.g:10603:4: (lv_ownedThenExpression_3_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10603:4: (lv_ownedThenExpression_3_0= ruleExpCS )
            // InternalQVTrelation.g:10604:5: lv_ownedThenExpression_3_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_132);
            lv_ownedThenExpression_3_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getIfExpCSRule());
              					}
              					set(
              						current,
              						"ownedThenExpression",
              						lv_ownedThenExpression_3_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10621:3: ( (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS ) )*
            loop240:
            do {
                int alt240=2;
                int LA240_0 = input.LA(1);

                if ( (LA240_0==146) ) {
                    alt240=1;
                }


                switch (alt240) {
            	case 1 :
            	    // InternalQVTrelation.g:10622:4: (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS )
            	    {
            	    // InternalQVTrelation.g:10622:4: (lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS )
            	    // InternalQVTrelation.g:10623:5: lv_ownedIfThenExpressions_4_0= ruleElseIfThenExpCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      					newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedIfThenExpressionsElseIfThenExpCSParserRuleCall_4_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_132);
            	    lv_ownedIfThenExpressions_4_0=ruleElseIfThenExpCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      					if (current==null) {
            	      						current = createModelElementForParent(grammarAccess.getIfExpCSRule());
            	      					}
            	      					add(
            	      						current,
            	      						"ownedIfThenExpressions",
            	      						lv_ownedIfThenExpressions_4_0,
            	      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ElseIfThenExpCS");
            	      					afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }
            	    break;

            	default :
            	    break loop240;
                }
            } while (true);

            otherlv_5=(Token)match(input,144,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getIfExpCSAccess().getElseKeyword_5());

            }
            // InternalQVTrelation.g:10644:3: ( (lv_ownedElseExpression_6_0= ruleExpCS ) )
            // InternalQVTrelation.g:10645:4: (lv_ownedElseExpression_6_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10645:4: (lv_ownedElseExpression_6_0= ruleExpCS )
            // InternalQVTrelation.g:10646:5: lv_ownedElseExpression_6_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getIfExpCSAccess().getOwnedElseExpressionExpCSParserRuleCall_6_0());

            }
            pushFollow(FollowSets000.FOLLOW_133);
            lv_ownedElseExpression_6_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getIfExpCSRule());
              					}
              					set(
              						current,
              						"ownedElseExpression",
              						lv_ownedElseExpression_6_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_7=(Token)match(input,145,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_7, grammarAccess.getIfExpCSAccess().getEndifKeyword_7());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIfExpCS"


    // $ANTLR start "entryRuleElseIfThenExpCS"
    // InternalQVTrelation.g:10671:1: entryRuleElseIfThenExpCS returns [EObject current=null] : iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF ;
    public final EObject entryRuleElseIfThenExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleElseIfThenExpCS = null;


        try {
            // InternalQVTrelation.g:10671:56: (iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF )
            // InternalQVTrelation.g:10672:2: iv_ruleElseIfThenExpCS= ruleElseIfThenExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getElseIfThenExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleElseIfThenExpCS=ruleElseIfThenExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleElseIfThenExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleElseIfThenExpCS"


    // $ANTLR start "ruleElseIfThenExpCS"
    // InternalQVTrelation.g:10678:1: ruleElseIfThenExpCS returns [EObject current=null] : (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ) ;
    public final EObject ruleElseIfThenExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_ownedCondition_1_0 = null;

        EObject lv_ownedThenExpression_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10684:2: ( (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) ) )
            // InternalQVTrelation.g:10685:2: (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) )
            {
            // InternalQVTrelation.g:10685:2: (otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) ) )
            // InternalQVTrelation.g:10686:3: otherlv_0= 'elseif' ( (lv_ownedCondition_1_0= ruleExpCS ) ) otherlv_2= 'then' ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            {
            otherlv_0=(Token)match(input,146,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getElseIfThenExpCSAccess().getElseifKeyword_0());

            }
            // InternalQVTrelation.g:10690:3: ( (lv_ownedCondition_1_0= ruleExpCS ) )
            // InternalQVTrelation.g:10691:4: (lv_ownedCondition_1_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10691:4: (lv_ownedCondition_1_0= ruleExpCS )
            // InternalQVTrelation.g:10692:5: lv_ownedCondition_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getElseIfThenExpCSAccess().getOwnedConditionExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_131);
            lv_ownedCondition_1_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getElseIfThenExpCSRule());
              					}
              					set(
              						current,
              						"ownedCondition",
              						lv_ownedCondition_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,143,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getElseIfThenExpCSAccess().getThenKeyword_2());

            }
            // InternalQVTrelation.g:10713:3: ( (lv_ownedThenExpression_3_0= ruleExpCS ) )
            // InternalQVTrelation.g:10714:4: (lv_ownedThenExpression_3_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10714:4: (lv_ownedThenExpression_3_0= ruleExpCS )
            // InternalQVTrelation.g:10715:5: lv_ownedThenExpression_3_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getElseIfThenExpCSAccess().getOwnedThenExpressionExpCSParserRuleCall_3_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedThenExpression_3_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getElseIfThenExpCSRule());
              					}
              					set(
              						current,
              						"ownedThenExpression",
              						lv_ownedThenExpression_3_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleElseIfThenExpCS"


    // $ANTLR start "entryRuleLetExpCS"
    // InternalQVTrelation.g:10736:1: entryRuleLetExpCS returns [EObject current=null] : iv_ruleLetExpCS= ruleLetExpCS EOF ;
    public final EObject entryRuleLetExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLetExpCS = null;


        try {
            // InternalQVTrelation.g:10736:49: (iv_ruleLetExpCS= ruleLetExpCS EOF )
            // InternalQVTrelation.g:10737:2: iv_ruleLetExpCS= ruleLetExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLetExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLetExpCS=ruleLetExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLetExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLetExpCS"


    // $ANTLR start "ruleLetExpCS"
    // InternalQVTrelation.g:10743:1: ruleLetExpCS returns [EObject current=null] : (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) ) ;
    public final EObject ruleLetExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedVariables_1_0 = null;

        EObject lv_ownedVariables_3_0 = null;

        EObject lv_ownedInExpression_5_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10749:2: ( (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) ) )
            // InternalQVTrelation.g:10750:2: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
            {
            // InternalQVTrelation.g:10750:2: (otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) ) )
            // InternalQVTrelation.g:10751:3: otherlv_0= 'let' ( (lv_ownedVariables_1_0= ruleLetVariableCS ) ) (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )* otherlv_4= 'in' ( (lv_ownedInExpression_5_0= ruleExpCS ) )
            {
            otherlv_0=(Token)match(input,147,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getLetExpCSAccess().getLetKeyword_0());

            }
            // InternalQVTrelation.g:10755:3: ( (lv_ownedVariables_1_0= ruleLetVariableCS ) )
            // InternalQVTrelation.g:10756:4: (lv_ownedVariables_1_0= ruleLetVariableCS )
            {
            // InternalQVTrelation.g:10756:4: (lv_ownedVariables_1_0= ruleLetVariableCS )
            // InternalQVTrelation.g:10757:5: lv_ownedVariables_1_0= ruleLetVariableCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_134);
            lv_ownedVariables_1_0=ruleLetVariableCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLetExpCSRule());
              					}
              					add(
              						current,
              						"ownedVariables",
              						lv_ownedVariables_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.LetVariableCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10774:3: (otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) ) )*
            loop241:
            do {
                int alt241=2;
                int LA241_0 = input.LA(1);

                if ( (LA241_0==23) ) {
                    alt241=1;
                }


                switch (alt241) {
            	case 1 :
            	    // InternalQVTrelation.g:10775:4: otherlv_2= ',' ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
            	    {
            	    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getLetExpCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTrelation.g:10779:4: ( (lv_ownedVariables_3_0= ruleLetVariableCS ) )
            	    // InternalQVTrelation.g:10780:5: (lv_ownedVariables_3_0= ruleLetVariableCS )
            	    {
            	    // InternalQVTrelation.g:10780:5: (lv_ownedVariables_3_0= ruleLetVariableCS )
            	    // InternalQVTrelation.g:10781:6: lv_ownedVariables_3_0= ruleLetVariableCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedVariablesLetVariableCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_134);
            	    lv_ownedVariables_3_0=ruleLetVariableCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getLetExpCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedVariables",
            	      							lv_ownedVariables_3_0,
            	      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.LetVariableCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop241;
                }
            } while (true);

            otherlv_4=(Token)match(input,140,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getLetExpCSAccess().getInKeyword_3());

            }
            // InternalQVTrelation.g:10803:3: ( (lv_ownedInExpression_5_0= ruleExpCS ) )
            // InternalQVTrelation.g:10804:4: (lv_ownedInExpression_5_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10804:4: (lv_ownedInExpression_5_0= ruleExpCS )
            // InternalQVTrelation.g:10805:5: lv_ownedInExpression_5_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLetExpCSAccess().getOwnedInExpressionExpCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedInExpression_5_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLetExpCSRule());
              					}
              					set(
              						current,
              						"ownedInExpression",
              						lv_ownedInExpression_5_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLetExpCS"


    // $ANTLR start "entryRuleLetVariableCS"
    // InternalQVTrelation.g:10826:1: entryRuleLetVariableCS returns [EObject current=null] : iv_ruleLetVariableCS= ruleLetVariableCS EOF ;
    public final EObject entryRuleLetVariableCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleLetVariableCS = null;


        try {
            // InternalQVTrelation.g:10826:54: (iv_ruleLetVariableCS= ruleLetVariableCS EOF )
            // InternalQVTrelation.g:10827:2: iv_ruleLetVariableCS= ruleLetVariableCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLetVariableCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLetVariableCS=ruleLetVariableCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLetVariableCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLetVariableCS"


    // $ANTLR start "ruleLetVariableCS"
    // InternalQVTrelation.g:10833:1: ruleLetVariableCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) ) ;
    public final EObject ruleLetVariableCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_2=null;
        Token otherlv_4=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedRoundBracketedClause_1_0 = null;

        EObject lv_ownedType_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10839:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) ) )
            // InternalQVTrelation.g:10840:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )
            {
            // InternalQVTrelation.g:10840:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )
            // InternalQVTrelation.g:10841:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )? (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )? otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
            {
            // InternalQVTrelation.g:10841:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:10842:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:10842:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:10843:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLetVariableCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_135);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:10860:3: ( (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS ) )?
            int alt242=2;
            int LA242_0 = input.LA(1);

            if ( (LA242_0==33) ) {
                alt242=1;
            }
            switch (alt242) {
                case 1 :
                    // InternalQVTrelation.g:10861:4: (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS )
                    {
                    // InternalQVTrelation.g:10861:4: (lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS )
                    // InternalQVTrelation.g:10862:5: lv_ownedRoundBracketedClause_1_0= ruleRoundBracketedClauseCS
                    {
                    if ( state.backtracking==0 ) {

                      					newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedRoundBracketedClauseRoundBracketedClauseCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_114);
                    lv_ownedRoundBracketedClause_1_0=ruleRoundBracketedClauseCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
                      					}
                      					set(
                      						current,
                      						"ownedRoundBracketedClause",
                      						lv_ownedRoundBracketedClause_1_0,
                      						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.RoundBracketedClauseCS");
                      					afterParserOrEnumRuleCall();

                    }

                    }


                    }
                    break;

            }

            // InternalQVTrelation.g:10879:3: (otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) ) )?
            int alt243=2;
            int LA243_0 = input.LA(1);

            if ( (LA243_0==18) ) {
                alt243=1;
            }
            switch (alt243) {
                case 1 :
                    // InternalQVTrelation.g:10880:4: otherlv_2= ':' ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    {
                    otherlv_2=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getLetVariableCSAccess().getColonKeyword_2_0());

                    }
                    // InternalQVTrelation.g:10884:4: ( (lv_ownedType_3_0= ruleTypeExpCS ) )
                    // InternalQVTrelation.g:10885:5: (lv_ownedType_3_0= ruleTypeExpCS )
                    {
                    // InternalQVTrelation.g:10885:5: (lv_ownedType_3_0= ruleTypeExpCS )
                    // InternalQVTrelation.g:10886:6: lv_ownedType_3_0= ruleTypeExpCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_18);
                    lv_ownedType_3_0=ruleTypeExpCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedType",
                      							lv_ownedType_3_0,
                      							"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.TypeExpCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_4=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getLetVariableCSAccess().getEqualsSignKeyword_3());

            }
            // InternalQVTrelation.g:10908:3: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
            // InternalQVTrelation.g:10909:4: (lv_ownedInitExpression_5_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10909:4: (lv_ownedInitExpression_5_0= ruleExpCS )
            // InternalQVTrelation.g:10910:5: lv_ownedInitExpression_5_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getLetVariableCSAccess().getOwnedInitExpressionExpCSParserRuleCall_4_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedInitExpression_5_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getLetVariableCSRule());
              					}
              					set(
              						current,
              						"ownedInitExpression",
              						lv_ownedInitExpression_5_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLetVariableCS"


    // $ANTLR start "entryRuleNestedExpCS"
    // InternalQVTrelation.g:10931:1: entryRuleNestedExpCS returns [EObject current=null] : iv_ruleNestedExpCS= ruleNestedExpCS EOF ;
    public final EObject entryRuleNestedExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNestedExpCS = null;


        try {
            // InternalQVTrelation.g:10931:52: (iv_ruleNestedExpCS= ruleNestedExpCS EOF )
            // InternalQVTrelation.g:10932:2: iv_ruleNestedExpCS= ruleNestedExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNestedExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNestedExpCS=ruleNestedExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNestedExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNestedExpCS"


    // $ANTLR start "ruleNestedExpCS"
    // InternalQVTrelation.g:10938:1: ruleNestedExpCS returns [EObject current=null] : (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' ) ;
    public final EObject ruleNestedExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        EObject lv_ownedExpression_1_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:10944:2: ( (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' ) )
            // InternalQVTrelation.g:10945:2: (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' )
            {
            // InternalQVTrelation.g:10945:2: (otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')' )
            // InternalQVTrelation.g:10946:3: otherlv_0= '(' ( (lv_ownedExpression_1_0= ruleExpCS ) ) otherlv_2= ')'
            {
            otherlv_0=(Token)match(input,33,FollowSets000.FOLLOW_19); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getNestedExpCSAccess().getLeftParenthesisKeyword_0());

            }
            // InternalQVTrelation.g:10950:3: ( (lv_ownedExpression_1_0= ruleExpCS ) )
            // InternalQVTrelation.g:10951:4: (lv_ownedExpression_1_0= ruleExpCS )
            {
            // InternalQVTrelation.g:10951:4: (lv_ownedExpression_1_0= ruleExpCS )
            // InternalQVTrelation.g:10952:5: lv_ownedExpression_1_0= ruleExpCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getNestedExpCSAccess().getOwnedExpressionExpCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_30);
            lv_ownedExpression_1_0=ruleExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getNestedExpCSRule());
              					}
              					set(
              						current,
              						"ownedExpression",
              						lv_ownedExpression_1_0,
              						"org.eclipse.ocl.xtext.essentialocl.EssentialOCL.ExpCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            otherlv_2=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_2, grammarAccess.getNestedExpCSAccess().getRightParenthesisKeyword_2());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNestedExpCS"


    // $ANTLR start "entryRuleSelfExpCS"
    // InternalQVTrelation.g:10977:1: entryRuleSelfExpCS returns [EObject current=null] : iv_ruleSelfExpCS= ruleSelfExpCS EOF ;
    public final EObject entryRuleSelfExpCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSelfExpCS = null;


        try {
            // InternalQVTrelation.g:10977:50: (iv_ruleSelfExpCS= ruleSelfExpCS EOF )
            // InternalQVTrelation.g:10978:2: iv_ruleSelfExpCS= ruleSelfExpCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSelfExpCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleSelfExpCS=ruleSelfExpCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleSelfExpCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleSelfExpCS"


    // $ANTLR start "ruleSelfExpCS"
    // InternalQVTrelation.g:10984:1: ruleSelfExpCS returns [EObject current=null] : ( () otherlv_1= 'self' ) ;
    public final EObject ruleSelfExpCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:10990:2: ( ( () otherlv_1= 'self' ) )
            // InternalQVTrelation.g:10991:2: ( () otherlv_1= 'self' )
            {
            // InternalQVTrelation.g:10991:2: ( () otherlv_1= 'self' )
            // InternalQVTrelation.g:10992:3: () otherlv_1= 'self'
            {
            // InternalQVTrelation.g:10992:3: ()
            // InternalQVTrelation.g:10993:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getSelfExpCSAccess().getSelfExpCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,148,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getSelfExpCSAccess().getSelfKeyword_1());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSelfExpCS"


    // $ANTLR start "entryRuleMultiplicityBoundsCS"
    // InternalQVTrelation.g:11010:1: entryRuleMultiplicityBoundsCS returns [EObject current=null] : iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF ;
    public final EObject entryRuleMultiplicityBoundsCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityBoundsCS = null;


        try {
            // InternalQVTrelation.g:11010:61: (iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF )
            // InternalQVTrelation.g:11011:2: iv_ruleMultiplicityBoundsCS= ruleMultiplicityBoundsCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityBoundsCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplicityBoundsCS=ruleMultiplicityBoundsCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicityBoundsCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicityBoundsCS"


    // $ANTLR start "ruleMultiplicityBoundsCS"
    // InternalQVTrelation.g:11017:1: ruleMultiplicityBoundsCS returns [EObject current=null] : ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? ) ;
    public final EObject ruleMultiplicityBoundsCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        AntlrDatatypeRuleToken lv_lowerBound_0_0 = null;

        AntlrDatatypeRuleToken lv_upperBound_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11023:2: ( ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? ) )
            // InternalQVTrelation.g:11024:2: ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? )
            {
            // InternalQVTrelation.g:11024:2: ( ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )? )
            // InternalQVTrelation.g:11025:3: ( (lv_lowerBound_0_0= ruleLOWER ) ) (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )?
            {
            // InternalQVTrelation.g:11025:3: ( (lv_lowerBound_0_0= ruleLOWER ) )
            // InternalQVTrelation.g:11026:4: (lv_lowerBound_0_0= ruleLOWER )
            {
            // InternalQVTrelation.g:11026:4: (lv_lowerBound_0_0= ruleLOWER )
            // InternalQVTrelation.g:11027:5: lv_lowerBound_0_0= ruleLOWER
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getMultiplicityBoundsCSAccess().getLowerBoundLOWERParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_111);
            lv_lowerBound_0_0=ruleLOWER();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getMultiplicityBoundsCSRule());
              					}
              					set(
              						current,
              						"lowerBound",
              						lv_lowerBound_0_0,
              						"org.eclipse.ocl.xtext.base.Base.LOWER");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:11044:3: (otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) ) )?
            int alt244=2;
            int LA244_0 = input.LA(1);

            if ( (LA244_0==129) ) {
                alt244=1;
            }
            switch (alt244) {
                case 1 :
                    // InternalQVTrelation.g:11045:4: otherlv_1= '..' ( (lv_upperBound_2_0= ruleUPPER ) )
                    {
                    otherlv_1=(Token)match(input,129,FollowSets000.FOLLOW_136); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getMultiplicityBoundsCSAccess().getFullStopFullStopKeyword_1_0());

                    }
                    // InternalQVTrelation.g:11049:4: ( (lv_upperBound_2_0= ruleUPPER ) )
                    // InternalQVTrelation.g:11050:5: (lv_upperBound_2_0= ruleUPPER )
                    {
                    // InternalQVTrelation.g:11050:5: (lv_upperBound_2_0= ruleUPPER )
                    // InternalQVTrelation.g:11051:6: lv_upperBound_2_0= ruleUPPER
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getMultiplicityBoundsCSAccess().getUpperBoundUPPERParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_upperBound_2_0=ruleUPPER();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getMultiplicityBoundsCSRule());
                      						}
                      						set(
                      							current,
                      							"upperBound",
                      							lv_upperBound_2_0,
                      							"org.eclipse.ocl.xtext.base.Base.UPPER");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicityBoundsCS"


    // $ANTLR start "entryRuleMultiplicityCS"
    // InternalQVTrelation.g:11073:1: entryRuleMultiplicityCS returns [EObject current=null] : iv_ruleMultiplicityCS= ruleMultiplicityCS EOF ;
    public final EObject entryRuleMultiplicityCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityCS = null;


        try {
            // InternalQVTrelation.g:11073:55: (iv_ruleMultiplicityCS= ruleMultiplicityCS EOF )
            // InternalQVTrelation.g:11074:2: iv_ruleMultiplicityCS= ruleMultiplicityCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplicityCS=ruleMultiplicityCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicityCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicityCS"


    // $ANTLR start "ruleMultiplicityCS"
    // InternalQVTrelation.g:11080:1: ruleMultiplicityCS returns [EObject current=null] : (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' ) ;
    public final EObject ruleMultiplicityCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_3=null;
        Token lv_isNullFree_4_0=null;
        Token otherlv_5=null;
        EObject this_MultiplicityBoundsCS_1 = null;

        EObject this_MultiplicityStringCS_2 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11086:2: ( (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' ) )
            // InternalQVTrelation.g:11087:2: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
            {
            // InternalQVTrelation.g:11087:2: (otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']' )
            // InternalQVTrelation.g:11088:3: otherlv_0= '[' (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS ) (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )? otherlv_5= ']'
            {
            otherlv_0=(Token)match(input,138,FollowSets000.FOLLOW_137); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getMultiplicityCSAccess().getLeftSquareBracketKeyword_0());

            }
            // InternalQVTrelation.g:11092:3: (this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS | this_MultiplicityStringCS_2= ruleMultiplicityStringCS )
            int alt245=2;
            int LA245_0 = input.LA(1);

            if ( (LA245_0==RULE_INT) ) {
                alt245=1;
            }
            else if ( (LA245_0==48||LA245_0==96||LA245_0==151) ) {
                alt245=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 245, 0, input);

                throw nvae;
            }
            switch (alt245) {
                case 1 :
                    // InternalQVTrelation.g:11093:4: this_MultiplicityBoundsCS_1= ruleMultiplicityBoundsCS
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityBoundsCSParserRuleCall_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_138);
                    this_MultiplicityBoundsCS_1=ruleMultiplicityBoundsCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_MultiplicityBoundsCS_1;
                      				afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:11105:4: this_MultiplicityStringCS_2= ruleMultiplicityStringCS
                    {
                    if ( state.backtracking==0 ) {

                      				/* */

                    }
                    if ( state.backtracking==0 ) {

                      				newCompositeNode(grammarAccess.getMultiplicityCSAccess().getMultiplicityStringCSParserRuleCall_1_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_138);
                    this_MultiplicityStringCS_2=ruleMultiplicityStringCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				current = this_MultiplicityStringCS_2;
                      				afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }

            // InternalQVTrelation.g:11117:3: (otherlv_3= '|?' | ( (lv_isNullFree_4_0= '|1' ) ) )?
            int alt246=3;
            int LA246_0 = input.LA(1);

            if ( (LA246_0==149) ) {
                alt246=1;
            }
            else if ( (LA246_0==150) ) {
                alt246=2;
            }
            switch (alt246) {
                case 1 :
                    // InternalQVTrelation.g:11118:4: otherlv_3= '|?'
                    {
                    otherlv_3=(Token)match(input,149,FollowSets000.FOLLOW_139); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_3, grammarAccess.getMultiplicityCSAccess().getVerticalLineQuestionMarkKeyword_2_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:11123:4: ( (lv_isNullFree_4_0= '|1' ) )
                    {
                    // InternalQVTrelation.g:11123:4: ( (lv_isNullFree_4_0= '|1' ) )
                    // InternalQVTrelation.g:11124:5: (lv_isNullFree_4_0= '|1' )
                    {
                    // InternalQVTrelation.g:11124:5: (lv_isNullFree_4_0= '|1' )
                    // InternalQVTrelation.g:11125:6: lv_isNullFree_4_0= '|1'
                    {
                    lv_isNullFree_4_0=(Token)match(input,150,FollowSets000.FOLLOW_139); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						newLeafNode(lv_isNullFree_4_0, grammarAccess.getMultiplicityCSAccess().getIsNullFree1Keyword_2_1_0());

                    }
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElement(grammarAccess.getMultiplicityCSRule());
                      						}
                      						setWithLastConsumed(current, "isNullFree", lv_isNullFree_4_0 != null, "|1");

                    }

                    }


                    }


                    }
                    break;

            }

            otherlv_5=(Token)match(input,139,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_5, grammarAccess.getMultiplicityCSAccess().getRightSquareBracketKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicityCS"


    // $ANTLR start "entryRuleMultiplicityStringCS"
    // InternalQVTrelation.g:11146:1: entryRuleMultiplicityStringCS returns [EObject current=null] : iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF ;
    public final EObject entryRuleMultiplicityStringCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMultiplicityStringCS = null;


        try {
            // InternalQVTrelation.g:11146:61: (iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF )
            // InternalQVTrelation.g:11147:2: iv_ruleMultiplicityStringCS= ruleMultiplicityStringCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMultiplicityStringCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleMultiplicityStringCS=ruleMultiplicityStringCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleMultiplicityStringCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleMultiplicityStringCS"


    // $ANTLR start "ruleMultiplicityStringCS"
    // InternalQVTrelation.g:11153:1: ruleMultiplicityStringCS returns [EObject current=null] : ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) ) ;
    public final EObject ruleMultiplicityStringCS() throws RecognitionException {
        EObject current = null;

        Token lv_stringBounds_0_1=null;
        Token lv_stringBounds_0_2=null;
        Token lv_stringBounds_0_3=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11159:2: ( ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) ) )
            // InternalQVTrelation.g:11160:2: ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) )
            {
            // InternalQVTrelation.g:11160:2: ( ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) ) )
            // InternalQVTrelation.g:11161:3: ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) )
            {
            // InternalQVTrelation.g:11161:3: ( (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' ) )
            // InternalQVTrelation.g:11162:4: (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' )
            {
            // InternalQVTrelation.g:11162:4: (lv_stringBounds_0_1= '*' | lv_stringBounds_0_2= '+' | lv_stringBounds_0_3= '?' )
            int alt247=3;
            switch ( input.LA(1) ) {
            case 48:
                {
                alt247=1;
                }
                break;
            case 96:
                {
                alt247=2;
                }
                break;
            case 151:
                {
                alt247=3;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 247, 0, input);

                throw nvae;
            }

            switch (alt247) {
                case 1 :
                    // InternalQVTrelation.g:11163:5: lv_stringBounds_0_1= '*'
                    {
                    lv_stringBounds_0_1=(Token)match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_stringBounds_0_1, grammarAccess.getMultiplicityStringCSAccess().getStringBoundsAsteriskKeyword_0_0());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getMultiplicityStringCSRule());
                      					}
                      					setWithLastConsumed(current, "stringBounds", lv_stringBounds_0_1, null);

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:11174:5: lv_stringBounds_0_2= '+'
                    {
                    lv_stringBounds_0_2=(Token)match(input,96,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_stringBounds_0_2, grammarAccess.getMultiplicityStringCSAccess().getStringBoundsPlusSignKeyword_0_1());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getMultiplicityStringCSRule());
                      					}
                      					setWithLastConsumed(current, "stringBounds", lv_stringBounds_0_2, null);

                    }

                    }
                    break;
                case 3 :
                    // InternalQVTrelation.g:11185:5: lv_stringBounds_0_3= '?'
                    {
                    lv_stringBounds_0_3=(Token)match(input,151,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      					newLeafNode(lv_stringBounds_0_3, grammarAccess.getMultiplicityStringCSAccess().getStringBoundsQuestionMarkKeyword_0_2());

                    }
                    if ( state.backtracking==0 ) {

                      					if (current==null) {
                      						current = createModelElement(grammarAccess.getMultiplicityStringCSRule());
                      					}
                      					setWithLastConsumed(current, "stringBounds", lv_stringBounds_0_3, null);

                    }

                    }
                    break;

            }


            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMultiplicityStringCS"


    // $ANTLR start "entryRulePathNameCS"
    // InternalQVTrelation.g:11201:1: entryRulePathNameCS returns [EObject current=null] : iv_rulePathNameCS= rulePathNameCS EOF ;
    public final EObject entryRulePathNameCS() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePathNameCS = null;


        try {
            // InternalQVTrelation.g:11201:51: (iv_rulePathNameCS= rulePathNameCS EOF )
            // InternalQVTrelation.g:11202:2: iv_rulePathNameCS= rulePathNameCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPathNameCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_rulePathNameCS=rulePathNameCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_rulePathNameCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRulePathNameCS"


    // $ANTLR start "rulePathNameCS"
    // InternalQVTrelation.g:11208:1: rulePathNameCS returns [EObject current=null] : ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) ;
    public final EObject rulePathNameCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        EObject lv_ownedPathElements_0_0 = null;

        EObject lv_ownedPathElements_2_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11214:2: ( ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* ) )
            // InternalQVTrelation.g:11215:2: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            {
            // InternalQVTrelation.g:11215:2: ( ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )* )
            // InternalQVTrelation.g:11216:3: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) ) (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            {
            // InternalQVTrelation.g:11216:3: ( (lv_ownedPathElements_0_0= ruleFirstPathElementCS ) )
            // InternalQVTrelation.g:11217:4: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            {
            // InternalQVTrelation.g:11217:4: (lv_ownedPathElements_0_0= ruleFirstPathElementCS )
            // InternalQVTrelation.g:11218:5: lv_ownedPathElements_0_0= ruleFirstPathElementCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsFirstPathElementCSParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_105);
            lv_ownedPathElements_0_0=ruleFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getPathNameCSRule());
              					}
              					add(
              						current,
              						"ownedPathElements",
              						lv_ownedPathElements_0_0,
              						"org.eclipse.ocl.xtext.base.Base.FirstPathElementCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:11235:3: (otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) )*
            loop248:
            do {
                int alt248=2;
                int LA248_0 = input.LA(1);

                if ( (LA248_0==44) ) {
                    alt248=1;
                }


                switch (alt248) {
            	case 1 :
            	    // InternalQVTrelation.g:11236:4: otherlv_1= '::' ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    {
            	    otherlv_1=(Token)match(input,44,FollowSets000.FOLLOW_106); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_1, grammarAccess.getPathNameCSAccess().getColonColonKeyword_1_0());

            	    }
            	    // InternalQVTrelation.g:11240:4: ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) )
            	    // InternalQVTrelation.g:11241:5: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    {
            	    // InternalQVTrelation.g:11241:5: (lv_ownedPathElements_2_0= ruleNextPathElementCS )
            	    // InternalQVTrelation.g:11242:6: lv_ownedPathElements_2_0= ruleNextPathElementCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getPathNameCSAccess().getOwnedPathElementsNextPathElementCSParserRuleCall_1_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_105);
            	    lv_ownedPathElements_2_0=ruleNextPathElementCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getPathNameCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedPathElements",
            	      							lv_ownedPathElements_2_0,
            	      							"org.eclipse.ocl.xtext.base.Base.NextPathElementCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop248;
                }
            } while (true);


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePathNameCS"


    // $ANTLR start "entryRuleFirstPathElementCS"
    // InternalQVTrelation.g:11264:1: entryRuleFirstPathElementCS returns [EObject current=null] : iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF ;
    public final EObject entryRuleFirstPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFirstPathElementCS = null;


        try {
            // InternalQVTrelation.g:11264:59: (iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF )
            // InternalQVTrelation.g:11265:2: iv_ruleFirstPathElementCS= ruleFirstPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFirstPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleFirstPathElementCS=ruleFirstPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleFirstPathElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleFirstPathElementCS"


    // $ANTLR start "ruleFirstPathElementCS"
    // InternalQVTrelation.g:11271:1: ruleFirstPathElementCS returns [EObject current=null] : ( ( ruleUnrestrictedName ) ) ;
    public final EObject ruleFirstPathElementCS() throws RecognitionException {
        EObject current = null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11277:2: ( ( ( ruleUnrestrictedName ) ) )
            // InternalQVTrelation.g:11278:2: ( ( ruleUnrestrictedName ) )
            {
            // InternalQVTrelation.g:11278:2: ( ( ruleUnrestrictedName ) )
            // InternalQVTrelation.g:11279:3: ( ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:11279:3: ( ruleUnrestrictedName )
            // InternalQVTrelation.g:11280:4: ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getFirstPathElementCSRule());
              				}

            }
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getFirstPathElementCSAccess().getReferredElementNamedElementCrossReference_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFirstPathElementCS"


    // $ANTLR start "entryRuleNextPathElementCS"
    // InternalQVTrelation.g:11300:1: entryRuleNextPathElementCS returns [EObject current=null] : iv_ruleNextPathElementCS= ruleNextPathElementCS EOF ;
    public final EObject entryRuleNextPathElementCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNextPathElementCS = null;


        try {
            // InternalQVTrelation.g:11300:58: (iv_ruleNextPathElementCS= ruleNextPathElementCS EOF )
            // InternalQVTrelation.g:11301:2: iv_ruleNextPathElementCS= ruleNextPathElementCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNextPathElementCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNextPathElementCS=ruleNextPathElementCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNextPathElementCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNextPathElementCS"


    // $ANTLR start "ruleNextPathElementCS"
    // InternalQVTrelation.g:11307:1: ruleNextPathElementCS returns [EObject current=null] : ( ( ruleUnreservedName ) ) ;
    public final EObject ruleNextPathElementCS() throws RecognitionException {
        EObject current = null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11313:2: ( ( ( ruleUnreservedName ) ) )
            // InternalQVTrelation.g:11314:2: ( ( ruleUnreservedName ) )
            {
            // InternalQVTrelation.g:11314:2: ( ( ruleUnreservedName ) )
            // InternalQVTrelation.g:11315:3: ( ruleUnreservedName )
            {
            // InternalQVTrelation.g:11315:3: ( ruleUnreservedName )
            // InternalQVTrelation.g:11316:4: ruleUnreservedName
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElement(grammarAccess.getNextPathElementCSRule());
              				}

            }
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getNextPathElementCSAccess().getReferredElementNamedElementCrossReference_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            ruleUnreservedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNextPathElementCS"


    // $ANTLR start "entryRuleTemplateParameterSubstitutionCS"
    // InternalQVTrelation.g:11336:1: entryRuleTemplateParameterSubstitutionCS returns [EObject current=null] : iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF ;
    public final EObject entryRuleTemplateParameterSubstitutionCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateParameterSubstitutionCS = null;


        try {
            // InternalQVTrelation.g:11336:72: (iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF )
            // InternalQVTrelation.g:11337:2: iv_ruleTemplateParameterSubstitutionCS= ruleTemplateParameterSubstitutionCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTemplateParameterSubstitutionCS=ruleTemplateParameterSubstitutionCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTemplateParameterSubstitutionCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTemplateParameterSubstitutionCS"


    // $ANTLR start "ruleTemplateParameterSubstitutionCS"
    // InternalQVTrelation.g:11343:1: ruleTemplateParameterSubstitutionCS returns [EObject current=null] : ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) ;
    public final EObject ruleTemplateParameterSubstitutionCS() throws RecognitionException {
        EObject current = null;

        EObject lv_ownedActualParameter_0_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11349:2: ( ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) ) )
            // InternalQVTrelation.g:11350:2: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
            {
            // InternalQVTrelation.g:11350:2: ( (lv_ownedActualParameter_0_0= ruleTypeRefCS ) )
            // InternalQVTrelation.g:11351:3: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
            {
            // InternalQVTrelation.g:11351:3: (lv_ownedActualParameter_0_0= ruleTypeRefCS )
            // InternalQVTrelation.g:11352:4: lv_ownedActualParameter_0_0= ruleTypeRefCS
            {
            if ( state.backtracking==0 ) {

              				newCompositeNode(grammarAccess.getTemplateParameterSubstitutionCSAccess().getOwnedActualParameterTypeRefCSParserRuleCall_0());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            lv_ownedActualParameter_0_0=ruleTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              				if (current==null) {
              					current = createModelElementForParent(grammarAccess.getTemplateParameterSubstitutionCSRule());
              				}
              				set(
              					current,
              					"ownedActualParameter",
              					lv_ownedActualParameter_0_0,
              					"org.eclipse.ocl.xtext.base.Base.TypeRefCS");
              				afterParserOrEnumRuleCall();

            }

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTemplateParameterSubstitutionCS"


    // $ANTLR start "entryRuleTemplateSignatureCS"
    // InternalQVTrelation.g:11372:1: entryRuleTemplateSignatureCS returns [EObject current=null] : iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF ;
    public final EObject entryRuleTemplateSignatureCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTemplateSignatureCS = null;


        try {
            // InternalQVTrelation.g:11372:60: (iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF )
            // InternalQVTrelation.g:11373:2: iv_ruleTemplateSignatureCS= ruleTemplateSignatureCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTemplateSignatureCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTemplateSignatureCS=ruleTemplateSignatureCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTemplateSignatureCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTemplateSignatureCS"


    // $ANTLR start "ruleTemplateSignatureCS"
    // InternalQVTrelation.g:11379:1: ruleTemplateSignatureCS returns [EObject current=null] : (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) ;
    public final EObject ruleTemplateSignatureCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedParameters_1_0 = null;

        EObject lv_ownedParameters_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11385:2: ( (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' ) )
            // InternalQVTrelation.g:11386:2: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
            {
            // InternalQVTrelation.g:11386:2: (otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')' )
            // InternalQVTrelation.g:11387:3: otherlv_0= '(' ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) ) (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )* otherlv_4= ')'
            {
            otherlv_0=(Token)match(input,33,FollowSets000.FOLLOW_5); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_0, grammarAccess.getTemplateSignatureCSAccess().getLeftParenthesisKeyword_0());

            }
            // InternalQVTrelation.g:11391:3: ( (lv_ownedParameters_1_0= ruleTypeParameterCS ) )
            // InternalQVTrelation.g:11392:4: (lv_ownedParameters_1_0= ruleTypeParameterCS )
            {
            // InternalQVTrelation.g:11392:4: (lv_ownedParameters_1_0= ruleTypeParameterCS )
            // InternalQVTrelation.g:11393:5: lv_ownedParameters_1_0= ruleTypeParameterCS
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_1_0());

            }
            pushFollow(FollowSets000.FOLLOW_38);
            lv_ownedParameters_1_0=ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTemplateSignatureCSRule());
              					}
              					add(
              						current,
              						"ownedParameters",
              						lv_ownedParameters_1_0,
              						"org.eclipse.ocl.xtext.base.Base.TypeParameterCS");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:11410:3: (otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) ) )*
            loop249:
            do {
                int alt249=2;
                int LA249_0 = input.LA(1);

                if ( (LA249_0==23) ) {
                    alt249=1;
                }


                switch (alt249) {
            	case 1 :
            	    // InternalQVTrelation.g:11411:4: otherlv_2= ',' ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
            	    {
            	    otherlv_2=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      				newLeafNode(otherlv_2, grammarAccess.getTemplateSignatureCSAccess().getCommaKeyword_2_0());

            	    }
            	    // InternalQVTrelation.g:11415:4: ( (lv_ownedParameters_3_0= ruleTypeParameterCS ) )
            	    // InternalQVTrelation.g:11416:5: (lv_ownedParameters_3_0= ruleTypeParameterCS )
            	    {
            	    // InternalQVTrelation.g:11416:5: (lv_ownedParameters_3_0= ruleTypeParameterCS )
            	    // InternalQVTrelation.g:11417:6: lv_ownedParameters_3_0= ruleTypeParameterCS
            	    {
            	    if ( state.backtracking==0 ) {

            	      						newCompositeNode(grammarAccess.getTemplateSignatureCSAccess().getOwnedParametersTypeParameterCSParserRuleCall_2_1_0());

            	    }
            	    pushFollow(FollowSets000.FOLLOW_38);
            	    lv_ownedParameters_3_0=ruleTypeParameterCS();

            	    state._fsp--;
            	    if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      						if (current==null) {
            	      							current = createModelElementForParent(grammarAccess.getTemplateSignatureCSRule());
            	      						}
            	      						add(
            	      							current,
            	      							"ownedParameters",
            	      							lv_ownedParameters_3_0,
            	      							"org.eclipse.ocl.xtext.base.Base.TypeParameterCS");
            	      						afterParserOrEnumRuleCall();

            	    }

            	    }


            	    }


            	    }
            	    break;

            	default :
            	    break loop249;
                }
            } while (true);

            otherlv_4=(Token)match(input,34,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_4, grammarAccess.getTemplateSignatureCSAccess().getRightParenthesisKeyword_3());

            }

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTemplateSignatureCS"


    // $ANTLR start "entryRuleTypeParameterCS"
    // InternalQVTrelation.g:11443:1: entryRuleTypeParameterCS returns [EObject current=null] : iv_ruleTypeParameterCS= ruleTypeParameterCS EOF ;
    public final EObject entryRuleTypeParameterCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeParameterCS = null;


        try {
            // InternalQVTrelation.g:11443:56: (iv_ruleTypeParameterCS= ruleTypeParameterCS EOF )
            // InternalQVTrelation.g:11444:2: iv_ruleTypeParameterCS= ruleTypeParameterCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeParameterCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeParameterCS=ruleTypeParameterCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeParameterCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeParameterCS"


    // $ANTLR start "ruleTypeParameterCS"
    // InternalQVTrelation.g:11450:1: ruleTypeParameterCS returns [EObject current=null] : ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) ;
    public final EObject ruleTypeParameterCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        AntlrDatatypeRuleToken lv_name_0_0 = null;

        EObject lv_ownedExtends_2_0 = null;

        EObject lv_ownedExtends_4_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11456:2: ( ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? ) )
            // InternalQVTrelation.g:11457:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
            {
            // InternalQVTrelation.g:11457:2: ( ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )? )
            // InternalQVTrelation.g:11458:3: ( (lv_name_0_0= ruleUnrestrictedName ) ) (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
            {
            // InternalQVTrelation.g:11458:3: ( (lv_name_0_0= ruleUnrestrictedName ) )
            // InternalQVTrelation.g:11459:4: (lv_name_0_0= ruleUnrestrictedName )
            {
            // InternalQVTrelation.g:11459:4: (lv_name_0_0= ruleUnrestrictedName )
            // InternalQVTrelation.g:11460:5: lv_name_0_0= ruleUnrestrictedName
            {
            if ( state.backtracking==0 ) {

              					newCompositeNode(grammarAccess.getTypeParameterCSAccess().getNameUnrestrictedNameParserRuleCall_0_0());

            }
            pushFollow(FollowSets000.FOLLOW_140);
            lv_name_0_0=ruleUnrestrictedName();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              					if (current==null) {
              						current = createModelElementForParent(grammarAccess.getTypeParameterCSRule());
              					}
              					set(
              						current,
              						"name",
              						lv_name_0_0,
              						"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.UnrestrictedName");
              					afterParserOrEnumRuleCall();

            }

            }


            }

            // InternalQVTrelation.g:11477:3: (otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )* )?
            int alt251=2;
            int LA251_0 = input.LA(1);

            if ( (LA251_0==46) ) {
                alt251=1;
            }
            switch (alt251) {
                case 1 :
                    // InternalQVTrelation.g:11478:4: otherlv_1= 'extends' ( (lv_ownedExtends_2_0= ruleTypedRefCS ) ) (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                    {
                    otherlv_1=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_1, grammarAccess.getTypeParameterCSAccess().getExtendsKeyword_1_0());

                    }
                    // InternalQVTrelation.g:11482:4: ( (lv_ownedExtends_2_0= ruleTypedRefCS ) )
                    // InternalQVTrelation.g:11483:5: (lv_ownedExtends_2_0= ruleTypedRefCS )
                    {
                    // InternalQVTrelation.g:11483:5: (lv_ownedExtends_2_0= ruleTypedRefCS )
                    // InternalQVTrelation.g:11484:6: lv_ownedExtends_2_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_141);
                    lv_ownedExtends_2_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getTypeParameterCSRule());
                      						}
                      						add(
                      							current,
                      							"ownedExtends",
                      							lv_ownedExtends_2_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }

                    // InternalQVTrelation.g:11501:4: (otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) ) )*
                    loop250:
                    do {
                        int alt250=2;
                        int LA250_0 = input.LA(1);

                        if ( (LA250_0==152) ) {
                            alt250=1;
                        }


                        switch (alt250) {
                    	case 1 :
                    	    // InternalQVTrelation.g:11502:5: otherlv_3= '&&' ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                    	    {
                    	    otherlv_3=(Token)match(input,152,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      					newLeafNode(otherlv_3, grammarAccess.getTypeParameterCSAccess().getAmpersandAmpersandKeyword_1_2_0());

                    	    }
                    	    // InternalQVTrelation.g:11506:5: ( (lv_ownedExtends_4_0= ruleTypedRefCS ) )
                    	    // InternalQVTrelation.g:11507:6: (lv_ownedExtends_4_0= ruleTypedRefCS )
                    	    {
                    	    // InternalQVTrelation.g:11507:6: (lv_ownedExtends_4_0= ruleTypedRefCS )
                    	    // InternalQVTrelation.g:11508:7: lv_ownedExtends_4_0= ruleTypedRefCS
                    	    {
                    	    if ( state.backtracking==0 ) {

                    	      							newCompositeNode(grammarAccess.getTypeParameterCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_1_2_1_0());

                    	    }
                    	    pushFollow(FollowSets000.FOLLOW_141);
                    	    lv_ownedExtends_4_0=ruleTypedRefCS();

                    	    state._fsp--;
                    	    if (state.failed) return current;
                    	    if ( state.backtracking==0 ) {

                    	      							if (current==null) {
                    	      								current = createModelElementForParent(grammarAccess.getTypeParameterCSRule());
                    	      							}
                    	      							add(
                    	      								current,
                    	      								"ownedExtends",
                    	      								lv_ownedExtends_4_0,
                    	      								"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                    	      							afterParserOrEnumRuleCall();

                    	    }

                    	    }


                    	    }


                    	    }
                    	    break;

                    	default :
                    	    break loop250;
                        }
                    } while (true);


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeParameterCS"


    // $ANTLR start "entryRuleTypeRefCS"
    // InternalQVTrelation.g:11531:1: entryRuleTypeRefCS returns [EObject current=null] : iv_ruleTypeRefCS= ruleTypeRefCS EOF ;
    public final EObject entryRuleTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleTypeRefCS = null;


        try {
            // InternalQVTrelation.g:11531:50: (iv_ruleTypeRefCS= ruleTypeRefCS EOF )
            // InternalQVTrelation.g:11532:2: iv_ruleTypeRefCS= ruleTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleTypeRefCS=ruleTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleTypeRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleTypeRefCS"


    // $ANTLR start "ruleTypeRefCS"
    // InternalQVTrelation.g:11538:1: ruleTypeRefCS returns [EObject current=null] : (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) ;
    public final EObject ruleTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject this_TypedRefCS_0 = null;

        EObject this_WildcardTypeRefCS_1 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11544:2: ( (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS ) )
            // InternalQVTrelation.g:11545:2: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
            {
            // InternalQVTrelation.g:11545:2: (this_TypedRefCS_0= ruleTypedRefCS | this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS )
            int alt252=2;
            int LA252_0 = input.LA(1);

            if ( ((LA252_0>=RULE_SIMPLE_ID && LA252_0<=RULE_ESCAPED_ID)||LA252_0==17||(LA252_0>=25 && LA252_0<=32)||(LA252_0>=35 && LA252_0<=43)||(LA252_0>=45 && LA252_0<=47)||(LA252_0>=49 && LA252_0<=59)||LA252_0==61||LA252_0==63||LA252_0==65||LA252_0==68||LA252_0==70||LA252_0==72||(LA252_0>=74 && LA252_0<=77)||(LA252_0>=79 && LA252_0<=84)||LA252_0==86||LA252_0==88||(LA252_0>=90 && LA252_0<=91)||(LA252_0>=116 && LA252_0<=128)) ) {
                alt252=1;
            }
            else if ( (LA252_0==151) ) {
                alt252=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 252, 0, input);

                throw nvae;
            }
            switch (alt252) {
                case 1 :
                    // InternalQVTrelation.g:11546:3: this_TypedRefCS_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeRefCSAccess().getTypedRefCSParserRuleCall_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_TypedRefCS_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_TypedRefCS_0;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:11558:3: this_WildcardTypeRefCS_1= ruleWildcardTypeRefCS
                    {
                    if ( state.backtracking==0 ) {

                      			/* */

                    }
                    if ( state.backtracking==0 ) {

                      			newCompositeNode(grammarAccess.getTypeRefCSAccess().getWildcardTypeRefCSParserRuleCall_1());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    this_WildcardTypeRefCS_1=ruleWildcardTypeRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current = this_WildcardTypeRefCS_1;
                      			afterParserOrEnumRuleCall();

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleTypeRefCS"


    // $ANTLR start "entryRuleWildcardTypeRefCS"
    // InternalQVTrelation.g:11573:1: entryRuleWildcardTypeRefCS returns [EObject current=null] : iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF ;
    public final EObject entryRuleWildcardTypeRefCS() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleWildcardTypeRefCS = null;


        try {
            // InternalQVTrelation.g:11573:58: (iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF )
            // InternalQVTrelation.g:11574:2: iv_ruleWildcardTypeRefCS= ruleWildcardTypeRefCS EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getWildcardTypeRefCSRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleWildcardTypeRefCS=ruleWildcardTypeRefCS();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleWildcardTypeRefCS;
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleWildcardTypeRefCS"


    // $ANTLR start "ruleWildcardTypeRefCS"
    // InternalQVTrelation.g:11580:1: ruleWildcardTypeRefCS returns [EObject current=null] : ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) ;
    public final EObject ruleWildcardTypeRefCS() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        EObject lv_ownedExtends_3_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11586:2: ( ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? ) )
            // InternalQVTrelation.g:11587:2: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
            {
            // InternalQVTrelation.g:11587:2: ( () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )? )
            // InternalQVTrelation.g:11588:3: () otherlv_1= '?' (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
            {
            // InternalQVTrelation.g:11588:3: ()
            // InternalQVTrelation.g:11589:4:
            {
            if ( state.backtracking==0 ) {

              				/* */

            }
            if ( state.backtracking==0 ) {

              				current = forceCreateModelElement(
              					grammarAccess.getWildcardTypeRefCSAccess().getWildcardTypeRefCSAction_0(),
              					current);

            }

            }

            otherlv_1=(Token)match(input,151,FollowSets000.FOLLOW_140); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(otherlv_1, grammarAccess.getWildcardTypeRefCSAccess().getQuestionMarkKeyword_1());

            }
            // InternalQVTrelation.g:11602:3: (otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) ) )?
            int alt253=2;
            int LA253_0 = input.LA(1);

            if ( (LA253_0==46) ) {
                alt253=1;
            }
            switch (alt253) {
                case 1 :
                    // InternalQVTrelation.g:11603:4: otherlv_2= 'extends' ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                    {
                    otherlv_2=(Token)match(input,46,FollowSets000.FOLLOW_27); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      				newLeafNode(otherlv_2, grammarAccess.getWildcardTypeRefCSAccess().getExtendsKeyword_2_0());

                    }
                    // InternalQVTrelation.g:11607:4: ( (lv_ownedExtends_3_0= ruleTypedRefCS ) )
                    // InternalQVTrelation.g:11608:5: (lv_ownedExtends_3_0= ruleTypedRefCS )
                    {
                    // InternalQVTrelation.g:11608:5: (lv_ownedExtends_3_0= ruleTypedRefCS )
                    // InternalQVTrelation.g:11609:6: lv_ownedExtends_3_0= ruleTypedRefCS
                    {
                    if ( state.backtracking==0 ) {

                      						newCompositeNode(grammarAccess.getWildcardTypeRefCSAccess().getOwnedExtendsTypedRefCSParserRuleCall_2_1_0());

                    }
                    pushFollow(FollowSets000.FOLLOW_2);
                    lv_ownedExtends_3_0=ruleTypedRefCS();

                    state._fsp--;
                    if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      						if (current==null) {
                      							current = createModelElementForParent(grammarAccess.getWildcardTypeRefCSRule());
                      						}
                      						set(
                      							current,
                      							"ownedExtends",
                      							lv_ownedExtends_3_0,
                      							"org.eclipse.qvtd.xtext.qvtrelation.QVTrelation.TypedRefCS");
                      						afterParserOrEnumRuleCall();

                    }

                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleWildcardTypeRefCS"


    // $ANTLR start "entryRuleID"
    // InternalQVTrelation.g:11631:1: entryRuleID returns [String current=null] : iv_ruleID= ruleID EOF ;
    public final String entryRuleID() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleID = null;


        try {
            // InternalQVTrelation.g:11631:42: (iv_ruleID= ruleID EOF )
            // InternalQVTrelation.g:11632:2: iv_ruleID= ruleID EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIDRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleID=ruleID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleID.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleID"


    // $ANTLR start "ruleID"
    // InternalQVTrelation.g:11638:1: ruleID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) ;
    public final AntlrDatatypeRuleToken ruleID() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_SIMPLE_ID_0=null;
        Token this_ESCAPED_ID_1=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11644:2: ( (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID ) )
            // InternalQVTrelation.g:11645:2: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
            {
            // InternalQVTrelation.g:11645:2: (this_SIMPLE_ID_0= RULE_SIMPLE_ID | this_ESCAPED_ID_1= RULE_ESCAPED_ID )
            int alt254=2;
            int LA254_0 = input.LA(1);

            if ( (LA254_0==RULE_SIMPLE_ID) ) {
                alt254=1;
            }
            else if ( (LA254_0==RULE_ESCAPED_ID) ) {
                alt254=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 254, 0, input);

                throw nvae;
            }
            switch (alt254) {
                case 1 :
                    // InternalQVTrelation.g:11646:3: this_SIMPLE_ID_0= RULE_SIMPLE_ID
                    {
                    this_SIMPLE_ID_0=(Token)match(input,RULE_SIMPLE_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_SIMPLE_ID_0);

                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_SIMPLE_ID_0, grammarAccess.getIDAccess().getSIMPLE_IDTerminalRuleCall_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:11654:3: this_ESCAPED_ID_1= RULE_ESCAPED_ID
                    {
                    this_ESCAPED_ID_1=(Token)match(input,RULE_ESCAPED_ID,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_ESCAPED_ID_1);

                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_ESCAPED_ID_1, grammarAccess.getIDAccess().getESCAPED_IDTerminalRuleCall_1());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleID"


    // $ANTLR start "entryRuleIdentifier"
    // InternalQVTrelation.g:11665:1: entryRuleIdentifier returns [String current=null] : iv_ruleIdentifier= ruleIdentifier EOF ;
    public final String entryRuleIdentifier() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleIdentifier = null;


        try {
            // InternalQVTrelation.g:11665:50: (iv_ruleIdentifier= ruleIdentifier EOF )
            // InternalQVTrelation.g:11666:2: iv_ruleIdentifier= ruleIdentifier EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getIdentifierRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleIdentifier=ruleIdentifier();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleIdentifier.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleIdentifier"


    // $ANTLR start "ruleIdentifier"
    // InternalQVTrelation.g:11672:1: ruleIdentifier returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= ruleID ;
    public final AntlrDatatypeRuleToken ruleIdentifier() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_ID_0 = null;



        	enterRule();

        try {
            // InternalQVTrelation.g:11678:2: (this_ID_0= ruleID )
            // InternalQVTrelation.g:11679:2: this_ID_0= ruleID
            {
            if ( state.backtracking==0 ) {

              		newCompositeNode(grammarAccess.getIdentifierAccess().getIDParserRuleCall());

            }
            pushFollow(FollowSets000.FOLLOW_2);
            this_ID_0=ruleID();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_ID_0);

            }
            if ( state.backtracking==0 ) {

              		afterParserOrEnumRuleCall();

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleIdentifier"


    // $ANTLR start "entryRuleLOWER"
    // InternalQVTrelation.g:11692:1: entryRuleLOWER returns [String current=null] : iv_ruleLOWER= ruleLOWER EOF ;
    public final String entryRuleLOWER() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleLOWER = null;


        try {
            // InternalQVTrelation.g:11692:45: (iv_ruleLOWER= ruleLOWER EOF )
            // InternalQVTrelation.g:11693:2: iv_ruleLOWER= ruleLOWER EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getLOWERRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleLOWER=ruleLOWER();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleLOWER.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleLOWER"


    // $ANTLR start "ruleLOWER"
    // InternalQVTrelation.g:11699:1: ruleLOWER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
    public final AntlrDatatypeRuleToken ruleLOWER() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11705:2: (this_INT_0= RULE_INT )
            // InternalQVTrelation.g:11706:2: this_INT_0= RULE_INT
            {
            this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_INT_0);

            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_INT_0, grammarAccess.getLOWERAccess().getINTTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleLOWER"


    // $ANTLR start "entryRuleNUMBER_LITERAL"
    // InternalQVTrelation.g:11716:1: entryRuleNUMBER_LITERAL returns [String current=null] : iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF ;
    public final String entryRuleNUMBER_LITERAL() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleNUMBER_LITERAL = null;


        try {
            // InternalQVTrelation.g:11716:54: (iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF )
            // InternalQVTrelation.g:11717:2: iv_ruleNUMBER_LITERAL= ruleNUMBER_LITERAL EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNUMBER_LITERALRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleNUMBER_LITERAL=ruleNUMBER_LITERAL();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleNUMBER_LITERAL.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleNUMBER_LITERAL"


    // $ANTLR start "ruleNUMBER_LITERAL"
    // InternalQVTrelation.g:11723:1: ruleNUMBER_LITERAL returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_INT_0= RULE_INT ;
    public final AntlrDatatypeRuleToken ruleNUMBER_LITERAL() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11729:2: (this_INT_0= RULE_INT )
            // InternalQVTrelation.g:11730:2: this_INT_0= RULE_INT
            {
            this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_INT_0);

            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_INT_0, grammarAccess.getNUMBER_LITERALAccess().getINTTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNUMBER_LITERAL"


    // $ANTLR start "entryRuleStringLiteral"
    // InternalQVTrelation.g:11740:1: entryRuleStringLiteral returns [String current=null] : iv_ruleStringLiteral= ruleStringLiteral EOF ;
    public final String entryRuleStringLiteral() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleStringLiteral = null;


        try {
            // InternalQVTrelation.g:11740:53: (iv_ruleStringLiteral= ruleStringLiteral EOF )
            // InternalQVTrelation.g:11741:2: iv_ruleStringLiteral= ruleStringLiteral EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStringLiteralRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleStringLiteral=ruleStringLiteral();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleStringLiteral.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleStringLiteral"


    // $ANTLR start "ruleStringLiteral"
    // InternalQVTrelation.g:11747:1: ruleStringLiteral returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
    public final AntlrDatatypeRuleToken ruleStringLiteral() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_SINGLE_QUOTED_STRING_0=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11753:2: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
            // InternalQVTrelation.g:11754:2: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
            {
            this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_SINGLE_QUOTED_STRING_0);

            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_SINGLE_QUOTED_STRING_0, grammarAccess.getStringLiteralAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStringLiteral"


    // $ANTLR start "entryRuleUPPER"
    // InternalQVTrelation.g:11764:1: entryRuleUPPER returns [String current=null] : iv_ruleUPPER= ruleUPPER EOF ;
    public final String entryRuleUPPER() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUPPER = null;


        try {
            // InternalQVTrelation.g:11764:45: (iv_ruleUPPER= ruleUPPER EOF )
            // InternalQVTrelation.g:11765:2: iv_ruleUPPER= ruleUPPER EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUPPERRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleUPPER=ruleUPPER();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUPPER.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleUPPER"


    // $ANTLR start "ruleUPPER"
    // InternalQVTrelation.g:11771:1: ruleUPPER returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_INT_0= RULE_INT | kw= '*' ) ;
    public final AntlrDatatypeRuleToken ruleUPPER() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_INT_0=null;
        Token kw=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11777:2: ( (this_INT_0= RULE_INT | kw= '*' ) )
            // InternalQVTrelation.g:11778:2: (this_INT_0= RULE_INT | kw= '*' )
            {
            // InternalQVTrelation.g:11778:2: (this_INT_0= RULE_INT | kw= '*' )
            int alt255=2;
            int LA255_0 = input.LA(1);

            if ( (LA255_0==RULE_INT) ) {
                alt255=1;
            }
            else if ( (LA255_0==48) ) {
                alt255=2;
            }
            else {
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 255, 0, input);

                throw nvae;
            }
            switch (alt255) {
                case 1 :
                    // InternalQVTrelation.g:11779:3: this_INT_0= RULE_INT
                    {
                    this_INT_0=(Token)match(input,RULE_INT,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(this_INT_0);

                    }
                    if ( state.backtracking==0 ) {

                      			newLeafNode(this_INT_0, grammarAccess.getUPPERAccess().getINTTerminalRuleCall_0());

                    }

                    }
                    break;
                case 2 :
                    // InternalQVTrelation.g:11787:3: kw= '*'
                    {
                    kw=(Token)match(input,48,FollowSets000.FOLLOW_2); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			current.merge(kw);
                      			newLeafNode(kw, grammarAccess.getUPPERAccess().getAsteriskKeyword_1());

                    }

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUPPER"


    // $ANTLR start "entryRuleURI"
    // InternalQVTrelation.g:11796:1: entryRuleURI returns [String current=null] : iv_ruleURI= ruleURI EOF ;
    public final String entryRuleURI() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleURI = null;


        try {
            // InternalQVTrelation.g:11796:43: (iv_ruleURI= ruleURI EOF )
            // InternalQVTrelation.g:11797:2: iv_ruleURI= ruleURI EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getURIRule());
            }
            pushFollow(FollowSets000.FOLLOW_1);
            iv_ruleURI=ruleURI();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleURI.getText();
            }
            match(input,EOF,FollowSets000.FOLLOW_2); if (state.failed) return current;

            }

        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "entryRuleURI"


    // $ANTLR start "ruleURI"
    // InternalQVTrelation.g:11803:1: ruleURI returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING ;
    public final AntlrDatatypeRuleToken ruleURI() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        Token this_SINGLE_QUOTED_STRING_0=null;


        	enterRule();

        try {
            // InternalQVTrelation.g:11809:2: (this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING )
            // InternalQVTrelation.g:11810:2: this_SINGLE_QUOTED_STRING_0= RULE_SINGLE_QUOTED_STRING
            {
            this_SINGLE_QUOTED_STRING_0=(Token)match(input,RULE_SINGLE_QUOTED_STRING,FollowSets000.FOLLOW_2); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		current.merge(this_SINGLE_QUOTED_STRING_0);

            }
            if ( state.backtracking==0 ) {

              		newLeafNode(this_SINGLE_QUOTED_STRING_0, grammarAccess.getURIAccess().getSINGLE_QUOTED_STRINGTerminalRuleCall());

            }

            }

            if ( state.backtracking==0 ) {

              	leaveRule();

            }
        }

            catch (RecognitionException re) {
                recover(input,re);
                appendSkippedTokens();
            }
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleURI"

    // $ANTLR start synpred41_InternalQVTrelation
    public final void synpred41_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        EObject lv_ownedPropertyTemplates_4_0 = null;

        EObject lv_ownedPropertyTemplates_6_0 = null;


        // InternalQVTrelation.g:1358:4: (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )
        // InternalQVTrelation.g:1358:4: otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}'
        {
        otherlv_3=(Token)match(input,20,FollowSets000.FOLLOW_26); if (state.failed) return ;
        // InternalQVTrelation.g:1362:4: ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )?
        int alt280=2;
        int LA280_0 = input.LA(1);

        if ( ((LA280_0>=RULE_SIMPLE_ID && LA280_0<=RULE_ESCAPED_ID)||LA280_0==17||(LA280_0>=25 && LA280_0<=32)||(LA280_0>=35 && LA280_0<=43)||(LA280_0>=45 && LA280_0<=47)||(LA280_0>=49 && LA280_0<=59)||LA280_0==61||LA280_0==63||LA280_0==65||LA280_0==68||LA280_0==70||LA280_0==72||(LA280_0>=74 && LA280_0<=77)||(LA280_0>=79 && LA280_0<=84)||LA280_0==86||LA280_0==88||(LA280_0>=90 && LA280_0<=91)) ) {
            alt280=1;
        }
        switch (alt280) {
            case 1 :
                // InternalQVTrelation.g:1363:5: ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )*
                {
                // InternalQVTrelation.g:1363:5: ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) )
                // InternalQVTrelation.g:1364:6: (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS )
                {
                // InternalQVTrelation.g:1364:6: (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS )
                // InternalQVTrelation.g:1365:7: lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS
                {
                if ( state.backtracking==0 ) {

                  							newCompositeNode(grammarAccess.getObjectTemplateCSAccess().getOwnedPropertyTemplatesPropertyTemplateCSParserRuleCall_3_1_0_0());

                }
                pushFollow(FollowSets000.FOLLOW_28);
                lv_ownedPropertyTemplates_4_0=rulePropertyTemplateCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalQVTrelation.g:1382:5: (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )*
                loop279:
                do {
                    int alt279=2;
                    int LA279_0 = input.LA(1);

                    if ( (LA279_0==23) ) {
                        alt279=1;
                    }


                    switch (alt279) {
                	case 1 :
                	    // InternalQVTrelation.g:1383:6: otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) )
                	    {
                	    otherlv_5=(Token)match(input,23,FollowSets000.FOLLOW_5); if (state.failed) return ;
                	    // InternalQVTrelation.g:1387:6: ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) )
                	    // InternalQVTrelation.g:1388:7: (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS )
                	    {
                	    // InternalQVTrelation.g:1388:7: (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS )
                	    // InternalQVTrelation.g:1389:8: lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS
                	    {
                	    if ( state.backtracking==0 ) {

                	      								newCompositeNode(grammarAccess.getObjectTemplateCSAccess().getOwnedPropertyTemplatesPropertyTemplateCSParserRuleCall_3_1_1_1_0());

                	    }
                	    pushFollow(FollowSets000.FOLLOW_28);
                	    lv_ownedPropertyTemplates_6_0=rulePropertyTemplateCS();

                	    state._fsp--;
                	    if (state.failed) return ;

                	    }


                	    }


                	    }
                	    break;

                	default :
                	    break loop279;
                    }
                } while (true);


                }
                break;

        }

        otherlv_7=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred41_InternalQVTrelation

    // $ANTLR start synpred58_InternalQVTrelation
    public final void synpred58_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_CollectionTemplateCS_0 = null;


        // InternalQVTrelation.g:2233:4: (this_CollectionTemplateCS_0= ruleCollectionTemplateCS )
        // InternalQVTrelation.g:2233:4: this_CollectionTemplateCS_0= ruleCollectionTemplateCS
        {
        if ( state.backtracking==0 ) {

          				/* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_CollectionTemplateCS_0=ruleCollectionTemplateCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred58_InternalQVTrelation

    // $ANTLR start synpred77_InternalQVTrelation
    public final void synpred77_InternalQVTrelation_fragment() throws RecognitionException {
        EObject lv_ownedMultiplicity_1_0 = null;


        // InternalQVTrelation.g:3030:5: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )
        // InternalQVTrelation.g:3030:5: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
        {
        // InternalQVTrelation.g:3030:5: (lv_ownedMultiplicity_1_0= ruleMultiplicityCS )
        // InternalQVTrelation.g:3031:6: lv_ownedMultiplicity_1_0= ruleMultiplicityCS
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getTypedRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedMultiplicity_1_0=ruleMultiplicityCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred77_InternalQVTrelation

    // $ANTLR start synpred79_InternalQVTrelation
    public final void synpred79_InternalQVTrelation_fragment() throws RecognitionException {
        EObject lv_ownedMultiplicity_3_0 = null;


        // InternalQVTrelation.g:3063:5: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )
        // InternalQVTrelation.g:3063:5: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
        {
        // InternalQVTrelation.g:3063:5: (lv_ownedMultiplicity_3_0= ruleMultiplicityCS )
        // InternalQVTrelation.g:3064:6: lv_ownedMultiplicity_3_0= ruleMultiplicityCS
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getTypedRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedMultiplicity_3_0=ruleMultiplicityCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred79_InternalQVTrelation

    // $ANTLR start synpred81_InternalQVTrelation
    public final void synpred81_InternalQVTrelation_fragment() throws RecognitionException {
        EObject lv_ownedMultiplicity_5_0 = null;


        // InternalQVTrelation.g:3096:5: ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )
        // InternalQVTrelation.g:3096:5: (lv_ownedMultiplicity_5_0= ruleMultiplicityCS )
        {
        // InternalQVTrelation.g:3096:5: (lv_ownedMultiplicity_5_0= ruleMultiplicityCS )
        // InternalQVTrelation.g:3097:6: lv_ownedMultiplicity_5_0= ruleMultiplicityCS
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getTypedRefCSAccess().getOwnedMultiplicityMultiplicityCSParserRuleCall_2_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedMultiplicity_5_0=ruleMultiplicityCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }
    }
    // $ANTLR end synpred81_InternalQVTrelation

    // $ANTLR start synpred109_InternalQVTrelation
    public final void synpred109_InternalQVTrelation_fragment() throws RecognitionException {
        AntlrDatatypeRuleToken this_QVTbaseUnrestrictedName_1 = null;


        // InternalQVTrelation.g:3325:3: (this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName )
        // InternalQVTrelation.g:3325:3: this_QVTbaseUnrestrictedName_1= ruleQVTbaseUnrestrictedName
        {
        if ( state.backtracking==0 ) {

          			newCompositeNode(grammarAccess.getUnrestrictedNameAccess().getQVTbaseUnrestrictedNameParserRuleCall_1());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_QVTbaseUnrestrictedName_1=ruleQVTbaseUnrestrictedName();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred109_InternalQVTrelation

    // $ANTLR start synpred346_InternalQVTrelation
    public final void synpred346_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedPatternGuard_3_0 = null;


        // InternalQVTrelation.g:8811:5: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )
        // InternalQVTrelation.g:8811:5: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
        {
        otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalQVTrelation.g:8815:5: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
        // InternalQVTrelation.g:8816:6: (lv_ownedPatternGuard_3_0= ruleExpCS )
        {
        // InternalQVTrelation.g:8816:6: (lv_ownedPatternGuard_3_0= ruleExpCS )
        // InternalQVTrelation.g:8817:7: lv_ownedPatternGuard_3_0= ruleExpCS
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_17);
        lv_ownedPatternGuard_3_0=ruleExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;

        }
    }
    // $ANTLR end synpred346_InternalQVTrelation

    // $ANTLR start synpred347_InternalQVTrelation
    public final void synpred347_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedCurlyBracketedClause_1_0 = null;

        EObject lv_ownedPatternGuard_3_0 = null;


        // InternalQVTrelation.g:8791:4: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )
        // InternalQVTrelation.g:8791:4: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
        {
        // InternalQVTrelation.g:8791:4: ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) )
        // InternalQVTrelation.g:8792:5: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
        {
        // InternalQVTrelation.g:8792:5: (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS )
        // InternalQVTrelation.g:8793:6: lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS
        {
        if ( state.backtracking==0 ) {

          						newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedCurlyBracketedClauseCurlyBracketedClauseCSParserRuleCall_1_0_0());

        }
        pushFollow(FollowSets000.FOLLOW_13);
        lv_ownedCurlyBracketedClause_1_0=ruleCurlyBracketedClauseCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTrelation.g:8810:4: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?
        int alt356=2;
        int LA356_0 = input.LA(1);

        if ( (LA356_0==20) ) {
            alt356=1;
        }
        switch (alt356) {
            case 1 :
                // InternalQVTrelation.g:8811:5: otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}'
                {
                otherlv_2=(Token)match(input,20,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalQVTrelation.g:8815:5: ( (lv_ownedPatternGuard_3_0= ruleExpCS ) )
                // InternalQVTrelation.g:8816:6: (lv_ownedPatternGuard_3_0= ruleExpCS )
                {
                // InternalQVTrelation.g:8816:6: (lv_ownedPatternGuard_3_0= ruleExpCS )
                // InternalQVTrelation.g:8817:7: lv_ownedPatternGuard_3_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  							newCompositeNode(grammarAccess.getTypeNameExpCSAccess().getOwnedPatternGuardExpCSParserRuleCall_1_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_17);
                lv_ownedPatternGuard_3_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                otherlv_4=(Token)match(input,21,FollowSets000.FOLLOW_2); if (state.failed) return ;

                }
                break;

        }


        }
    }
    // $ANTLR end synpred347_InternalQVTrelation

    // $ANTLR start synpred349_InternalQVTrelation
    public final void synpred349_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_TypeLiteralCS_1 = null;


        // InternalQVTrelation.g:8871:3: (this_TypeLiteralCS_1= ruleTypeLiteralCS )
        // InternalQVTrelation.g:8871:3: this_TypeLiteralCS_1= ruleTypeLiteralCS
        {
        if ( state.backtracking==0 ) {

          			/* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_TypeLiteralCS_1=ruleTypeLiteralCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred349_InternalQVTrelation

    // $ANTLR start synpred352_InternalQVTrelation
    public final void synpred352_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_PrefixedPrimaryExpCS_0 = null;

        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_ownedRight_3_0 = null;


        // InternalQVTrelation.g:8962:3: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) )
        // InternalQVTrelation.g:8962:3: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
        {
        // InternalQVTrelation.g:8962:3: (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? )
        // InternalQVTrelation.g:8963:4: this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
        {
        if ( state.backtracking==0 ) {

          				/* */

        }
        pushFollow(FollowSets000.FOLLOW_116);
        this_PrefixedPrimaryExpCS_0=rulePrefixedPrimaryExpCS();

        state._fsp--;
        if (state.failed) return ;
        // InternalQVTrelation.g:8974:4: ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )?
        int alt357=2;
        int LA357_0 = input.LA(1);

        if ( (LA357_0==19||LA357_0==48||LA357_0==92||(LA357_0>=95 && LA357_0<=113)) ) {
            alt357=1;
        }
        switch (alt357) {
            case 1 :
                // InternalQVTrelation.g:8975:5: () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) )
                {
                // InternalQVTrelation.g:8975:5: ()
                // InternalQVTrelation.g:8976:6:
                {
                if ( state.backtracking==0 ) {

                  						/* */

                }

                }

                // InternalQVTrelation.g:8985:5: ( (lv_name_2_0= ruleBinaryOperatorName ) )
                // InternalQVTrelation.g:8986:6: (lv_name_2_0= ruleBinaryOperatorName )
                {
                // InternalQVTrelation.g:8986:6: (lv_name_2_0= ruleBinaryOperatorName )
                // InternalQVTrelation.g:8987:7: lv_name_2_0= ruleBinaryOperatorName
                {
                if ( state.backtracking==0 ) {

                  							newCompositeNode(grammarAccess.getExpCSAccess().getNameBinaryOperatorNameParserRuleCall_0_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_19);
                lv_name_2_0=ruleBinaryOperatorName();

                state._fsp--;
                if (state.failed) return ;

                }


                }

                // InternalQVTrelation.g:9004:5: ( (lv_ownedRight_3_0= ruleExpCS ) )
                // InternalQVTrelation.g:9005:6: (lv_ownedRight_3_0= ruleExpCS )
                {
                // InternalQVTrelation.g:9005:6: (lv_ownedRight_3_0= ruleExpCS )
                // InternalQVTrelation.g:9006:7: lv_ownedRight_3_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  							newCompositeNode(grammarAccess.getExpCSAccess().getOwnedRightExpCSParserRuleCall_0_1_2_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedRight_3_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred352_InternalQVTrelation

    // $ANTLR start synpred359_InternalQVTrelation
    public final void synpred359_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_TupleLiteralExpCS_4 = null;


        // InternalQVTrelation.g:9266:3: (this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS )
        // InternalQVTrelation.g:9266:3: this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          			/* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_TupleLiteralExpCS_4=ruleTupleLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred359_InternalQVTrelation

    // $ANTLR start synpred360_InternalQVTrelation
    public final void synpred360_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_MapLiteralExpCS_5 = null;


        // InternalQVTrelation.g:9278:3: (this_MapLiteralExpCS_5= ruleMapLiteralExpCS )
        // InternalQVTrelation.g:9278:3: this_MapLiteralExpCS_5= ruleMapLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          			/* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_MapLiteralExpCS_5=ruleMapLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred360_InternalQVTrelation

    // $ANTLR start synpred361_InternalQVTrelation
    public final void synpred361_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_CollectionLiteralExpCS_6 = null;


        // InternalQVTrelation.g:9290:3: (this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS )
        // InternalQVTrelation.g:9290:3: this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          			/* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_CollectionLiteralExpCS_6=ruleCollectionLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred361_InternalQVTrelation

    // $ANTLR start synpred363_InternalQVTrelation
    public final void synpred363_InternalQVTrelation_fragment() throws RecognitionException {
        EObject this_TypeLiteralExpCS_8 = null;


        // InternalQVTrelation.g:9314:3: (this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS )
        // InternalQVTrelation.g:9314:3: this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS
        {
        if ( state.backtracking==0 ) {

          			/* */

        }
        pushFollow(FollowSets000.FOLLOW_2);
        this_TypeLiteralExpCS_8=ruleTypeLiteralExpCS();

        state._fsp--;
        if (state.failed) return ;

        }
    }
    // $ANTLR end synpred363_InternalQVTrelation

    // $ANTLR start synpred376_InternalQVTrelation
    public final void synpred376_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_1=null;
        Token otherlv_3=null;
        EObject lv_ownedCoIterator_2_0 = null;

        EObject lv_ownedInitExpression_4_0 = null;


        // InternalQVTrelation.g:9757:5: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) )
        // InternalQVTrelation.g:9757:5: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
        {
        // InternalQVTrelation.g:9757:5: (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? )
        // InternalQVTrelation.g:9758:6: otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
        {
        otherlv_1=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return ;
        // InternalQVTrelation.g:9762:6: ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) )
        // InternalQVTrelation.g:9763:7: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
        {
        // InternalQVTrelation.g:9763:7: (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS )
        // InternalQVTrelation.g:9764:8: lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS
        {
        if ( state.backtracking==0 ) {

          								newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_126);
        lv_ownedCoIterator_2_0=ruleCoIteratorVariableCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTrelation.g:9781:6: (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )?
        int alt362=2;
        int LA362_0 = input.LA(1);

        if ( (LA362_0==19) ) {
            alt362=1;
        }
        switch (alt362) {
            case 1 :
                // InternalQVTrelation.g:9782:7: otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                {
                otherlv_3=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalQVTrelation.g:9786:7: ( (lv_ownedInitExpression_4_0= ruleExpCS ) )
                // InternalQVTrelation.g:9787:8: (lv_ownedInitExpression_4_0= ruleExpCS )
                {
                // InternalQVTrelation.g:9787:8: (lv_ownedInitExpression_4_0= ruleExpCS )
                // InternalQVTrelation.g:9788:9: lv_ownedInitExpression_4_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_0_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_4_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred376_InternalQVTrelation

    // $ANTLR start synpred379_InternalQVTrelation
    public final void synpred379_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        EObject lv_ownedType_6_0 = null;

        EObject lv_ownedCoIterator_8_0 = null;

        EObject lv_ownedInitExpression_10_0 = null;


        // InternalQVTrelation.g:9808:5: ( (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) )
        // InternalQVTrelation.g:9808:5: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
        {
        // InternalQVTrelation.g:9808:5: (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? )
        // InternalQVTrelation.g:9809:6: otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
        {
        otherlv_5=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return ;
        // InternalQVTrelation.g:9813:6: ( (lv_ownedType_6_0= ruleTypeExpCS ) )
        // InternalQVTrelation.g:9814:7: (lv_ownedType_6_0= ruleTypeExpCS )
        {
        // InternalQVTrelation.g:9814:7: (lv_ownedType_6_0= ruleTypeExpCS )
        // InternalQVTrelation.g:9815:8: lv_ownedType_6_0= ruleTypeExpCS
        {
        if ( state.backtracking==0 ) {

          								newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_127);
        lv_ownedType_6_0=ruleTypeExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTrelation.g:9832:6: (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )?
        int alt363=2;
        int LA363_0 = input.LA(1);

        if ( (LA363_0==131) ) {
            alt363=1;
        }
        switch (alt363) {
            case 1 :
                // InternalQVTrelation.g:9833:7: otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_7=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTrelation.g:9837:7: ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) )
                // InternalQVTrelation.g:9838:8: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTrelation.g:9838:8: (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS )
                // InternalQVTrelation.g:9839:9: lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_1_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_126);
                lv_ownedCoIterator_8_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTrelation.g:9857:6: (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )?
        int alt364=2;
        int LA364_0 = input.LA(1);

        if ( (LA364_0==19) ) {
            alt364=1;
        }
        switch (alt364) {
            case 1 :
                // InternalQVTrelation.g:9858:7: otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                {
                otherlv_9=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalQVTrelation.g:9862:7: ( (lv_ownedInitExpression_10_0= ruleExpCS ) )
                // InternalQVTrelation.g:9863:8: (lv_ownedInitExpression_10_0= ruleExpCS )
                {
                // InternalQVTrelation.g:9863:8: (lv_ownedInitExpression_10_0= ruleExpCS )
                // InternalQVTrelation.g:9864:9: lv_ownedInitExpression_10_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_1_3_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_10_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred379_InternalQVTrelation

    // $ANTLR start synpred382_InternalQVTrelation
    public final void synpred382_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_11=null;
        Token otherlv_13=null;
        Token otherlv_15=null;
        EObject lv_ownedType_12_0 = null;

        EObject lv_ownedCoIterator_14_0 = null;

        EObject lv_ownedInitExpression_16_0 = null;


        // InternalQVTrelation.g:9884:5: ( ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )
        // InternalQVTrelation.g:9884:5: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
        {
        // InternalQVTrelation.g:9884:5: ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) )
        // InternalQVTrelation.g:9885:6: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
        {
        // InternalQVTrelation.g:9885:6: (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )?
        int alt365=2;
        int LA365_0 = input.LA(1);

        if ( (LA365_0==18) ) {
            alt365=1;
        }
        switch (alt365) {
            case 1 :
                // InternalQVTrelation.g:9886:7: otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                {
                otherlv_11=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return ;
                // InternalQVTrelation.g:9890:7: ( (lv_ownedType_12_0= ruleTypeExpCS ) )
                // InternalQVTrelation.g:9891:8: (lv_ownedType_12_0= ruleTypeExpCS )
                {
                // InternalQVTrelation.g:9891:8: (lv_ownedType_12_0= ruleTypeExpCS )
                // InternalQVTrelation.g:9892:9: lv_ownedType_12_0= ruleTypeExpCS
                {
                if ( state.backtracking==0 ) {

                  									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_0_1_2_0_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_128);
                lv_ownedType_12_0=ruleTypeExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTrelation.g:9910:6: (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )?
        int alt366=2;
        int LA366_0 = input.LA(1);

        if ( (LA366_0==131) ) {
            alt366=1;
        }
        switch (alt366) {
            case 1 :
                // InternalQVTrelation.g:9911:7: otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_13=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTrelation.g:9915:7: ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) )
                // InternalQVTrelation.g:9916:8: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTrelation.g:9916:8: (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS )
                // InternalQVTrelation.g:9917:9: lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  									newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_0_1_2_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_129);
                lv_ownedCoIterator_14_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        otherlv_15=(Token)match(input,140,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalQVTrelation.g:9939:6: ( (lv_ownedInitExpression_16_0= ruleExpCS ) )
        // InternalQVTrelation.g:9940:7: (lv_ownedInitExpression_16_0= ruleExpCS )
        {
        // InternalQVTrelation.g:9940:7: (lv_ownedInitExpression_16_0= ruleExpCS )
        // InternalQVTrelation.g:9941:8: lv_ownedInitExpression_16_0= ruleExpCS
        {
        if ( state.backtracking==0 ) {

          								newCompositeNode(grammarAccess.getNavigatingArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_0_1_2_3_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedInitExpression_16_0=ruleExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred382_InternalQVTrelation

    // $ANTLR start synpred387_InternalQVTrelation
    public final void synpred387_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_ownedCoIterator_3_0 = null;

        EObject lv_ownedInitExpression_5_0 = null;


        // InternalQVTrelation.g:10142:4: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) )
        // InternalQVTrelation.g:10142:4: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
        {
        // InternalQVTrelation.g:10142:4: (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? )
        // InternalQVTrelation.g:10143:5: otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
        {
        otherlv_2=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return ;
        // InternalQVTrelation.g:10147:5: ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) )
        // InternalQVTrelation.g:10148:6: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
        {
        // InternalQVTrelation.g:10148:6: (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS )
        // InternalQVTrelation.g:10149:7: lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_0_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_126);
        lv_ownedCoIterator_3_0=ruleCoIteratorVariableCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTrelation.g:10166:5: (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )?
        int alt374=2;
        int LA374_0 = input.LA(1);

        if ( (LA374_0==19) ) {
            alt374=1;
        }
        switch (alt374) {
            case 1 :
                // InternalQVTrelation.g:10167:6: otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                {
                otherlv_4=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalQVTrelation.g:10171:6: ( (lv_ownedInitExpression_5_0= ruleExpCS ) )
                // InternalQVTrelation.g:10172:7: (lv_ownedInitExpression_5_0= ruleExpCS )
                {
                // InternalQVTrelation.g:10172:7: (lv_ownedInitExpression_5_0= ruleExpCS )
                // InternalQVTrelation.g:10173:8: lv_ownedInitExpression_5_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_0_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_5_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred387_InternalQVTrelation

    // $ANTLR start synpred390_InternalQVTrelation
    public final void synpred390_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_6=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        EObject lv_ownedType_7_0 = null;

        EObject lv_ownedCoIterator_9_0 = null;

        EObject lv_ownedInitExpression_11_0 = null;


        // InternalQVTrelation.g:10193:4: ( (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) )
        // InternalQVTrelation.g:10193:4: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
        {
        // InternalQVTrelation.g:10193:4: (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? )
        // InternalQVTrelation.g:10194:5: otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
        {
        otherlv_6=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return ;
        // InternalQVTrelation.g:10198:5: ( (lv_ownedType_7_0= ruleTypeExpCS ) )
        // InternalQVTrelation.g:10199:6: (lv_ownedType_7_0= ruleTypeExpCS )
        {
        // InternalQVTrelation.g:10199:6: (lv_ownedType_7_0= ruleTypeExpCS )
        // InternalQVTrelation.g:10200:7: lv_ownedType_7_0= ruleTypeExpCS
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_1_1_0());

        }
        pushFollow(FollowSets000.FOLLOW_127);
        lv_ownedType_7_0=ruleTypeExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }

        // InternalQVTrelation.g:10217:5: (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )?
        int alt375=2;
        int LA375_0 = input.LA(1);

        if ( (LA375_0==131) ) {
            alt375=1;
        }
        switch (alt375) {
            case 1 :
                // InternalQVTrelation.g:10218:6: otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_8=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTrelation.g:10222:6: ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) )
                // InternalQVTrelation.g:10223:7: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTrelation.g:10223:7: (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS )
                // InternalQVTrelation.g:10224:8: lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_1_2_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_126);
                lv_ownedCoIterator_9_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTrelation.g:10242:5: (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )?
        int alt376=2;
        int LA376_0 = input.LA(1);

        if ( (LA376_0==19) ) {
            alt376=1;
        }
        switch (alt376) {
            case 1 :
                // InternalQVTrelation.g:10243:6: otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                {
                otherlv_10=(Token)match(input,19,FollowSets000.FOLLOW_19); if (state.failed) return ;
                // InternalQVTrelation.g:10247:6: ( (lv_ownedInitExpression_11_0= ruleExpCS ) )
                // InternalQVTrelation.g:10248:7: (lv_ownedInitExpression_11_0= ruleExpCS )
                {
                // InternalQVTrelation.g:10248:7: (lv_ownedInitExpression_11_0= ruleExpCS )
                // InternalQVTrelation.g:10249:8: lv_ownedInitExpression_11_0= ruleExpCS
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_1_3_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_2);
                lv_ownedInitExpression_11_0=ruleExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }


        }


        }
    }
    // $ANTLR end synpred390_InternalQVTrelation

    // $ANTLR start synpred393_InternalQVTrelation
    public final void synpred393_InternalQVTrelation_fragment() throws RecognitionException {
        Token otherlv_12=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        EObject lv_ownedType_13_0 = null;

        EObject lv_ownedCoIterator_15_0 = null;

        EObject lv_ownedInitExpression_17_0 = null;


        // InternalQVTrelation.g:10269:4: ( ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )
        // InternalQVTrelation.g:10269:4: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
        {
        // InternalQVTrelation.g:10269:4: ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) )
        // InternalQVTrelation.g:10270:5: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
        {
        // InternalQVTrelation.g:10270:5: (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )?
        int alt377=2;
        int LA377_0 = input.LA(1);

        if ( (LA377_0==18) ) {
            alt377=1;
        }
        switch (alt377) {
            case 1 :
                // InternalQVTrelation.g:10271:6: otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                {
                otherlv_12=(Token)match(input,18,FollowSets000.FOLLOW_27); if (state.failed) return ;
                // InternalQVTrelation.g:10275:6: ( (lv_ownedType_13_0= ruleTypeExpCS ) )
                // InternalQVTrelation.g:10276:7: (lv_ownedType_13_0= ruleTypeExpCS )
                {
                // InternalQVTrelation.g:10276:7: (lv_ownedType_13_0= ruleTypeExpCS )
                // InternalQVTrelation.g:10277:8: lv_ownedType_13_0= ruleTypeExpCS
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedTypeTypeExpCSParserRuleCall_2_2_0_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_128);
                lv_ownedType_13_0=ruleTypeExpCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        // InternalQVTrelation.g:10295:5: (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )?
        int alt378=2;
        int LA378_0 = input.LA(1);

        if ( (LA378_0==131) ) {
            alt378=1;
        }
        switch (alt378) {
            case 1 :
                // InternalQVTrelation.g:10296:6: otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                {
                otherlv_14=(Token)match(input,131,FollowSets000.FOLLOW_5); if (state.failed) return ;
                // InternalQVTrelation.g:10300:6: ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) )
                // InternalQVTrelation.g:10301:7: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                {
                // InternalQVTrelation.g:10301:7: (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS )
                // InternalQVTrelation.g:10302:8: lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS
                {
                if ( state.backtracking==0 ) {

                  								newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedCoIteratorCoIteratorVariableCSParserRuleCall_2_2_1_1_0());

                }
                pushFollow(FollowSets000.FOLLOW_129);
                lv_ownedCoIterator_15_0=ruleCoIteratorVariableCS();

                state._fsp--;
                if (state.failed) return ;

                }


                }


                }
                break;

        }

        otherlv_16=(Token)match(input,140,FollowSets000.FOLLOW_19); if (state.failed) return ;
        // InternalQVTrelation.g:10324:5: ( (lv_ownedInitExpression_17_0= ruleExpCS ) )
        // InternalQVTrelation.g:10325:6: (lv_ownedInitExpression_17_0= ruleExpCS )
        {
        // InternalQVTrelation.g:10325:6: (lv_ownedInitExpression_17_0= ruleExpCS )
        // InternalQVTrelation.g:10326:7: lv_ownedInitExpression_17_0= ruleExpCS
        {
        if ( state.backtracking==0 ) {

          							newCompositeNode(grammarAccess.getNavigatingCommaArgCSAccess().getOwnedInitExpressionExpCSParserRuleCall_2_2_3_0());

        }
        pushFollow(FollowSets000.FOLLOW_2);
        lv_ownedInitExpression_17_0=ruleExpCS();

        state._fsp--;
        if (state.failed) return ;

        }


        }


        }


        }
    }
    // $ANTLR end synpred393_InternalQVTrelation

    // Delegated rules

    public final boolean synpred379_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred379_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred382_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred382_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred393_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred393_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred346_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred346_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred347_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred347_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred360_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred360_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred376_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred376_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred77_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred77_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred359_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred359_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred109_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred109_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred81_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred81_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred349_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred349_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred363_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred363_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred390_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred390_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred352_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred352_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred387_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred387_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred41_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred41_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred58_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred58_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred361_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred361_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }
    public final boolean synpred79_InternalQVTrelation() {
        state.backtracking++;
        int start = input.mark();
        try {
            synpred79_InternalQVTrelation_fragment(); // can never throw exception
        } catch (RecognitionException re) {
            System.err.println("impossible: "+re);
        }
        boolean success = !state.failed;
        input.rewind(start);
        state.backtracking--;
        state.failed=false;
        return success;
    }


    protected DFA3 dfa3 = new DFA3(this);
    protected DFA14 dfa14 = new DFA14(this);
    protected DFA10 dfa10 = new DFA10(this);
    protected DFA11 dfa11 = new DFA11(this);
    protected DFA37 dfa37 = new DFA37(this);
    protected DFA51 dfa51 = new DFA51(this);
    protected DFA52 dfa52 = new DFA52(this);
    protected DFA54 dfa54 = new DFA54(this);
    protected DFA61 dfa61 = new DFA61(this);
    protected DFA68 dfa68 = new DFA68(this);
    protected DFA69 dfa69 = new DFA69(this);
    protected DFA70 dfa70 = new DFA70(this);
    protected DFA71 dfa71 = new DFA71(this);
    protected DFA187 dfa187 = new DFA187(this);
    protected DFA190 dfa190 = new DFA190(this);
    protected DFA203 dfa203 = new DFA203(this);
    protected DFA202 dfa202 = new DFA202(this);
    protected DFA204 dfa204 = new DFA204(this);
    protected DFA207 dfa207 = new DFA207(this);
    protected DFA210 dfa210 = new DFA210(this);
    protected DFA226 dfa226 = new DFA226(this);
    protected DFA235 dfa235 = new DFA235(this);
    protected DFA239 dfa239 = new DFA239(this);
    static final String dfa_1s = "\71\uffff";
    static final String dfa_2s = "\1\7\66\22\2\uffff";
    static final String dfa_3s = "\1\133\66\54\2\uffff";
    static final String dfa_4s = "\67\uffff\1\2\1\1";
    static final String dfa_5s = "\71\uffff}>";
    static final String[] dfa_6s = {
            "\1\1\1\2\10\uffff\1\55\7\uffff\1\37\1\43\1\60\1\42\1\44\1\40\1\51\1\52\2\uffff\1\41\1\47\1\24\1\33\1\56\1\62\1\3\1\57\1\54\1\uffff\1\63\1\15\1\45\1\uffff\1\65\1\66\1\46\1\50\1\53\1\61\1\64\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\6\1\20",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "\3\67\1\uffff\1\67\25\uffff\1\70",
            "",
            ""
    };

    static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
    static final char[] dfa_2 = DFA.unpackEncodedStringToUnsignedChars(dfa_2s);
    static final char[] dfa_3 = DFA.unpackEncodedStringToUnsignedChars(dfa_3s);
    static final short[] dfa_4 = DFA.unpackEncodedString(dfa_4s);
    static final short[] dfa_5 = DFA.unpackEncodedString(dfa_5s);
    static final short[][] dfa_6 = unpackEncodedStringArray(dfa_6s);

    class DFA3 extends DFA {

        public DFA3(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 3;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_3;
            this.accept = dfa_4;
            this.special = dfa_5;
            this.transition = dfa_6;
        }
        public String getDescription() {
            return "177:3: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?";
        }
    }
    static final String dfa_7s = "\72\uffff";
    static final String dfa_8s = "\1\2\71\uffff";
    static final String dfa_9s = "\1\24\1\4\1\uffff\66\22\1\uffff";
    static final String dfa_10s = "\1\36\1\u0094\1\uffff\66\u008a\1\uffff";
    static final String dfa_11s = "\2\uffff\1\2\66\uffff\1\1";
    static final String dfa_12s = "\72\uffff}>";
    static final String[] dfa_13s = {
            "\1\1\4\2\4\uffff\2\2",
            "\1\2\1\uffff\1\2\1\3\1\4\10\uffff\1\57\1\71\2\uffff\1\71\3\uffff\1\41\1\45\1\62\1\44\1\46\1\42\1\53\1\54\1\2\1\uffff\1\43\1\51\1\26\1\35\1\60\1\64\1\5\1\61\1\56\1\uffff\1\65\1\17\1\47\1\2\1\67\1\70\1\50\1\52\1\55\1\63\1\66\1\33\1\13\1\6\1\14\1\uffff\1\20\1\uffff\1\25\1\uffff\1\30\2\uffff\1\36\1\uffff\1\37\1\uffff\1\40\1\uffff\1\21\1\15\1\12\1\32\1\uffff\1\16\1\23\1\24\1\34\1\7\1\27\1\uffff\1\11\1\uffff\1\31\1\uffff\1\10\1\22\3\2\23\uffff\17\2\1\uffff\1\2\1\uffff\4\2\6\uffff\1\2\4\uffff\2\2",
            "",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            "\1\71\3\2\1\uffff\2\71\10\uffff\1\2\12\uffff\1\2\3\uffff\1\2\53\uffff\1\2\2\uffff\23\2\26\uffff\1\2\1\uffff\1\2",
            ""
    };

    static final short[] dfa_7 = DFA.unpackEncodedString(dfa_7s);
    static final short[] dfa_8 = DFA.unpackEncodedString(dfa_8s);
    static final char[] dfa_9 = DFA.unpackEncodedStringToUnsignedChars(dfa_9s);
    static final char[] dfa_10 = DFA.unpackEncodedStringToUnsignedChars(dfa_10s);
    static final short[] dfa_11 = DFA.unpackEncodedString(dfa_11s);
    static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
    static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);

    class DFA14 extends DFA {

        public DFA14(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 14;
            this.eot = dfa_7;
            this.eof = dfa_8;
            this.min = dfa_9;
            this.max = dfa_10;
            this.accept = dfa_11;
            this.special = dfa_12;
            this.transition = dfa_13;
        }
        public String getDescription() {
            return "402:3: (otherlv_3= '{' ( ( ( (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS ) ) ) (otherlv_5= ',' ( ( (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS ) ) ) )* otherlv_7= '++' ( (lv_ownedRestIdentifier_8_0= ruleElementTemplateCS ) ) )? otherlv_9= '}' )?";
        }
    }
    static final String dfa_14s = "\1\133\66\30\2\uffff";
    static final String dfa_15s = "\67\uffff\1\1\1\2";
    static final String[] dfa_16s = {
            "\1\1\1\2\10\uffff\1\55\1\67\6\uffff\1\37\1\43\1\60\1\42\1\44\1\40\1\51\1\52\2\uffff\1\41\1\47\1\24\1\33\1\56\1\62\1\3\1\57\1\54\1\uffff\1\63\1\15\1\45\1\uffff\1\65\1\66\1\46\1\50\1\53\1\61\1\64\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\6\1\20",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "\1\67\4\uffff\2\70",
            "",
            ""
    };
    static final char[] dfa_14 = DFA.unpackEncodedStringToUnsignedChars(dfa_14s);
    static final short[] dfa_15 = DFA.unpackEncodedString(dfa_15s);
    static final short[][] dfa_16 = unpackEncodedStringArray(dfa_16s);

    class DFA10 extends DFA {

        public DFA10(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 10;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_14;
            this.accept = dfa_15;
            this.special = dfa_5;
            this.transition = dfa_16;
        }
        public String getDescription() {
            return "410:7: (lv_ownedMemberIdentifiers_4_1= ruleTemplateCS | lv_ownedMemberIdentifiers_4_2= ruleElementTemplateCS )";
        }
    }

    class DFA11 extends DFA {

        public DFA11(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 11;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_2;
            this.max = dfa_14;
            this.accept = dfa_15;
            this.special = dfa_5;
            this.transition = dfa_16;
        }
        public String getDescription() {
            return "452:8: (lv_ownedMemberIdentifiers_6_1= ruleTemplateCS | lv_ownedMemberIdentifiers_6_2= ruleElementTemplateCS )";
        }
    }
    static final String dfa_17s = "\12\uffff";
    static final String dfa_18s = "\1\2\11\uffff";
    static final String dfa_19s = "\1\24\1\0\10\uffff";
    static final String dfa_20s = "\1\36\1\0\10\uffff";
    static final String dfa_21s = "\2\uffff\1\2\6\uffff\1\1";
    static final String dfa_22s = "\1\uffff\1\0\10\uffff}>";
    static final String[] dfa_23s = {
            "\1\1\4\2\4\uffff\2\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_17 = DFA.unpackEncodedString(dfa_17s);
    static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
    static final char[] dfa_19 = DFA.unpackEncodedStringToUnsignedChars(dfa_19s);
    static final char[] dfa_20 = DFA.unpackEncodedStringToUnsignedChars(dfa_20s);
    static final short[] dfa_21 = DFA.unpackEncodedString(dfa_21s);
    static final short[] dfa_22 = DFA.unpackEncodedString(dfa_22s);
    static final short[][] dfa_23 = unpackEncodedStringArray(dfa_23s);

    class DFA37 extends DFA {

        public DFA37(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 37;
            this.eot = dfa_17;
            this.eof = dfa_18;
            this.min = dfa_19;
            this.max = dfa_20;
            this.accept = dfa_21;
            this.special = dfa_22;
            this.transition = dfa_23;
        }
        public String getDescription() {
            return "1357:3: (otherlv_3= '{' ( ( (lv_ownedPropertyTemplates_4_0= rulePropertyTemplateCS ) ) (otherlv_5= ',' ( (lv_ownedPropertyTemplates_6_0= rulePropertyTemplateCS ) ) )* )? otherlv_7= '}' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA37_1 = input.LA(1);


                        int index37_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred41_InternalQVTrelation()) ) {s = 9;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index37_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 37, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_24s = "\1\67\70\uffff";
    static final String dfa_25s = "\1\u0080\66\54\2\uffff";
    static final String[] dfa_26s = {
            "\1\1\1\2\10\uffff\1\55\7\uffff\1\37\1\43\1\60\1\42\1\44\1\40\1\51\1\52\2\uffff\1\41\1\47\1\24\1\33\1\56\1\62\1\3\1\57\1\54\1\uffff\1\63\1\15\1\45\1\uffff\1\65\1\66\1\46\1\50\1\53\1\61\1\64\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\6\1\20\26\uffff\17\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "\3\67\1\uffff\1\67\12\uffff\1\67\12\uffff\1\70",
            "",
            ""
    };
    static final short[] dfa_24 = DFA.unpackEncodedString(dfa_24s);
    static final char[] dfa_25 = DFA.unpackEncodedStringToUnsignedChars(dfa_25s);
    static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);

    class DFA51 extends DFA {

        public DFA51(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 51;
            this.eot = dfa_1;
            this.eof = dfa_24;
            this.min = dfa_2;
            this.max = dfa_25;
            this.accept = dfa_4;
            this.special = dfa_5;
            this.transition = dfa_26;
        }
        public String getDescription() {
            return "()* loopback of 2188:3: ( ( (lv_ownedPathElements_2_0= ruleNextPathElementCS ) ) otherlv_3= '::' )*";
        }
    }
    static final String dfa_27s = "\77\uffff";
    static final String dfa_28s = "\1\7\66\22\1\7\5\0\2\uffff";
    static final String dfa_29s = "\1\133\66\22\1\u0080\5\0\2\uffff";
    static final String dfa_30s = "\75\uffff\1\2\1\1";
    static final String dfa_31s = "\70\uffff\1\4\1\3\1\0\1\2\1\1\2\uffff}>";
    static final String[] dfa_32s = {
            "\1\1\1\2\10\uffff\1\55\1\67\6\uffff\1\37\1\43\1\60\1\42\1\44\1\40\1\51\1\52\2\uffff\1\41\1\47\1\24\1\33\1\56\1\62\1\3\1\57\1\54\1\uffff\1\63\1\15\1\45\1\uffff\1\65\1\66\1\46\1\50\1\53\1\61\1\64\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\6\1\20",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\1\67",
            "\2\75\10\uffff\1\75\7\uffff\10\75\2\uffff\11\75\1\uffff\3\75\1\uffff\13\75\1\uffff\1\75\1\uffff\1\75\1\uffff\1\75\2\uffff\1\75\1\uffff\1\75\1\uffff\1\75\1\uffff\4\75\1\uffff\6\75\1\uffff\1\75\1\uffff\1\75\1\uffff\2\75\30\uffff\10\75\1\70\1\71\1\72\1\73\1\74",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            ""
    };

    static final short[] dfa_27 = DFA.unpackEncodedString(dfa_27s);
    static final char[] dfa_28 = DFA.unpackEncodedStringToUnsignedChars(dfa_28s);
    static final char[] dfa_29 = DFA.unpackEncodedStringToUnsignedChars(dfa_29s);
    static final short[] dfa_30 = DFA.unpackEncodedString(dfa_30s);
    static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
    static final short[][] dfa_32 = unpackEncodedStringArray(dfa_32s);

    class DFA52 extends DFA {

        public DFA52(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 52;
            this.eot = dfa_27;
            this.eof = dfa_27;
            this.min = dfa_28;
            this.max = dfa_29;
            this.accept = dfa_30;
            this.special = dfa_31;
            this.transition = dfa_32;
        }
        public String getDescription() {
            return "2232:3: (this_CollectionTemplateCS_0= ruleCollectionTemplateCS | this_ObjectTemplateCS_1= ruleObjectTemplateCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA52_58 = input.LA(1);


                        int index52_58 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred58_InternalQVTrelation()) ) {s = 62;}

                        else if ( (true) ) {s = 61;}


                        input.seek(index52_58);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA52_60 = input.LA(1);


                        int index52_60 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred58_InternalQVTrelation()) ) {s = 62;}

                        else if ( (true) ) {s = 61;}


                        input.seek(index52_60);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA52_59 = input.LA(1);


                        int index52_59 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred58_InternalQVTrelation()) ) {s = 62;}

                        else if ( (true) ) {s = 61;}


                        input.seek(index52_59);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA52_57 = input.LA(1);


                        int index52_57 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred58_InternalQVTrelation()) ) {s = 62;}

                        else if ( (true) ) {s = 61;}


                        input.seek(index52_57);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA52_56 = input.LA(1);


                        int index52_56 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred58_InternalQVTrelation()) ) {s = 62;}

                        else if ( (true) ) {s = 61;}


                        input.seek(index52_56);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 52, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_33s = "\1\7\66\41\2\uffff";
    static final String[] dfa_34s = {
            "\1\1\1\2\10\uffff\1\55\7\uffff\1\37\1\43\1\60\1\42\1\44\1\40\1\51\1\52\2\uffff\1\41\1\47\1\24\1\33\1\56\1\62\1\3\1\57\1\54\1\uffff\1\63\1\15\1\45\1\uffff\1\65\1\66\1\46\1\50\1\53\1\61\1\64\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\6\1\20",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "\1\67\12\uffff\1\70",
            "",
            ""
    };
    static final char[] dfa_33 = DFA.unpackEncodedStringToUnsignedChars(dfa_33s);
    static final short[][] dfa_34 = unpackEncodedStringArray(dfa_34s);

    class DFA54 extends DFA {

        public DFA54(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 54;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_33;
            this.max = dfa_3;
            this.accept = dfa_4;
            this.special = dfa_5;
            this.transition = dfa_34;
        }
        public String getDescription() {
            return "2309:3: ( (lv_ownedPathName_1_0= ruleScopeNameCS ) )?";
        }
    }
    static final String dfa_35s = "\1\4\66\22\2\uffff";
    static final String[] dfa_36s = {
            "\1\67\2\uffff\1\1\1\2\10\uffff\1\55\7\uffff\1\37\1\43\1\60\1\42\1\44\1\40\1\51\1\52\2\uffff\1\41\1\47\1\24\1\33\1\56\1\62\1\3\1\57\1\54\1\uffff\1\63\1\15\1\45\1\uffff\1\65\1\66\1\46\1\50\1\53\1\61\1\64\1\31\1\11\1\4\1\12\1\uffff\1\16\1\uffff\1\23\1\uffff\1\26\2\uffff\1\34\1\uffff\1\35\1\uffff\1\36\1\uffff\1\17\1\13\1\10\1\30\1\uffff\1\14\1\21\1\22\1\32\1\5\1\25\1\uffff\1\7\1\uffff\1\27\1\uffff\1\6\1\20",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "\1\70\3\uffff\1\67\25\uffff\1\67",
            "",
            ""
    };
    static final char[] dfa_35 = DFA.unpackEncodedStringToUnsignedChars(dfa_35s);
    static final short[][] dfa_36 = unpackEncodedStringArray(dfa_36s);

    class DFA61 extends DFA {

        public DFA61(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 61;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_35;
            this.max = dfa_3;
            this.accept = dfa_4;
            this.special = dfa_5;
            this.transition = dfa_36;
        }
        public String getDescription() {
            return "2579:3: ( ( (lv_name_1_0= ruleUnrestrictedName ) ) otherlv_2= ':' )?";
        }
    }
    static final String dfa_37s = "\2\uffff\66\1\1\uffff";
    static final String dfa_38s = "\1\4\1\uffff\66\22\1\uffff";
    static final String dfa_39s = "\1\u0094\1\uffff\66\u008a\1\uffff";
    static final String dfa_40s = "\1\uffff\1\1\66\uffff\1\2";
    static final String[] dfa_41s = {
            "\1\1\1\uffff\1\1\1\2\1\3\10\uffff\1\56\1\70\6\uffff\1\40\1\44\1\61\1\43\1\45\1\41\1\52\1\53\1\1\1\uffff\1\42\1\50\1\25\1\34\1\57\1\63\1\4\1\60\1\55\1\uffff\1\64\1\16\1\46\1\1\1\66\1\67\1\47\1\51\1\54\1\62\1\65\1\32\1\12\1\5\1\13\1\uffff\1\17\1\uffff\1\24\1\uffff\1\27\2\uffff\1\35\1\uffff\1\36\1\uffff\1\37\1\uffff\1\20\1\14\1\11\1\31\1\uffff\1\15\1\22\1\23\1\33\1\6\1\26\1\uffff\1\10\1\uffff\1\30\1\uffff\1\7\1\21\3\1\23\uffff\17\1\1\uffff\1\1\1\uffff\4\1\6\uffff\1\1\4\uffff\2\1",
            "",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1",
            ""
    };
    static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
    static final char[] dfa_38 = DFA.unpackEncodedStringToUnsignedChars(dfa_38s);
    static final char[] dfa_39 = DFA.unpackEncodedStringToUnsignedChars(dfa_39s);
    static final short[] dfa_40 = DFA.unpackEncodedString(dfa_40s);
    static final short[][] dfa_41 = unpackEncodedStringArray(dfa_41s);

    class DFA68 extends DFA {

        public DFA68(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 68;
            this.eot = dfa_1;
            this.eof = dfa_37;
            this.min = dfa_38;
            this.max = dfa_39;
            this.accept = dfa_40;
            this.special = dfa_5;
            this.transition = dfa_41;
        }
        public String getDescription() {
            return "2938:2: (this_ExpCS_0= ruleExpCS | this_TemplateCS_1= ruleTemplateCS )";
        }
    }
    static final String dfa_42s = "\16\uffff";
    static final String dfa_43s = "\1\2\15\uffff";
    static final String dfa_44s = "\1\22\1\6\1\uffff\1\u0081\3\u008b\1\6\2\u008b\1\0\2\u008b\1\uffff";
    static final String dfa_45s = "\1\u0098\1\u0097\1\uffff\4\u0096\1\60\2\u008b\1\0\2\u0096\1\uffff";
    static final String dfa_46s = "\2\uffff\1\2\12\uffff\1\1";
    static final String dfa_47s = "\12\uffff\1\0\3\uffff}>";
    static final String[] dfa_48s = {
            "\7\2\4\uffff\2\2\3\uffff\1\2\57\uffff\1\2\67\uffff\1\1\15\uffff\1\2",
            "\1\3\51\uffff\1\4\57\uffff\1\5\66\uffff\1\6",
            "",
            "\1\7\11\uffff\1\12\11\uffff\1\10\1\11",
            "\1\12\11\uffff\1\10\1\11",
            "\1\12\11\uffff\1\10\1\11",
            "\1\12\11\uffff\1\10\1\11",
            "\1\13\51\uffff\1\14",
            "\1\12",
            "\1\12",
            "\1\uffff",
            "\1\12\11\uffff\1\10\1\11",
            "\1\12\11\uffff\1\10\1\11",
            ""
    };

    static final short[] dfa_42 = DFA.unpackEncodedString(dfa_42s);
    static final short[] dfa_43 = DFA.unpackEncodedString(dfa_43s);
    static final char[] dfa_44 = DFA.unpackEncodedStringToUnsignedChars(dfa_44s);
    static final char[] dfa_45 = DFA.unpackEncodedStringToUnsignedChars(dfa_45s);
    static final short[] dfa_46 = DFA.unpackEncodedString(dfa_46s);
    static final short[] dfa_47 = DFA.unpackEncodedString(dfa_47s);
    static final short[][] dfa_48 = unpackEncodedStringArray(dfa_48s);

    class DFA69 extends DFA {

        public DFA69(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 69;
            this.eot = dfa_42;
            this.eof = dfa_43;
            this.min = dfa_44;
            this.max = dfa_45;
            this.accept = dfa_46;
            this.special = dfa_47;
            this.transition = dfa_48;
        }
        public String getDescription() {
            return "3029:4: ( (lv_ownedMultiplicity_1_0= ruleMultiplicityCS ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA69_10 = input.LA(1);


                        int index69_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred77_InternalQVTrelation()) ) {s = 13;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index69_10);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 69, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA70 extends DFA {

        public DFA70(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 70;
            this.eot = dfa_42;
            this.eof = dfa_43;
            this.min = dfa_44;
            this.max = dfa_45;
            this.accept = dfa_46;
            this.special = dfa_47;
            this.transition = dfa_48;
        }
        public String getDescription() {
            return "3062:4: ( (lv_ownedMultiplicity_3_0= ruleMultiplicityCS ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA70_10 = input.LA(1);


                        int index70_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred79_InternalQVTrelation()) ) {s = 13;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index70_10);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 70, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA71 extends DFA {

        public DFA71(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 71;
            this.eot = dfa_42;
            this.eof = dfa_43;
            this.min = dfa_44;
            this.max = dfa_45;
            this.accept = dfa_46;
            this.special = dfa_47;
            this.transition = dfa_48;
        }
        public String getDescription() {
            return "3095:4: ( (lv_ownedMultiplicity_5_0= ruleMultiplicityCS ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA71_10 = input.LA(1);


                        int index71_10 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred81_InternalQVTrelation()) ) {s = 13;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index71_10);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 71, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String[] dfa_49s = {
            "\1\1\1\uffff\1\1\1\2\1\3\10\uffff\1\56\1\70\6\uffff\1\40\1\44\1\61\1\43\1\45\1\41\1\52\1\53\1\1\1\uffff\1\42\1\50\1\25\1\34\1\57\1\63\1\4\1\60\1\55\1\uffff\1\64\1\16\1\46\1\1\1\66\1\67\1\47\1\51\1\54\1\62\1\65\1\32\1\12\1\5\1\13\1\uffff\1\17\1\uffff\1\24\1\uffff\1\27\2\uffff\1\35\1\uffff\1\36\1\uffff\1\37\1\uffff\1\20\1\14\1\11\1\31\1\uffff\1\15\1\22\1\23\1\33\1\6\1\26\1\uffff\1\10\1\uffff\1\30\1\uffff\1\7\1\21\3\1\23\uffff\17\1\1\uffff\1\1\1\uffff\4\1\6\uffff\1\1\4\uffff\2\1",
            "",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            "\1\70\3\1\1\uffff\1\1\11\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\17\uffff\1\1\6\uffff\1\1\1\uffff\1\1",
            ""
    };
    static final short[][] dfa_49 = unpackEncodedStringArray(dfa_49s);

    class DFA187 extends DFA {

        public DFA187(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 187;
            this.eot = dfa_1;
            this.eof = dfa_37;
            this.min = dfa_38;
            this.max = dfa_39;
            this.accept = dfa_40;
            this.special = dfa_5;
            this.transition = dfa_49;
        }
        public String getDescription() {
            return "7582:2: ( ( ( (lv_ownedExpression_0_0= ruleExpCS ) ) (otherlv_1= '..' ( (lv_ownedLastExpression_2_0= ruleExpCS ) ) )? ) | ( (lv_ownedExpression_3_0= rulePatternExpCS ) ) )";
        }
    }

    class DFA190 extends DFA {

        public DFA190(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 190;
            this.eot = dfa_1;
            this.eof = dfa_37;
            this.min = dfa_38;
            this.max = dfa_39;
            this.accept = dfa_40;
            this.special = dfa_5;
            this.transition = dfa_41;
        }
        public String getDescription() {
            return "7811:6: (lv_ownedInitExpression_2_1= ruleExpCS | lv_ownedInitExpression_2_2= rulePatternExpCS )";
        }
    }
    static final String dfa_50s = "\20\uffff";
    static final String dfa_51s = "\1\2\17\uffff";
    static final String dfa_52s = "\1\23\1\0\16\uffff";
    static final String dfa_53s = "\1\u008f\1\0\16\uffff";
    static final String dfa_54s = "\2\uffff\1\2\14\uffff\1\1";
    static final String dfa_55s = "\1\uffff\1\0\16\uffff}>";
    static final String[] dfa_56s = {
            "\1\2\1\1\4\2\4\uffff\1\2\4\uffff\1\2\140\uffff\1\2\6\uffff\1\2\1\uffff\2\2\1\uffff\1\2",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
    static final short[] dfa_51 = DFA.unpackEncodedString(dfa_51s);
    static final char[] dfa_52 = DFA.unpackEncodedStringToUnsignedChars(dfa_52s);
    static final char[] dfa_53 = DFA.unpackEncodedStringToUnsignedChars(dfa_53s);
    static final short[] dfa_54 = DFA.unpackEncodedString(dfa_54s);
    static final short[] dfa_55 = DFA.unpackEncodedString(dfa_55s);
    static final short[][] dfa_56 = unpackEncodedStringArray(dfa_56s);

    class DFA203 extends DFA {

        public DFA203(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 203;
            this.eot = dfa_50;
            this.eof = dfa_51;
            this.min = dfa_52;
            this.max = dfa_53;
            this.accept = dfa_54;
            this.special = dfa_55;
            this.transition = dfa_56;
        }
        public String getDescription() {
            return "8790:3: ( ( (lv_ownedCurlyBracketedClause_1_0= ruleCurlyBracketedClauseCS ) ) (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )? )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA203_1 = input.LA(1);


                        int index203_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred347_InternalQVTrelation()) ) {s = 15;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index203_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 203, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA202 extends DFA {

        public DFA202(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 202;
            this.eot = dfa_50;
            this.eof = dfa_51;
            this.min = dfa_52;
            this.max = dfa_53;
            this.accept = dfa_54;
            this.special = dfa_55;
            this.transition = dfa_56;
        }
        public String getDescription() {
            return "8810:4: (otherlv_2= '{' ( (lv_ownedPatternGuard_3_0= ruleExpCS ) ) otherlv_4= '}' )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA202_1 = input.LA(1);


                        int index202_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred346_InternalQVTrelation()) ) {s = 15;}

                        else if ( (true) ) {s = 2;}


                        input.seek(index202_1);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 202, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_57s = "\107\uffff";
    static final String dfa_58s = "\1\7\76\uffff\5\0\3\uffff";
    static final String dfa_59s = "\1\u0080\76\uffff\5\0\3\uffff";
    static final String dfa_60s = "\1\uffff\1\1\65\uffff\1\2\16\uffff\1\3";
    static final String dfa_61s = "\77\uffff\1\0\1\1\1\2\1\3\1\4\3\uffff}>";
    static final String[] dfa_62s = {
            "\2\1\10\uffff\1\1\7\uffff\10\1\2\uffff\11\1\1\uffff\3\1\1\uffff\13\1\1\uffff\1\1\1\uffff\1\1\1\uffff\1\1\2\uffff\1\1\1\uffff\1\1\1\uffff\1\1\1\uffff\4\1\1\uffff\6\1\1\uffff\1\1\1\uffff\1\1\1\uffff\2\1\26\uffff\12\67\1\77\1\100\1\101\1\102\1\103",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            ""
    };

    static final short[] dfa_57 = DFA.unpackEncodedString(dfa_57s);
    static final char[] dfa_58 = DFA.unpackEncodedStringToUnsignedChars(dfa_58s);
    static final char[] dfa_59 = DFA.unpackEncodedStringToUnsignedChars(dfa_59s);
    static final short[] dfa_60 = DFA.unpackEncodedString(dfa_60s);
    static final short[] dfa_61 = DFA.unpackEncodedString(dfa_61s);
    static final short[][] dfa_62 = unpackEncodedStringArray(dfa_62s);

    class DFA204 extends DFA {

        public DFA204(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 204;
            this.eot = dfa_57;
            this.eof = dfa_57;
            this.min = dfa_58;
            this.max = dfa_59;
            this.accept = dfa_60;
            this.special = dfa_61;
            this.transition = dfa_62;
        }
        public String getDescription() {
            return "8858:2: (this_TypeNameExpCS_0= ruleTypeNameExpCS | this_TypeLiteralCS_1= ruleTypeLiteralCS | this_CollectionPatternCS_2= ruleCollectionPatternCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA204_63 = input.LA(1);


                        int index204_63 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred349_InternalQVTrelation()) ) {s = 55;}

                        else if ( (true) ) {s = 70;}


                        input.seek(index204_63);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA204_64 = input.LA(1);


                        int index204_64 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred349_InternalQVTrelation()) ) {s = 55;}

                        else if ( (true) ) {s = 70;}


                        input.seek(index204_64);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA204_65 = input.LA(1);


                        int index204_65 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred349_InternalQVTrelation()) ) {s = 55;}

                        else if ( (true) ) {s = 70;}


                        input.seek(index204_65);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA204_66 = input.LA(1);


                        int index204_66 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred349_InternalQVTrelation()) ) {s = 55;}

                        else if ( (true) ) {s = 70;}


                        input.seek(index204_66);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA204_67 = input.LA(1);


                        int index204_67 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred349_InternalQVTrelation()) ) {s = 55;}

                        else if ( (true) ) {s = 70;}


                        input.seek(index204_67);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 204, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_63s = "\125\uffff";
    static final String dfa_64s = "\1\4\3\0\121\uffff";
    static final String dfa_65s = "\1\u0094\3\0\121\uffff";
    static final String dfa_66s = "\4\uffff\1\1\117\uffff\1\2";
    static final String dfa_67s = "\1\uffff\1\0\1\1\1\2\121\uffff}>";
    static final String[] dfa_68s = {
            "\1\4\1\uffff\3\4\10\uffff\1\4\7\uffff\11\4\1\uffff\11\4\1\uffff\17\4\1\uffff\1\4\1\uffff\1\4\1\uffff\1\4\2\uffff\1\4\1\uffff\1\4\1\uffff\1\4\1\uffff\4\4\1\uffff\6\4\1\uffff\1\4\1\uffff\1\4\1\uffff\2\4\1\1\1\2\1\3\23\uffff\17\4\1\uffff\1\4\1\uffff\4\4\6\uffff\1\4\4\uffff\1\124\1\4",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_63 = DFA.unpackEncodedString(dfa_63s);
    static final char[] dfa_64 = DFA.unpackEncodedStringToUnsignedChars(dfa_64s);
    static final char[] dfa_65 = DFA.unpackEncodedStringToUnsignedChars(dfa_65s);
    static final short[] dfa_66 = DFA.unpackEncodedString(dfa_66s);
    static final short[] dfa_67 = DFA.unpackEncodedString(dfa_67s);
    static final short[][] dfa_68 = unpackEncodedStringArray(dfa_68s);

    class DFA207 extends DFA {

        public DFA207(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 207;
            this.eot = dfa_63;
            this.eof = dfa_63;
            this.min = dfa_64;
            this.max = dfa_65;
            this.accept = dfa_66;
            this.special = dfa_67;
            this.transition = dfa_68;
        }
        public String getDescription() {
            return "8961:2: ( (this_PrefixedPrimaryExpCS_0= rulePrefixedPrimaryExpCS ( () ( (lv_name_2_0= ruleBinaryOperatorName ) ) ( (lv_ownedRight_3_0= ruleExpCS ) ) )? ) | this_PrefixedLetExpCS_4= rulePrefixedLetExpCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA207_1 = input.LA(1);


                        int index207_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred352_InternalQVTrelation()) ) {s = 4;}

                        else if ( (true) ) {s = 84;}


                        input.seek(index207_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA207_2 = input.LA(1);


                        int index207_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred352_InternalQVTrelation()) ) {s = 4;}

                        else if ( (true) ) {s = 84;}


                        input.seek(index207_2);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA207_3 = input.LA(1);


                        int index207_3 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred352_InternalQVTrelation()) ) {s = 4;}

                        else if ( (true) ) {s = 84;}


                        input.seek(index207_3);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 207, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_69s = "\124\uffff";
    static final String dfa_70s = "\1\4\12\uffff\7\0\102\uffff";
    static final String dfa_71s = "\1\u0094\12\uffff\7\0\102\uffff";
    static final String dfa_72s = "\1\uffff\1\1\1\2\1\3\1\4\15\uffff\1\10\1\11\7\uffff\1\12\65\uffff\1\5\1\6\1\7";
    static final String dfa_73s = "\13\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\102\uffff}>";
    static final String[] dfa_74s = {
            "\1\4\1\uffff\1\4\2\33\10\uffff\1\33\7\uffff\10\33\1\1\1\uffff\11\33\1\uffff\3\33\1\4\13\33\1\uffff\1\33\1\uffff\1\33\1\uffff\1\33\2\uffff\1\33\1\uffff\1\33\1\uffff\1\33\1\uffff\4\33\1\uffff\6\33\1\uffff\1\33\1\uffff\1\33\1\uffff\2\33\26\uffff\1\14\1\13\10\23\1\15\1\16\1\17\1\20\1\21\1\uffff\1\22\1\uffff\4\4\6\uffff\1\2\5\uffff\1\3",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
    static final char[] dfa_70 = DFA.unpackEncodedStringToUnsignedChars(dfa_70s);
    static final char[] dfa_71 = DFA.unpackEncodedStringToUnsignedChars(dfa_71s);
    static final short[] dfa_72 = DFA.unpackEncodedString(dfa_72s);
    static final short[] dfa_73 = DFA.unpackEncodedString(dfa_73s);
    static final short[][] dfa_74 = unpackEncodedStringArray(dfa_74s);

    class DFA210 extends DFA {

        public DFA210(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 210;
            this.eot = dfa_69;
            this.eof = dfa_69;
            this.min = dfa_70;
            this.max = dfa_71;
            this.accept = dfa_72;
            this.special = dfa_73;
            this.transition = dfa_74;
        }
        public String getDescription() {
            return "9217:2: (this_NestedExpCS_0= ruleNestedExpCS | this_IfExpCS_1= ruleIfExpCS | this_SelfExpCS_2= ruleSelfExpCS | this_PrimitiveLiteralExpCS_3= rulePrimitiveLiteralExpCS | this_TupleLiteralExpCS_4= ruleTupleLiteralExpCS | this_MapLiteralExpCS_5= ruleMapLiteralExpCS | this_CollectionLiteralExpCS_6= ruleCollectionLiteralExpCS | this_LambdaLiteralExpCS_7= ruleLambdaLiteralExpCS | this_TypeLiteralExpCS_8= ruleTypeLiteralExpCS | this_NameExpCS_9= ruleNameExpCS )";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA210_11 = input.LA(1);


                        int index210_11 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred359_InternalQVTrelation()) ) {s = 81;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_11);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA210_12 = input.LA(1);


                        int index210_12 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred360_InternalQVTrelation()) ) {s = 82;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_12);
                        if ( s>=0 ) return s;
                        break;
                    case 2 :
                        int LA210_13 = input.LA(1);


                        int index210_13 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred361_InternalQVTrelation()) ) {s = 83;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_13);
                        if ( s>=0 ) return s;
                        break;
                    case 3 :
                        int LA210_14 = input.LA(1);


                        int index210_14 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred361_InternalQVTrelation()) ) {s = 83;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_14);
                        if ( s>=0 ) return s;
                        break;
                    case 4 :
                        int LA210_15 = input.LA(1);


                        int index210_15 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred361_InternalQVTrelation()) ) {s = 83;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_15);
                        if ( s>=0 ) return s;
                        break;
                    case 5 :
                        int LA210_16 = input.LA(1);


                        int index210_16 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred361_InternalQVTrelation()) ) {s = 83;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_16);
                        if ( s>=0 ) return s;
                        break;
                    case 6 :
                        int LA210_17 = input.LA(1);


                        int index210_17 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred361_InternalQVTrelation()) ) {s = 83;}

                        else if ( (synpred363_InternalQVTrelation()) ) {s = 19;}


                        input.seek(index210_17);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 210, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_75s = "\13\uffff";
    static final String dfa_76s = "\1\4\12\uffff";
    static final String dfa_77s = "\1\22\2\0\10\uffff";
    static final String dfa_78s = "\1\u008d\2\0\10\uffff";
    static final String dfa_79s = "\3\uffff\1\3\1\4\4\uffff\1\1\1\2";
    static final String dfa_80s = "\1\uffff\1\0\1\1\10\uffff}>";
    static final String[] dfa_81s = {
            "\1\2\3\uffff\2\4\12\uffff\1\4\140\uffff\1\1\10\uffff\1\3\1\4",
            "\1\uffff",
            "\1\uffff",
            "",
            "",
            "",
            "",
            "",
            "",
            "",
            ""
    };

    static final short[] dfa_75 = DFA.unpackEncodedString(dfa_75s);
    static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
    static final char[] dfa_77 = DFA.unpackEncodedStringToUnsignedChars(dfa_77s);
    static final char[] dfa_78 = DFA.unpackEncodedStringToUnsignedChars(dfa_78s);
    static final short[] dfa_79 = DFA.unpackEncodedString(dfa_79s);
    static final short[] dfa_80 = DFA.unpackEncodedString(dfa_80s);
    static final short[][] dfa_81 = unpackEncodedStringArray(dfa_81s);

    class DFA226 extends DFA {

        public DFA226(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 226;
            this.eot = dfa_75;
            this.eof = dfa_76;
            this.min = dfa_77;
            this.max = dfa_78;
            this.accept = dfa_79;
            this.special = dfa_80;
            this.transition = dfa_81;
        }
        public String getDescription() {
            return "9756:4: ( (otherlv_1= '<-' ( (lv_ownedCoIterator_2_0= ruleCoIteratorVariableCS ) ) (otherlv_3= '=' ( (lv_ownedInitExpression_4_0= ruleExpCS ) ) )? ) | (otherlv_5= ':' ( (lv_ownedType_6_0= ruleTypeExpCS ) ) (otherlv_7= '<-' ( (lv_ownedCoIterator_8_0= ruleCoIteratorVariableCS ) ) )? (otherlv_9= '=' ( (lv_ownedInitExpression_10_0= ruleExpCS ) ) )? ) | ( (otherlv_11= ':' ( (lv_ownedType_12_0= ruleTypeExpCS ) ) )? (otherlv_13= '<-' ( (lv_ownedCoIterator_14_0= ruleCoIteratorVariableCS ) ) )? otherlv_15= 'in' ( (lv_ownedInitExpression_16_0= ruleExpCS ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA226_1 = input.LA(1);


                        int index226_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred376_InternalQVTrelation()) ) {s = 9;}

                        else if ( (synpred382_InternalQVTrelation()) ) {s = 3;}


                        input.seek(index226_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA226_2 = input.LA(1);


                        int index226_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred379_InternalQVTrelation()) ) {s = 10;}

                        else if ( (synpred382_InternalQVTrelation()) ) {s = 3;}


                        input.seek(index226_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 226, _s, input);
            error(nvae);
            throw nvae;
        }
    }

    class DFA235 extends DFA {

        public DFA235(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 235;
            this.eot = dfa_75;
            this.eof = dfa_76;
            this.min = dfa_77;
            this.max = dfa_78;
            this.accept = dfa_79;
            this.special = dfa_80;
            this.transition = dfa_81;
        }
        public String getDescription() {
            return "10141:3: ( (otherlv_2= '<-' ( (lv_ownedCoIterator_3_0= ruleCoIteratorVariableCS ) ) (otherlv_4= '=' ( (lv_ownedInitExpression_5_0= ruleExpCS ) ) )? ) | (otherlv_6= ':' ( (lv_ownedType_7_0= ruleTypeExpCS ) ) (otherlv_8= '<-' ( (lv_ownedCoIterator_9_0= ruleCoIteratorVariableCS ) ) )? (otherlv_10= '=' ( (lv_ownedInitExpression_11_0= ruleExpCS ) ) )? ) | ( (otherlv_12= ':' ( (lv_ownedType_13_0= ruleTypeExpCS ) ) )? (otherlv_14= '<-' ( (lv_ownedCoIterator_15_0= ruleCoIteratorVariableCS ) ) )? otherlv_16= 'in' ( (lv_ownedInitExpression_17_0= ruleExpCS ) ) ) )?";
        }
        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
            TokenStream input = (TokenStream)_input;
        	int _s = s;
            switch ( s ) {
                    case 0 :
                        int LA235_1 = input.LA(1);


                        int index235_1 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred387_InternalQVTrelation()) ) {s = 9;}

                        else if ( (synpred393_InternalQVTrelation()) ) {s = 3;}


                        input.seek(index235_1);
                        if ( s>=0 ) return s;
                        break;
                    case 1 :
                        int LA235_2 = input.LA(1);


                        int index235_2 = input.index();
                        input.rewind();
                        s = -1;
                        if ( (synpred390_InternalQVTrelation()) ) {s = 10;}

                        else if ( (synpred393_InternalQVTrelation()) ) {s = 3;}


                        input.seek(index235_2);
                        if ( s>=0 ) return s;
                        break;
            }
            if (state.backtracking>0) {state.failed=true; return -1;}
            NoViableAltException nvae =
                new NoViableAltException(getDescription(), 235, _s, input);
            error(nvae);
            throw nvae;
        }
    }
    static final String dfa_82s = "\1\u0094\1\uffff\66\u008f\1\uffff";
    static final String[] dfa_83s = {
            "\1\1\1\uffff\1\1\1\2\1\3\10\uffff\1\56\1\70\6\uffff\1\40\1\44\1\61\1\43\1\45\1\41\1\52\1\53\1\1\1\uffff\1\42\1\50\1\25\1\34\1\57\1\63\1\4\1\60\1\55\1\uffff\1\64\1\16\1\46\1\1\1\66\1\67\1\47\1\51\1\54\1\62\1\65\1\32\1\12\1\5\1\13\1\uffff\1\17\1\uffff\1\24\1\uffff\1\27\2\uffff\1\35\1\uffff\1\36\1\uffff\1\37\1\uffff\1\20\1\14\1\11\1\31\1\uffff\1\15\1\22\1\23\1\33\1\6\1\26\1\uffff\1\10\1\uffff\1\30\1\uffff\1\7\1\21\3\1\23\uffff\17\1\1\uffff\1\1\1\uffff\4\1\6\uffff\1\1\4\uffff\2\1",
            "",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            "\1\70\2\1\14\uffff\1\1\12\uffff\1\1\3\uffff\1\1\53\uffff\1\1\2\uffff\23\1\26\uffff\1\1\1\uffff\1\1\4\uffff\1\1",
            ""
    };
    static final char[] dfa_82 = DFA.unpackEncodedStringToUnsignedChars(dfa_82s);
    static final short[][] dfa_83 = unpackEncodedStringArray(dfa_83s);

    class DFA239 extends DFA {

        public DFA239(BaseRecognizer recognizer) {
            this.recognizer = recognizer;
            this.decisionNumber = 239;
            this.eot = dfa_1;
            this.eof = dfa_1;
            this.min = dfa_38;
            this.max = dfa_82;
            this.accept = dfa_40;
            this.special = dfa_5;
            this.transition = dfa_83;
        }
        public String getDescription() {
            return "10563:5: (lv_ownedCondition_1_1= ruleExpCS | lv_ownedCondition_1_2= rulePatternExpCS )";
        }
    }



    private static class FollowSets000 {
        public static final BitSet FOLLOW_1 = new BitSet(new long[]{0x0000000000000000L});
        public static final BitSet FOLLOW_2 = new BitSet(new long[]{0x0000000000000002L});
        public static final BitSet FOLLOW_3 = new BitSet(new long[]{0x0000A00000020002L});
        public static final BitSet FOLLOW_4 = new BitSet(new long[]{0x0000200000020002L});
        public static final BitSet FOLLOW_5 = new BitSet(new long[]{0xAFFEEFF9FE020180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x00000000005C0000L});
        public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000580000L});
        public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000000010L});
        public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000500000L});
        public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000222000220000L,0x0000000004009000L});
        public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000040000L});
        public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000000000L,0xF000000000000000L,0x0000000000000001L});
        public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000100002L});
        public static final BitSet FOLLOW_14 = new BitSet(new long[]{0xAFFEEFF9FE260180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000001800000L});
        public static final BitSet FOLLOW_16 = new BitSet(new long[]{0xAFFEEFF9FE060180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000200000L});
        public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000080000L});
        public static final BitSet FOLLOW_19 = new BitSet(new long[]{0xAFFFEFFBFE0201D0L,0xFFFC00007D5FBD52L,0x00000000001840F5L});
        public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000400000L});
        public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000010000000L});
        public static final BitSet FOLLOW_22 = new BitSet(new long[]{0xAFFEEFF9FE460180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000060C00000L});
        public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000040400000L});
        public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000100000L});
        public static final BitSet FOLLOW_26 = new BitSet(new long[]{0xAFFEEFF9FE220180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_27 = new BitSet(new long[]{0xAFFFEFFBFE0201D0L,0xFFFC00007D5FBD52L,0x00000000001040F5L});
        public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000000A00000L});
        public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000200000000L});
        public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000400000000L});
        public static final BitSet FOLLOW_31 = new BitSet(new long[]{0xAFFEEFF9FE120180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000001800000002L});
        public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000001000000002L});
        public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000C00000L});
        public static final BitSet FOLLOW_35 = new BitSet(new long[]{0xAFFFEFFBFE0601D0L,0xFFFC00007D5FBD52L,0x00000000001840F5L});
        public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000008000000000L});
        public static final BitSet FOLLOW_37 = new BitSet(new long[]{0xAFFEEFFDFE020180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000400800000L});
        public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000020500000L});
        public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000060000000000L});
        public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000040000000000L});
        public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000080000100000L});
        public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0004000000200000L});
        public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000100000000000L});
        public static final BitSet FOLLOW_45 = new BitSet(new long[]{0xAFFEEFF9FE020182L,0xFFFC00000D5FBD52L,0x0000000000000001L});
        public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000400000100000L});
        public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000900000L});
        public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x074007C080200000L,0x0000000000100000L});
        public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x070007C080200000L,0x0000000000100000L});
        public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x070007C000200000L,0x0000000000100000L});
        public static final BitSet FOLLOW_51 = new BitSet(new long[]{0xAFFEEFF9FE020190L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000100000400000L});
        public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0001000000000000L});
        public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000CC0000L});
        public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000480000L});
        public static final BitSet FOLLOW_56 = new BitSet(new long[]{0xAFFFEFFBFE2201D0L,0xFFFC00007D5FBD52L,0x00000000001840F5L});
        public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000400L});
        public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0600000000000000L});
        public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0400000000000000L});
        public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0500000000000000L});
        public static final BitSet FOLLOW_61 = new BitSet(new long[]{0xF800004000000000L,0x00000000000003FFL});
        public static final BitSet FOLLOW_62 = new BitSet(new long[]{0xF800004000A00000L,0x00000000000003FFL});
        public static final BitSet FOLLOW_63 = new BitSet(new long[]{0xF800004000200000L,0x00000000000003FFL});
        public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000200000L,0x0000000000000C00L});
        public static final BitSet FOLLOW_65 = new BitSet(new long[]{0xAFFFEFFBFE4201F0L,0xFFFC00007D5FBD52L,0x00000000001840F5L});
        public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x00A8000000200000L});
        public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000400002L});
        public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
        public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000200540000L});
        public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000540000L});
        public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000200000L,0x0000000000006000L});
        public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000200180L,0x0000000000010000L});
        public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000040L,0x0000000010000000L});
        public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0200000000000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0100000000000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_77 = new BitSet(new long[]{0xAFFEEFFBFE020180L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000540000L,0x0000000000040000L});
        public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000500000L,0x0000000000040000L});
        public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000D00000L});
        public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x9800000000000000L,0x0000000000000031L});
        public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x9800000000A00000L,0x0000000000000031L});
        public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x9800000000200000L,0x0000000000000031L});
        public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000200000L,0x0000000000080000L});
        public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000140002L});
        public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x8000000000000000L,0x0000000000000031L});
        public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x8000000000A00000L,0x0000000000000031L});
        public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x8000000000200000L,0x0000000000000031L});
        public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0200000000000000L,0x0000000000100000L});
        public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000000000100000L});
        public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0100000000000000L,0x0000000000100000L});
        public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x00000000005C0000L,0x0000000000200000L});
        public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x9800004000000000L,0x0000000003C003FFL});
        public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x9800004000A00000L,0x0000000003C003FFL});
        public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x9800004000200000L,0x0000000003C003FFL});
        public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000001000400000L});
        public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
        public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000400200540000L});
        public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000400000540000L});
        public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000D40000L});
        public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000200000L,0x0000000008000000L});
        public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x070007C000200000L,0x0000000000120000L});
        public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x00A8000000300000L});
        public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000040L});
        public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000100000000002L});
        public static final BitSet FOLLOW_106 = new BitSet(new long[]{0xAFFEEFF9FE020180L,0xFFFC00000D5FBD52L,0x0000000000000001L});
        public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000200000002L});
        public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000400000000L,0x0000000000000000L,0x0000000000000400L});
        public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000800000L});
        public static final BitSet FOLLOW_110 = new BitSet(new long[]{0xAFFFEFFBFE2601D0L,0xFFFC00007D5FBD52L,0x00000000001840F5L});
        public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000002L});
        public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000000000000180L});
        public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
        public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x00000000000C0000L});
        public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000000012L});
        public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0001000000080002L,0x0003FFFF90000000L});
        public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000200100002L,0x0000000000000000L,0x0000000000000500L});
        public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0000000000100002L,0x0000000000000000L,0x0000000000000100L});
        public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000100L});
        public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
        public static final BitSet FOLLOW_121 = new BitSet(new long[]{0xAFFEEFF9FE220190L,0x000000000D5FBD52L});
        public static final BitSet FOLLOW_122 = new BitSet(new long[]{0xAFFFEFFFFE0601D0L,0xFFFC00007D5FBD52L,0x00000000001840F5L});
        public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000400C00000L,0x0000000000000000L,0x0000000000002000L});
        public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000000L,0x0000000000000800L});
        public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000040002L,0x0000000000000000L,0x0000000000001008L});
        public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000080002L});
        public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000080002L,0x0000000000000000L,0x0000000000000008L});
        public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001008L});
        public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
        public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000000040002L});
        public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
        public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000050000L});
        public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000020000L});
        public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000800000L,0x0000000000000000L,0x0000000000001000L});
        public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x00000002000C0000L});
        public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0001000000000040L});
        public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0001000000000040L,0x0000000100000000L,0x0000000000800000L});
        public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000600800L});
        public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
        public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000400000000002L});
        public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000001000000L});
    }


}