/**
 *                                                                            
 *  Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany) 
 *                                                                            
 *  All rights reserved. This program and the accompanying materials           
 *  are made available under the terms of the Eclipse Public License v1.0       
 *  which accompanies this distribution, and is available at                  
 *  http://www.eclipse.org/legal/epl-v10.html                                 
 *                                                                            
 *  Contributors:                                                      
 * 	   Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation
 * 
 */

package org.eclipse.osbp.xtext.reportdsl.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.emf.common.util.Enumerator;
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.osbp.xtext.reportdsl.services.ReportDSLGrammarAccess;



import org.antlr.runtime.*;
import java.util.Stack;
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
@SuppressWarnings("all")
public class InternalReportDSLParser extends AbstractInternalAntlrParser {
    public static final String[] tokenNames = new String[] {
        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_INT", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'layout-data'", "'externalCssURI'", "'from bundle'", "'}'", "'formatters'", "'colors'", "'fonts'", "'medias'", "'media'", "'styles'", "'pagetemplate'", "'type'", "'orientation'", "'topmargin'", "'leftmargin'", "'bottommargin'", "'rightmargin'", "'color'", "'darkens'", "'by-percent'", "'lightens'", "'transforms'", "'towards'", "'font'", "'extends'", "'family'", "'bold'", "'size'", "'style'", "'formatter'", "'backgroundcolor'", "'alternate'", "'textcolor'", "'textalign'", "'border-top'", "'border-bottom'", "'border-left'", "'border-right'", "'padding-top'", "'padding-bottom'", "'padding-left'", "'padding-right'", "'margin-top'", "'margin-bottom'", "'margin-left'", "'margin-right'", "'uomo'", "'ui'", "'report'", "'number'", "'currency'", "'date'", "'date+time'", "'time'", "'described by'", "'toolbar'", "'datamart'", "'rendering'", "'file'", "'template'", "'header'", "'showOnFirst'", "'height'", "'detail'", "'footer'", "'showOnLast'", "'grid'", "'as'", "'row'", "'cell'", "'columnspan'", "'table'", "'detailheader'", "'detailfooter'", "'group'", "'by'", "'details'", "'all'", "'image'", "'intervals'", "'hidelabel'", "'lookups'", "'path'", "'dynamic'", "'resize'", "'property'", "'aggregate'", "'on-group'", "'title'", "'of'", "'('", "')'", "'up to'", "'days in past'", "'string'", "'-'", "'cellcolor'", "'icon'", "'trend'", "'subtitle'", "'subsubtitle'", "'label'", "'text'", "'autotext'", "'scale'", "'import'", "'.'", "'*'", "'@'", "','", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'::'", "'?.'", "'|'", "';'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'for'", "'while'", "'do'", "'var'", "'val'", "'static'", "'extension'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'mm'", "'cm'", "'pt'", "'inch'", "'pc'", "'em'", "'ex'", "'px'", "'a4'", "'a3'", "'a5'", "'us-letter'", "'us-legal'", "'us-ledger'", "'us-super-b'", "'portrait'", "'landscape'", "'normal'", "'italic'", "'oblique'", "'monospace'", "'sans-serif'", "'serif'", "'left'", "'center'", "'right'", "'unformatted'", "'general-number'", "'fixed'", "'percent'", "'scientific'", "'custom'", "'html'", "'pdf'", "'count'", "'running-count'", "'sum'", "'average'", "'minimum'", "'maximum'", "'running-sum'", "'divide'", "'concat'", "'rising'", "'bad-rising'", "'sloping'", "'good-sloping'", "'stagnating'", "'none'", "'solid'", "'dotted'", "'dashed'", "'double'", "'groove'", "'ridge'", "'inset'", "'outset'", "'page-number'", "'total-page'", "'page-number-unfiltered'", "'total-page-unfiltered'", "'page-variable'", "'size-to-image'", "'scale-to-item'", "'clip'", "'url'", "'embed'"
    };
    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__254=254;
    public static final int T__132=132;
    public static final int T__253=253;
    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__250=250;
    public static final int RULE_ID=5;
    public static final int T__131=131;
    public static final int T__252=252;
    public static final int T__130=130;
    public static final int T__251=251;
    public static final int RULE_INT=6;
    public static final int T__66=66;
    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__247=247;
    public static final int T__63=63;
    public static final int T__125=125;
    public static final int T__246=246;
    public static final int T__64=64;
    public static final int T__128=128;
    public static final int T__249=249;
    public static final int T__65=65;
    public static final int T__127=127;
    public static final int T__248=248;
    public static final int T__166=166;
    public static final int T__165=165;
    public static final int T__168=168;
    public static final int T__167=167;
    public static final int T__162=162;
    public static final int T__161=161;
    public static final int T__164=164;
    public static final int T__163=163;
    public static final int T__160=160;
    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__159=159;
    public static final int T__30=30;
    public static final int T__158=158;
    public static final int T__31=31;
    public static final int T__32=32;
    public static final int T__155=155;
    public static final int T__154=154;
    public static final int T__157=157;
    public static final int T__156=156;
    public static final int T__151=151;
    public static final int T__150=150;
    public static final int T__153=153;
    public static final int T__152=152;
    public static final int T__48=48;
    public static final int T__49=49;
    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 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__100=100;
    public static final int T__221=221;
    public static final int T__220=220;
    public static final int T__102=102;
    public static final int T__223=223;
    public static final int T__101=101;
    public static final int T__222=222;
    public static final int T__19=19;
    public static final int T__15=15;
    public static final int T__16=16;
    public static final int T__17=17;
    public static final int T__18=18;
    public static final int T__218=218;
    public static final int T__217=217;
    public static final int T__13=13;
    public static final int T__14=14;
    public static final int T__219=219;
    public static final int T__214=214;
    public static final int T__213=213;
    public static final int T__216=216;
    public static final int T__215=215;
    public static final int T__210=210;
    public static final int T__212=212;
    public static final int T__211=211;
    public static final int RULE_DECIMAL=8;
    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__207=207;
    public static final int T__23=23;
    public static final int T__206=206;
    public static final int T__24=24;
    public static final int T__209=209;
    public static final int T__25=25;
    public static final int T__208=208;
    public static final int T__203=203;
    public static final int T__202=202;
    public static final int T__20=20;
    public static final int T__205=205;
    public static final int T__21=21;
    public static final int T__204=204;
    public static final int T__122=122;
    public static final int T__243=243;
    public static final int T__121=121;
    public static final int T__242=242;
    public static final int T__124=124;
    public static final int T__245=245;
    public static final int T__123=123;
    public static final int T__244=244;
    public static final int T__120=120;
    public static final int T__241=241;
    public static final int T__240=240;
    public static final int RULE_SL_COMMENT=10;
    public static final int T__119=119;
    public static final int T__118=118;
    public static final int T__239=239;
    public static final int T__115=115;
    public static final int T__236=236;
    public static final int EOF=-1;
    public static final int T__114=114;
    public static final int T__235=235;
    public static final int T__117=117;
    public static final int T__238=238;
    public static final int T__116=116;
    public static final int T__237=237;
    public static final int T__111=111;
    public static final int T__232=232;
    public static final int T__110=110;
    public static final int T__231=231;
    public static final int T__113=113;
    public static final int T__234=234;
    public static final int T__112=112;
    public static final int T__233=233;
    public static final int T__230=230;
    public static final int T__108=108;
    public static final int T__229=229;
    public static final int T__107=107;
    public static final int T__228=228;
    public static final int T__109=109;
    public static final int T__104=104;
    public static final int T__225=225;
    public static final int T__103=103;
    public static final int T__224=224;
    public static final int T__106=106;
    public static final int T__227=227;
    public static final int T__105=105;
    public static final int T__226=226;
    public static final int RULE_HEX=7;
    public static final int RULE_ML_COMMENT=9;
    public static final int T__201=201;
    public static final int T__200=200;
    public static final int T__91=91;
    public static final int T__188=188;
    public static final int T__92=92;
    public static final int T__187=187;
    public static final int T__93=93;
    public static final int T__94=94;
    public static final int T__189=189;
    public static final int T__184=184;
    public static final int T__183=183;
    public static final int T__186=186;
    public static final int T__90=90;
    public static final int T__185=185;
    public static final int T__180=180;
    public static final int T__182=182;
    public static final int T__181=181;
    public static final int T__99=99;
    public static final int T__95=95;
    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__177=177;
    public static final int T__176=176;
    public static final int T__179=179;
    public static final int T__178=178;
    public static final int T__173=173;
    public static final int T__172=172;
    public static final int T__175=175;
    public static final int T__174=174;
    public static final int T__171=171;
    public static final int T__170=170;
    public static final int T__169=169;
    public static final int T__70=70;
    public static final int T__71=71;
    public static final int T__72=72;
    public static final int RULE_STRING=4;
    public static final int T__77=77;
    public static final int T__78=78;
    public static final int T__79=79;
    public static final int T__73=73;
    public static final int T__74=74;
    public static final int T__75=75;
    public static final int T__76=76;
    public static final int T__80=80;
    public static final int T__199=199;
    public static final int T__81=81;
    public static final int T__198=198;
    public static final int T__82=82;
    public static final int T__83=83;
    public static final int T__195=195;
    public static final int T__194=194;
    public static final int RULE_WS=11;
    public static final int T__197=197;
    public static final int T__196=196;
    public static final int T__191=191;
    public static final int T__190=190;
    public static final int T__193=193;
    public static final int T__192=192;
    public static final int RULE_ANY_OTHER=12;
    public static final int T__88=88;
    public static final int T__89=89;
    public static final int T__84=84;
    public static final int T__85=85;
    public static final int T__86=86;
    public static final int T__87=87;

    // delegates
    // delegators


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

    public String[] getTokenNames() { return InternalReportDSLParser.tokenNames; }
    public String getGrammarFileName() { return "../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g"; }



     	private ReportDSLGrammarAccess grammarAccess;
     	
        public InternalReportDSLParser(TokenStream input, ReportDSLGrammarAccess grammarAccess) {
            this(input);
            this.grammarAccess = grammarAccess;
            registerRules(grammarAccess.getGrammar());
        }
        
        @Override
        protected String getFirstRuleName() {
        	return "ReportModel";	
       	}
       	
       	@Override
       	protected ReportDSLGrammarAccess getGrammarAccess() {
       		return grammarAccess;
       	}



