<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="generator" content="{{app.title}}">
    <meta name="viewport" content="width=device-width, minimum-scale = 1.0, initial-scale = 1.0, maximum-scale = 1.0, user-scalable=no">

    <title>{{app.title}}</title>
    <meta name="description" content="{{app.description}}">

    <!--
      If deploying to a non-root path, replace href="/" with the full path to the project root.
      For example: href="/polymer-starter-kit/relative-path-example/"
    -->
    <base href="{{app.baseHref}}">

    <link rel="icon" href="images/favicon.ico">

    <!-- See https://goo.gl/OOhYW5 -->
    <link rel="manifest" href="manifest.json">

    <!-- See https://goo.gl/qRE0vM -->
    <meta name="theme-color" content="{{theme.themeColor}}">

    <!-- Add to homescreen for Chrome on Android. Fallback for manifest.json -->
    <meta name="mobile-web-app-capable" content="{{theme.webApp.capable}}">
    <meta name="application-name" content="{{app.title}}">

    <!-- Add to homescreen for Safari on iOS -->
    <meta name="apple-mobile-web-app-capable" content="{{theme.webApp.capable}}">
    <meta name="apple-mobile-web-app-status-bar-style" content="{{theme.webApp.statusBarStyle}}">
    <meta name="apple-mobile-web-app-title" content="{{app.title}}">

    <!-- Homescreen icons -->
    {{#each theme.icons}}
    <link rel="apple-touch-icon"{{#if sizes}} sizes="{{sizes}}"{{/if}} href="images/manifest/{{href}}">
    {{/each}}

    <!-- Tile icon for Windows 8 (144x144 + tile color) -->
    {{#each theme.icons}}
    {{#if tileImage}}
    <meta name="msapplication-TileImage" content="images/manifest/{{href}}">
    {{/if}}
    {{/each}}
    <meta name="msapplication-TileColor" content="{{theme.themeColor}}">
    <meta name="msapplication-tap-highlight" content="{{theme.webApp.tapHighlight}}">
    <script src="https://polyfill.io/v2/polyfill.min.js?features=IntersectionObserver,fetch,Promise,Array.prototype.findIndex,Object.defineProperty,Map,Set,CustomEvent,performance.now&flags=gated"></script>
    <script>
      // set project namespace
      Object.defineProperty(window, 'App', { value: window.App || {} })
      Object.defineProperty(App, 'Mixins', { value: App.Mixins || {} })
      Object.defineProperty(App, 'utils', { value: App.utils || {} })
      Object.defineProperty(App.utils, 'extends', { value: App.utils.extends || Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key] } } } return target } })
      /**
       * Merges a property's object value using the defaults way.
       *
       * @private
       * @param {Object} what Initial prototype
       * @param {String} which Property to collect.
       * @return {Object} the collected values
       */
      Object.defineProperty(App.utils, 'collect', { value: App.utils.collect || function (what, which) {
        var res = {}
        while (what) {
          res = App.utils.extends({}, what[which], res) // Respect prototype priority
          what = Object.getPrototypeOf(what)
        }
        return res
      }})
      Object.defineProperty(App.utils, 'isEmpty', { value: App.utils.isEmpty || function (obj) {
        for (var key in obj) {
          if (obj.hasOwnProperty(key)) return false
        }
        return true
      }});
      (() => {
        var __currentUsed = 0
        Object.defineProperty(App.utils, 'checkStorage', { value: App.utils.checkStorage || function () {
          if (window.navigator && navigator.storage && navigator.storage.estimate) {
            return navigator.storage.estimate()
          } else if (window.navigator &&
            navigator.webkitTemporaryStorage &&
            navigator.webkitTemporaryStorage.queryUsageAndQuota &&
            typeof navigator.webkitTemporaryStorage.queryUsageAndQuota === 'function') {
            return new Promise((resolve, reject) => {
              navigator.webkitTemporaryStorage.queryUsageAndQuota(
                (usedBytes, grantedBytes) => {
                  if (__currentUsed && App.__build !== 'prod') {
                    console.log('added data:', ((usedBytes - __currentUsed) / 1024) / 1024, 'MB. Current used:', (usedBytes / 1024) / 1024, 'MB')
                  }
                  __currentUsed = usedBytes
                  return resolve({
                    usage: usedBytes
                  })
                }, reject)
            })
          } else {
            Promise.resolve({
              type: 'no_navigator_storage'
            })
          }
        }});
        App.utils.checkStorage()
      })()

      Object.defineProperty(App, '__dataRestStaleTime', { value: {{app.waitBeforeFetchingSameURLInRest}} })
      Object.defineProperty(App, '__firebaseFetch', { value: App.__firebaseFetch || {} })
      Object.defineProperty(App, '__firebaseVersion', { value: App.__firebaseVersion || '{{app.firebaseVersion}}' })

      // set project build
      Object.defineProperty(App, '__build', { value: App.__build || '{{build}}' })
      Object.defineProperty(App, '__version', { value: App.__version || '{{version}}' })
      Object.defineProperty(App, '__database', { value: App.__database || '{{database}}' })
      Object.defineProperty(App, '__analytics', { value: App.__analytics || '{{app.analytics}} '})

      // set config variables
      Object.defineProperty(App, '__routes', { value: App.__routes || '{{#compileRouting}}{{/compileRouting}}' })
      Object.defineProperty(App, '__shellComponents', { value: App.__shellComponents || '{{#compileShellComponents}}{{/compileShellComponents}}' })
      Object.defineProperty(App, 'Reducers', { value: App.Reducers || {} })
      Object.defineProperty(App, 'Actions', { value: App.Actions || {} })

      if (window.performance) {
        window.globalStart = window.globalStart || performance.now()
      }

      window.onerror = (err, url, line) => {
        console.error(err)
        try {
          if (window.ga) {
            ga('send', 'exception', {
              exDescription: err.message,
              exFatal: true
            })
          }
          if (window.Raven) {
            Raven.captureException(err)
          }
        } catch (e) {
          console.error(e)
        }
      }

      // Register the base URL
      window.App.baseUrl = window.App.baseUrl || document.querySelector('base').href

      // Load and register pre-caching Service Worker

    </script>

    <!-- Load webcomponents-loader.js to check and load any polyfills your browser needs -->
    <script src="bower_components/webcomponentsjs/webcomponents-loader.js"></script>

    {{#if app.sentryUrl}}
    <script src="https://cdn.ravenjs.com/3.17.0/raven.min.js" crossorigin="anonymous" async onload="installRaven()"></script>

    <script>
      function installRaven() {
        if (window.Raven && !Raven.isSetup()) {
          Raven.config('{{app.sentryUrl}}', {
            environment: App.__build === 'prod' ? 'production' : App.__build,
            autoBreadcrumbs: App.__build === 'prod',
            debug: App.__build !== 'prod'
          }).install()
          if (App.__build !== 'prod') {
            console.log('Raven installed')
          }
          installRaven = null
        }
      }
    </script>
    {{/if}}

    <!-- Load your application shell -->
    <link rel="import" href="script.html">
    <link rel="import" href="shell/app-shell.html">

    <!-- Add any global styles for body, document, etc. -->
    <style>
      {{css}}
    </style>

    <!-- Add all lazy-imports here -->
    <link rel="lazy-import" href="modules/polyapp-toast/components/polyapp-toast.html" node="polyapp-toast">
    <link rel="prefetch" href="modules/polyapp-toast/components/polyapp-toast.html">
    {{#each fragments}}
    <link rel="lazy-import" href="{{this}}" node="{{@key}}">
    <link rel="prefetch" href="{{this}}">
    {{/each}}
  </head>
  <body>
    {{#if analytics}}
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
      if (window.ga) {
        ga('create', App.__analytics, 'auto');
        ga('send', 'pageview');
      }
      setTimeout(() => {
        App.utils.checkStorage().then((res) => {
          if (res.usage && window.ga) {
            ga('send', 'event', 'appLoad', 'load', null, res.usage)
          } else if (res.type) {
            Raven.captureMessage(res.type)
          }
        }).catch((err) => {
          Raven.captureException(err)
        })
      }, 10000)
    </script>
    {{/if}}
    <script>
      if (window.__shellHasBeenLoaded) {
        document.head.querySelectorAll('link[rel="import"]').forEach(link => {
          if (link.import && link.import.body && link.import.body.querySelector('app-shell')) {
            link.import.body.querySelector('app-shell').remove()
            console.log(link.import.body.querySelector('app-shell'))
            link.remove()
          }
        })
        throw Error(new Error('This file doesn`t exist'))
      }
      Object.defineProperty(window, '__shellHasBeenLoaded', { value: window.__shellHasBeenLoaded || true })
    </script>

    <app-shell id="app-shell"></app-shell>
    <noscript>
      Please enable JavaScript to view this website.
    </noscript>
    <!-- Built with love using Polymer Starter Kit -->
    <script>
      Object.defineProperty(App, 'Shell', { value: document.querySelector('#app-shell') })

      // Load and register pre-caching Service Worker
      if ('serviceWorker' in navigator) {

        navigator.serviceWorker.register(window.App.baseUrl + 'service-worker.js', {
          scope: window.App.baseUrl
        }).then((registration) => {
          registration.onupdatefound = () => {
            const installingWorker = registration.installing

            installingWorker.onstatechange = function () {
              switch (installingWorker.state) {
                case 'installed':
                  if (!navigator.serviceWorker.controller) {
                    App.Shell.showMessage('Caching complete! Future visits will work offline.')
                  }
                  break;

                case 'redundant':
                  console.error(Error('The installing service worker became redundant.'));
                  Raven.captureMessage('The installing service worker became redundant.');
              }
            }
          }
          if (navigator.serviceWorker.controller) {
            console.log('The service worker is currently handling network operations.')
          } else {
            console.log('Please reload this page to allow the service worker to handle network operations.')
          }
        })

        // Check to see if the service worker controlling the page at initial load
        // has become redundant, since this implies there's a new service worker with fresh content.
        if (navigator.serviceWorker && navigator.serviceWorker.controller) {
          navigator.serviceWorker.controller.onstatechange = function (event) {
            if (event.target.state === 'redundant') {
              // Define a handler that will be used for the next io-toast tap, at which point it
              // be automatically removed.
              var tapHandler = function () {
                window.location.reload();
              };

              if (App.Shell.showMessage) {
                App.Shell.showMessage('A new version of this app is available.', tapHandler, 'Refresh', null, 0); // duration 0 indications shows the toast indefinitely.
              } else {
                tapHandler(); // Force reload if user never was shown the toast.
              }
            }
          };
        }

      }
    </script>
    <script src="app.js" async></script>
  </body>
</html>
