/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#mixed_content  // f.c.MixedContent
    ${...}  // f.c.DollarVariable
        - content: ?trim  // f.c.BuiltInsForStringsBasic$trimBI
            - left-hand operand: x  // f.c.Identifier
            - right-hand operand: "trim"  // String
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ...(...)  // f.c.MethodCall
            - callee: ?left_pad  // f.c.BuiltInsForStringsBasic$padBI
                - left-hand operand: x  // f.c.Identifier
                - right-hand operand: "left_pad"  // String
            - argument value: 5  // f.c.NumberLiteral
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ...(...)  // f.c.MethodCall
            - callee: ?left_pad  // f.c.BuiltInsForStringsBasic$padBI
                - left-hand operand: x  // f.c.Identifier
                - right-hand operand: "left_pad"  // String
            - argument value: 5  // f.c.NumberLiteral
            - argument value: "-"  // f.c.StringLiteral
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ?then(...)  // f.c.BuiltInsWithParseTimeParameters$then_BI
            - left-hand operand: x  // f.c.Identifier
            - right-hand operand: "then"  // String
            - argument value: "y"  // f.c.StringLiteral
            - argument value: "n"  // f.c.StringLiteral
    #text  // f.c.TextBlock
        - content: "\n"  // String
    ${...}  // f.c.DollarVariable
        - content: ?switch(...)  // f.c.BuiltInsWithParseTimeParameters$switch_BI
            - left-hand operand: x  // f.c.Identifier
            - right-hand operand: "switch"  // String
            - argument value: 1  // f.c.NumberLiteral
            - argument value: 11  // f.c.NumberLiteral
            - argument value: 2  // f.c.NumberLiteral
            - argument value: 22  // f.c.NumberLiteral
            - argument value: 33  // f.c.NumberLiteral