    // $ANTLR start "entryRuleReportModel"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:68:1: entryRuleReportModel returns [EObject current=null] : iv_ruleReportModel= ruleReportModel EOF ;
    public final EObject entryRuleReportModel() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReportModel = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:69:2: (iv_ruleReportModel= ruleReportModel EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:70:2: iv_ruleReportModel= ruleReportModel EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReportModelRule()); 
            }
            pushFollow(FOLLOW_ruleReportModel_in_entryRuleReportModel75);
            iv_ruleReportModel=ruleReportModel();

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

            }

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


    // $ANTLR start "ruleReportModel"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:77:1: ruleReportModel returns [EObject current=null] : ( (lv_pckg_0_0= ruleReportPackage ) )* ;
    public final EObject ruleReportModel() throws RecognitionException {
        EObject current = null;

        EObject lv_pckg_0_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:80:28: ( ( (lv_pckg_0_0= ruleReportPackage ) )* )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:81:1: ( (lv_pckg_0_0= ruleReportPackage ) )*
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:81:1: ( (lv_pckg_0_0= ruleReportPackage ) )*
            loop1:
            do {
                int alt1=2;
                switch ( input.LA(1) ) {
                case 13:
                    {
                    alt1=1;
                    }
                    break;

                }

                switch (alt1) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:82:1: (lv_pckg_0_0= ruleReportPackage )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:82:1: (lv_pckg_0_0= ruleReportPackage )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:83:3: lv_pckg_0_0= ruleReportPackage
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getReportModelAccess().getPckgReportPackageParserRuleCall_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleReportPackage_in_ruleReportModel130);
            	    lv_pckg_0_0=ruleReportPackage();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getReportModelRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"pckg",
            	              		lv_pckg_0_0, 
            	              		"ReportPackage");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleReportModel"


    // $ANTLR start "entryRuleReportPackage"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:107:1: entryRuleReportPackage returns [EObject current=null] : iv_ruleReportPackage= ruleReportPackage EOF ;
    public final EObject entryRuleReportPackage() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleReportPackage = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:108:2: (iv_ruleReportPackage= ruleReportPackage EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:109:2: iv_ruleReportPackage= ruleReportPackage EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getReportPackageRule()); 
            }
            pushFollow(FOLLOW_ruleReportPackage_in_entryRuleReportPackage166);
            iv_ruleReportPackage=ruleReportPackage();

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

            }

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


    // $ANTLR start "ruleReportPackage"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:116:1: ruleReportPackage returns [EObject current=null] : ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= '{' ( (lv_imports_4_0= ruleReportImport ) )* (otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}' )? ( (lv_reports_18_0= ruleReport ) )* otherlv_19= '}' ) ;
    public final EObject ruleReportPackage() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token lv_externalCssURI_8_0=null;
        Token otherlv_9=null;
        Token lv_externalCssURIBundle_10_0=null;
        Token otherlv_17=null;
        Token otherlv_19=null;
        AntlrDatatypeRuleToken lv_name_2_0 = null;

        EObject lv_imports_4_0 = null;

        EObject lv_pagetemplates_11_0 = null;

        EObject lv_formatters_12_0 = null;

        EObject lv_colors_13_0 = null;

        EObject lv_fonts_14_0 = null;

        EObject lv_medias_15_0 = null;

        EObject lv_styles_16_0 = null;

        EObject lv_reports_18_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:119:28: ( ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= '{' ( (lv_imports_4_0= ruleReportImport ) )* (otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}' )? ( (lv_reports_18_0= ruleReport ) )* otherlv_19= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:120:1: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= '{' ( (lv_imports_4_0= ruleReportImport ) )* (otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}' )? ( (lv_reports_18_0= ruleReport ) )* otherlv_19= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:120:1: ( () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= '{' ( (lv_imports_4_0= ruleReportImport ) )* (otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}' )? ( (lv_reports_18_0= ruleReport ) )* otherlv_19= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:120:2: () otherlv_1= 'package' ( (lv_name_2_0= ruleQualifiedName ) ) otherlv_3= '{' ( (lv_imports_4_0= ruleReportImport ) )* (otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}' )? ( (lv_reports_18_0= ruleReport ) )* otherlv_19= '}'
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:120:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:121:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getReportPackageAccess().getReportPackageAction_0(),
                          current);
                  
            }

            }

            otherlv_1=(Token)match(input,13,FOLLOW_13_in_ruleReportPackage222); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getReportPackageAccess().getPackageKeyword_1());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:130:1: ( (lv_name_2_0= ruleQualifiedName ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:131:1: (lv_name_2_0= ruleQualifiedName )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:131:1: (lv_name_2_0= ruleQualifiedName )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:132:3: lv_name_2_0= ruleQualifiedName
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getReportPackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleQualifiedName_in_ruleReportPackage243);
            lv_name_2_0=ruleQualifiedName();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
              	        }
                     		set(
                     			current, 
                     			"name",
                      		lv_name_2_0, 
                      		"QualifiedName");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_3=(Token)match(input,14,FOLLOW_14_in_ruleReportPackage255); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getReportPackageAccess().getLeftCurlyBracketKeyword_3());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:152:1: ( (lv_imports_4_0= ruleReportImport ) )*
            loop2:
            do {
                int alt2=2;
                switch ( input.LA(1) ) {
                case 120:
                    {
                    alt2=1;
                    }
                    break;

                }

                switch (alt2) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:153:1: (lv_imports_4_0= ruleReportImport )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:153:1: (lv_imports_4_0= ruleReportImport )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:154:3: lv_imports_4_0= ruleReportImport
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getReportPackageAccess().getImportsReportImportParserRuleCall_4_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleReportImport_in_ruleReportPackage276);
            	    lv_imports_4_0=ruleReportImport();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"imports",
            	              		lv_imports_4_0, 
            	              		"ReportImport");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:170:3: (otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}' )?
            int alt5=2;
            switch ( input.LA(1) ) {
                case 15:
                    {
                    alt5=1;
                    }
                    break;
            }

            switch (alt5) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:170:5: otherlv_5= 'layout-data' otherlv_6= '{' (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )? ( (lv_pagetemplates_11_0= rulePageTemplates ) ) ( (lv_formatters_12_0= ruleSomeFormats ) ) ( (lv_colors_13_0= ruleColors ) ) ( (lv_fonts_14_0= ruleFonts ) ) ( (lv_medias_15_0= ruleMedias ) ) ( (lv_styles_16_0= ruleStyles ) ) otherlv_17= '}'
                    {
                    otherlv_5=(Token)match(input,15,FOLLOW_15_in_ruleReportPackage290); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getReportPackageAccess().getLayoutDataKeyword_5_0());
                          
                    }
                    otherlv_6=(Token)match(input,14,FOLLOW_14_in_ruleReportPackage302); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_6, grammarAccess.getReportPackageAccess().getLeftCurlyBracketKeyword_5_1());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:178:1: (otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )? )?
                    int alt4=2;
                    switch ( input.LA(1) ) {
                        case 16:
                            {
                            alt4=1;
                            }
                            break;
                    }

                    switch (alt4) {
                        case 1 :
                            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:178:3: otherlv_7= 'externalCssURI' ( (lv_externalCssURI_8_0= RULE_STRING ) ) (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )?
                            {
                            otherlv_7=(Token)match(input,16,FOLLOW_16_in_ruleReportPackage315); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                                  	newLeafNode(otherlv_7, grammarAccess.getReportPackageAccess().getExternalCssURIKeyword_5_2_0());
                                  
                            }
                            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:182:1: ( (lv_externalCssURI_8_0= RULE_STRING ) )
                            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:183:1: (lv_externalCssURI_8_0= RULE_STRING )
                            {
                            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:183:1: (lv_externalCssURI_8_0= RULE_STRING )
                            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:184:3: lv_externalCssURI_8_0= RULE_STRING
                            {
                            lv_externalCssURI_8_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleReportPackage332); if (state.failed) return current;
                            if ( state.backtracking==0 ) {

                              			newLeafNode(lv_externalCssURI_8_0, grammarAccess.getReportPackageAccess().getExternalCssURISTRINGTerminalRuleCall_5_2_1_0()); 
                              		
                            }
                            if ( state.backtracking==0 ) {

                              	        if (current==null) {
                              	            current = createModelElement(grammarAccess.getReportPackageRule());
                              	        }
                                     		setWithLastConsumed(
                                     			current, 
                                     			"externalCssURI",
                                      		lv_externalCssURI_8_0, 
                                      		"STRING");
                              	    
                            }

                            }


                            }

                            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:200:2: (otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) ) )?
                            int alt3=2;
                            switch ( input.LA(1) ) {
                                case 17:
                                    {
                                    alt3=1;
                                    }
                                    break;
                            }

                            switch (alt3) {
                                case 1 :
                                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:200:4: otherlv_9= 'from bundle' ( (lv_externalCssURIBundle_10_0= RULE_STRING ) )
                                    {
                                    otherlv_9=(Token)match(input,17,FOLLOW_17_in_ruleReportPackage350); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                          	newLeafNode(otherlv_9, grammarAccess.getReportPackageAccess().getFromBundleKeyword_5_2_2_0());
                                          
                                    }
                                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:204:1: ( (lv_externalCssURIBundle_10_0= RULE_STRING ) )
                                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:205:1: (lv_externalCssURIBundle_10_0= RULE_STRING )
                                    {
                                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:205:1: (lv_externalCssURIBundle_10_0= RULE_STRING )
                                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:206:3: lv_externalCssURIBundle_10_0= RULE_STRING
                                    {
                                    lv_externalCssURIBundle_10_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleReportPackage367); if (state.failed) return current;
                                    if ( state.backtracking==0 ) {

                                      			newLeafNode(lv_externalCssURIBundle_10_0, grammarAccess.getReportPackageAccess().getExternalCssURIBundleSTRINGTerminalRuleCall_5_2_2_1_0()); 
                                      		
                                    }
                                    if ( state.backtracking==0 ) {

                                      	        if (current==null) {
                                      	            current = createModelElement(grammarAccess.getReportPackageRule());
                                      	        }
                                             		setWithLastConsumed(
                                             			current, 
                                             			"externalCssURIBundle",
                                              		lv_externalCssURIBundle_10_0, 
                                              		"STRING");
                                      	    
                                    }

                                    }


                                    }


                                    }
                                    break;

                            }


                            }
                            break;

                    }

                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:222:6: ( (lv_pagetemplates_11_0= rulePageTemplates ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:223:1: (lv_pagetemplates_11_0= rulePageTemplates )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:223:1: (lv_pagetemplates_11_0= rulePageTemplates )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:224:3: lv_pagetemplates_11_0= rulePageTemplates
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getReportPackageAccess().getPagetemplatesPageTemplatesParserRuleCall_5_3_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_rulePageTemplates_in_ruleReportPackage397);
                    lv_pagetemplates_11_0=rulePageTemplates();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
                      	        }
                             		set(
                             			current, 
                             			"pagetemplates",
                              		lv_pagetemplates_11_0, 
                              		"PageTemplates");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:240:2: ( (lv_formatters_12_0= ruleSomeFormats ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:241:1: (lv_formatters_12_0= ruleSomeFormats )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:241:1: (lv_formatters_12_0= ruleSomeFormats )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:242:3: lv_formatters_12_0= ruleSomeFormats
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getReportPackageAccess().getFormattersSomeFormatsParserRuleCall_5_4_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_ruleSomeFormats_in_ruleReportPackage418);
                    lv_formatters_12_0=ruleSomeFormats();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
                      	        }
                             		set(
                             			current, 
                             			"formatters",
                              		lv_formatters_12_0, 
                              		"SomeFormats");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:258:2: ( (lv_colors_13_0= ruleColors ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:259:1: (lv_colors_13_0= ruleColors )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:259:1: (lv_colors_13_0= ruleColors )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:260:3: lv_colors_13_0= ruleColors
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getReportPackageAccess().getColorsColorsParserRuleCall_5_5_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_ruleColors_in_ruleReportPackage439);
                    lv_colors_13_0=ruleColors();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
                      	        }
                             		set(
                             			current, 
                             			"colors",
                              		lv_colors_13_0, 
                              		"Colors");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:276:2: ( (lv_fonts_14_0= ruleFonts ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:277:1: (lv_fonts_14_0= ruleFonts )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:277:1: (lv_fonts_14_0= ruleFonts )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:278:3: lv_fonts_14_0= ruleFonts
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getReportPackageAccess().getFontsFontsParserRuleCall_5_6_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_ruleFonts_in_ruleReportPackage460);
                    lv_fonts_14_0=ruleFonts();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
                      	        }
                             		set(
                             			current, 
                             			"fonts",
                              		lv_fonts_14_0, 
                              		"Fonts");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:294:2: ( (lv_medias_15_0= ruleMedias ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:295:1: (lv_medias_15_0= ruleMedias )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:295:1: (lv_medias_15_0= ruleMedias )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:296:3: lv_medias_15_0= ruleMedias
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getReportPackageAccess().getMediasMediasParserRuleCall_5_7_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_ruleMedias_in_ruleReportPackage481);
                    lv_medias_15_0=ruleMedias();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
                      	        }
                             		set(
                             			current, 
                             			"medias",
                              		lv_medias_15_0, 
                              		"Medias");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:312:2: ( (lv_styles_16_0= ruleStyles ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:313:1: (lv_styles_16_0= ruleStyles )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:313:1: (lv_styles_16_0= ruleStyles )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:314:3: lv_styles_16_0= ruleStyles
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getReportPackageAccess().getStylesStylesParserRuleCall_5_8_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_ruleStyles_in_ruleReportPackage502);
                    lv_styles_16_0=ruleStyles();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
                      	        }
                             		set(
                             			current, 
                             			"styles",
                              		lv_styles_16_0, 
                              		"Styles");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }

                    otherlv_17=(Token)match(input,18,FOLLOW_18_in_ruleReportPackage514); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_17, grammarAccess.getReportPackageAccess().getRightCurlyBracketKeyword_5_9());
                          
                    }

                    }
                    break;

            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:334:3: ( (lv_reports_18_0= ruleReport ) )*
            loop6:
            do {
                int alt6=2;
                switch ( input.LA(1) ) {
                case 63:
                    {
                    alt6=1;
                    }
                    break;

                }

                switch (alt6) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:335:1: (lv_reports_18_0= ruleReport )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:335:1: (lv_reports_18_0= ruleReport )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:336:3: lv_reports_18_0= ruleReport
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getReportPackageAccess().getReportsReportParserRuleCall_6_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleReport_in_ruleReportPackage537);
            	    lv_reports_18_0=ruleReport();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getReportPackageRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"reports",
            	              		lv_reports_18_0, 
            	              		"Report");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_19=(Token)match(input,18,FOLLOW_18_in_ruleReportPackage550); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_19, grammarAccess.getReportPackageAccess().getRightCurlyBracketKeyword_7());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleReportPackage"


    // $ANTLR start "entryRulePageTemplates"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:364:1: entryRulePageTemplates returns [EObject current=null] : iv_rulePageTemplates= rulePageTemplates EOF ;
    public final EObject entryRulePageTemplates() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePageTemplates = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:365:2: (iv_rulePageTemplates= rulePageTemplates EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:366:2: iv_rulePageTemplates= rulePageTemplates EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPageTemplatesRule()); 
            }
            pushFollow(FOLLOW_rulePageTemplates_in_entryRulePageTemplates586);
            iv_rulePageTemplates=rulePageTemplates();

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

            }

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


    // $ANTLR start "rulePageTemplates"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:373:1: rulePageTemplates returns [EObject current=null] : ( () ( (lv_pagetemplates_1_0= rulePageTemplate ) )* ) ;
    public final EObject rulePageTemplates() throws RecognitionException {
        EObject current = null;

        EObject lv_pagetemplates_1_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:376:28: ( ( () ( (lv_pagetemplates_1_0= rulePageTemplate ) )* ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:377:1: ( () ( (lv_pagetemplates_1_0= rulePageTemplate ) )* )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:377:1: ( () ( (lv_pagetemplates_1_0= rulePageTemplate ) )* )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:377:2: () ( (lv_pagetemplates_1_0= rulePageTemplate ) )*
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:377:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:378:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getPageTemplatesAccess().getPageTemplatesAction_0(),
                          current);
                  
            }

            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:383:2: ( (lv_pagetemplates_1_0= rulePageTemplate ) )*
            loop7:
            do {
                int alt7=2;
                switch ( input.LA(1) ) {
                case 25:
                    {
                    alt7=1;
                    }
                    break;

                }

                switch (alt7) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:384:1: (lv_pagetemplates_1_0= rulePageTemplate )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:384:1: (lv_pagetemplates_1_0= rulePageTemplate )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:385:3: lv_pagetemplates_1_0= rulePageTemplate
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getPageTemplatesAccess().getPagetemplatesPageTemplateParserRuleCall_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_rulePageTemplate_in_rulePageTemplates651);
            	    lv_pagetemplates_1_0=rulePageTemplate();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getPageTemplatesRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"pagetemplates",
            	              		lv_pagetemplates_1_0, 
            	              		"PageTemplate");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePageTemplates"


    // $ANTLR start "entryRuleSomeFormats"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:409:1: entryRuleSomeFormats returns [EObject current=null] : iv_ruleSomeFormats= ruleSomeFormats EOF ;
    public final EObject entryRuleSomeFormats() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSomeFormats = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:410:2: (iv_ruleSomeFormats= ruleSomeFormats EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:411:2: iv_ruleSomeFormats= ruleSomeFormats EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSomeFormatsRule()); 
            }
            pushFollow(FOLLOW_ruleSomeFormats_in_entryRuleSomeFormats688);
            iv_ruleSomeFormats=ruleSomeFormats();

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

            }

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


    // $ANTLR start "ruleSomeFormats"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:418:1: ruleSomeFormats returns [EObject current=null] : ( () otherlv_1= 'formatters' otherlv_2= '{' ( (lv_formatters_3_0= ruleSomeFormat ) )* otherlv_4= '}' ) ;
    public final EObject ruleSomeFormats() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_formatters_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:421:28: ( ( () otherlv_1= 'formatters' otherlv_2= '{' ( (lv_formatters_3_0= ruleSomeFormat ) )* otherlv_4= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:422:1: ( () otherlv_1= 'formatters' otherlv_2= '{' ( (lv_formatters_3_0= ruleSomeFormat ) )* otherlv_4= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:422:1: ( () otherlv_1= 'formatters' otherlv_2= '{' ( (lv_formatters_3_0= ruleSomeFormat ) )* otherlv_4= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:422:2: () otherlv_1= 'formatters' otherlv_2= '{' ( (lv_formatters_3_0= ruleSomeFormat ) )* otherlv_4= '}'
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:422:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:423:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getSomeFormatsAccess().getSomeFormatsAction_0(),
                          current);
                  
            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getSomeFormatsAccess().getFormattersKeyword_1());
                  
            }
            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleSomeFormats756); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getSomeFormatsAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:436:1: ( (lv_formatters_3_0= ruleSomeFormat ) )*
            loop8:
            do {
                int alt8=2;
                switch ( input.LA(1) ) {
                case 61:
                case 64:
                case 65:
                case 66:
                case 67:
                case 68:
                    {
                    alt8=1;
                    }
                    break;

                }

                switch (alt8) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:437:1: (lv_formatters_3_0= ruleSomeFormat )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:437:1: (lv_formatters_3_0= ruleSomeFormat )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:438:3: lv_formatters_3_0= ruleSomeFormat
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getSomeFormatsAccess().getFormattersSomeFormatParserRuleCall_3_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleSomeFormat_in_ruleSomeFormats777);
            	    lv_formatters_3_0=ruleSomeFormat();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getSomeFormatsRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"formatters",
            	              		lv_formatters_3_0, 
            	              		"SomeFormat");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleSomeFormats790); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getSomeFormatsAccess().getRightCurlyBracketKeyword_4());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSomeFormats"


    // $ANTLR start "entryRuleColors"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:466:1: entryRuleColors returns [EObject current=null] : iv_ruleColors= ruleColors EOF ;
    public final EObject entryRuleColors() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleColors = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:467:2: (iv_ruleColors= ruleColors EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:468:2: iv_ruleColors= ruleColors EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getColorsRule()); 
            }
            pushFollow(FOLLOW_ruleColors_in_entryRuleColors826);
            iv_ruleColors=ruleColors();

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

            }

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


    // $ANTLR start "ruleColors"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:475:1: ruleColors returns [EObject current=null] : ( () otherlv_1= 'colors' otherlv_2= '{' ( (lv_colors_3_0= ruleColor ) )* otherlv_4= '}' ) ;
    public final EObject ruleColors() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_colors_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:478:28: ( ( () otherlv_1= 'colors' otherlv_2= '{' ( (lv_colors_3_0= ruleColor ) )* otherlv_4= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:479:1: ( () otherlv_1= 'colors' otherlv_2= '{' ( (lv_colors_3_0= ruleColor ) )* otherlv_4= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:479:1: ( () otherlv_1= 'colors' otherlv_2= '{' ( (lv_colors_3_0= ruleColor ) )* otherlv_4= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:479:2: () otherlv_1= 'colors' otherlv_2= '{' ( (lv_colors_3_0= ruleColor ) )* otherlv_4= '}'
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:479:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:480:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getColorsAccess().getColorsAction_0(),
                          current);
                  
            }

            }

            otherlv_1=(Token)match(input,20,FOLLOW_20_in_ruleColors882); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getColorsAccess().getColorsKeyword_1());
                  
            }
            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleColors894); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getColorsAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:493:1: ( (lv_colors_3_0= ruleColor ) )*
            loop9:
            do {
                int alt9=2;
                switch ( input.LA(1) ) {
                case 32:
                    {
                    alt9=1;
                    }
                    break;

                }

                switch (alt9) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:494:1: (lv_colors_3_0= ruleColor )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:494:1: (lv_colors_3_0= ruleColor )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:495:3: lv_colors_3_0= ruleColor
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getColorsAccess().getColorsColorParserRuleCall_3_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleColor_in_ruleColors915);
            	    lv_colors_3_0=ruleColor();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getColorsRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"colors",
            	              		lv_colors_3_0, 
            	              		"Color");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleColors928); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getColorsAccess().getRightCurlyBracketKeyword_4());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleColors"


    // $ANTLR start "entryRuleFonts"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:523:1: entryRuleFonts returns [EObject current=null] : iv_ruleFonts= ruleFonts EOF ;
    public final EObject entryRuleFonts() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFonts = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:524:2: (iv_ruleFonts= ruleFonts EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:525:2: iv_ruleFonts= ruleFonts EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFontsRule()); 
            }
            pushFollow(FOLLOW_ruleFonts_in_entryRuleFonts964);
            iv_ruleFonts=ruleFonts();

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

            }

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


    // $ANTLR start "ruleFonts"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:532:1: ruleFonts returns [EObject current=null] : ( () otherlv_1= 'fonts' otherlv_2= '{' ( (lv_fonts_3_0= ruleFont ) )* otherlv_4= '}' ) ;
    public final EObject ruleFonts() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_fonts_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:535:28: ( ( () otherlv_1= 'fonts' otherlv_2= '{' ( (lv_fonts_3_0= ruleFont ) )* otherlv_4= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:536:1: ( () otherlv_1= 'fonts' otherlv_2= '{' ( (lv_fonts_3_0= ruleFont ) )* otherlv_4= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:536:1: ( () otherlv_1= 'fonts' otherlv_2= '{' ( (lv_fonts_3_0= ruleFont ) )* otherlv_4= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:536:2: () otherlv_1= 'fonts' otherlv_2= '{' ( (lv_fonts_3_0= ruleFont ) )* otherlv_4= '}'
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:536:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:537:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getFontsAccess().getFontsAction_0(),
                          current);
                  
            }

            }

            otherlv_1=(Token)match(input,21,FOLLOW_21_in_ruleFonts1020); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getFontsAccess().getFontsKeyword_1());
                  
            }
            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleFonts1032); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getFontsAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:550:1: ( (lv_fonts_3_0= ruleFont ) )*
            loop10:
            do {
                int alt10=2;
                switch ( input.LA(1) ) {
                case 18:
                    {
                    switch ( input.LA(2) ) {
                    case 18:
                    case 38:
                    case 41:
                    case 42:
                    case 205:
                    case 206:
                    case 207:
                        {
                        alt10=1;
                        }
                        break;

                    }

                    }
                    break;
                case 38:
                case 41:
                case 42:
                case 205:
                case 206:
                case 207:
                    {
                    alt10=1;
                    }
                    break;

                }

                switch (alt10) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:551:1: (lv_fonts_3_0= ruleFont )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:551:1: (lv_fonts_3_0= ruleFont )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:552:3: lv_fonts_3_0= ruleFont
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getFontsAccess().getFontsFontParserRuleCall_3_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleFont_in_ruleFonts1053);
            	    lv_fonts_3_0=ruleFont();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getFontsRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"fonts",
            	              		lv_fonts_3_0, 
            	              		"Font");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleFonts1066); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getFontsAccess().getRightCurlyBracketKeyword_4());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFonts"


    // $ANTLR start "entryRuleMedias"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:580:1: entryRuleMedias returns [EObject current=null] : iv_ruleMedias= ruleMedias EOF ;
    public final EObject entryRuleMedias() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMedias = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:581:2: (iv_ruleMedias= ruleMedias EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:582:2: iv_ruleMedias= ruleMedias EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMediasRule()); 
            }
            pushFollow(FOLLOW_ruleMedias_in_entryRuleMedias1102);
            iv_ruleMedias=ruleMedias();

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

            }

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


    // $ANTLR start "ruleMedias"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:589:1: ruleMedias returns [EObject current=null] : ( () otherlv_1= 'medias' otherlv_2= '{' ( (lv_medias_3_0= ruleMedia ) )* otherlv_4= '}' ) ;
    public final EObject ruleMedias() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_medias_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:592:28: ( ( () otherlv_1= 'medias' otherlv_2= '{' ( (lv_medias_3_0= ruleMedia ) )* otherlv_4= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:593:1: ( () otherlv_1= 'medias' otherlv_2= '{' ( (lv_medias_3_0= ruleMedia ) )* otherlv_4= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:593:1: ( () otherlv_1= 'medias' otherlv_2= '{' ( (lv_medias_3_0= ruleMedia ) )* otherlv_4= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:593:2: () otherlv_1= 'medias' otherlv_2= '{' ( (lv_medias_3_0= ruleMedia ) )* otherlv_4= '}'
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:593:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:594:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getMediasAccess().getMediasAction_0(),
                          current);
                  
            }

            }

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

                  	newLeafNode(otherlv_1, grammarAccess.getMediasAccess().getMediasKeyword_1());
                  
            }
            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleMedias1170); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getMediasAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:607:1: ( (lv_medias_3_0= ruleMedia ) )*
            loop11:
            do {
                int alt11=2;
                switch ( input.LA(1) ) {
                case 23:
                    {
                    alt11=1;
                    }
                    break;

                }

                switch (alt11) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:608:1: (lv_medias_3_0= ruleMedia )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:608:1: (lv_medias_3_0= ruleMedia )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:609:3: lv_medias_3_0= ruleMedia
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediasAccess().getMediasMediaParserRuleCall_3_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleMedia_in_ruleMedias1191);
            	    lv_medias_3_0=ruleMedia();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediasRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"medias",
            	              		lv_medias_3_0, 
            	              		"Media");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleMedias1204); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getMediasAccess().getRightCurlyBracketKeyword_4());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMedias"


    // $ANTLR start "entryRuleMedia"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:637:1: entryRuleMedia returns [EObject current=null] : iv_ruleMedia= ruleMedia EOF ;
    public final EObject entryRuleMedia() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMedia = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:638:2: (iv_ruleMedia= ruleMedia EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:639:2: iv_ruleMedia= ruleMedia EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMediaRule()); 
            }
            pushFollow(FOLLOW_ruleMedia_in_entryRuleMedia1240);
            iv_ruleMedia=ruleMedia();

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

            }

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


    // $ANTLR start "ruleMedia"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:646:1: ruleMedia returns [EObject current=null] : (otherlv_0= 'media' ( (lv_name_1_0= RULE_ID ) ) ) ;
    public final EObject ruleMedia() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;

         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:649:28: ( (otherlv_0= 'media' ( (lv_name_1_0= RULE_ID ) ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:650:1: (otherlv_0= 'media' ( (lv_name_1_0= RULE_ID ) ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:650:1: (otherlv_0= 'media' ( (lv_name_1_0= RULE_ID ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:650:3: otherlv_0= 'media' ( (lv_name_1_0= RULE_ID ) )
            {
            otherlv_0=(Token)match(input,23,FOLLOW_23_in_ruleMedia1287); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getMediaAccess().getMediaKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:654:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:655:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:655:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:656:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMedia1304); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getMediaAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getMediaRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMedia"


    // $ANTLR start "entryRuleStyles"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:680:1: entryRuleStyles returns [EObject current=null] : iv_ruleStyles= ruleStyles EOF ;
    public final EObject entryRuleStyles() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStyles = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:681:2: (iv_ruleStyles= ruleStyles EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:682:2: iv_ruleStyles= ruleStyles EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStylesRule()); 
            }
            pushFollow(FOLLOW_ruleStyles_in_entryRuleStyles1345);
            iv_ruleStyles=ruleStyles();

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

            }

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


    // $ANTLR start "ruleStyles"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:689:1: ruleStyles returns [EObject current=null] : ( () otherlv_1= 'styles' otherlv_2= '{' ( (lv_styles_3_0= ruleStyle ) )* otherlv_4= '}' ) ;
    public final EObject ruleStyles() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        EObject lv_styles_3_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:692:28: ( ( () otherlv_1= 'styles' otherlv_2= '{' ( (lv_styles_3_0= ruleStyle ) )* otherlv_4= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:693:1: ( () otherlv_1= 'styles' otherlv_2= '{' ( (lv_styles_3_0= ruleStyle ) )* otherlv_4= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:693:1: ( () otherlv_1= 'styles' otherlv_2= '{' ( (lv_styles_3_0= ruleStyle ) )* otherlv_4= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:693:2: () otherlv_1= 'styles' otherlv_2= '{' ( (lv_styles_3_0= ruleStyle ) )* otherlv_4= '}'
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:693:2: ()
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:694:5: 
            {
            if ( state.backtracking==0 ) {

                      current = forceCreateModelElement(
                          grammarAccess.getStylesAccess().getStylesAction_0(),
                          current);
                  
            }

            }

            otherlv_1=(Token)match(input,24,FOLLOW_24_in_ruleStyles1401); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_1, grammarAccess.getStylesAccess().getStylesKeyword_1());
                  
            }
            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleStyles1413); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getStylesAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:707:1: ( (lv_styles_3_0= ruleStyle ) )*
            loop12:
            do {
                int alt12=2;
                switch ( input.LA(1) ) {
                case 43:
                    {
                    alt12=1;
                    }
                    break;

                }

                switch (alt12) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:708:1: (lv_styles_3_0= ruleStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:708:1: (lv_styles_3_0= ruleStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:709:3: lv_styles_3_0= ruleStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStylesAccess().getStylesStyleParserRuleCall_3_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleStyle_in_ruleStyles1434);
            	    lv_styles_3_0=ruleStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStylesRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"styles",
            	              		lv_styles_3_0, 
            	              		"Style");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_4=(Token)match(input,18,FOLLOW_18_in_ruleStyles1447); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_4, grammarAccess.getStylesAccess().getRightCurlyBracketKeyword_4());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStyles"


    // $ANTLR start "entryRulePageTemplate"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:737:1: entryRulePageTemplate returns [EObject current=null] : iv_rulePageTemplate= rulePageTemplate EOF ;
    public final EObject entryRulePageTemplate() throws RecognitionException {
        EObject current = null;

        EObject iv_rulePageTemplate = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:738:2: (iv_rulePageTemplate= rulePageTemplate EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:739:2: iv_rulePageTemplate= rulePageTemplate EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getPageTemplateRule()); 
            }
            pushFollow(FOLLOW_rulePageTemplate_in_entryRulePageTemplate1483);
            iv_rulePageTemplate=rulePageTemplate();

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

            }

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


    // $ANTLR start "rulePageTemplate"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:746:1: rulePageTemplate returns [EObject current=null] : (otherlv_0= 'pagetemplate' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'type' ( (lv_size_4_0= rulePageSizeEnum ) ) otherlv_5= 'orientation' ( (lv_orientation_6_0= ruleOrientationEnum ) ) otherlv_7= 'topmargin' ( (lv_topMarginValue_8_0= ruleUnsignedNumber ) ) ( (lv_topMarginUnit_9_0= ruleUnitEnum ) ) otherlv_10= 'leftmargin' ( (lv_leftMarginValue_11_0= ruleUnsignedNumber ) ) ( (lv_leftMarginUnit_12_0= ruleUnitEnum ) ) otherlv_13= 'bottommargin' ( (lv_bottomMarginValue_14_0= ruleUnsignedNumber ) ) ( (lv_bottomMarginUnit_15_0= ruleUnitEnum ) ) otherlv_16= 'rightmargin' ( (lv_rightMarginValue_17_0= ruleUnsignedNumber ) ) ( (lv_rightMarginUnit_18_0= ruleUnitEnum ) ) ( (lv_header_19_0= rulePageHeader ) )? ( (lv_footer_20_0= rulePageFooter ) )? otherlv_21= '}' ) ;
    public final EObject rulePageTemplate() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_5=null;
        Token otherlv_7=null;
        Token otherlv_10=null;
        Token otherlv_13=null;
        Token otherlv_16=null;
        Token otherlv_21=null;
        Enumerator lv_size_4_0 = null;

        Enumerator lv_orientation_6_0 = null;

        AntlrDatatypeRuleToken lv_topMarginValue_8_0 = null;

        Enumerator lv_topMarginUnit_9_0 = null;

        AntlrDatatypeRuleToken lv_leftMarginValue_11_0 = null;

        Enumerator lv_leftMarginUnit_12_0 = null;

        AntlrDatatypeRuleToken lv_bottomMarginValue_14_0 = null;

        Enumerator lv_bottomMarginUnit_15_0 = null;

        AntlrDatatypeRuleToken lv_rightMarginValue_17_0 = null;

        Enumerator lv_rightMarginUnit_18_0 = null;

        EObject lv_header_19_0 = null;

        EObject lv_footer_20_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:749:28: ( (otherlv_0= 'pagetemplate' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'type' ( (lv_size_4_0= rulePageSizeEnum ) ) otherlv_5= 'orientation' ( (lv_orientation_6_0= ruleOrientationEnum ) ) otherlv_7= 'topmargin' ( (lv_topMarginValue_8_0= ruleUnsignedNumber ) ) ( (lv_topMarginUnit_9_0= ruleUnitEnum ) ) otherlv_10= 'leftmargin' ( (lv_leftMarginValue_11_0= ruleUnsignedNumber ) ) ( (lv_leftMarginUnit_12_0= ruleUnitEnum ) ) otherlv_13= 'bottommargin' ( (lv_bottomMarginValue_14_0= ruleUnsignedNumber ) ) ( (lv_bottomMarginUnit_15_0= ruleUnitEnum ) ) otherlv_16= 'rightmargin' ( (lv_rightMarginValue_17_0= ruleUnsignedNumber ) ) ( (lv_rightMarginUnit_18_0= ruleUnitEnum ) ) ( (lv_header_19_0= rulePageHeader ) )? ( (lv_footer_20_0= rulePageFooter ) )? otherlv_21= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:750:1: (otherlv_0= 'pagetemplate' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'type' ( (lv_size_4_0= rulePageSizeEnum ) ) otherlv_5= 'orientation' ( (lv_orientation_6_0= ruleOrientationEnum ) ) otherlv_7= 'topmargin' ( (lv_topMarginValue_8_0= ruleUnsignedNumber ) ) ( (lv_topMarginUnit_9_0= ruleUnitEnum ) ) otherlv_10= 'leftmargin' ( (lv_leftMarginValue_11_0= ruleUnsignedNumber ) ) ( (lv_leftMarginUnit_12_0= ruleUnitEnum ) ) otherlv_13= 'bottommargin' ( (lv_bottomMarginValue_14_0= ruleUnsignedNumber ) ) ( (lv_bottomMarginUnit_15_0= ruleUnitEnum ) ) otherlv_16= 'rightmargin' ( (lv_rightMarginValue_17_0= ruleUnsignedNumber ) ) ( (lv_rightMarginUnit_18_0= ruleUnitEnum ) ) ( (lv_header_19_0= rulePageHeader ) )? ( (lv_footer_20_0= rulePageFooter ) )? otherlv_21= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:750:1: (otherlv_0= 'pagetemplate' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'type' ( (lv_size_4_0= rulePageSizeEnum ) ) otherlv_5= 'orientation' ( (lv_orientation_6_0= ruleOrientationEnum ) ) otherlv_7= 'topmargin' ( (lv_topMarginValue_8_0= ruleUnsignedNumber ) ) ( (lv_topMarginUnit_9_0= ruleUnitEnum ) ) otherlv_10= 'leftmargin' ( (lv_leftMarginValue_11_0= ruleUnsignedNumber ) ) ( (lv_leftMarginUnit_12_0= ruleUnitEnum ) ) otherlv_13= 'bottommargin' ( (lv_bottomMarginValue_14_0= ruleUnsignedNumber ) ) ( (lv_bottomMarginUnit_15_0= ruleUnitEnum ) ) otherlv_16= 'rightmargin' ( (lv_rightMarginValue_17_0= ruleUnsignedNumber ) ) ( (lv_rightMarginUnit_18_0= ruleUnitEnum ) ) ( (lv_header_19_0= rulePageHeader ) )? ( (lv_footer_20_0= rulePageFooter ) )? otherlv_21= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:750:3: otherlv_0= 'pagetemplate' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'type' ( (lv_size_4_0= rulePageSizeEnum ) ) otherlv_5= 'orientation' ( (lv_orientation_6_0= ruleOrientationEnum ) ) otherlv_7= 'topmargin' ( (lv_topMarginValue_8_0= ruleUnsignedNumber ) ) ( (lv_topMarginUnit_9_0= ruleUnitEnum ) ) otherlv_10= 'leftmargin' ( (lv_leftMarginValue_11_0= ruleUnsignedNumber ) ) ( (lv_leftMarginUnit_12_0= ruleUnitEnum ) ) otherlv_13= 'bottommargin' ( (lv_bottomMarginValue_14_0= ruleUnsignedNumber ) ) ( (lv_bottomMarginUnit_15_0= ruleUnitEnum ) ) otherlv_16= 'rightmargin' ( (lv_rightMarginValue_17_0= ruleUnsignedNumber ) ) ( (lv_rightMarginUnit_18_0= ruleUnitEnum ) ) ( (lv_header_19_0= rulePageHeader ) )? ( (lv_footer_20_0= rulePageFooter ) )? otherlv_21= '}'
            {
            otherlv_0=(Token)match(input,25,FOLLOW_25_in_rulePageTemplate1530); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getPageTemplateAccess().getPagetemplateKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:754:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:755:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:755:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:756:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_rulePageTemplate1547); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getPageTemplateAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getPageTemplateRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_rulePageTemplate1564); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getPageTemplateAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            otherlv_3=(Token)match(input,26,FOLLOW_26_in_rulePageTemplate1576); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getPageTemplateAccess().getTypeKeyword_3());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:780:1: ( (lv_size_4_0= rulePageSizeEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:781:1: (lv_size_4_0= rulePageSizeEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:781:1: (lv_size_4_0= rulePageSizeEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:782:3: lv_size_4_0= rulePageSizeEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getSizePageSizeEnumEnumRuleCall_4_0()); 
              	    
            }
            pushFollow(FOLLOW_rulePageSizeEnum_in_rulePageTemplate1597);
            lv_size_4_0=rulePageSizeEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"size",
                      		lv_size_4_0, 
                      		"PageSizeEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_5=(Token)match(input,27,FOLLOW_27_in_rulePageTemplate1609); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getPageTemplateAccess().getOrientationKeyword_5());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:802:1: ( (lv_orientation_6_0= ruleOrientationEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:803:1: (lv_orientation_6_0= ruleOrientationEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:803:1: (lv_orientation_6_0= ruleOrientationEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:804:3: lv_orientation_6_0= ruleOrientationEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getOrientationOrientationEnumEnumRuleCall_6_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleOrientationEnum_in_rulePageTemplate1630);
            lv_orientation_6_0=ruleOrientationEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"orientation",
                      		lv_orientation_6_0, 
                      		"OrientationEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_7=(Token)match(input,28,FOLLOW_28_in_rulePageTemplate1642); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_7, grammarAccess.getPageTemplateAccess().getTopmarginKeyword_7());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:824:1: ( (lv_topMarginValue_8_0= ruleUnsignedNumber ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:825:1: (lv_topMarginValue_8_0= ruleUnsignedNumber )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:825:1: (lv_topMarginValue_8_0= ruleUnsignedNumber )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:826:3: lv_topMarginValue_8_0= ruleUnsignedNumber
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getTopMarginValueUnsignedNumberParserRuleCall_8_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePageTemplate1663);
            lv_topMarginValue_8_0=ruleUnsignedNumber();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"topMarginValue",
                      		lv_topMarginValue_8_0, 
                      		"UnsignedNumber");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:842:2: ( (lv_topMarginUnit_9_0= ruleUnitEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:843:1: (lv_topMarginUnit_9_0= ruleUnitEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:843:1: (lv_topMarginUnit_9_0= ruleUnitEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:844:3: lv_topMarginUnit_9_0= ruleUnitEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getTopMarginUnitUnitEnumEnumRuleCall_9_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnitEnum_in_rulePageTemplate1684);
            lv_topMarginUnit_9_0=ruleUnitEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"topMarginUnit",
                      		lv_topMarginUnit_9_0, 
                      		"UnitEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_10=(Token)match(input,29,FOLLOW_29_in_rulePageTemplate1696); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_10, grammarAccess.getPageTemplateAccess().getLeftmarginKeyword_10());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:864:1: ( (lv_leftMarginValue_11_0= ruleUnsignedNumber ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:865:1: (lv_leftMarginValue_11_0= ruleUnsignedNumber )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:865:1: (lv_leftMarginValue_11_0= ruleUnsignedNumber )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:866:3: lv_leftMarginValue_11_0= ruleUnsignedNumber
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getLeftMarginValueUnsignedNumberParserRuleCall_11_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePageTemplate1717);
            lv_leftMarginValue_11_0=ruleUnsignedNumber();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"leftMarginValue",
                      		lv_leftMarginValue_11_0, 
                      		"UnsignedNumber");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:882:2: ( (lv_leftMarginUnit_12_0= ruleUnitEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:883:1: (lv_leftMarginUnit_12_0= ruleUnitEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:883:1: (lv_leftMarginUnit_12_0= ruleUnitEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:884:3: lv_leftMarginUnit_12_0= ruleUnitEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getLeftMarginUnitUnitEnumEnumRuleCall_12_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnitEnum_in_rulePageTemplate1738);
            lv_leftMarginUnit_12_0=ruleUnitEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"leftMarginUnit",
                      		lv_leftMarginUnit_12_0, 
                      		"UnitEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_13=(Token)match(input,30,FOLLOW_30_in_rulePageTemplate1750); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_13, grammarAccess.getPageTemplateAccess().getBottommarginKeyword_13());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:904:1: ( (lv_bottomMarginValue_14_0= ruleUnsignedNumber ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:905:1: (lv_bottomMarginValue_14_0= ruleUnsignedNumber )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:905:1: (lv_bottomMarginValue_14_0= ruleUnsignedNumber )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:906:3: lv_bottomMarginValue_14_0= ruleUnsignedNumber
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getBottomMarginValueUnsignedNumberParserRuleCall_14_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePageTemplate1771);
            lv_bottomMarginValue_14_0=ruleUnsignedNumber();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"bottomMarginValue",
                      		lv_bottomMarginValue_14_0, 
                      		"UnsignedNumber");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:922:2: ( (lv_bottomMarginUnit_15_0= ruleUnitEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:923:1: (lv_bottomMarginUnit_15_0= ruleUnitEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:923:1: (lv_bottomMarginUnit_15_0= ruleUnitEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:924:3: lv_bottomMarginUnit_15_0= ruleUnitEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getBottomMarginUnitUnitEnumEnumRuleCall_15_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnitEnum_in_rulePageTemplate1792);
            lv_bottomMarginUnit_15_0=ruleUnitEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"bottomMarginUnit",
                      		lv_bottomMarginUnit_15_0, 
                      		"UnitEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_16=(Token)match(input,31,FOLLOW_31_in_rulePageTemplate1804); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_16, grammarAccess.getPageTemplateAccess().getRightmarginKeyword_16());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:944:1: ( (lv_rightMarginValue_17_0= ruleUnsignedNumber ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:945:1: (lv_rightMarginValue_17_0= ruleUnsignedNumber )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:945:1: (lv_rightMarginValue_17_0= ruleUnsignedNumber )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:946:3: lv_rightMarginValue_17_0= ruleUnsignedNumber
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getRightMarginValueUnsignedNumberParserRuleCall_17_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnsignedNumber_in_rulePageTemplate1825);
            lv_rightMarginValue_17_0=ruleUnsignedNumber();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"rightMarginValue",
                      		lv_rightMarginValue_17_0, 
                      		"UnsignedNumber");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:962:2: ( (lv_rightMarginUnit_18_0= ruleUnitEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:963:1: (lv_rightMarginUnit_18_0= ruleUnitEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:963:1: (lv_rightMarginUnit_18_0= ruleUnitEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:964:3: lv_rightMarginUnit_18_0= ruleUnitEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getPageTemplateAccess().getRightMarginUnitUnitEnumEnumRuleCall_18_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnitEnum_in_rulePageTemplate1846);
            lv_rightMarginUnit_18_0=ruleUnitEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
              	        }
                     		set(
                     			current, 
                     			"rightMarginUnit",
                      		lv_rightMarginUnit_18_0, 
                      		"UnitEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:980:2: ( (lv_header_19_0= rulePageHeader ) )?
            int alt13=2;
            switch ( input.LA(1) ) {
                case 75:
                    {
                    alt13=1;
                    }
                    break;
            }

            switch (alt13) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:981:1: (lv_header_19_0= rulePageHeader )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:981:1: (lv_header_19_0= rulePageHeader )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:982:3: lv_header_19_0= rulePageHeader
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getPageTemplateAccess().getHeaderPageHeaderParserRuleCall_19_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_rulePageHeader_in_rulePageTemplate1867);
                    lv_header_19_0=rulePageHeader();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
                      	        }
                             		set(
                             			current, 
                             			"header",
                              		lv_header_19_0, 
                              		"PageHeader");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }
                    break;

            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:998:3: ( (lv_footer_20_0= rulePageFooter ) )?
            int alt14=2;
            switch ( input.LA(1) ) {
                case 79:
                    {
                    alt14=1;
                    }
                    break;
            }

            switch (alt14) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:999:1: (lv_footer_20_0= rulePageFooter )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:999:1: (lv_footer_20_0= rulePageFooter )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1000:3: lv_footer_20_0= rulePageFooter
                    {
                    if ( state.backtracking==0 ) {
                       
                      	        newCompositeNode(grammarAccess.getPageTemplateAccess().getFooterPageFooterParserRuleCall_20_0()); 
                      	    
                    }
                    pushFollow(FOLLOW_rulePageFooter_in_rulePageTemplate1889);
                    lv_footer_20_0=rulePageFooter();

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

                      	        if (current==null) {
                      	            current = createModelElementForParent(grammarAccess.getPageTemplateRule());
                      	        }
                             		set(
                             			current, 
                             			"footer",
                              		lv_footer_20_0, 
                              		"PageFooter");
                      	        afterParserOrEnumRuleCall();
                      	    
                    }

                    }


                    }
                    break;

            }

            otherlv_21=(Token)match(input,18,FOLLOW_18_in_rulePageTemplate1902); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_21, grammarAccess.getPageTemplateAccess().getRightCurlyBracketKeyword_21());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "rulePageTemplate"


    // $ANTLR start "entryRuleUnsignedNumber"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1028:1: entryRuleUnsignedNumber returns [String current=null] : iv_ruleUnsignedNumber= ruleUnsignedNumber EOF ;
    public final String entryRuleUnsignedNumber() throws RecognitionException {
        String current = null;

        AntlrDatatypeRuleToken iv_ruleUnsignedNumber = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1029:2: (iv_ruleUnsignedNumber= ruleUnsignedNumber EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1030:2: iv_ruleUnsignedNumber= ruleUnsignedNumber EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUnsignedNumberRule()); 
            }
            pushFollow(FOLLOW_ruleUnsignedNumber_in_entryRuleUnsignedNumber1939);
            iv_ruleUnsignedNumber=ruleUnsignedNumber();

            state._fsp--;
            if (state.failed) return current;
            if ( state.backtracking==0 ) {
               current =iv_ruleUnsignedNumber.getText(); 
            }
            match(input,EOF,FOLLOW_EOF_in_entryRuleUnsignedNumber1950); if (state.failed) return current;

            }

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


    // $ANTLR start "ruleUnsignedNumber"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1037:1: ruleUnsignedNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_Number_0= ruleNumber ;
    public final AntlrDatatypeRuleToken ruleUnsignedNumber() throws RecognitionException {
        AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();

        AntlrDatatypeRuleToken this_Number_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1040:28: (this_Number_0= ruleNumber )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1042:5: this_Number_0= ruleNumber
            {
            if ( state.backtracking==0 ) {
               
                      newCompositeNode(grammarAccess.getUnsignedNumberAccess().getNumberParserRuleCall()); 
                  
            }
            pushFollow(FOLLOW_ruleNumber_in_ruleUnsignedNumber1996);
            this_Number_0=ruleNumber();

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

              		current.merge(this_Number_0);
                  
            }
            if ( state.backtracking==0 ) {
               
                      afterParserOrEnumRuleCall();
                  
            }

            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUnsignedNumber"


    // $ANTLR start "entryRuleColor"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1060:1: entryRuleColor returns [EObject current=null] : iv_ruleColor= ruleColor EOF ;
    public final EObject entryRuleColor() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleColor = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1061:2: (iv_ruleColor= ruleColor EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1062:2: iv_ruleColor= ruleColor EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getColorRule()); 
            }
            pushFollow(FOLLOW_ruleColor_in_entryRuleColor2040);
            iv_ruleColor=ruleColor();

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

            }

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


    // $ANTLR start "ruleColor"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1069:1: ruleColor returns [EObject current=null] : (otherlv_0= 'color' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_color_2_0= RULE_STRING ) ) | (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) ) | (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) ) | (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) ) ) ) ;
    public final EObject ruleColor() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token lv_color_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token lv_darkensby_6_0=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token lv_lightensby_10_0=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token lv_transformsby_14_0=null;
        Token otherlv_15=null;
        Token otherlv_16=null;

         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1072:28: ( (otherlv_0= 'color' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_color_2_0= RULE_STRING ) ) | (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) ) | (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) ) | (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) ) ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1073:1: (otherlv_0= 'color' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_color_2_0= RULE_STRING ) ) | (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) ) | (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) ) | (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) ) ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1073:1: (otherlv_0= 'color' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_color_2_0= RULE_STRING ) ) | (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) ) | (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) ) | (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1073:3: otherlv_0= 'color' ( (lv_name_1_0= RULE_ID ) ) ( ( (lv_color_2_0= RULE_STRING ) ) | (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) ) | (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) ) | (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) ) )
            {
            otherlv_0=(Token)match(input,32,FOLLOW_32_in_ruleColor2087); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getColorAccess().getColorKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1077:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1078:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1078:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1079:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleColor2104); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getColorAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getColorRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1095:2: ( ( (lv_color_2_0= RULE_STRING ) ) | (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) ) | (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) ) | (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) ) )
            int alt15=4;
            switch ( input.LA(1) ) {
            case RULE_STRING:
                {
                alt15=1;
                }
                break;
            case 33:
                {
                alt15=2;
                }
                break;
            case 35:
                {
                alt15=3;
                }
                break;
            case 36:
                {
                alt15=4;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 15, 0, input);

                throw nvae;
            }

            switch (alt15) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1095:3: ( (lv_color_2_0= RULE_STRING ) )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1095:3: ( (lv_color_2_0= RULE_STRING ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1096:1: (lv_color_2_0= RULE_STRING )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1096:1: (lv_color_2_0= RULE_STRING )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1097:3: lv_color_2_0= RULE_STRING
                    {
                    lv_color_2_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleColor2127); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_color_2_0, grammarAccess.getColorAccess().getColorSTRINGTerminalRuleCall_2_0_0()); 
                      		
                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                             		setWithLastConsumed(
                             			current, 
                             			"color",
                              		lv_color_2_0, 
                              		"STRING");
                      	    
                    }

                    }


                    }


                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1114:6: (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1114:6: (otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1114:8: otherlv_3= 'darkens' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'by-percent' ( (lv_darkensby_6_0= RULE_INT ) )
                    {
                    otherlv_3=(Token)match(input,33,FOLLOW_33_in_ruleColor2151); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getColorAccess().getDarkensKeyword_2_1_0());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1118:1: ( (otherlv_4= RULE_ID ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1119:1: (otherlv_4= RULE_ID )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1119:1: (otherlv_4= RULE_ID )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1120:3: otherlv_4= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                              
                    }
                    otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleColor2171); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		newLeafNode(otherlv_4, grammarAccess.getColorAccess().getBasecolorColorCrossReference_2_1_1_0()); 
                      	
                    }

                    }


                    }

                    otherlv_5=(Token)match(input,34,FOLLOW_34_in_ruleColor2183); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_5, grammarAccess.getColorAccess().getByPercentKeyword_2_1_2());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1135:1: ( (lv_darkensby_6_0= RULE_INT ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1136:1: (lv_darkensby_6_0= RULE_INT )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1136:1: (lv_darkensby_6_0= RULE_INT )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1137:3: lv_darkensby_6_0= RULE_INT
                    {
                    lv_darkensby_6_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleColor2200); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_darkensby_6_0, grammarAccess.getColorAccess().getDarkensbyINTTerminalRuleCall_2_1_3_0()); 
                      		
                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                             		setWithLastConsumed(
                             			current, 
                             			"darkensby",
                              		lv_darkensby_6_0, 
                              		"INT");
                      	    
                    }

                    }


                    }


                    }


                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1154:6: (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1154:6: (otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1154:8: otherlv_7= 'lightens' ( (otherlv_8= RULE_ID ) ) otherlv_9= 'by-percent' ( (lv_lightensby_10_0= RULE_INT ) )
                    {
                    otherlv_7=(Token)match(input,35,FOLLOW_35_in_ruleColor2225); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_7, grammarAccess.getColorAccess().getLightensKeyword_2_2_0());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1158:1: ( (otherlv_8= RULE_ID ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1159:1: (otherlv_8= RULE_ID )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1159:1: (otherlv_8= RULE_ID )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1160:3: otherlv_8= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                              
                    }
                    otherlv_8=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleColor2245); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		newLeafNode(otherlv_8, grammarAccess.getColorAccess().getBasecolorColorCrossReference_2_2_1_0()); 
                      	
                    }

                    }


                    }

                    otherlv_9=(Token)match(input,34,FOLLOW_34_in_ruleColor2257); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_9, grammarAccess.getColorAccess().getByPercentKeyword_2_2_2());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1175:1: ( (lv_lightensby_10_0= RULE_INT ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1176:1: (lv_lightensby_10_0= RULE_INT )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1176:1: (lv_lightensby_10_0= RULE_INT )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1177:3: lv_lightensby_10_0= RULE_INT
                    {
                    lv_lightensby_10_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleColor2274); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_lightensby_10_0, grammarAccess.getColorAccess().getLightensbyINTTerminalRuleCall_2_2_3_0()); 
                      		
                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                             		setWithLastConsumed(
                             			current, 
                             			"lightensby",
                              		lv_lightensby_10_0, 
                              		"INT");
                      	    
                    }

                    }


                    }


                    }


                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1194:6: (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1194:6: (otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1194:8: otherlv_11= 'transforms' ( (otherlv_12= RULE_ID ) ) otherlv_13= 'by-percent' ( (lv_transformsby_14_0= RULE_INT ) ) otherlv_15= 'towards' ( (otherlv_16= RULE_ID ) )
                    {
                    otherlv_11=(Token)match(input,36,FOLLOW_36_in_ruleColor2299); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_11, grammarAccess.getColorAccess().getTransformsKeyword_2_3_0());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1198:1: ( (otherlv_12= RULE_ID ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1199:1: (otherlv_12= RULE_ID )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1199:1: (otherlv_12= RULE_ID )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1200:3: otherlv_12= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                              
                    }
                    otherlv_12=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleColor2319); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		newLeafNode(otherlv_12, grammarAccess.getColorAccess().getBasecolorColorCrossReference_2_3_1_0()); 
                      	
                    }

                    }


                    }

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

                          	newLeafNode(otherlv_13, grammarAccess.getColorAccess().getByPercentKeyword_2_3_2());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1215:1: ( (lv_transformsby_14_0= RULE_INT ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1216:1: (lv_transformsby_14_0= RULE_INT )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1216:1: (lv_transformsby_14_0= RULE_INT )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1217:3: lv_transformsby_14_0= RULE_INT
                    {
                    lv_transformsby_14_0=(Token)match(input,RULE_INT,FOLLOW_RULE_INT_in_ruleColor2348); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      			newLeafNode(lv_transformsby_14_0, grammarAccess.getColorAccess().getTransformsbyINTTerminalRuleCall_2_3_3_0()); 
                      		
                    }
                    if ( state.backtracking==0 ) {

                      	        if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                             		setWithLastConsumed(
                             			current, 
                             			"transformsby",
                              		lv_transformsby_14_0, 
                              		"INT");
                      	    
                    }

                    }


                    }

                    otherlv_15=(Token)match(input,37,FOLLOW_37_in_ruleColor2365); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_15, grammarAccess.getColorAccess().getTowardsKeyword_2_3_4());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1237:1: ( (otherlv_16= RULE_ID ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1238:1: (otherlv_16= RULE_ID )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1238:1: (otherlv_16= RULE_ID )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1239:3: otherlv_16= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getColorRule());
                      	        }
                              
                    }
                    otherlv_16=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleColor2385); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		newLeafNode(otherlv_16, grammarAccess.getColorAccess().getTargetcolorColorCrossReference_2_3_5_0()); 
                      	
                    }

                    }


                    }


                    }


                    }
                    break;

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleColor"


    // $ANTLR start "entryRuleFont"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1258:1: entryRuleFont returns [EObject current=null] : iv_ruleFont= ruleFont EOF ;
    public final EObject entryRuleFont() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFont = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1259:2: (iv_ruleFont= ruleFont EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1260:2: iv_ruleFont= ruleFont EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFontRule()); 
            }
            pushFollow(FOLLOW_ruleFont_in_entryRuleFont2423);
            iv_ruleFont=ruleFont();

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

            }

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


    // $ANTLR start "ruleFont"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1267:1: ruleFont returns [EObject current=null] : ( ( ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?) ) ) ;
    public final EObject ruleFont() throws RecognitionException {
        EObject current = null;

        Token otherlv_1=null;
        Token lv_name_2_0=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token lv_bold_9_0=null;
        Token otherlv_10=null;
        Token otherlv_13=null;
        EObject lv_family_7_0 = null;

        Enumerator lv_style_8_0 = null;

        AntlrDatatypeRuleToken lv_sizevalue_11_0 = null;

        Enumerator lv_sizeunit_12_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1270:28: ( ( ( ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?) ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1271:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?) ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1271:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1273:1: ( ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1273:1: ( ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1274:2: ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?)
            {
            getUnorderedGroupHelper().enter(grammarAccess.getFontAccess().getUnorderedGroup());
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1277:2: ( ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?)
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1278:3: ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+ {...}?
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1278:3: ( ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) ) | ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) ) | ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) ) )+
            int cnt19=0;
            loop19:
            do {
                int alt19=5;
                switch ( input.LA(1) ) {
                case 18:
                    {
                    int LA19_1 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 3) ) {
                        alt19=4;
                    }


                    }
                    break;
                case 38:
                    {
                    int LA19_2 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 0) ) {
                        alt19=1;
                    }


                    }
                    break;
                case 205:
                    {
                    int LA19_3 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 1) ) {
                        alt19=2;
                    }


                    }
                    break;
                case 206:
                    {
                    int LA19_4 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 1) ) {
                        alt19=2;
                    }


                    }
                    break;
                case 207:
                    {
                    int LA19_5 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 1) ) {
                        alt19=2;
                    }


                    }
                    break;
                case 41:
                    {
                    int LA19_6 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 2) ) {
                        alt19=3;
                    }


                    }
                    break;
                case 42:
                    {
                    int LA19_7 = input.LA(2);

                    if ( getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 3) ) {
                        alt19=4;
                    }


                    }
                    break;

                }

                switch (alt19) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1280:4: ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1280:4: ({...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1281:5: {...}? => ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 0)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1281:99: ( ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1282:6: ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getFontAccess().getUnorderedGroup(), 0);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1285:6: ({...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1285:7: {...}? => (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1285:16: (otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )? )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1285:18: otherlv_1= 'font' ( (lv_name_2_0= RULE_ID ) ) otherlv_3= '{' (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )? (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )?
            	    {
            	    otherlv_1=(Token)match(input,38,FOLLOW_38_in_ruleFont2515); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_1, grammarAccess.getFontAccess().getFontKeyword_0_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1289:1: ( (lv_name_2_0= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1290:1: (lv_name_2_0= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1290:1: (lv_name_2_0= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1291:3: lv_name_2_0= RULE_ID
            	    {
            	    lv_name_2_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleFont2532); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      			newLeafNode(lv_name_2_0, grammarAccess.getFontAccess().getNameIDTerminalRuleCall_0_1_0()); 
            	      		
            	    }
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElement(grammarAccess.getFontRule());
            	      	        }
            	             		setWithLastConsumed(
            	             			current, 
            	             			"name",
            	              		lv_name_2_0, 
            	              		"ID");
            	      	    
            	    }

            	    }


            	    }

            	    otherlv_3=(Token)match(input,14,FOLLOW_14_in_ruleFont2549); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_3, grammarAccess.getFontAccess().getLeftCurlyBracketKeyword_0_2());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1311:1: (otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) ) )?
            	    int alt16=2;
            	    switch ( input.LA(1) ) {
            	        case 39:
            	            {
            	            alt16=1;
            	            }
            	            break;
            	    }

            	    switch (alt16) {
            	        case 1 :
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1311:3: otherlv_4= 'extends' ( (otherlv_5= RULE_ID ) )
            	            {
            	            otherlv_4=(Token)match(input,39,FOLLOW_39_in_ruleFont2562); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	                  	newLeafNode(otherlv_4, grammarAccess.getFontAccess().getExtendsKeyword_0_3_0());
            	                  
            	            }
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1315:1: ( (otherlv_5= RULE_ID ) )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1316:1: (otherlv_5= RULE_ID )
            	            {
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1316:1: (otherlv_5= RULE_ID )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1317:3: otherlv_5= RULE_ID
            	            {
            	            if ( state.backtracking==0 ) {

            	              			if (current==null) {
            	              	            current = createModelElement(grammarAccess.getFontRule());
            	              	        }
            	                      
            	            }
            	            otherlv_5=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleFont2582); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              		newLeafNode(otherlv_5, grammarAccess.getFontAccess().getExtendsFontCrossReference_0_3_1_0()); 
            	              	
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1328:4: (otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) ) )?
            	    int alt17=2;
            	    switch ( input.LA(1) ) {
            	        case 40:
            	            {
            	            alt17=1;
            	            }
            	            break;
            	    }

            	    switch (alt17) {
            	        case 1 :
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1328:6: otherlv_6= 'family' ( (lv_family_7_0= ruleFontFamily ) )
            	            {
            	            otherlv_6=(Token)match(input,40,FOLLOW_40_in_ruleFont2597); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	                  	newLeafNode(otherlv_6, grammarAccess.getFontAccess().getFamilyKeyword_0_4_0());
            	                  
            	            }
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1332:1: ( (lv_family_7_0= ruleFontFamily ) )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1333:1: (lv_family_7_0= ruleFontFamily )
            	            {
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1333:1: (lv_family_7_0= ruleFontFamily )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1334:3: lv_family_7_0= ruleFontFamily
            	            {
            	            if ( state.backtracking==0 ) {
            	               
            	              	        newCompositeNode(grammarAccess.getFontAccess().getFamilyFontFamilyParserRuleCall_0_4_1_0()); 
            	              	    
            	            }
            	            pushFollow(FOLLOW_ruleFontFamily_in_ruleFont2618);
            	            lv_family_7_0=ruleFontFamily();

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

            	              	        if (current==null) {
            	              	            current = createModelElementForParent(grammarAccess.getFontRule());
            	              	        }
            	                     		set(
            	                     			current, 
            	                     			"family",
            	                      		lv_family_7_0, 
            	                      		"FontFamily");
            	              	        afterParserOrEnumRuleCall();
            	              	    
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFontAccess().getUnorderedGroup());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1357:4: ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1357:4: ({...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1358:5: {...}? => ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 1)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1358:99: ( ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1359:6: ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getFontAccess().getUnorderedGroup(), 1);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1362:6: ({...}? => ( (lv_style_8_0= ruleFontStyleEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1362:7: {...}? => ( (lv_style_8_0= ruleFontStyleEnum ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1362:16: ( (lv_style_8_0= ruleFontStyleEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1363:1: (lv_style_8_0= ruleFontStyleEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1363:1: (lv_style_8_0= ruleFontStyleEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1364:3: lv_style_8_0= ruleFontStyleEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getFontAccess().getStyleFontStyleEnumEnumRuleCall_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleFontStyleEnum_in_ruleFont2696);
            	    lv_style_8_0=ruleFontStyleEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getFontRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"style",
            	              		lv_style_8_0, 
            	              		"FontStyleEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFontAccess().getUnorderedGroup());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1387:4: ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1387:4: ({...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1388:5: {...}? => ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 2)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1388:99: ( ({...}? => ( (lv_bold_9_0= 'bold' ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1389:6: ({...}? => ( (lv_bold_9_0= 'bold' ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getFontAccess().getUnorderedGroup(), 2);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1392:6: ({...}? => ( (lv_bold_9_0= 'bold' ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1392:7: {...}? => ( (lv_bold_9_0= 'bold' ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1392:16: ( (lv_bold_9_0= 'bold' ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1393:1: (lv_bold_9_0= 'bold' )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1393:1: (lv_bold_9_0= 'bold' )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1394:3: lv_bold_9_0= 'bold'
            	    {
            	    lv_bold_9_0=(Token)match(input,41,FOLLOW_41_in_ruleFont2768); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	              newLeafNode(lv_bold_9_0, grammarAccess.getFontAccess().getBoldBoldKeyword_2_0());
            	          
            	    }
            	    if ( state.backtracking==0 ) {

            	      	        if (current==null) {
            	      	            current = createModelElement(grammarAccess.getFontRule());
            	      	        }
            	             		setWithLastConsumed(current, "bold", true, "bold");
            	      	    
            	    }

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFontAccess().getUnorderedGroup());

            	    }


            	    }


            	    }
            	    break;
            	case 4 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1414:4: ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1414:4: ({...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1415:5: {...}? => ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 3) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "getUnorderedGroupHelper().canSelect(grammarAccess.getFontAccess().getUnorderedGroup(), 3)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1415:99: ( ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1416:6: ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getFontAccess().getUnorderedGroup(), 3);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1419:6: ({...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1419:7: {...}? => ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleFont", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1419:16: ( (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}' )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1419:17: (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )? otherlv_13= '}'
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1419:17: (otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) ) )?
            	    int alt18=2;
            	    switch ( input.LA(1) ) {
            	        case 42:
            	            {
            	            alt18=1;
            	            }
            	            break;
            	    }

            	    switch (alt18) {
            	        case 1 :
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1419:19: otherlv_10= 'size' ( (lv_sizevalue_11_0= ruleUnsignedNumber ) ) ( (lv_sizeunit_12_0= ruleUnitEnum ) )
            	            {
            	            otherlv_10=(Token)match(input,42,FOLLOW_42_in_ruleFont2849); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	                  	newLeafNode(otherlv_10, grammarAccess.getFontAccess().getSizeKeyword_3_0_0());
            	                  
            	            }
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1423:1: ( (lv_sizevalue_11_0= ruleUnsignedNumber ) )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1424:1: (lv_sizevalue_11_0= ruleUnsignedNumber )
            	            {
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1424:1: (lv_sizevalue_11_0= ruleUnsignedNumber )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1425:3: lv_sizevalue_11_0= ruleUnsignedNumber
            	            {
            	            if ( state.backtracking==0 ) {
            	               
            	              	        newCompositeNode(grammarAccess.getFontAccess().getSizevalueUnsignedNumberParserRuleCall_3_0_1_0()); 
            	              	    
            	            }
            	            pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleFont2870);
            	            lv_sizevalue_11_0=ruleUnsignedNumber();

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

            	              	        if (current==null) {
            	              	            current = createModelElementForParent(grammarAccess.getFontRule());
            	              	        }
            	                     		set(
            	                     			current, 
            	                     			"sizevalue",
            	                      		lv_sizevalue_11_0, 
            	                      		"UnsignedNumber");
            	              	        afterParserOrEnumRuleCall();
            	              	    
            	            }

            	            }


            	            }

            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1441:2: ( (lv_sizeunit_12_0= ruleUnitEnum ) )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1442:1: (lv_sizeunit_12_0= ruleUnitEnum )
            	            {
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1442:1: (lv_sizeunit_12_0= ruleUnitEnum )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1443:3: lv_sizeunit_12_0= ruleUnitEnum
            	            {
            	            if ( state.backtracking==0 ) {
            	               
            	              	        newCompositeNode(grammarAccess.getFontAccess().getSizeunitUnitEnumEnumRuleCall_3_0_2_0()); 
            	              	    
            	            }
            	            pushFollow(FOLLOW_ruleUnitEnum_in_ruleFont2891);
            	            lv_sizeunit_12_0=ruleUnitEnum();

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

            	              	        if (current==null) {
            	              	            current = createModelElementForParent(grammarAccess.getFontRule());
            	              	        }
            	                     		set(
            	                     			current, 
            	                     			"sizeunit",
            	                      		lv_sizeunit_12_0, 
            	                      		"UnitEnum");
            	              	        afterParserOrEnumRuleCall();
            	              	    
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }

            	    otherlv_13=(Token)match(input,18,FOLLOW_18_in_ruleFont2905); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_13, grammarAccess.getFontAccess().getRightCurlyBracketKeyword_3_1());
            	          
            	    }

            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getFontAccess().getUnorderedGroup());

            	    }


            	    }


            	    }
            	    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);

            if ( ! getUnorderedGroupHelper().canLeave(grammarAccess.getFontAccess().getUnorderedGroup()) ) {
                if (state.backtracking>0) {state.failed=true; return current;}
                throw new FailedPredicateException(input, "ruleFont", "getUnorderedGroupHelper().canLeave(grammarAccess.getFontAccess().getUnorderedGroup())");
            }

            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getFontAccess().getUnorderedGroup());

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFont"


    // $ANTLR start "entryRuleFontFamily"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1486:1: entryRuleFontFamily returns [EObject current=null] : iv_ruleFontFamily= ruleFontFamily EOF ;
    public final EObject entryRuleFontFamily() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleFontFamily = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1487:2: (iv_ruleFontFamily= ruleFontFamily EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1488:2: iv_ruleFontFamily= ruleFontFamily EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getFontFamilyRule()); 
            }
            pushFollow(FOLLOW_ruleFontFamily_in_entryRuleFontFamily2987);
            iv_ruleFontFamily=ruleFontFamily();

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

            }

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


    // $ANTLR start "ruleFontFamily"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1495:1: ruleFontFamily returns [EObject current=null] : (this_BuildInFontFamily_0= ruleBuildInFontFamily | this_CustomFontFamily_1= ruleCustomFontFamily ) ;
    public final EObject ruleFontFamily() throws RecognitionException {
        EObject current = null;

        EObject this_BuildInFontFamily_0 = null;

        EObject this_CustomFontFamily_1 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1498:28: ( (this_BuildInFontFamily_0= ruleBuildInFontFamily | this_CustomFontFamily_1= ruleCustomFontFamily ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1499:1: (this_BuildInFontFamily_0= ruleBuildInFontFamily | this_CustomFontFamily_1= ruleCustomFontFamily )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1499:1: (this_BuildInFontFamily_0= ruleBuildInFontFamily | this_CustomFontFamily_1= ruleCustomFontFamily )
            int alt20=2;
            switch ( input.LA(1) ) {
            case 208:
            case 209:
            case 210:
                {
                alt20=1;
                }
                break;
            case RULE_STRING:
                {
                alt20=2;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 20, 0, input);

                throw nvae;
            }

            switch (alt20) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1500:5: this_BuildInFontFamily_0= ruleBuildInFontFamily
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getFontFamilyAccess().getBuildInFontFamilyParserRuleCall_0()); 
                          
                    }
                    pushFollow(FOLLOW_ruleBuildInFontFamily_in_ruleFontFamily3044);
                    this_BuildInFontFamily_0=ruleBuildInFontFamily();

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

                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1510:5: this_CustomFontFamily_1= ruleCustomFontFamily
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getFontFamilyAccess().getCustomFontFamilyParserRuleCall_1()); 
                          
                    }
                    pushFollow(FOLLOW_ruleCustomFontFamily_in_ruleFontFamily3071);
                    this_CustomFontFamily_1=ruleCustomFontFamily();

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

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleFontFamily"


    // $ANTLR start "entryRuleBuildInFontFamily"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1526:1: entryRuleBuildInFontFamily returns [EObject current=null] : iv_ruleBuildInFontFamily= ruleBuildInFontFamily EOF ;
    public final EObject entryRuleBuildInFontFamily() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBuildInFontFamily = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1527:2: (iv_ruleBuildInFontFamily= ruleBuildInFontFamily EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1528:2: iv_ruleBuildInFontFamily= ruleBuildInFontFamily EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBuildInFontFamilyRule()); 
            }
            pushFollow(FOLLOW_ruleBuildInFontFamily_in_entryRuleBuildInFontFamily3106);
            iv_ruleBuildInFontFamily=ruleBuildInFontFamily();

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

            }

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


    // $ANTLR start "ruleBuildInFontFamily"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1535:1: ruleBuildInFontFamily returns [EObject current=null] : ( (lv_custom_0_0= ruleBuildInFontFamilyEnum ) ) ;
    public final EObject ruleBuildInFontFamily() throws RecognitionException {
        EObject current = null;

        Enumerator lv_custom_0_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1538:28: ( ( (lv_custom_0_0= ruleBuildInFontFamilyEnum ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1539:1: ( (lv_custom_0_0= ruleBuildInFontFamilyEnum ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1539:1: ( (lv_custom_0_0= ruleBuildInFontFamilyEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1540:1: (lv_custom_0_0= ruleBuildInFontFamilyEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1540:1: (lv_custom_0_0= ruleBuildInFontFamilyEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1541:3: lv_custom_0_0= ruleBuildInFontFamilyEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getBuildInFontFamilyAccess().getCustomBuildInFontFamilyEnumEnumRuleCall_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleBuildInFontFamilyEnum_in_ruleBuildInFontFamily3161);
            lv_custom_0_0=ruleBuildInFontFamilyEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getBuildInFontFamilyRule());
              	        }
                     		set(
                     			current, 
                     			"custom",
                      		lv_custom_0_0, 
                      		"BuildInFontFamilyEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleBuildInFontFamily"


    // $ANTLR start "entryRuleCustomFontFamily"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1565:1: entryRuleCustomFontFamily returns [EObject current=null] : iv_ruleCustomFontFamily= ruleCustomFontFamily EOF ;
    public final EObject entryRuleCustomFontFamily() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCustomFontFamily = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1566:2: (iv_ruleCustomFontFamily= ruleCustomFontFamily EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1567:2: iv_ruleCustomFontFamily= ruleCustomFontFamily EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCustomFontFamilyRule()); 
            }
            pushFollow(FOLLOW_ruleCustomFontFamily_in_entryRuleCustomFontFamily3196);
            iv_ruleCustomFontFamily=ruleCustomFontFamily();

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

            }

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


    // $ANTLR start "ruleCustomFontFamily"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1574:1: ruleCustomFontFamily returns [EObject current=null] : ( (lv_custom_0_0= RULE_STRING ) ) ;
    public final EObject ruleCustomFontFamily() throws RecognitionException {
        EObject current = null;

        Token lv_custom_0_0=null;

         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1577:28: ( ( (lv_custom_0_0= RULE_STRING ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1578:1: ( (lv_custom_0_0= RULE_STRING ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1578:1: ( (lv_custom_0_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1579:1: (lv_custom_0_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1579:1: (lv_custom_0_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1580:3: lv_custom_0_0= RULE_STRING
            {
            lv_custom_0_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleCustomFontFamily3247); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_custom_0_0, grammarAccess.getCustomFontFamilyAccess().getCustomSTRINGTerminalRuleCall_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getCustomFontFamilyRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"custom",
                      		lv_custom_0_0, 
                      		"STRING");
              	    
            }

            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCustomFontFamily"


    // $ANTLR start "entryRuleBorderStyle"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1604:1: entryRuleBorderStyle returns [EObject current=null] : iv_ruleBorderStyle= ruleBorderStyle EOF ;
    public final EObject entryRuleBorderStyle() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleBorderStyle = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1605:2: (iv_ruleBorderStyle= ruleBorderStyle EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1606:2: iv_ruleBorderStyle= ruleBorderStyle EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getBorderStyleRule()); 
            }
            pushFollow(FOLLOW_ruleBorderStyle_in_entryRuleBorderStyle3287);
            iv_ruleBorderStyle=ruleBorderStyle();

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

            }

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


    // $ANTLR start "ruleBorderStyle"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1613:1: ruleBorderStyle returns [EObject current=null] : ( ( (lv_type_0_0= ruleBorderTypeEnum ) ) ( (lv_widthvalue_1_0= ruleUnsignedNumber ) ) ( (lv_widthunit_2_0= ruleUnitEnum ) ) ( (otherlv_3= RULE_ID ) ) ) ;
    public final EObject ruleBorderStyle() throws RecognitionException {
        EObject current = null;

        Token otherlv_3=null;
        Enumerator lv_type_0_0 = null;

        AntlrDatatypeRuleToken lv_widthvalue_1_0 = null;

        Enumerator lv_widthunit_2_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1616:28: ( ( ( (lv_type_0_0= ruleBorderTypeEnum ) ) ( (lv_widthvalue_1_0= ruleUnsignedNumber ) ) ( (lv_widthunit_2_0= ruleUnitEnum ) ) ( (otherlv_3= RULE_ID ) ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1617:1: ( ( (lv_type_0_0= ruleBorderTypeEnum ) ) ( (lv_widthvalue_1_0= ruleUnsignedNumber ) ) ( (lv_widthunit_2_0= ruleUnitEnum ) ) ( (otherlv_3= RULE_ID ) ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1617:1: ( ( (lv_type_0_0= ruleBorderTypeEnum ) ) ( (lv_widthvalue_1_0= ruleUnsignedNumber ) ) ( (lv_widthunit_2_0= ruleUnitEnum ) ) ( (otherlv_3= RULE_ID ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1617:2: ( (lv_type_0_0= ruleBorderTypeEnum ) ) ( (lv_widthvalue_1_0= ruleUnsignedNumber ) ) ( (lv_widthunit_2_0= ruleUnitEnum ) ) ( (otherlv_3= RULE_ID ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1617:2: ( (lv_type_0_0= ruleBorderTypeEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1618:1: (lv_type_0_0= ruleBorderTypeEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1618:1: (lv_type_0_0= ruleBorderTypeEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1619:3: lv_type_0_0= ruleBorderTypeEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getBorderStyleAccess().getTypeBorderTypeEnumEnumRuleCall_0_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleBorderTypeEnum_in_ruleBorderStyle3343);
            lv_type_0_0=ruleBorderTypeEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getBorderStyleRule());
              	        }
                     		set(
                     			current, 
                     			"type",
                      		lv_type_0_0, 
                      		"BorderTypeEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1635:2: ( (lv_widthvalue_1_0= ruleUnsignedNumber ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1636:1: (lv_widthvalue_1_0= ruleUnsignedNumber )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1636:1: (lv_widthvalue_1_0= ruleUnsignedNumber )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1637:3: lv_widthvalue_1_0= ruleUnsignedNumber
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getBorderStyleAccess().getWidthvalueUnsignedNumberParserRuleCall_1_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleBorderStyle3364);
            lv_widthvalue_1_0=ruleUnsignedNumber();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getBorderStyleRule());
              	        }
                     		set(
                     			current, 
                     			"widthvalue",
                      		lv_widthvalue_1_0, 
                      		"UnsignedNumber");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1653:2: ( (lv_widthunit_2_0= ruleUnitEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1654:1: (lv_widthunit_2_0= ruleUnitEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1654:1: (lv_widthunit_2_0= ruleUnitEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1655:3: lv_widthunit_2_0= ruleUnitEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getBorderStyleAccess().getWidthunitUnitEnumEnumRuleCall_2_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleUnitEnum_in_ruleBorderStyle3385);
            lv_widthunit_2_0=ruleUnitEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getBorderStyleRule());
              	        }
                     		set(
                     			current, 
                     			"widthunit",
                      		lv_widthunit_2_0, 
                      		"UnitEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1671:2: ( (otherlv_3= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1672:1: (otherlv_3= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1672:1: (otherlv_3= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1673:3: otherlv_3= RULE_ID
            {
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getBorderStyleRule());
              	        }
                      
            }
            otherlv_3=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleBorderStyle3405); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		newLeafNode(otherlv_3, grammarAccess.getBorderStyleAccess().getColorColorCrossReference_3_0()); 
              	
            }

            }


            }


            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleBorderStyle"


    // $ANTLR start "entryRuleStyle"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1692:1: entryRuleStyle returns [EObject current=null] : iv_ruleStyle= ruleStyle EOF ;
    public final EObject entryRuleStyle() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleStyle = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1693:2: (iv_ruleStyle= ruleStyle EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1694:2: iv_ruleStyle= ruleStyle EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getStyleRule()); 
            }
            pushFollow(FOLLOW_ruleStyle_in_entryRuleStyle3441);
            iv_ruleStyle=ruleStyle();

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

            }

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


    // $ANTLR start "ruleStyle"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1701:1: ruleStyle returns [EObject current=null] : (otherlv_0= 'style' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) ( (lv_mediastyles_50_0= ruleMediaStyle ) )* otherlv_51= '}' ) ;
    public final EObject ruleStyle() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token otherlv_4=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_14=null;
        Token otherlv_15=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        Token otherlv_24=null;
        Token otherlv_26=null;
        Token otherlv_29=null;
        Token otherlv_32=null;
        Token otherlv_35=null;
        Token otherlv_38=null;
        Token otherlv_41=null;
        Token otherlv_44=null;
        Token otherlv_47=null;
        Token otherlv_51=null;
        Enumerator lv_textalign_17_0 = null;

        EObject lv_borderTop_19_0 = null;

        EObject lv_borderBottom_21_0 = null;

        EObject lv_borderLeft_23_0 = null;

        EObject lv_borderRight_25_0 = null;

        AntlrDatatypeRuleToken lv_paddingTopValue_27_0 = null;

        Enumerator lv_paddingTopUnit_28_0 = null;

        AntlrDatatypeRuleToken lv_paddingBottomValue_30_0 = null;

        Enumerator lv_paddingBottomUnit_31_0 = null;

        AntlrDatatypeRuleToken lv_paddingLeftValue_33_0 = null;

        Enumerator lv_paddingLeftUnit_34_0 = null;

        AntlrDatatypeRuleToken lv_paddingRightValue_36_0 = null;

        Enumerator lv_paddingRightUnit_37_0 = null;

        AntlrDatatypeRuleToken lv_marginTopValue_39_0 = null;

        Enumerator lv_marginTopUnit_40_0 = null;

        AntlrDatatypeRuleToken lv_marginBottomValue_42_0 = null;

        Enumerator lv_marginBottomUnit_43_0 = null;

        AntlrDatatypeRuleToken lv_marginLeftValue_45_0 = null;

        Enumerator lv_marginLeftUnit_46_0 = null;

        AntlrDatatypeRuleToken lv_marginRightValue_48_0 = null;

        Enumerator lv_marginRightUnit_49_0 = null;

        EObject lv_mediastyles_50_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1704:28: ( (otherlv_0= 'style' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) ( (lv_mediastyles_50_0= ruleMediaStyle ) )* otherlv_51= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1705:1: (otherlv_0= 'style' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) ( (lv_mediastyles_50_0= ruleMediaStyle ) )* otherlv_51= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1705:1: (otherlv_0= 'style' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) ( (lv_mediastyles_50_0= ruleMediaStyle ) )* otherlv_51= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1705:3: otherlv_0= 'style' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )? ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) ( (lv_mediastyles_50_0= ruleMediaStyle ) )* otherlv_51= '}'
            {
            otherlv_0=(Token)match(input,43,FOLLOW_43_in_ruleStyle3488); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getStyleAccess().getStyleKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1709:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1710:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1710:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1711:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3505); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getStyleAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getStyleRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleStyle3522); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getStyleAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1731:1: (otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) ) )?
            int alt21=2;
            switch ( input.LA(1) ) {
                case 39:
                    {
                    alt21=1;
                    }
                    break;
            }

            switch (alt21) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1731:3: otherlv_3= 'extends' ( (otherlv_4= RULE_ID ) )
                    {
                    otherlv_3=(Token)match(input,39,FOLLOW_39_in_ruleStyle3535); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                          	newLeafNode(otherlv_3, grammarAccess.getStyleAccess().getExtendsKeyword_3_0());
                          
                    }
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1735:1: ( (otherlv_4= RULE_ID ) )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1736:1: (otherlv_4= RULE_ID )
                    {
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1736:1: (otherlv_4= RULE_ID )
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1737:3: otherlv_4= RULE_ID
                    {
                    if ( state.backtracking==0 ) {

                      			if (current==null) {
                      	            current = createModelElement(grammarAccess.getStyleRule());
                      	        }
                              
                    }
                    otherlv_4=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3555); if (state.failed) return current;
                    if ( state.backtracking==0 ) {

                      		newLeafNode(otherlv_4, grammarAccess.getStyleAccess().getExtendsStyleCrossReference_3_1_0()); 
                      	
                    }

                    }


                    }


                    }
                    break;

            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1748:4: ( ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1750:1: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1750:1: ( ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1751:2: ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getStyleAccess().getUnorderedGroup_4());
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1754:2: ( ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )* )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1755:3: ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )*
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1755:3: ( ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) ) )*
            loop23:
            do {
                int alt23=18;
                int LA23_0 = input.LA(1);

                if ( LA23_0 ==44 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 0) ) {
                    alt23=1;
                }
                else if ( LA23_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 1) ) {
                    alt23=2;
                }
                else if ( LA23_0 ==45 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 2) ) {
                    alt23=3;
                }
                else if ( LA23_0 ==47 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 3) ) {
                    alt23=4;
                }
                else if ( LA23_0 ==48 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 4) ) {
                    alt23=5;
                }
                else if ( LA23_0 ==49 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 5) ) {
                    alt23=6;
                }
                else if ( LA23_0 ==50 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 6) ) {
                    alt23=7;
                }
                else if ( LA23_0 ==51 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 7) ) {
                    alt23=8;
                }
                else if ( LA23_0 ==52 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 8) ) {
                    alt23=9;
                }
                else if ( LA23_0 ==53 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 9) ) {
                    alt23=10;
                }
                else if ( LA23_0 ==54 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 10) ) {
                    alt23=11;
                }
                else if ( LA23_0 ==55 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 11) ) {
                    alt23=12;
                }
                else if ( LA23_0 ==56 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 12) ) {
                    alt23=13;
                }
                else if ( LA23_0 ==57 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 13) ) {
                    alt23=14;
                }
                else if ( LA23_0 ==58 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 14) ) {
                    alt23=15;
                }
                else if ( LA23_0 ==59 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 15) ) {
                    alt23=16;
                }
                else if ( LA23_0 ==60 && getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 16) ) {
                    alt23=17;
                }


                switch (alt23) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1757:4: ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1757:4: ({...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1758:5: {...}? => ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 0)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1758:102: ( ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1759:6: ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 0);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1762:6: ({...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1762:7: {...}? => (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1762:16: (otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1762:18: otherlv_6= 'formatter' ( (otherlv_7= RULE_ID ) )
            	    {
            	    otherlv_6=(Token)match(input,44,FOLLOW_44_in_ruleStyle3615); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_6, grammarAccess.getStyleAccess().getFormatterKeyword_4_0_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1766:1: ( (otherlv_7= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1767:1: (otherlv_7= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1767:1: (otherlv_7= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1768:3: otherlv_7= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_7=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3635); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_7, grammarAccess.getStyleAccess().getFormatSomeFormatCrossReference_4_0_1_0()); 
            	      	
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1786:4: ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1786:4: ({...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1787:5: {...}? => ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 1)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1787:102: ( ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1788:6: ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 1);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1791:6: ({...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1791:7: {...}? => (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1791:16: (otherlv_8= 'font' ( (otherlv_9= RULE_ID ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1791:18: otherlv_8= 'font' ( (otherlv_9= RULE_ID ) )
            	    {
            	    otherlv_8=(Token)match(input,38,FOLLOW_38_in_ruleStyle3703); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_8, grammarAccess.getStyleAccess().getFontKeyword_4_1_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1795:1: ( (otherlv_9= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1796:1: (otherlv_9= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1796:1: (otherlv_9= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1797:3: otherlv_9= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_9=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3723); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_9, grammarAccess.getStyleAccess().getFontFontCrossReference_4_1_1_0()); 
            	      	
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1815:4: ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1815:4: ({...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1816:5: {...}? => ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 2)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1816:102: ( ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1817:6: ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 2);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1820:6: ({...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1820:7: {...}? => (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1820:16: (otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )? )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1820:18: otherlv_10= 'backgroundcolor' ( (otherlv_11= RULE_ID ) ) (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )?
            	    {
            	    otherlv_10=(Token)match(input,45,FOLLOW_45_in_ruleStyle3791); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_10, grammarAccess.getStyleAccess().getBackgroundcolorKeyword_4_2_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1824:1: ( (otherlv_11= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1825:1: (otherlv_11= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1825:1: (otherlv_11= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1826:3: otherlv_11= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_11=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3811); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_11, grammarAccess.getStyleAccess().getBackgroundcolorColorCrossReference_4_2_1_0()); 
            	      	
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1837:2: (otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) ) )?
            	    int alt22=2;
            	    switch ( input.LA(1) ) {
            	        case 46:
            	            {
            	            alt22=1;
            	            }
            	            break;
            	    }

            	    switch (alt22) {
            	        case 1 :
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1837:4: otherlv_12= 'alternate' ( (otherlv_13= RULE_ID ) )
            	            {
            	            otherlv_12=(Token)match(input,46,FOLLOW_46_in_ruleStyle3824); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	                  	newLeafNode(otherlv_12, grammarAccess.getStyleAccess().getAlternateKeyword_4_2_2_0());
            	                  
            	            }
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1841:1: ( (otherlv_13= RULE_ID ) )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1842:1: (otherlv_13= RULE_ID )
            	            {
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1842:1: (otherlv_13= RULE_ID )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1843:3: otherlv_13= RULE_ID
            	            {
            	            if ( state.backtracking==0 ) {

            	              			if (current==null) {
            	              	            current = createModelElement(grammarAccess.getStyleRule());
            	              	        }
            	                      
            	            }
            	            otherlv_13=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3844); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              		newLeafNode(otherlv_13, grammarAccess.getStyleAccess().getBackgroundcolor_alternateColorCrossReference_4_2_2_1_0()); 
            	              	
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 4 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1861:4: ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1861:4: ({...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1862:5: {...}? => ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 3) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 3)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1862:102: ( ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1863:6: ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 3);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1866:6: ({...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1866:7: {...}? => (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1866:16: (otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1866:18: otherlv_14= 'textcolor' ( (otherlv_15= RULE_ID ) )
            	    {
            	    otherlv_14=(Token)match(input,47,FOLLOW_47_in_ruleStyle3914); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_14, grammarAccess.getStyleAccess().getTextcolorKeyword_4_3_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1870:1: ( (otherlv_15= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1871:1: (otherlv_15= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1871:1: (otherlv_15= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1872:3: otherlv_15= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_15=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleStyle3934); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_15, grammarAccess.getStyleAccess().getTextcolorColorCrossReference_4_3_1_0()); 
            	      	
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 5 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1890:4: ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1890:4: ({...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1891:5: {...}? => ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 4) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 4)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1891:102: ( ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1892:6: ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 4);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1895:6: ({...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1895:7: {...}? => (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1895:16: (otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1895:18: otherlv_16= 'textalign' ( (lv_textalign_17_0= ruleTextAlignEnum ) )
            	    {
            	    otherlv_16=(Token)match(input,48,FOLLOW_48_in_ruleStyle4002); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_16, grammarAccess.getStyleAccess().getTextalignKeyword_4_4_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1899:1: ( (lv_textalign_17_0= ruleTextAlignEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1900:1: (lv_textalign_17_0= ruleTextAlignEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1900:1: (lv_textalign_17_0= ruleTextAlignEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1901:3: lv_textalign_17_0= ruleTextAlignEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getTextalignTextAlignEnumEnumRuleCall_4_4_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleTextAlignEnum_in_ruleStyle4023);
            	    lv_textalign_17_0=ruleTextAlignEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"textalign",
            	              		lv_textalign_17_0, 
            	              		"TextAlignEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 6 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1924:4: ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1924:4: ({...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1925:5: {...}? => ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 5) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 5)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1925:102: ( ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1926:6: ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 5);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1929:6: ({...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1929:7: {...}? => (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1929:16: (otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1929:18: otherlv_18= 'border-top' ( (lv_borderTop_19_0= ruleBorderStyle ) )
            	    {
            	    otherlv_18=(Token)match(input,49,FOLLOW_49_in_ruleStyle4091); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_18, grammarAccess.getStyleAccess().getBorderTopKeyword_4_5_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1933:1: ( (lv_borderTop_19_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1934:1: (lv_borderTop_19_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1934:1: (lv_borderTop_19_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1935:3: lv_borderTop_19_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getBorderTopBorderStyleParserRuleCall_4_5_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleStyle4112);
            	    lv_borderTop_19_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderTop",
            	              		lv_borderTop_19_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 7 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1958:4: ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1958:4: ({...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1959:5: {...}? => ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 6) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 6)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1959:102: ( ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1960:6: ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 6);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1963:6: ({...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1963:7: {...}? => (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1963:16: (otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1963:18: otherlv_20= 'border-bottom' ( (lv_borderBottom_21_0= ruleBorderStyle ) )
            	    {
            	    otherlv_20=(Token)match(input,50,FOLLOW_50_in_ruleStyle4180); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_20, grammarAccess.getStyleAccess().getBorderBottomKeyword_4_6_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1967:1: ( (lv_borderBottom_21_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1968:1: (lv_borderBottom_21_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1968:1: (lv_borderBottom_21_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1969:3: lv_borderBottom_21_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getBorderBottomBorderStyleParserRuleCall_4_6_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleStyle4201);
            	    lv_borderBottom_21_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderBottom",
            	              		lv_borderBottom_21_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 8 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1992:4: ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1992:4: ({...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1993:5: {...}? => ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 7) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 7)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1993:102: ( ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1994:6: ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 7);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1997:6: ({...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1997:7: {...}? => (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1997:16: (otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:1997:18: otherlv_22= 'border-left' ( (lv_borderLeft_23_0= ruleBorderStyle ) )
            	    {
            	    otherlv_22=(Token)match(input,51,FOLLOW_51_in_ruleStyle4269); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_22, grammarAccess.getStyleAccess().getBorderLeftKeyword_4_7_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2001:1: ( (lv_borderLeft_23_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2002:1: (lv_borderLeft_23_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2002:1: (lv_borderLeft_23_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2003:3: lv_borderLeft_23_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getBorderLeftBorderStyleParserRuleCall_4_7_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleStyle4290);
            	    lv_borderLeft_23_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderLeft",
            	              		lv_borderLeft_23_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 9 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2026:4: ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2026:4: ({...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2027:5: {...}? => ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 8) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 8)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2027:102: ( ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2028:6: ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 8);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2031:6: ({...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2031:7: {...}? => (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2031:16: (otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2031:18: otherlv_24= 'border-right' ( (lv_borderRight_25_0= ruleBorderStyle ) )
            	    {
            	    otherlv_24=(Token)match(input,52,FOLLOW_52_in_ruleStyle4358); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_24, grammarAccess.getStyleAccess().getBorderRightKeyword_4_8_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2035:1: ( (lv_borderRight_25_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2036:1: (lv_borderRight_25_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2036:1: (lv_borderRight_25_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2037:3: lv_borderRight_25_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getBorderRightBorderStyleParserRuleCall_4_8_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleStyle4379);
            	    lv_borderRight_25_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderRight",
            	              		lv_borderRight_25_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 10 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2060:4: ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2060:4: ({...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2061:5: {...}? => ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 9) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 9)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2061:102: ( ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2062:6: ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 9);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2065:6: ({...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2065:7: {...}? => (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2065:16: (otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2065:18: otherlv_26= 'padding-top' ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) )
            	    {
            	    otherlv_26=(Token)match(input,53,FOLLOW_53_in_ruleStyle4447); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_26, grammarAccess.getStyleAccess().getPaddingTopKeyword_4_9_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2069:1: ( (lv_paddingTopValue_27_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2070:1: (lv_paddingTopValue_27_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2070:1: (lv_paddingTopValue_27_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2071:3: lv_paddingTopValue_27_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingTopValueUnsignedNumberParserRuleCall_4_9_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle4468);
            	    lv_paddingTopValue_27_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingTopValue",
            	              		lv_paddingTopValue_27_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2087:2: ( (lv_paddingTopUnit_28_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2088:1: (lv_paddingTopUnit_28_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2088:1: (lv_paddingTopUnit_28_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2089:3: lv_paddingTopUnit_28_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingTopUnitUnitEnumEnumRuleCall_4_9_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle4489);
            	    lv_paddingTopUnit_28_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingTopUnit",
            	              		lv_paddingTopUnit_28_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 11 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2112:4: ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2112:4: ({...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2113:5: {...}? => ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 10) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 10)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2113:103: ( ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2114:6: ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 10);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2117:6: ({...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2117:7: {...}? => (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2117:16: (otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2117:18: otherlv_29= 'padding-bottom' ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) )
            	    {
            	    otherlv_29=(Token)match(input,54,FOLLOW_54_in_ruleStyle4557); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_29, grammarAccess.getStyleAccess().getPaddingBottomKeyword_4_10_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2121:1: ( (lv_paddingBottomValue_30_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2122:1: (lv_paddingBottomValue_30_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2122:1: (lv_paddingBottomValue_30_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2123:3: lv_paddingBottomValue_30_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingBottomValueUnsignedNumberParserRuleCall_4_10_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle4578);
            	    lv_paddingBottomValue_30_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingBottomValue",
            	              		lv_paddingBottomValue_30_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2139:2: ( (lv_paddingBottomUnit_31_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2140:1: (lv_paddingBottomUnit_31_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2140:1: (lv_paddingBottomUnit_31_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2141:3: lv_paddingBottomUnit_31_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingBottomUnitUnitEnumEnumRuleCall_4_10_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle4599);
            	    lv_paddingBottomUnit_31_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingBottomUnit",
            	              		lv_paddingBottomUnit_31_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 12 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2164:4: ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2164:4: ({...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2165:5: {...}? => ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 11) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 11)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2165:103: ( ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2166:6: ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 11);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2169:6: ({...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2169:7: {...}? => (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2169:16: (otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2169:18: otherlv_32= 'padding-left' ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) )
            	    {
            	    otherlv_32=(Token)match(input,55,FOLLOW_55_in_ruleStyle4667); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_32, grammarAccess.getStyleAccess().getPaddingLeftKeyword_4_11_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2173:1: ( (lv_paddingLeftValue_33_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2174:1: (lv_paddingLeftValue_33_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2174:1: (lv_paddingLeftValue_33_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2175:3: lv_paddingLeftValue_33_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingLeftValueUnsignedNumberParserRuleCall_4_11_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle4688);
            	    lv_paddingLeftValue_33_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingLeftValue",
            	              		lv_paddingLeftValue_33_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2191:2: ( (lv_paddingLeftUnit_34_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2192:1: (lv_paddingLeftUnit_34_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2192:1: (lv_paddingLeftUnit_34_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2193:3: lv_paddingLeftUnit_34_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingLeftUnitUnitEnumEnumRuleCall_4_11_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle4709);
            	    lv_paddingLeftUnit_34_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingLeftUnit",
            	              		lv_paddingLeftUnit_34_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 13 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2216:4: ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2216:4: ({...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2217:5: {...}? => ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 12) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 12)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2217:103: ( ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2218:6: ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 12);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2221:6: ({...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2221:7: {...}? => (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2221:16: (otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2221:18: otherlv_35= 'padding-right' ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) )
            	    {
            	    otherlv_35=(Token)match(input,56,FOLLOW_56_in_ruleStyle4777); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_35, grammarAccess.getStyleAccess().getPaddingRightKeyword_4_12_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2225:1: ( (lv_paddingRightValue_36_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2226:1: (lv_paddingRightValue_36_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2226:1: (lv_paddingRightValue_36_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2227:3: lv_paddingRightValue_36_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingRightValueUnsignedNumberParserRuleCall_4_12_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle4798);
            	    lv_paddingRightValue_36_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingRightValue",
            	              		lv_paddingRightValue_36_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2243:2: ( (lv_paddingRightUnit_37_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2244:1: (lv_paddingRightUnit_37_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2244:1: (lv_paddingRightUnit_37_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2245:3: lv_paddingRightUnit_37_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getPaddingRightUnitUnitEnumEnumRuleCall_4_12_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle4819);
            	    lv_paddingRightUnit_37_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingRightUnit",
            	              		lv_paddingRightUnit_37_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 14 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2268:4: ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2268:4: ({...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2269:5: {...}? => ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 13) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 13)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2269:103: ( ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2270:6: ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 13);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2273:6: ({...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2273:7: {...}? => (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2273:16: (otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2273:18: otherlv_38= 'margin-top' ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_40_0= ruleUnitEnum ) )
            	    {
            	    otherlv_38=(Token)match(input,57,FOLLOW_57_in_ruleStyle4887); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_38, grammarAccess.getStyleAccess().getMarginTopKeyword_4_13_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2277:1: ( (lv_marginTopValue_39_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2278:1: (lv_marginTopValue_39_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2278:1: (lv_marginTopValue_39_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2279:3: lv_marginTopValue_39_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginTopValueUnsignedNumberParserRuleCall_4_13_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle4908);
            	    lv_marginTopValue_39_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginTopValue",
            	              		lv_marginTopValue_39_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2295:2: ( (lv_marginTopUnit_40_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2296:1: (lv_marginTopUnit_40_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2296:1: (lv_marginTopUnit_40_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2297:3: lv_marginTopUnit_40_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginTopUnitUnitEnumEnumRuleCall_4_13_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle4929);
            	    lv_marginTopUnit_40_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginTopUnit",
            	              		lv_marginTopUnit_40_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 15 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2320:4: ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2320:4: ({...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2321:5: {...}? => ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 14) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 14)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2321:103: ( ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2322:6: ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 14);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2325:6: ({...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2325:7: {...}? => (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2325:16: (otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2325:18: otherlv_41= 'margin-bottom' ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) )
            	    {
            	    otherlv_41=(Token)match(input,58,FOLLOW_58_in_ruleStyle4997); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_41, grammarAccess.getStyleAccess().getMarginBottomKeyword_4_14_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2329:1: ( (lv_marginBottomValue_42_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2330:1: (lv_marginBottomValue_42_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2330:1: (lv_marginBottomValue_42_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2331:3: lv_marginBottomValue_42_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginBottomValueUnsignedNumberParserRuleCall_4_14_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle5018);
            	    lv_marginBottomValue_42_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginBottomValue",
            	              		lv_marginBottomValue_42_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2347:2: ( (lv_marginBottomUnit_43_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2348:1: (lv_marginBottomUnit_43_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2348:1: (lv_marginBottomUnit_43_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2349:3: lv_marginBottomUnit_43_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginBottomUnitUnitEnumEnumRuleCall_4_14_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle5039);
            	    lv_marginBottomUnit_43_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginBottomUnit",
            	              		lv_marginBottomUnit_43_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 16 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2372:4: ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2372:4: ({...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2373:5: {...}? => ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 15) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 15)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2373:103: ( ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2374:6: ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 15);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2377:6: ({...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2377:7: {...}? => (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2377:16: (otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2377:18: otherlv_44= 'margin-left' ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) )
            	    {
            	    otherlv_44=(Token)match(input,59,FOLLOW_59_in_ruleStyle5107); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_44, grammarAccess.getStyleAccess().getMarginLeftKeyword_4_15_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2381:1: ( (lv_marginLeftValue_45_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2382:1: (lv_marginLeftValue_45_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2382:1: (lv_marginLeftValue_45_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2383:3: lv_marginLeftValue_45_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginLeftValueUnsignedNumberParserRuleCall_4_15_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle5128);
            	    lv_marginLeftValue_45_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginLeftValue",
            	              		lv_marginLeftValue_45_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2399:2: ( (lv_marginLeftUnit_46_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2400:1: (lv_marginLeftUnit_46_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2400:1: (lv_marginLeftUnit_46_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2401:3: lv_marginLeftUnit_46_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginLeftUnitUnitEnumEnumRuleCall_4_15_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle5149);
            	    lv_marginLeftUnit_46_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginLeftUnit",
            	              		lv_marginLeftUnit_46_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;
            	case 17 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2424:4: ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2424:4: ({...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2425:5: {...}? => ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 16) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 16)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2425:103: ( ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2426:6: ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getStyleAccess().getUnorderedGroup_4(), 16);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2429:6: ({...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2429:7: {...}? => (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2429:16: (otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2429:18: otherlv_47= 'margin-right' ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_49_0= ruleUnitEnum ) )
            	    {
            	    otherlv_47=(Token)match(input,60,FOLLOW_60_in_ruleStyle5217); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_47, grammarAccess.getStyleAccess().getMarginRightKeyword_4_16_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2433:1: ( (lv_marginRightValue_48_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2434:1: (lv_marginRightValue_48_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2434:1: (lv_marginRightValue_48_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2435:3: lv_marginRightValue_48_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginRightValueUnsignedNumberParserRuleCall_4_16_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleStyle5238);
            	    lv_marginRightValue_48_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginRightValue",
            	              		lv_marginRightValue_48_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2451:2: ( (lv_marginRightUnit_49_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2452:1: (lv_marginRightUnit_49_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2452:1: (lv_marginRightUnit_49_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2453:3: lv_marginRightUnit_49_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMarginRightUnitUnitEnumEnumRuleCall_4_16_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleStyle5259);
            	    lv_marginRightUnit_49_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginRightUnit",
            	              		lv_marginRightUnit_49_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getStyleAccess().getUnorderedGroup_4());

            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2483:2: ( (lv_mediastyles_50_0= ruleMediaStyle ) )*
            loop24:
            do {
                int alt24=2;
                switch ( input.LA(1) ) {
                case 23:
                    {
                    alt24=1;
                    }
                    break;

                }

                switch (alt24) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2484:1: (lv_mediastyles_50_0= ruleMediaStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2484:1: (lv_mediastyles_50_0= ruleMediaStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2485:3: lv_mediastyles_50_0= ruleMediaStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getStyleAccess().getMediastylesMediaStyleParserRuleCall_5_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleMediaStyle_in_ruleStyle5321);
            	    lv_mediastyles_50_0=ruleMediaStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getStyleRule());
            	      	        }
            	             		add(
            	             			current, 
            	             			"mediastyles",
            	              		lv_mediastyles_50_0, 
            	              		"MediaStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }
            	    break;

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

            otherlv_51=(Token)match(input,18,FOLLOW_18_in_ruleStyle5334); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_51, grammarAccess.getStyleAccess().getRightCurlyBracketKeyword_6());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleStyle"


    // $ANTLR start "entryRuleMediaStyle"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2513:1: entryRuleMediaStyle returns [EObject current=null] : iv_ruleMediaStyle= ruleMediaStyle EOF ;
    public final EObject entryRuleMediaStyle() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleMediaStyle = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2514:2: (iv_ruleMediaStyle= ruleMediaStyle EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2515:2: iv_ruleMediaStyle= ruleMediaStyle EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getMediaStyleRule()); 
            }
            pushFollow(FOLLOW_ruleMediaStyle_in_entryRuleMediaStyle5370);
            iv_ruleMediaStyle=ruleMediaStyle();

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

            }

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


    // $ANTLR start "ruleMediaStyle"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2522:1: ruleMediaStyle returns [EObject current=null] : (otherlv_0= 'media' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) otherlv_48= '}' ) ;
    public final EObject ruleMediaStyle() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token otherlv_1=null;
        Token otherlv_2=null;
        Token otherlv_4=null;
        Token otherlv_5=null;
        Token otherlv_6=null;
        Token otherlv_7=null;
        Token otherlv_8=null;
        Token otherlv_9=null;
        Token otherlv_10=null;
        Token otherlv_11=null;
        Token otherlv_12=null;
        Token otherlv_13=null;
        Token otherlv_14=null;
        Token otherlv_16=null;
        Token otherlv_18=null;
        Token otherlv_20=null;
        Token otherlv_22=null;
        Token otherlv_24=null;
        Token otherlv_27=null;
        Token otherlv_30=null;
        Token otherlv_33=null;
        Token otherlv_36=null;
        Token otherlv_39=null;
        Token otherlv_42=null;
        Token otherlv_45=null;
        Token otherlv_48=null;
        Enumerator lv_textalign_15_0 = null;

        EObject lv_borderTop_17_0 = null;

        EObject lv_borderBottom_19_0 = null;

        EObject lv_borderLeft_21_0 = null;

        EObject lv_borderRight_23_0 = null;

        AntlrDatatypeRuleToken lv_paddingTopValue_25_0 = null;

        Enumerator lv_paddingTopUnit_26_0 = null;

        AntlrDatatypeRuleToken lv_paddingBottomValue_28_0 = null;

        Enumerator lv_paddingBottomUnit_29_0 = null;

        AntlrDatatypeRuleToken lv_paddingLeftValue_31_0 = null;

        Enumerator lv_paddingLeftUnit_32_0 = null;

        AntlrDatatypeRuleToken lv_paddingRightValue_34_0 = null;

        Enumerator lv_paddingRightUnit_35_0 = null;

        AntlrDatatypeRuleToken lv_marginTopValue_37_0 = null;

        Enumerator lv_marginTopUnit_38_0 = null;

        AntlrDatatypeRuleToken lv_marginBottomValue_40_0 = null;

        Enumerator lv_marginBottomUnit_41_0 = null;

        AntlrDatatypeRuleToken lv_marginLeftValue_43_0 = null;

        Enumerator lv_marginLeftUnit_44_0 = null;

        AntlrDatatypeRuleToken lv_marginRightValue_46_0 = null;

        Enumerator lv_marginRightUnit_47_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2525:28: ( (otherlv_0= 'media' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) otherlv_48= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2526:1: (otherlv_0= 'media' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) otherlv_48= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2526:1: (otherlv_0= 'media' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) otherlv_48= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2526:3: otherlv_0= 'media' ( (otherlv_1= RULE_ID ) ) otherlv_2= '{' ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) ) otherlv_48= '}'
            {
            otherlv_0=(Token)match(input,23,FOLLOW_23_in_ruleMediaStyle5417); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getMediaStyleAccess().getMediaKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2530:1: ( (otherlv_1= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2531:1: (otherlv_1= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2531:1: (otherlv_1= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2532:3: otherlv_1= RULE_ID
            {
            if ( state.backtracking==0 ) {

              			if (current==null) {
              	            current = createModelElement(grammarAccess.getMediaStyleRule());
              	        }
                      
            }
            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMediaStyle5437); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              		newLeafNode(otherlv_1, grammarAccess.getMediaStyleAccess().getMediaMediaCrossReference_1_0()); 
              	
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleMediaStyle5449); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getMediaStyleAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2547:1: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2549:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2549:1: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2550:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* )
            {
            getUnorderedGroupHelper().enter(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2553:2: ( ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )* )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2554:3: ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )*
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2554:3: ( ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) ) | ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) ) )*
            loop26:
            do {
                int alt26=18;
                int LA26_0 = input.LA(1);

                if ( LA26_0 ==44 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 0) ) {
                    alt26=1;
                }
                else if ( LA26_0 ==38 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 1) ) {
                    alt26=2;
                }
                else if ( LA26_0 ==45 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 2) ) {
                    alt26=3;
                }
                else if ( LA26_0 ==47 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 3) ) {
                    alt26=4;
                }
                else if ( LA26_0 ==48 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 4) ) {
                    alt26=5;
                }
                else if ( LA26_0 ==49 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 5) ) {
                    alt26=6;
                }
                else if ( LA26_0 ==50 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 6) ) {
                    alt26=7;
                }
                else if ( LA26_0 ==51 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 7) ) {
                    alt26=8;
                }
                else if ( LA26_0 ==52 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 8) ) {
                    alt26=9;
                }
                else if ( LA26_0 ==53 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 9) ) {
                    alt26=10;
                }
                else if ( LA26_0 ==54 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 10) ) {
                    alt26=11;
                }
                else if ( LA26_0 ==55 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 11) ) {
                    alt26=12;
                }
                else if ( LA26_0 ==56 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 12) ) {
                    alt26=13;
                }
                else if ( LA26_0 ==57 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 13) ) {
                    alt26=14;
                }
                else if ( LA26_0 ==58 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 14) ) {
                    alt26=15;
                }
                else if ( LA26_0 ==59 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 15) ) {
                    alt26=16;
                }
                else if ( LA26_0 ==60 && getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 16) ) {
                    alt26=17;
                }


                switch (alt26) {
            	case 1 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2556:4: ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2556:4: ({...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2557:5: {...}? => ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 0) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 0)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2557:107: ( ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2558:6: ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 0);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2561:6: ({...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2561:7: {...}? => (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2561:16: (otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2561:18: otherlv_4= 'formatter' ( (otherlv_5= RULE_ID ) )
            	    {
            	    otherlv_4=(Token)match(input,44,FOLLOW_44_in_ruleMediaStyle5507); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_4, grammarAccess.getMediaStyleAccess().getFormatterKeyword_3_0_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2565:1: ( (otherlv_5= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2566:1: (otherlv_5= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2566:1: (otherlv_5= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2567:3: otherlv_5= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getMediaStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_5=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMediaStyle5527); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_5, grammarAccess.getMediaStyleAccess().getFormatSomeFormatCrossReference_3_0_1_0()); 
            	      	
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 2 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2585:4: ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2585:4: ({...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2586:5: {...}? => ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 1) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 1)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2586:107: ( ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2587:6: ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 1);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2590:6: ({...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2590:7: {...}? => (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2590:16: (otherlv_6= 'font' ( (otherlv_7= RULE_ID ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2590:18: otherlv_6= 'font' ( (otherlv_7= RULE_ID ) )
            	    {
            	    otherlv_6=(Token)match(input,38,FOLLOW_38_in_ruleMediaStyle5595); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_6, grammarAccess.getMediaStyleAccess().getFontKeyword_3_1_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2594:1: ( (otherlv_7= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2595:1: (otherlv_7= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2595:1: (otherlv_7= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2596:3: otherlv_7= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getMediaStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_7=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMediaStyle5615); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_7, grammarAccess.getMediaStyleAccess().getFontFontCrossReference_3_1_1_0()); 
            	      	
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 3 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2614:4: ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2614:4: ({...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2615:5: {...}? => ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 2) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 2)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2615:107: ( ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2616:6: ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 2);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2619:6: ({...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2619:7: {...}? => (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2619:16: (otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )? )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2619:18: otherlv_8= 'backgroundcolor' ( (otherlv_9= RULE_ID ) ) (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )?
            	    {
            	    otherlv_8=(Token)match(input,45,FOLLOW_45_in_ruleMediaStyle5683); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_8, grammarAccess.getMediaStyleAccess().getBackgroundcolorKeyword_3_2_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2623:1: ( (otherlv_9= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2624:1: (otherlv_9= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2624:1: (otherlv_9= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2625:3: otherlv_9= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getMediaStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_9=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMediaStyle5703); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_9, grammarAccess.getMediaStyleAccess().getBackgroundcolorColorCrossReference_3_2_1_0()); 
            	      	
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2636:2: (otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) ) )?
            	    int alt25=2;
            	    switch ( input.LA(1) ) {
            	        case 46:
            	            {
            	            alt25=1;
            	            }
            	            break;
            	    }

            	    switch (alt25) {
            	        case 1 :
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2636:4: otherlv_10= 'alternate' ( (otherlv_11= RULE_ID ) )
            	            {
            	            otherlv_10=(Token)match(input,46,FOLLOW_46_in_ruleMediaStyle5716); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	                  	newLeafNode(otherlv_10, grammarAccess.getMediaStyleAccess().getAlternateKeyword_3_2_2_0());
            	                  
            	            }
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2640:1: ( (otherlv_11= RULE_ID ) )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2641:1: (otherlv_11= RULE_ID )
            	            {
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2641:1: (otherlv_11= RULE_ID )
            	            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2642:3: otherlv_11= RULE_ID
            	            {
            	            if ( state.backtracking==0 ) {

            	              			if (current==null) {
            	              	            current = createModelElement(grammarAccess.getMediaStyleRule());
            	              	        }
            	                      
            	            }
            	            otherlv_11=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMediaStyle5736); if (state.failed) return current;
            	            if ( state.backtracking==0 ) {

            	              		newLeafNode(otherlv_11, grammarAccess.getMediaStyleAccess().getBackgroundcolor_alternateColorCrossReference_3_2_2_1_0()); 
            	              	
            	            }

            	            }


            	            }


            	            }
            	            break;

            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 4 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2660:4: ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2660:4: ({...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2661:5: {...}? => ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 3) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 3)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2661:107: ( ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2662:6: ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 3);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2665:6: ({...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2665:7: {...}? => (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2665:16: (otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2665:18: otherlv_12= 'textcolor' ( (otherlv_13= RULE_ID ) )
            	    {
            	    otherlv_12=(Token)match(input,47,FOLLOW_47_in_ruleMediaStyle5806); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_12, grammarAccess.getMediaStyleAccess().getTextcolorKeyword_3_3_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2669:1: ( (otherlv_13= RULE_ID ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2670:1: (otherlv_13= RULE_ID )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2670:1: (otherlv_13= RULE_ID )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2671:3: otherlv_13= RULE_ID
            	    {
            	    if ( state.backtracking==0 ) {

            	      			if (current==null) {
            	      	            current = createModelElement(grammarAccess.getMediaStyleRule());
            	      	        }
            	              
            	    }
            	    otherlv_13=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleMediaStyle5826); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	      		newLeafNode(otherlv_13, grammarAccess.getMediaStyleAccess().getTextcolorColorCrossReference_3_3_1_0()); 
            	      	
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 5 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2689:4: ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2689:4: ({...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2690:5: {...}? => ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 4) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 4)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2690:107: ( ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2691:6: ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 4);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2694:6: ({...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2694:7: {...}? => (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2694:16: (otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2694:18: otherlv_14= 'textalign' ( (lv_textalign_15_0= ruleTextAlignEnum ) )
            	    {
            	    otherlv_14=(Token)match(input,48,FOLLOW_48_in_ruleMediaStyle5894); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_14, grammarAccess.getMediaStyleAccess().getTextalignKeyword_3_4_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2698:1: ( (lv_textalign_15_0= ruleTextAlignEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2699:1: (lv_textalign_15_0= ruleTextAlignEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2699:1: (lv_textalign_15_0= ruleTextAlignEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2700:3: lv_textalign_15_0= ruleTextAlignEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getTextalignTextAlignEnumEnumRuleCall_3_4_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleTextAlignEnum_in_ruleMediaStyle5915);
            	    lv_textalign_15_0=ruleTextAlignEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"textalign",
            	              		lv_textalign_15_0, 
            	              		"TextAlignEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 6 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2723:4: ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2723:4: ({...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2724:5: {...}? => ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 5) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 5)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2724:107: ( ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2725:6: ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 5);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2728:6: ({...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2728:7: {...}? => (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2728:16: (otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2728:18: otherlv_16= 'border-top' ( (lv_borderTop_17_0= ruleBorderStyle ) )
            	    {
            	    otherlv_16=(Token)match(input,49,FOLLOW_49_in_ruleMediaStyle5983); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_16, grammarAccess.getMediaStyleAccess().getBorderTopKeyword_3_5_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2732:1: ( (lv_borderTop_17_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2733:1: (lv_borderTop_17_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2733:1: (lv_borderTop_17_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2734:3: lv_borderTop_17_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getBorderTopBorderStyleParserRuleCall_3_5_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleMediaStyle6004);
            	    lv_borderTop_17_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderTop",
            	              		lv_borderTop_17_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 7 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2757:4: ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2757:4: ({...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2758:5: {...}? => ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 6) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 6)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2758:107: ( ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2759:6: ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 6);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2762:6: ({...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2762:7: {...}? => (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2762:16: (otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2762:18: otherlv_18= 'border-bottom' ( (lv_borderBottom_19_0= ruleBorderStyle ) )
            	    {
            	    otherlv_18=(Token)match(input,50,FOLLOW_50_in_ruleMediaStyle6072); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_18, grammarAccess.getMediaStyleAccess().getBorderBottomKeyword_3_6_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2766:1: ( (lv_borderBottom_19_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2767:1: (lv_borderBottom_19_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2767:1: (lv_borderBottom_19_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2768:3: lv_borderBottom_19_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getBorderBottomBorderStyleParserRuleCall_3_6_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleMediaStyle6093);
            	    lv_borderBottom_19_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderBottom",
            	              		lv_borderBottom_19_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 8 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2791:4: ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2791:4: ({...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2792:5: {...}? => ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 7) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 7)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2792:107: ( ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2793:6: ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 7);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2796:6: ({...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2796:7: {...}? => (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2796:16: (otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2796:18: otherlv_20= 'border-left' ( (lv_borderLeft_21_0= ruleBorderStyle ) )
            	    {
            	    otherlv_20=(Token)match(input,51,FOLLOW_51_in_ruleMediaStyle6161); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_20, grammarAccess.getMediaStyleAccess().getBorderLeftKeyword_3_7_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2800:1: ( (lv_borderLeft_21_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2801:1: (lv_borderLeft_21_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2801:1: (lv_borderLeft_21_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2802:3: lv_borderLeft_21_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getBorderLeftBorderStyleParserRuleCall_3_7_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleMediaStyle6182);
            	    lv_borderLeft_21_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderLeft",
            	              		lv_borderLeft_21_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 9 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2825:4: ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2825:4: ({...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2826:5: {...}? => ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 8) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 8)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2826:107: ( ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2827:6: ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 8);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2830:6: ({...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2830:7: {...}? => (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2830:16: (otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2830:18: otherlv_22= 'border-right' ( (lv_borderRight_23_0= ruleBorderStyle ) )
            	    {
            	    otherlv_22=(Token)match(input,52,FOLLOW_52_in_ruleMediaStyle6250); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_22, grammarAccess.getMediaStyleAccess().getBorderRightKeyword_3_8_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2834:1: ( (lv_borderRight_23_0= ruleBorderStyle ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2835:1: (lv_borderRight_23_0= ruleBorderStyle )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2835:1: (lv_borderRight_23_0= ruleBorderStyle )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2836:3: lv_borderRight_23_0= ruleBorderStyle
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getBorderRightBorderStyleParserRuleCall_3_8_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleBorderStyle_in_ruleMediaStyle6271);
            	    lv_borderRight_23_0=ruleBorderStyle();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"borderRight",
            	              		lv_borderRight_23_0, 
            	              		"BorderStyle");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 10 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2859:4: ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2859:4: ({...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2860:5: {...}? => ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 9) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 9)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2860:107: ( ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2861:6: ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 9);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2864:6: ({...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2864:7: {...}? => (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2864:16: (otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2864:18: otherlv_24= 'padding-top' ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) ) ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) )
            	    {
            	    otherlv_24=(Token)match(input,53,FOLLOW_53_in_ruleMediaStyle6339); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_24, grammarAccess.getMediaStyleAccess().getPaddingTopKeyword_3_9_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2868:1: ( (lv_paddingTopValue_25_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2869:1: (lv_paddingTopValue_25_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2869:1: (lv_paddingTopValue_25_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2870:3: lv_paddingTopValue_25_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingTopValueUnsignedNumberParserRuleCall_3_9_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle6360);
            	    lv_paddingTopValue_25_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingTopValue",
            	              		lv_paddingTopValue_25_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2886:2: ( (lv_paddingTopUnit_26_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2887:1: (lv_paddingTopUnit_26_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2887:1: (lv_paddingTopUnit_26_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2888:3: lv_paddingTopUnit_26_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingTopUnitUnitEnumEnumRuleCall_3_9_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle6381);
            	    lv_paddingTopUnit_26_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingTopUnit",
            	              		lv_paddingTopUnit_26_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 11 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2911:4: ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2911:4: ({...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2912:5: {...}? => ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 10) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 10)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2912:108: ( ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2913:6: ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 10);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2916:6: ({...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2916:7: {...}? => (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2916:16: (otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2916:18: otherlv_27= 'padding-bottom' ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) ) ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) )
            	    {
            	    otherlv_27=(Token)match(input,54,FOLLOW_54_in_ruleMediaStyle6449); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_27, grammarAccess.getMediaStyleAccess().getPaddingBottomKeyword_3_10_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2920:1: ( (lv_paddingBottomValue_28_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2921:1: (lv_paddingBottomValue_28_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2921:1: (lv_paddingBottomValue_28_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2922:3: lv_paddingBottomValue_28_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingBottomValueUnsignedNumberParserRuleCall_3_10_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle6470);
            	    lv_paddingBottomValue_28_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingBottomValue",
            	              		lv_paddingBottomValue_28_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2938:2: ( (lv_paddingBottomUnit_29_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2939:1: (lv_paddingBottomUnit_29_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2939:1: (lv_paddingBottomUnit_29_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2940:3: lv_paddingBottomUnit_29_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingBottomUnitUnitEnumEnumRuleCall_3_10_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle6491);
            	    lv_paddingBottomUnit_29_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingBottomUnit",
            	              		lv_paddingBottomUnit_29_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 12 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2963:4: ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2963:4: ({...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2964:5: {...}? => ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 11) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 11)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2964:108: ( ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2965:6: ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 11);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2968:6: ({...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2968:7: {...}? => (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2968:16: (otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2968:18: otherlv_30= 'padding-left' ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) ) ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) )
            	    {
            	    otherlv_30=(Token)match(input,55,FOLLOW_55_in_ruleMediaStyle6559); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_30, grammarAccess.getMediaStyleAccess().getPaddingLeftKeyword_3_11_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2972:1: ( (lv_paddingLeftValue_31_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2973:1: (lv_paddingLeftValue_31_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2973:1: (lv_paddingLeftValue_31_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2974:3: lv_paddingLeftValue_31_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingLeftValueUnsignedNumberParserRuleCall_3_11_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle6580);
            	    lv_paddingLeftValue_31_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingLeftValue",
            	              		lv_paddingLeftValue_31_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2990:2: ( (lv_paddingLeftUnit_32_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2991:1: (lv_paddingLeftUnit_32_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2991:1: (lv_paddingLeftUnit_32_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:2992:3: lv_paddingLeftUnit_32_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingLeftUnitUnitEnumEnumRuleCall_3_11_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle6601);
            	    lv_paddingLeftUnit_32_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingLeftUnit",
            	              		lv_paddingLeftUnit_32_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 13 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3015:4: ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3015:4: ({...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3016:5: {...}? => ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 12) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 12)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3016:108: ( ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3017:6: ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 12);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3020:6: ({...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3020:7: {...}? => (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3020:16: (otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3020:18: otherlv_33= 'padding-right' ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) ) ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) )
            	    {
            	    otherlv_33=(Token)match(input,56,FOLLOW_56_in_ruleMediaStyle6669); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_33, grammarAccess.getMediaStyleAccess().getPaddingRightKeyword_3_12_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3024:1: ( (lv_paddingRightValue_34_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3025:1: (lv_paddingRightValue_34_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3025:1: (lv_paddingRightValue_34_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3026:3: lv_paddingRightValue_34_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingRightValueUnsignedNumberParserRuleCall_3_12_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle6690);
            	    lv_paddingRightValue_34_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingRightValue",
            	              		lv_paddingRightValue_34_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3042:2: ( (lv_paddingRightUnit_35_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3043:1: (lv_paddingRightUnit_35_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3043:1: (lv_paddingRightUnit_35_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3044:3: lv_paddingRightUnit_35_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getPaddingRightUnitUnitEnumEnumRuleCall_3_12_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle6711);
            	    lv_paddingRightUnit_35_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"paddingRightUnit",
            	              		lv_paddingRightUnit_35_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 14 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3067:4: ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3067:4: ({...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3068:5: {...}? => ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 13) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 13)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3068:108: ( ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3069:6: ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 13);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3072:6: ({...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3072:7: {...}? => (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3072:16: (otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3072:18: otherlv_36= 'margin-top' ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) ) ( (lv_marginTopUnit_38_0= ruleUnitEnum ) )
            	    {
            	    otherlv_36=(Token)match(input,57,FOLLOW_57_in_ruleMediaStyle6779); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_36, grammarAccess.getMediaStyleAccess().getMarginTopKeyword_3_13_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3076:1: ( (lv_marginTopValue_37_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3077:1: (lv_marginTopValue_37_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3077:1: (lv_marginTopValue_37_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3078:3: lv_marginTopValue_37_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginTopValueUnsignedNumberParserRuleCall_3_13_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle6800);
            	    lv_marginTopValue_37_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginTopValue",
            	              		lv_marginTopValue_37_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3094:2: ( (lv_marginTopUnit_38_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3095:1: (lv_marginTopUnit_38_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3095:1: (lv_marginTopUnit_38_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3096:3: lv_marginTopUnit_38_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginTopUnitUnitEnumEnumRuleCall_3_13_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle6821);
            	    lv_marginTopUnit_38_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginTopUnit",
            	              		lv_marginTopUnit_38_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 15 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3119:4: ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3119:4: ({...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3120:5: {...}? => ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 14) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 14)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3120:108: ( ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3121:6: ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 14);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3124:6: ({...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3124:7: {...}? => (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3124:16: (otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3124:18: otherlv_39= 'margin-bottom' ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) ) ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) )
            	    {
            	    otherlv_39=(Token)match(input,58,FOLLOW_58_in_ruleMediaStyle6889); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_39, grammarAccess.getMediaStyleAccess().getMarginBottomKeyword_3_14_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3128:1: ( (lv_marginBottomValue_40_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3129:1: (lv_marginBottomValue_40_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3129:1: (lv_marginBottomValue_40_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3130:3: lv_marginBottomValue_40_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginBottomValueUnsignedNumberParserRuleCall_3_14_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle6910);
            	    lv_marginBottomValue_40_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginBottomValue",
            	              		lv_marginBottomValue_40_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3146:2: ( (lv_marginBottomUnit_41_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3147:1: (lv_marginBottomUnit_41_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3147:1: (lv_marginBottomUnit_41_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3148:3: lv_marginBottomUnit_41_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginBottomUnitUnitEnumEnumRuleCall_3_14_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle6931);
            	    lv_marginBottomUnit_41_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginBottomUnit",
            	              		lv_marginBottomUnit_41_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 16 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3171:4: ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3171:4: ({...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3172:5: {...}? => ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 15) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 15)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3172:108: ( ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3173:6: ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 15);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3176:6: ({...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3176:7: {...}? => (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3176:16: (otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3176:18: otherlv_42= 'margin-left' ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) ) ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) )
            	    {
            	    otherlv_42=(Token)match(input,59,FOLLOW_59_in_ruleMediaStyle6999); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_42, grammarAccess.getMediaStyleAccess().getMarginLeftKeyword_3_15_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3180:1: ( (lv_marginLeftValue_43_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3181:1: (lv_marginLeftValue_43_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3181:1: (lv_marginLeftValue_43_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3182:3: lv_marginLeftValue_43_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginLeftValueUnsignedNumberParserRuleCall_3_15_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle7020);
            	    lv_marginLeftValue_43_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginLeftValue",
            	              		lv_marginLeftValue_43_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3198:2: ( (lv_marginLeftUnit_44_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3199:1: (lv_marginLeftUnit_44_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3199:1: (lv_marginLeftUnit_44_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3200:3: lv_marginLeftUnit_44_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginLeftUnitUnitEnumEnumRuleCall_3_15_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle7041);
            	    lv_marginLeftUnit_44_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginLeftUnit",
            	              		lv_marginLeftUnit_44_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;
            	case 17 :
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3223:4: ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3223:4: ({...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3224:5: {...}? => ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) )
            	    {
            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 16) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "getUnorderedGroupHelper().canSelect(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 16)");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3224:108: ( ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3225:6: ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) )
            	    {
            	    getUnorderedGroupHelper().select(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3(), 16);
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3228:6: ({...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3228:7: {...}? => (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) )
            	    {
            	    if ( !((true)) ) {
            	        if (state.backtracking>0) {state.failed=true; return current;}
            	        throw new FailedPredicateException(input, "ruleMediaStyle", "true");
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3228:16: (otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3228:18: otherlv_45= 'margin-right' ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) ) ( (lv_marginRightUnit_47_0= ruleUnitEnum ) )
            	    {
            	    otherlv_45=(Token)match(input,60,FOLLOW_60_in_ruleMediaStyle7109); if (state.failed) return current;
            	    if ( state.backtracking==0 ) {

            	          	newLeafNode(otherlv_45, grammarAccess.getMediaStyleAccess().getMarginRightKeyword_3_16_0());
            	          
            	    }
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3232:1: ( (lv_marginRightValue_46_0= ruleUnsignedNumber ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3233:1: (lv_marginRightValue_46_0= ruleUnsignedNumber )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3233:1: (lv_marginRightValue_46_0= ruleUnsignedNumber )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3234:3: lv_marginRightValue_46_0= ruleUnsignedNumber
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginRightValueUnsignedNumberParserRuleCall_3_16_1_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnsignedNumber_in_ruleMediaStyle7130);
            	    lv_marginRightValue_46_0=ruleUnsignedNumber();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginRightValue",
            	              		lv_marginRightValue_46_0, 
            	              		"UnsignedNumber");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }

            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3250:2: ( (lv_marginRightUnit_47_0= ruleUnitEnum ) )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3251:1: (lv_marginRightUnit_47_0= ruleUnitEnum )
            	    {
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3251:1: (lv_marginRightUnit_47_0= ruleUnitEnum )
            	    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3252:3: lv_marginRightUnit_47_0= ruleUnitEnum
            	    {
            	    if ( state.backtracking==0 ) {
            	       
            	      	        newCompositeNode(grammarAccess.getMediaStyleAccess().getMarginRightUnitUnitEnumEnumRuleCall_3_16_2_0()); 
            	      	    
            	    }
            	    pushFollow(FOLLOW_ruleUnitEnum_in_ruleMediaStyle7151);
            	    lv_marginRightUnit_47_0=ruleUnitEnum();

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

            	      	        if (current==null) {
            	      	            current = createModelElementForParent(grammarAccess.getMediaStyleRule());
            	      	        }
            	             		set(
            	             			current, 
            	             			"marginRightUnit",
            	              		lv_marginRightUnit_47_0, 
            	              		"UnitEnum");
            	      	        afterParserOrEnumRuleCall();
            	      	    
            	    }

            	    }


            	    }


            	    }


            	    }

            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            	    }


            	    }


            	    }
            	    break;

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


            }


            }

            getUnorderedGroupHelper().leave(grammarAccess.getMediaStyleAccess().getUnorderedGroup_3());

            }

            otherlv_48=(Token)match(input,18,FOLLOW_18_in_ruleMediaStyle7204); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_48, grammarAccess.getMediaStyleAccess().getRightCurlyBracketKeyword_4());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleMediaStyle"


    // $ANTLR start "entryRuleSomeFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3294:1: entryRuleSomeFormat returns [EObject current=null] : iv_ruleSomeFormat= ruleSomeFormat EOF ;
    public final EObject entryRuleSomeFormat() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleSomeFormat = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3295:2: (iv_ruleSomeFormat= ruleSomeFormat EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3296:2: iv_ruleSomeFormat= ruleSomeFormat EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getSomeFormatRule()); 
            }
            pushFollow(FOLLOW_ruleSomeFormat_in_entryRuleSomeFormat7240);
            iv_ruleSomeFormat=ruleSomeFormat();

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

            }

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


    // $ANTLR start "ruleSomeFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3303:1: ruleSomeFormat returns [EObject current=null] : (this_UomoFormat_0= ruleUomoFormat | this_NumberFormat_1= ruleNumberFormat | this_CurrencyFormat_2= ruleCurrencyFormat | this_DateFormat_3= ruleDateFormat | this_DateTimeFormat_4= ruleDateTimeFormat | this_TimeFormat_5= ruleTimeFormat ) ;
    public final EObject ruleSomeFormat() throws RecognitionException {
        EObject current = null;

        EObject this_UomoFormat_0 = null;

        EObject this_NumberFormat_1 = null;

        EObject this_CurrencyFormat_2 = null;

        EObject this_DateFormat_3 = null;

        EObject this_DateTimeFormat_4 = null;

        EObject this_TimeFormat_5 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3306:28: ( (this_UomoFormat_0= ruleUomoFormat | this_NumberFormat_1= ruleNumberFormat | this_CurrencyFormat_2= ruleCurrencyFormat | this_DateFormat_3= ruleDateFormat | this_DateTimeFormat_4= ruleDateTimeFormat | this_TimeFormat_5= ruleTimeFormat ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3307:1: (this_UomoFormat_0= ruleUomoFormat | this_NumberFormat_1= ruleNumberFormat | this_CurrencyFormat_2= ruleCurrencyFormat | this_DateFormat_3= ruleDateFormat | this_DateTimeFormat_4= ruleDateTimeFormat | this_TimeFormat_5= ruleTimeFormat )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3307:1: (this_UomoFormat_0= ruleUomoFormat | this_NumberFormat_1= ruleNumberFormat | this_CurrencyFormat_2= ruleCurrencyFormat | this_DateFormat_3= ruleDateFormat | this_DateTimeFormat_4= ruleDateTimeFormat | this_TimeFormat_5= ruleTimeFormat )
            int alt27=6;
            switch ( input.LA(1) ) {
            case 61:
                {
                alt27=1;
                }
                break;
            case 64:
                {
                alt27=2;
                }
                break;
            case 65:
                {
                alt27=3;
                }
                break;
            case 66:
                {
                alt27=4;
                }
                break;
            case 67:
                {
                alt27=5;
                }
                break;
            case 68:
                {
                alt27=6;
                }
                break;
            default:
                if (state.backtracking>0) {state.failed=true; return current;}
                NoViableAltException nvae =
                    new NoViableAltException("", 27, 0, input);

                throw nvae;
            }

            switch (alt27) {
                case 1 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3308:5: this_UomoFormat_0= ruleUomoFormat
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getSomeFormatAccess().getUomoFormatParserRuleCall_0()); 
                          
                    }
                    pushFollow(FOLLOW_ruleUomoFormat_in_ruleSomeFormat7297);
                    this_UomoFormat_0=ruleUomoFormat();

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

                    }
                    break;
                case 2 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3318:5: this_NumberFormat_1= ruleNumberFormat
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getSomeFormatAccess().getNumberFormatParserRuleCall_1()); 
                          
                    }
                    pushFollow(FOLLOW_ruleNumberFormat_in_ruleSomeFormat7324);
                    this_NumberFormat_1=ruleNumberFormat();

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

                    }
                    break;
                case 3 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3328:5: this_CurrencyFormat_2= ruleCurrencyFormat
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getSomeFormatAccess().getCurrencyFormatParserRuleCall_2()); 
                          
                    }
                    pushFollow(FOLLOW_ruleCurrencyFormat_in_ruleSomeFormat7351);
                    this_CurrencyFormat_2=ruleCurrencyFormat();

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

                    }
                    break;
                case 4 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3338:5: this_DateFormat_3= ruleDateFormat
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getSomeFormatAccess().getDateFormatParserRuleCall_3()); 
                          
                    }
                    pushFollow(FOLLOW_ruleDateFormat_in_ruleSomeFormat7378);
                    this_DateFormat_3=ruleDateFormat();

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

                    }
                    break;
                case 5 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3348:5: this_DateTimeFormat_4= ruleDateTimeFormat
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getSomeFormatAccess().getDateTimeFormatParserRuleCall_4()); 
                          
                    }
                    pushFollow(FOLLOW_ruleDateTimeFormat_in_ruleSomeFormat7405);
                    this_DateTimeFormat_4=ruleDateTimeFormat();

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

                    }
                    break;
                case 6 :
                    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3358:5: this_TimeFormat_5= ruleTimeFormat
                    {
                    if ( state.backtracking==0 ) {
                       
                              newCompositeNode(grammarAccess.getSomeFormatAccess().getTimeFormatParserRuleCall_5()); 
                          
                    }
                    pushFollow(FOLLOW_ruleTimeFormat_in_ruleSomeFormat7432);
                    this_TimeFormat_5=ruleTimeFormat();

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

                    }
                    break;

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleSomeFormat"


    // $ANTLR start "entryRuleUomoFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3374:1: entryRuleUomoFormat returns [EObject current=null] : iv_ruleUomoFormat= ruleUomoFormat EOF ;
    public final EObject entryRuleUomoFormat() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleUomoFormat = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3375:2: (iv_ruleUomoFormat= ruleUomoFormat EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3376:2: iv_ruleUomoFormat= ruleUomoFormat EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getUomoFormatRule()); 
            }
            pushFollow(FOLLOW_ruleUomoFormat_in_entryRuleUomoFormat7467);
            iv_ruleUomoFormat=ruleUomoFormat();

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

            }

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


    // $ANTLR start "ruleUomoFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3383:1: ruleUomoFormat returns [EObject current=null] : (otherlv_0= 'uomo' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_pattern_6_0= RULE_STRING ) ) otherlv_7= 'textalign' ( (lv_textalign_8_0= ruleTextAlignEnum ) ) otherlv_9= '}' ) ;
    public final EObject ruleUomoFormat() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token lv_ui_pattern_4_0=null;
        Token otherlv_5=null;
        Token lv_report_pattern_6_0=null;
        Token otherlv_7=null;
        Token otherlv_9=null;
        Enumerator lv_textalign_8_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3386:28: ( (otherlv_0= 'uomo' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_pattern_6_0= RULE_STRING ) ) otherlv_7= 'textalign' ( (lv_textalign_8_0= ruleTextAlignEnum ) ) otherlv_9= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3387:1: (otherlv_0= 'uomo' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_pattern_6_0= RULE_STRING ) ) otherlv_7= 'textalign' ( (lv_textalign_8_0= ruleTextAlignEnum ) ) otherlv_9= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3387:1: (otherlv_0= 'uomo' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_pattern_6_0= RULE_STRING ) ) otherlv_7= 'textalign' ( (lv_textalign_8_0= ruleTextAlignEnum ) ) otherlv_9= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3387:3: otherlv_0= 'uomo' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_pattern_6_0= RULE_STRING ) ) otherlv_7= 'textalign' ( (lv_textalign_8_0= ruleTextAlignEnum ) ) otherlv_9= '}'
            {
            otherlv_0=(Token)match(input,61,FOLLOW_61_in_ruleUomoFormat7514); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getUomoFormatAccess().getUomoKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3391:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3392:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3392:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3393:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleUomoFormat7531); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getUomoFormatAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getUomoFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleUomoFormat7548); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getUomoFormatAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            otherlv_3=(Token)match(input,62,FOLLOW_62_in_ruleUomoFormat7560); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getUomoFormatAccess().getUiKeyword_3());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3417:1: ( (lv_ui_pattern_4_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3418:1: (lv_ui_pattern_4_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3418:1: (lv_ui_pattern_4_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3419:3: lv_ui_pattern_4_0= RULE_STRING
            {
            lv_ui_pattern_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleUomoFormat7577); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_ui_pattern_4_0, grammarAccess.getUomoFormatAccess().getUi_patternSTRINGTerminalRuleCall_4_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getUomoFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"ui_pattern",
                      		lv_ui_pattern_4_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_5=(Token)match(input,63,FOLLOW_63_in_ruleUomoFormat7594); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getUomoFormatAccess().getReportKeyword_5());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3439:1: ( (lv_report_pattern_6_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3440:1: (lv_report_pattern_6_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3440:1: (lv_report_pattern_6_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3441:3: lv_report_pattern_6_0= RULE_STRING
            {
            lv_report_pattern_6_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleUomoFormat7611); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_report_pattern_6_0, grammarAccess.getUomoFormatAccess().getReport_patternSTRINGTerminalRuleCall_6_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getUomoFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"report_pattern",
                      		lv_report_pattern_6_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_7=(Token)match(input,48,FOLLOW_48_in_ruleUomoFormat7628); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_7, grammarAccess.getUomoFormatAccess().getTextalignKeyword_7());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3461:1: ( (lv_textalign_8_0= ruleTextAlignEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3462:1: (lv_textalign_8_0= ruleTextAlignEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3462:1: (lv_textalign_8_0= ruleTextAlignEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3463:3: lv_textalign_8_0= ruleTextAlignEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getUomoFormatAccess().getTextalignTextAlignEnumEnumRuleCall_8_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleTextAlignEnum_in_ruleUomoFormat7649);
            lv_textalign_8_0=ruleTextAlignEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getUomoFormatRule());
              	        }
                     		set(
                     			current, 
                     			"textalign",
                      		lv_textalign_8_0, 
                      		"TextAlignEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_9=(Token)match(input,18,FOLLOW_18_in_ruleUomoFormat7661); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_9, grammarAccess.getUomoFormatAccess().getRightCurlyBracketKeyword_9());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleUomoFormat"


    // $ANTLR start "entryRuleNumberFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3491:1: entryRuleNumberFormat returns [EObject current=null] : iv_ruleNumberFormat= ruleNumberFormat EOF ;
    public final EObject entryRuleNumberFormat() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleNumberFormat = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3492:2: (iv_ruleNumberFormat= ruleNumberFormat EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3493:2: iv_ruleNumberFormat= ruleNumberFormat EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getNumberFormatRule()); 
            }
            pushFollow(FOLLOW_ruleNumberFormat_in_entryRuleNumberFormat7697);
            iv_ruleNumberFormat=ruleNumberFormat();

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

            }

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


    // $ANTLR start "ruleNumberFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3500:1: ruleNumberFormat returns [EObject current=null] : (otherlv_0= 'number' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleNumberFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' ) ;
    public final EObject ruleNumberFormat() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token lv_ui_pattern_4_0=null;
        Token otherlv_5=null;
        Token lv_report_pattern_7_0=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Enumerator lv_report_category_6_0 = null;

        Enumerator lv_textalign_9_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3503:28: ( (otherlv_0= 'number' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleNumberFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3504:1: (otherlv_0= 'number' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleNumberFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3504:1: (otherlv_0= 'number' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleNumberFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3504:3: otherlv_0= 'number' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleNumberFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}'
            {
            otherlv_0=(Token)match(input,64,FOLLOW_64_in_ruleNumberFormat7744); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getNumberFormatAccess().getNumberKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3508:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3509:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3509:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3510:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleNumberFormat7761); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getNumberFormatAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getNumberFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleNumberFormat7778); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getNumberFormatAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            otherlv_3=(Token)match(input,62,FOLLOW_62_in_ruleNumberFormat7790); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getNumberFormatAccess().getUiKeyword_3());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3534:1: ( (lv_ui_pattern_4_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3535:1: (lv_ui_pattern_4_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3535:1: (lv_ui_pattern_4_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3536:3: lv_ui_pattern_4_0= RULE_STRING
            {
            lv_ui_pattern_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleNumberFormat7807); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_ui_pattern_4_0, grammarAccess.getNumberFormatAccess().getUi_patternSTRINGTerminalRuleCall_4_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getNumberFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"ui_pattern",
                      		lv_ui_pattern_4_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_5=(Token)match(input,63,FOLLOW_63_in_ruleNumberFormat7824); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getNumberFormatAccess().getReportKeyword_5());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3556:1: ( (lv_report_category_6_0= ruleNumberFormatCategoryEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3557:1: (lv_report_category_6_0= ruleNumberFormatCategoryEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3557:1: (lv_report_category_6_0= ruleNumberFormatCategoryEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3558:3: lv_report_category_6_0= ruleNumberFormatCategoryEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getNumberFormatAccess().getReport_categoryNumberFormatCategoryEnumEnumRuleCall_6_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleNumberFormatCategoryEnum_in_ruleNumberFormat7845);
            lv_report_category_6_0=ruleNumberFormatCategoryEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNumberFormatRule());
              	        }
                     		set(
                     			current, 
                     			"report_category",
                      		lv_report_category_6_0, 
                      		"NumberFormatCategoryEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3574:2: ( (lv_report_pattern_7_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3575:1: (lv_report_pattern_7_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3575:1: (lv_report_pattern_7_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3576:3: lv_report_pattern_7_0= RULE_STRING
            {
            lv_report_pattern_7_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleNumberFormat7862); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_report_pattern_7_0, grammarAccess.getNumberFormatAccess().getReport_patternSTRINGTerminalRuleCall_7_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getNumberFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"report_pattern",
                      		lv_report_pattern_7_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_8=(Token)match(input,48,FOLLOW_48_in_ruleNumberFormat7879); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_8, grammarAccess.getNumberFormatAccess().getTextalignKeyword_8());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3596:1: ( (lv_textalign_9_0= ruleTextAlignEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3597:1: (lv_textalign_9_0= ruleTextAlignEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3597:1: (lv_textalign_9_0= ruleTextAlignEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3598:3: lv_textalign_9_0= ruleTextAlignEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getNumberFormatAccess().getTextalignTextAlignEnumEnumRuleCall_9_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleTextAlignEnum_in_ruleNumberFormat7900);
            lv_textalign_9_0=ruleTextAlignEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getNumberFormatRule());
              	        }
                     		set(
                     			current, 
                     			"textalign",
                      		lv_textalign_9_0, 
                      		"TextAlignEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_10=(Token)match(input,18,FOLLOW_18_in_ruleNumberFormat7912); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_10, grammarAccess.getNumberFormatAccess().getRightCurlyBracketKeyword_10());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleNumberFormat"


    // $ANTLR start "entryRuleCurrencyFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3626:1: entryRuleCurrencyFormat returns [EObject current=null] : iv_ruleCurrencyFormat= ruleCurrencyFormat EOF ;
    public final EObject entryRuleCurrencyFormat() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleCurrencyFormat = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3627:2: (iv_ruleCurrencyFormat= ruleCurrencyFormat EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3628:2: iv_ruleCurrencyFormat= ruleCurrencyFormat EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getCurrencyFormatRule()); 
            }
            pushFollow(FOLLOW_ruleCurrencyFormat_in_entryRuleCurrencyFormat7948);
            iv_ruleCurrencyFormat=ruleCurrencyFormat();

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

            }

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


    // $ANTLR start "ruleCurrencyFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3635:1: ruleCurrencyFormat returns [EObject current=null] : (otherlv_0= 'currency' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' ) ;
    public final EObject ruleCurrencyFormat() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token lv_ui_pattern_4_0=null;
        Token otherlv_5=null;
        Token lv_report_pattern_7_0=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Enumerator lv_report_category_6_0 = null;

        Enumerator lv_textalign_9_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3638:28: ( (otherlv_0= 'currency' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3639:1: (otherlv_0= 'currency' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3639:1: (otherlv_0= 'currency' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3639:3: otherlv_0= 'currency' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}'
            {
            otherlv_0=(Token)match(input,65,FOLLOW_65_in_ruleCurrencyFormat7995); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getCurrencyFormatAccess().getCurrencyKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3643:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3644:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3644:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3645:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleCurrencyFormat8012); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getCurrencyFormatAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getCurrencyFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleCurrencyFormat8029); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getCurrencyFormatAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            otherlv_3=(Token)match(input,62,FOLLOW_62_in_ruleCurrencyFormat8041); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getCurrencyFormatAccess().getUiKeyword_3());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3669:1: ( (lv_ui_pattern_4_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3670:1: (lv_ui_pattern_4_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3670:1: (lv_ui_pattern_4_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3671:3: lv_ui_pattern_4_0= RULE_STRING
            {
            lv_ui_pattern_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleCurrencyFormat8058); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_ui_pattern_4_0, grammarAccess.getCurrencyFormatAccess().getUi_patternSTRINGTerminalRuleCall_4_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getCurrencyFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"ui_pattern",
                      		lv_ui_pattern_4_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_5=(Token)match(input,63,FOLLOW_63_in_ruleCurrencyFormat8075); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getCurrencyFormatAccess().getReportKeyword_5());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3691:1: ( (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3692:1: (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3692:1: (lv_report_category_6_0= ruleCurrencyFormatCategoryEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3693:3: lv_report_category_6_0= ruleCurrencyFormatCategoryEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getCurrencyFormatAccess().getReport_categoryCurrencyFormatCategoryEnumEnumRuleCall_6_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleCurrencyFormatCategoryEnum_in_ruleCurrencyFormat8096);
            lv_report_category_6_0=ruleCurrencyFormatCategoryEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCurrencyFormatRule());
              	        }
                     		set(
                     			current, 
                     			"report_category",
                      		lv_report_category_6_0, 
                      		"CurrencyFormatCategoryEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3709:2: ( (lv_report_pattern_7_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3710:1: (lv_report_pattern_7_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3710:1: (lv_report_pattern_7_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3711:3: lv_report_pattern_7_0= RULE_STRING
            {
            lv_report_pattern_7_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleCurrencyFormat8113); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_report_pattern_7_0, grammarAccess.getCurrencyFormatAccess().getReport_patternSTRINGTerminalRuleCall_7_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getCurrencyFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"report_pattern",
                      		lv_report_pattern_7_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_8=(Token)match(input,48,FOLLOW_48_in_ruleCurrencyFormat8130); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_8, grammarAccess.getCurrencyFormatAccess().getTextalignKeyword_8());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3731:1: ( (lv_textalign_9_0= ruleTextAlignEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3732:1: (lv_textalign_9_0= ruleTextAlignEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3732:1: (lv_textalign_9_0= ruleTextAlignEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3733:3: lv_textalign_9_0= ruleTextAlignEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getCurrencyFormatAccess().getTextalignTextAlignEnumEnumRuleCall_9_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleTextAlignEnum_in_ruleCurrencyFormat8151);
            lv_textalign_9_0=ruleTextAlignEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getCurrencyFormatRule());
              	        }
                     		set(
                     			current, 
                     			"textalign",
                      		lv_textalign_9_0, 
                      		"TextAlignEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            otherlv_10=(Token)match(input,18,FOLLOW_18_in_ruleCurrencyFormat8163); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_10, grammarAccess.getCurrencyFormatAccess().getRightCurlyBracketKeyword_10());
                  
            }

            }


            }

            if ( state.backtracking==0 ) {
               leaveRule(); 
            }
        }
         
            catch (RecognitionException re) { 
                recover(input,re); 
                appendSkippedTokens();
            } 
        finally {
        }
        return current;
    }
    // $ANTLR end "ruleCurrencyFormat"


    // $ANTLR start "entryRuleDateFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3761:1: entryRuleDateFormat returns [EObject current=null] : iv_ruleDateFormat= ruleDateFormat EOF ;
    public final EObject entryRuleDateFormat() throws RecognitionException {
        EObject current = null;

        EObject iv_ruleDateFormat = null;


        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3762:2: (iv_ruleDateFormat= ruleDateFormat EOF )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3763:2: iv_ruleDateFormat= ruleDateFormat EOF
            {
            if ( state.backtracking==0 ) {
               newCompositeNode(grammarAccess.getDateFormatRule()); 
            }
            pushFollow(FOLLOW_ruleDateFormat_in_entryRuleDateFormat8199);
            iv_ruleDateFormat=ruleDateFormat();

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

            }

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


    // $ANTLR start "ruleDateFormat"
    // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3770:1: ruleDateFormat returns [EObject current=null] : (otherlv_0= 'date' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleDateFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' ) ;
    public final EObject ruleDateFormat() throws RecognitionException {
        EObject current = null;

        Token otherlv_0=null;
        Token lv_name_1_0=null;
        Token otherlv_2=null;
        Token otherlv_3=null;
        Token lv_ui_pattern_4_0=null;
        Token otherlv_5=null;
        Token lv_report_pattern_7_0=null;
        Token otherlv_8=null;
        Token otherlv_10=null;
        Enumerator lv_report_category_6_0 = null;

        Enumerator lv_textalign_9_0 = null;


         enterRule(); 
            
        try {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3773:28: ( (otherlv_0= 'date' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleDateFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3774:1: (otherlv_0= 'date' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleDateFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3774:1: (otherlv_0= 'date' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleDateFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}' )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3774:3: otherlv_0= 'date' ( (lv_name_1_0= RULE_ID ) ) otherlv_2= '{' otherlv_3= 'ui' ( (lv_ui_pattern_4_0= RULE_STRING ) ) otherlv_5= 'report' ( (lv_report_category_6_0= ruleDateFormatCategoryEnum ) ) ( (lv_report_pattern_7_0= RULE_STRING ) ) otherlv_8= 'textalign' ( (lv_textalign_9_0= ruleTextAlignEnum ) ) otherlv_10= '}'
            {
            otherlv_0=(Token)match(input,66,FOLLOW_66_in_ruleDateFormat8246); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_0, grammarAccess.getDateFormatAccess().getDateKeyword_0());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3778:1: ( (lv_name_1_0= RULE_ID ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3779:1: (lv_name_1_0= RULE_ID )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3779:1: (lv_name_1_0= RULE_ID )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3780:3: lv_name_1_0= RULE_ID
            {
            lv_name_1_0=(Token)match(input,RULE_ID,FOLLOW_RULE_ID_in_ruleDateFormat8263); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_name_1_0, grammarAccess.getDateFormatAccess().getNameIDTerminalRuleCall_1_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getDateFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"name",
                      		lv_name_1_0, 
                      		"ID");
              	    
            }

            }


            }

            otherlv_2=(Token)match(input,14,FOLLOW_14_in_ruleDateFormat8280); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_2, grammarAccess.getDateFormatAccess().getLeftCurlyBracketKeyword_2());
                  
            }
            otherlv_3=(Token)match(input,62,FOLLOW_62_in_ruleDateFormat8292); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_3, grammarAccess.getDateFormatAccess().getUiKeyword_3());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3804:1: ( (lv_ui_pattern_4_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3805:1: (lv_ui_pattern_4_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3805:1: (lv_ui_pattern_4_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3806:3: lv_ui_pattern_4_0= RULE_STRING
            {
            lv_ui_pattern_4_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleDateFormat8309); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_ui_pattern_4_0, grammarAccess.getDateFormatAccess().getUi_patternSTRINGTerminalRuleCall_4_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getDateFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"ui_pattern",
                      		lv_ui_pattern_4_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_5=(Token)match(input,63,FOLLOW_63_in_ruleDateFormat8326); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_5, grammarAccess.getDateFormatAccess().getReportKeyword_5());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3826:1: ( (lv_report_category_6_0= ruleDateFormatCategoryEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3827:1: (lv_report_category_6_0= ruleDateFormatCategoryEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3827:1: (lv_report_category_6_0= ruleDateFormatCategoryEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3828:3: lv_report_category_6_0= ruleDateFormatCategoryEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDateFormatAccess().getReport_categoryDateFormatCategoryEnumEnumRuleCall_6_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleDateFormatCategoryEnum_in_ruleDateFormat8347);
            lv_report_category_6_0=ruleDateFormatCategoryEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getDateFormatRule());
              	        }
                     		set(
                     			current, 
                     			"report_category",
                      		lv_report_category_6_0, 
                      		"DateFormatCategoryEnum");
              	        afterParserOrEnumRuleCall();
              	    
            }

            }


            }

            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3844:2: ( (lv_report_pattern_7_0= RULE_STRING ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3845:1: (lv_report_pattern_7_0= RULE_STRING )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3845:1: (lv_report_pattern_7_0= RULE_STRING )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3846:3: lv_report_pattern_7_0= RULE_STRING
            {
            lv_report_pattern_7_0=(Token)match(input,RULE_STRING,FOLLOW_RULE_STRING_in_ruleDateFormat8364); if (state.failed) return current;
            if ( state.backtracking==0 ) {

              			newLeafNode(lv_report_pattern_7_0, grammarAccess.getDateFormatAccess().getReport_patternSTRINGTerminalRuleCall_7_0()); 
              		
            }
            if ( state.backtracking==0 ) {

              	        if (current==null) {
              	            current = createModelElement(grammarAccess.getDateFormatRule());
              	        }
                     		setWithLastConsumed(
                     			current, 
                     			"report_pattern",
                      		lv_report_pattern_7_0, 
                      		"STRING");
              	    
            }

            }


            }

            otherlv_8=(Token)match(input,48,FOLLOW_48_in_ruleDateFormat8381); if (state.failed) return current;
            if ( state.backtracking==0 ) {

                  	newLeafNode(otherlv_8, grammarAccess.getDateFormatAccess().getTextalignKeyword_8());
                  
            }
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3866:1: ( (lv_textalign_9_0= ruleTextAlignEnum ) )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3867:1: (lv_textalign_9_0= ruleTextAlignEnum )
            {
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3867:1: (lv_textalign_9_0= ruleTextAlignEnum )
            // ../org.eclipse.osbp.xtext.reportdsl/src-gen/org/eclipse/osbp/xtext/reportdsl/parser/antlr/internal/InternalReportDSL.g:3868:3: lv_textalign_9_0= ruleTextAlignEnum
            {
            if ( state.backtracking==0 ) {
               
              	        newCompositeNode(grammarAccess.getDateFormatAccess().getTextalignTextAlignEnumEnumRuleCall_9_0()); 
              	    
            }
            pushFollow(FOLLOW_ruleTextAlignEnum_in_ruleDateFormat8402);
            lv_textalign_9_0=ruleTextAlignEnum();

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

              	        if (current==null) {
              	            current = createModelElementForParent(grammarAccess.getDateFormatRule());
              	        }
                     		set(
                     			current, 
                     			"textalign",
                      		lv_textalign_9_0, 
                      		"TextAlignEnum");
              	        afterParserOrEnumRuleCall();
              	    
