/*
   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.
*/

module.exports = [
  // Please contact SINGA team if you
  // want to feature your usage of Apache SINGA
  {
    caption: "NetEase",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/NetEase.jpg",
    infoLink: "http://tech.163.com/17/0602/17/CLUL016I00098GJ5.html",
    pinned: true,
  },
  {
    caption: "NUH SG",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/nuhlogo.jpg",
    infoLink: "https://www.nuh.com.sg/Pages/Home.aspx",
    pinned: true,
  },
  {
    caption: "SGH SG",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/sgh.png",
    infoLink: "https://www.sgh.com.sg/",
    pinned: true,
  },
  {
    caption: "TTSH SG",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/TTSH_Logo.gif",
    infoLink: "https://www.ttsh.com.sg/Pages/default.aspx",
    pinned: true,
  },
  {
    caption: "JurongHealth SG",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/juronghealth.png",
    infoLink: "https://www.juronghealthcampus.com.sg/",
    pinned: true,
  },
  {
    caption: "yzBigData",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/yzBigData.png",
    infoLink: "http://www.yzbigdata.com/",
    pinned: true,
  },
  {
    caption: "Shentilium",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/shentilium.png",
    infoLink: "https://shentilium.com/",
    pinned: true,
  },
  {
    caption: "Foodlg",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/foodlg.png",
    infoLink: "http://www.foodlg.com/",
    pinned: true,
  },
  {
    caption: "Medilot",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/medilot.svg",
    infoLink: "https://medilot.com/technologies",
    pinned: true,
  },
  {
    caption: "MZH Tech",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/mzhtech.png",
    infoLink: "http://www.mzhtechnologies.com/index.html",
    pinned: true,
  },
  {
    caption: "Secureage Technology",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/SecureAge_Logo.png",
    infoLink: "https://www.secureage.com/",
    pinned: true,
  },
  {
    caption: "Carnegie Technologies",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/carnegietech.png",
    infoLink: "https://www.carnegietechnologies.com/",
    pinned: false,
  },
  {
    caption: "CBRE",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/CBRE.jpg",
    infoLink: "http://www.cbre.com",
    pinned: false,
  },
  {
    caption: "Noblis",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/noblis.png",
    infoLink: "https://noblis.org/",
    pinned: false,
  },
  {
    caption: "CitiGroup",
    // You will need to prepend the image path with your baseUrl
    // if it is not '/', like: '/test-site/img/image.jpg'.
    image: "/img/users/citigroup-logo.jpg",
    infoLink: "https://www.citigroup.com/citi/",
    pinned: false,
  },
]
