
<!--
Copyright 2017-present Open Networking Foundation

Licensed 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.
-->


<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Service Suspended</title>
  <style>
    
    .row {
      width: 100%;
    }

    .col-sm-offset-2 {
      margin-left: 16.66666667%;
    }

    .col-sm-8 {
      width: 66.66666667%;
    }

    .alert-danger {
        color: #a94442;
        background-color: #f2dede;
        border-color: #a94442;
    }
    .alert {
        padding: 15px;
        margin-bottom: 20px;
        border: 1px solid transparent;
        border-radius: 4px;
    }

    body {
      background-size: cover;
      background-color: #00BFEC;
      font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
      font-size: 18px;
      line-height: 1.42857143;
    }

    .vertical-center {
      min-height: 100%;  /* Fallback for browsers do NOT support vh unit */
      min-height: 100vh; /* These two lines are counted as one :-)       */

      display: flex;
      align-items: center;
    }

    .jumbotron {
      padding: 60px;
      border-radius: 6px;
      background-color: #eee;
      box-shadow: 4px 4px 18px black;
    }

    .cord-logo-title{
      font-size: 150px;
      display: inline-block;
      color: #007EC4;
    }

    path {
      fill: #B2181E;
    }

    #cord-logo {
      transform: scale(1.3)
    }

    @media only screen 
    and (min-device-width : 768px) 
    and (max-device-width : 1024px)  {
      #cord-logo {
        transform: scale(1.2)
      }
      .cord-logo-title{
        font-size: 100px;
      }
    }
  </style>
</head>
<body>
  
  <div class="container vertical-center">
    <div class="row">
      <div class="col-sm-8 col-sm-offset-2">
        <div class="jumbotron">
          <div class="cord-logo-title">
            <svg height="150" width="150">
              <path id="cord-logo" d="M92.5,62.3l-33,33,2.5,2.5c4.1,4.1,7.4,3.6,11.2-.1L95.9,75l-4.5-4.5,4.7-4.7-3.6-3.6Zm2.6,7L98.4,66l3.3,3.3-3.3,3.3-3.3-3.3ZM94.5,60l4.9-4.9,4.9,4.9-4.9,4.9ZM36.2,36.1L18.6,53.8c-7.8,7.8-5.8,17.4-2.4,22l-2.2-2.2c-10.6-10.6-11.2-20,0-31.2L28.2,28.1L31.3,25l8,8-3.1,3.1ZM55.5,55.4l3.6-3.6L66.9,44l-8-8l-2.5,2.5-5.2,5.2l-3.6,3.6L33.2,61.6C22,72.7,22.5,82.2,33.2,92.8L35.4,95c-3.4-4.5-5.4-14.1,2.4-22L55.5,55.4ZM50.7,21.7l-8-8L35,21.2l8,8,7.6-7.6ZM62.8,9.6L55.4,17l-8-8,7.4-7.4,8,8Zm0.7,18.3-7.6,7.6-8-8,7.6-7.6,8,8Zm26.1-6.6-8.1,8.1-8-8,8.1-8.1,8,8ZM79.3,31.5l-7.4,7.4-8-8,7.4-7.4,8,8ZM45.7,45.6L54.3,37l-8-8-8.6,8.6L23.4,51.8C12.2,63,12.8,72.4,23.4,83l2.2,2.2c-3.4-4.5-5.4-14.1,2.4-22ZM34.9,80.7l20.6,20.5c2,2,4.6,4.1,7.9,3.2-2.9,2.9-8.9,1.7-11.9-1.3L35.1,86.8,35,86.6H34.9l-0.8-.8a15,15,0,0,1,.1-1.9,14.7,14.7,0,0,1,.7-3.2Zm-0.6,7.4a21.3,21.3,0,0,0,5.9,11.7l5.7,5.7c3,3,9,4.1,11.9,1.3-3.3.9-5.9-1.2-7.9-3.2L34.3,88.1Zm3.5-12.4a16.6,16.6,0,0,0-2.3,3.6L57,100.8c3,3,9,4.1,11.9,1.3-3.3.9-5.9-1.2-7.9-3.2Z" />
              Sorry, your browser does not support inline SVG.
            </svg>
            CORD
          </div>
          <div class="alert alert-danger">
            {% if status == "delinquent" %}
            Your account is delinquent.  Please visit the customer portal to pay your bill.
            {% elif status == "copyrightviolation" %}
            Someone in your home has been illegally downloading copyrighted material.
            Please visit the customer portal and perform the Copyright Training course.
            {% else %}
            Your service has been suspended.  Please visit the customer portal to resume.
            {% endif %}
          </div>
        </div>
      </div>
    </div>
  </div>


</body>
</html>
