/*
 * 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
    #text  // f.c.TextBlock
        - content: "1. "  // String
    @  // f.c.UnifiedCall
        - callee: m  // f.c.Identifier
        - argument name: "x"  // String
        - argument value: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: e1  // f.c.Identifier
        - argument name: "y"  // String
        - argument value: "$\\{e2}"  // f.c.StringLiteral
    #text  // f.c.TextBlock
        - content: "\n2. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: "a"  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: "b"  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: "c"  // String
    #text  // f.c.TextBlock
        - content: "\n3. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: "b"  // String
    #text  // f.c.TextBlock
        - content: "\n4. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: "a"  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
    #text  // f.c.TextBlock
        - content: "\n5. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: #{...}  // f.c.NumericalOutput
                - content: y  // f.c.Identifier
                - minimum decimals: null  // Null
                - maximum decimals: null  // Null
    #text  // f.c.TextBlock
        - content: "\n6. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: "a b "  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: " c d"  // String
    #text  // f.c.TextBlock
        - content: "\n7. "  // String
    ${...}  // f.c.DollarVariable
        - content: dynamic "..."  // f.c.StringLiteral
            - value part: ${...}  // f.c.DollarVariable
                - content: x  // f.c.Identifier
            - value part: " a b "  // String
            - value part: ${...}  // f.c.DollarVariable
                - content: y  // f.c.Identifier
            - value part: " c$d"  // String
