{{!
 * 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.
}}

{{#if normalizedLinks.length}}
  {{#each normalizedLinks as |link|}}
    {{#if link.routeName}}
      {{#if link.withModel}}
        {{#link-to link.routeName link.model target=definition.target}}
          {{link.text}}
        {{/link-to}}
      {{else}}
        {{#link-to link.routeName target=definition.target}}
          {{link.text}}
        {{/link-to}}
      {{/if}}
    {{else if link.href}}
      <a href={{link.href}} target={{definition.target}} download={{link.download}}>
        {{link.text}}
      </a>
    {{else}}
      {{link.text}}
    {{/if}}
  {{/each}}
{{else}}
  <span class="txt-message">Not Available!</span>
{{/if}}
