.. 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
   https://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.


.. This file contain Variables shared across other .rst files in this project


.. _CloudStack Installation Guide: https://docs.cloudstack.apache.org/projects/cloudstack-installation
.. _CloudStack Administrator's Guide: https://docs.cloudstack.apache.org/projects/cloudstack-administration
.. _CloudStack Apidocs: https://cloudstack.apache.org/api.html

.. |documentation_home| replace:: https://docs.cloudstack.apache.org/

.. Latest version systemvm template name

.. |sysvm64-version|     replace:: 4.17.2
.. |sysvm64-name-xen|    replace:: systemvm-xenserver-4.17.2
.. |sysvm64-name-kvm|    replace:: systemvm-kvm-4.17.2
.. |sysvm64-name-vmware| replace:: systemvm-vmware-4.17.2
.. |sysvm64-name-hyperv| replace:: systemvm-hyperv-4.17.2
.. |sysvm64-name-ovm|    replace:: systemvm-ovm-4.17.2

.. Latest version systemvm template URL
.. |sysvm64-url-xen|    replace:: http://download.cloudstack.org/systemvm/4.17/systemvmtemplate-4.17.2-xen.vhd.bz2
.. |sysvm64-url-kvm|    replace:: http://download.cloudstack.org/systemvm/4.17/systemvmtemplate-4.17.2-kvm.qcow2.bz2
.. |sysvm64-url-vmware| replace:: http://download.cloudstack.org/systemvm/4.17/systemvmtemplate-4.17.2-vmware.ova
.. |sysvm64-url-hyperv| replace:: http://download.cloudstack.org/systemvm/4.17/systemvmtemplate-4.17.2-hyperv.vhd.zip
.. |sysvm64-url-ovm|    replace:: http://download.cloudstack.org/systemvm/4.17/systemvmtemplate-4.17.2-ovm.raw.bz2

.. Version specific: 4.5 systemvm template URL
.. |acs45-sysvm64-url-xen|    replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-xen.vhd.bz2
.. |acs45-sysvm64-url-kvm|    replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-kvm.qcow2.bz2
.. |acs45-sysvm64-url-vmware| replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-vmware.ova
.. |acs45-sysvm64-url-hyperv| replace:: https://download.cloudstack.org/systemvm/4.5/systemvm64template-4.5-hyperv.vhd.zip

.. Images


.. |vpn-icon.png| image:: /_static/images/vpn-icon.png
.. |sysmanager.png| image:: /_static/images/sysmanager.png
.. |software-license.png| image:: /_static/images/software-license.png
.. |change-admin-password.png| image:: /_static/images/change-admin-password.png
.. |menu_acs_logo| image:: /_static/acslogo.png

.. |br| raw:: html

   <br/>
