From 56e088ac6644554142d44a82cd905606ea1930f7 Mon Sep 17 00:00:00 2001 From: Reimer Behrends Date: Tue, 9 Jun 2020 11:49:24 +0200 Subject: [PATCH] Rework of the CI logic in (mostly) Ruby. This refactoring had a number of goals: * Replace fragile shell script constructs with more robust Ruby code. Ruby has all the tools needed for shell scripting, but is a proper programming language. * Various hacks to avoid encoding issues with Python's handling of strings can be avoided, especially when output is not legal Unicode. Ruby is more forgiving of malformed Unicode strings and can pass them through as long as you don't try to process their contents. * The Python implementation had issues with truncating output when processes were killed from timeouts, as the signaling mechanism prevented output from being captured. * Templating of the Docker file was easiest with `erb`. In addition, we also incorporate the GitHub status page layout in this repository so that we don't need to update multiple repos when the layout changes. --- Jenkinsfile | 16 +- bin/create-stdjob | 36 +- bin/docker-cli | 8 +- bin/get-jenkins | 12 +- bin/jenkins | 17 +- bin/show-image-name | 8 +- check-julia-notebook.rb | 32 + install/install-finalize.rb | 3 + install/install-finalize.sh | 4 - install/install-gap-packages.rb | 11 + install/install-gap-packages.sh | 5 - install/install-gap-pkg.sh | 4 - install/install-gap.rb | 5 + install/install-gap.sh | 5 - install/install-julia.rb | 6 + install/install-julia.sh | 7 - install/install-jupyter.rb | 15 + install/install-jupyter.sh | 16 - install/install-oscar.rb | 6 + install/install-oscar.sh | 13 - jenkins-env.rb | 6 + jenkins-env.sh | 4 - jupyter-env.sh | 3 - layout/.gitignore | 5 + layout/404.html | 25 + layout/Gemfile | 30 + layout/Gemfile.lock | 255 + layout/README.md | 35 + layout/_config.yml | 3 + layout/_data/ci.yml | 340 ++ layout/_data/github.yml | 29 + layout/_includes/head.html | 12 + layout/_layouts/default.html | 44 + layout/assets/css/cards.css | 98 + layout/assets/css/style.css | 6712 +++++++++++++++++++++++++ layout/index.html | 25 + layout/table.html | 38 + prepare.rb | 4 + prepare.sh | 5 - run-tests.py | 364 -- run-tests.rb | 422 ++ run-tests.sh | 5 - settings.rb | 15 + stdenv.sh | 16 - tests/config.yaml | 54 +- tests/test-GroebnerBasis_jl.sh | 3 - tests/test-GroupAtlas_jl.sh | 3 - tests/test-HomalgProject_jl.sh | 3 - tests/test-JuliaExperimental.sh | 3 - tests/test-JuliaInterface.sh | 3 - tests/test-NemoLinearAlgebraForCAP.sh | 5 - tests/test-absalg.sh | 3 - tests/test-gapjl.sh | 3 - tests/test-hecke.sh | 4 - tests/test-nb-AbsAlg.sh | 3 - tests/test-nb-CohP1.sh | 3 - tests/test-nb-Hecke.sh | 3 - tests/test-nb-K3-16.sh | 3 - tests/test-nb-Singular.sh | 3 - tests/test-nb-Tropicalization.sh | 3 - tests/test-nb-comb-auto.sh | 3 - tests/test-nb-g-vectors.sh | 3 - tests/test-nb-gitfans.sh | 3 - tests/test-nb-groebner.sh | 3 - tests/test-nb-tilteq.sh | 3 - tests/test-nb-umps.sh | 3 - tests/test-nb-wronski-poly.sh | 3 - tests/test-nemo.sh | 3 - tests/test-oscar.sh | 3 - tests/test-packages.sh | 2 +- tests/test-polymakejl.sh | 3 - tests/test-singularjl.sh | 3 - 72 files changed, 8251 insertions(+), 610 deletions(-) create mode 100644 check-julia-notebook.rb create mode 100755 install/install-finalize.rb delete mode 100755 install/install-finalize.sh create mode 100755 install/install-gap-packages.rb delete mode 100755 install/install-gap-packages.sh delete mode 100755 install/install-gap-pkg.sh create mode 100755 install/install-gap.rb delete mode 100755 install/install-gap.sh create mode 100755 install/install-julia.rb delete mode 100755 install/install-julia.sh create mode 100755 install/install-jupyter.rb delete mode 100755 install/install-jupyter.sh create mode 100755 install/install-oscar.rb delete mode 100755 install/install-oscar.sh create mode 100644 jenkins-env.rb delete mode 100644 jenkins-env.sh delete mode 100644 jupyter-env.sh create mode 100644 layout/.gitignore create mode 100644 layout/404.html create mode 100644 layout/Gemfile create mode 100644 layout/Gemfile.lock create mode 100644 layout/README.md create mode 100644 layout/_config.yml create mode 100644 layout/_data/ci.yml create mode 100644 layout/_data/github.yml create mode 100644 layout/_includes/head.html create mode 100644 layout/_layouts/default.html create mode 100644 layout/assets/css/cards.css create mode 100644 layout/assets/css/style.css create mode 100644 layout/index.html create mode 100644 layout/table.html create mode 100755 prepare.rb delete mode 100755 prepare.sh delete mode 100644 run-tests.py create mode 100755 run-tests.rb delete mode 100755 run-tests.sh create mode 100644 settings.rb delete mode 100644 stdenv.sh delete mode 100755 tests/test-GroebnerBasis_jl.sh delete mode 100755 tests/test-GroupAtlas_jl.sh delete mode 100755 tests/test-HomalgProject_jl.sh delete mode 100755 tests/test-JuliaExperimental.sh delete mode 100755 tests/test-JuliaInterface.sh delete mode 100755 tests/test-NemoLinearAlgebraForCAP.sh delete mode 100755 tests/test-absalg.sh delete mode 100755 tests/test-gapjl.sh delete mode 100755 tests/test-hecke.sh delete mode 100755 tests/test-nb-AbsAlg.sh delete mode 100755 tests/test-nb-CohP1.sh delete mode 100755 tests/test-nb-Hecke.sh delete mode 100755 tests/test-nb-K3-16.sh delete mode 100755 tests/test-nb-Singular.sh delete mode 100755 tests/test-nb-Tropicalization.sh delete mode 100755 tests/test-nb-comb-auto.sh delete mode 100755 tests/test-nb-g-vectors.sh delete mode 100755 tests/test-nb-gitfans.sh delete mode 100755 tests/test-nb-groebner.sh delete mode 100755 tests/test-nb-tilteq.sh delete mode 100755 tests/test-nb-umps.sh delete mode 100755 tests/test-nb-wronski-poly.sh delete mode 100755 tests/test-nemo.sh delete mode 100755 tests/test-oscar.sh delete mode 100755 tests/test-polymakejl.sh delete mode 100755 tests/test-singularjl.sh diff --git a/Jenkinsfile b/Jenkinsfile index a7b41e7..3ddac2c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -77,7 +77,7 @@ node { } updateTimestamp() get url: metarepo, dir: "meta" - sh "meta/prepare.sh" + sh "meta/prepare.rb" // Update repositories if (rebuild != "none") { get url: "https://github.com/julialang/julia", @@ -116,12 +116,12 @@ node { stage('Build') { if (rebuild != "none") { run_in_docker { - sh "meta/install/install-julia.sh" - sh "meta/install/install-oscar.sh" - sh "meta/install/install-jupyter.sh" - sh "meta/install/install-gap.sh" - sh "meta/install/install-gap-packages.sh" - sh "meta/install/install-finalize.sh" + sh "meta/install/install-julia.rb" + sh "meta/install/install-oscar.rb" + sh "meta/install/install-jupyter.rb" + sh "meta/install/install-gap.rb" + sh "meta/install/install-gap-packages.rb" + sh "meta/install/install-finalize.rb" } } else { // skip build stage @@ -130,7 +130,7 @@ node { } stage('Test') { run_in_docker { - sh "meta/run-tests.sh" + sh "meta/run-tests.rb" } } } finally { diff --git a/bin/create-stdjob b/bin/create-stdjob index a0fa66a..c57da8c 100755 --- a/bin/create-stdjob +++ b/bin/create-stdjob @@ -1,20 +1,26 @@ -#!/bin/bash +#!/usr/bin/env ruby +require_relative "../jenkins-env.rb" +require "fileutils" -if [ ! -d "$JENKINS_HOME/jobs" ]; then - echo "Jenkins has not been setup yet." +def fatal(msg) + puts msg exit 1 -fi +end -if [ -z "$1" ]; then - echo "usage: create-stdjob " - exit 1 -fi +if not Dir.exist?("#{$JENKINS_HOME}/jobs") then + fatal "Jenkins has not been setup yet." +end -if [ -d "$JENKINS_HOME/jobs/$1" ]; then - echo "Job '$1' already exists." - exit 1 -fi +if ARGV.size != 1 or ARGV.first == "" then + fatal "usage: create-stdjob " +end + +job = ARGV.first +jobdir = "#{$JENKINS_HOME}/jobs/#{job}" + +if Dir.exist?(jobdir) then + fatal "Job #{job} already exists." +end -JOBDIR="$JENKINS_HOME/jobs/$1" -mkdir -p $JOBDIR -cp -f $HOME/develop/ci-meta/config.xml $JOBDIR +FileUtils.mkdir_p jobdir +FileUtils.cp_f File.expand_path("#{__dir__}/../config.xml"), jobdir diff --git a/bin/docker-cli b/bin/docker-cli index 64b33b1..bbda535 100755 --- a/bin/docker-cli +++ b/bin/docker-cli @@ -1,5 +1,3 @@ -#!/bin/bash -set -e -BASEDIR="$(realpath "$(dirname "$0")/..")" -source "$BASEDIR/jenkins-env.sh" -docker run -it "$OSCAR_CI_IMAGE" "$@" +#!/usr/bin/env ruby +require_relative "../jenkins-env.rb" +exec "docker", "run", "-it", $OSCAR_CI_IMAGE, *ARGV diff --git a/bin/get-jenkins b/bin/get-jenkins index 6618452..30fc2c2 100755 --- a/bin/get-jenkins +++ b/bin/get-jenkins @@ -1,7 +1,5 @@ -#!/bin/bash -set -e -BASEDIR="$(realpath "$(dirname "$0")/..")" -source "$BASEDIR/jenkins-env.sh" -JENKINS_VER="${JENKINS_VER:-latest}" -JENKINS_URL="http://mirrors.jenkins.io/war-stable/${JENKINS_VER}/jenkins.war" -wget -O "$JENKINS_WAR" "$JENKINS_URL" +#!/usr/bin/env ruby +require_relative "../jenkins-env.rb" +$JENKINS_VER = ENV["JENKINS_VER"] || "latest" +$JENKINS_URL="http://mirrors.jenkins.io/war-stable/#{$JENKINS_VER}/jenkins.war" +system "wget", "-O", $JENKINS_WAR, $JENKINS_URL diff --git a/bin/jenkins b/bin/jenkins index b82f93f..3c560f6 100755 --- a/bin/jenkins +++ b/bin/jenkins @@ -1,10 +1,9 @@ -#!/bin/bash -set -e -BASEDIR="$(realpath "$(dirname "$0")/..")" -source "$BASEDIR/jenkins-env.sh" -test -f "$JENKINS_WAR" || { - echo "Please install $JENKINS_WAR first." - echo "You can use $BASEDIR/bin/get-jenkins for that." +#!/usr/bin/env ruby +require_relative "../jenkins-env.rb" +require "shellwords" +if not File.exist?($JENKINS_WAR) then + puts "Please install $JENKINS_WAR first." + puts "You can use bin/get-jenkins for that." exit 1 -} -java -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=600 -jar "$JENKINS_WAR" "$@" +end +exec "java -Dorg.jenkinsci.plugins.durabletask.BourneShellScript.HEARTBEAT_CHECK_INTERVAL=600 -jar #{$JENKINS_WAR} #{Shellwords.shelljoin(ARGV)}" diff --git a/bin/show-image-name b/bin/show-image-name index 55f518a..6481133 100755 --- a/bin/show-image-name +++ b/bin/show-image-name @@ -1,5 +1,3 @@ -#!/bin/bash -set -e -BASEDIR="$(realpath "$(dirname "$0")/..")" -source "$BASEDIR/jenkins-env.sh" -echo "$OSCAR_CI_IMAGE" +#!/usr/bin/env ruby +require_relative "../jenkins-env" +puts $OSCAR_CI_IMAGE diff --git a/check-julia-notebook.rb b/check-julia-notebook.rb new file mode 100644 index 0000000..d5d9028 --- /dev/null +++ b/check-julia-notebook.rb @@ -0,0 +1,32 @@ +#!/usr/bin/env ruby +require_relative "settings.rb" +require "json" + +env = { "LC_ALL" => "en_US.UTF-8" } +notebook = ARGV.shift +basename = File.basename(notebook) +kernel = nil +kernelspecs = JSON.load(%x{jupyter kernelspec list --json})["kernelspecs"] +for name in kernelspecs.keys do + if name.start_with?("julia-") then + kernel = name + break + end +end +if not kernel then + puts "=== Error: no Julia Jupyter kernel found" + exit 1 +end + +success = system env, "jupyter", "nbconvert", + "--ExecutePreprocessor.kernel_name=#{kernel}", + "--ExecutePreprocessor.timeout=600", + "--to=notebook", + "--output-dir=#{$WORKSPACE}/notebooks-out", + "--execute", + notebook + +puts "=== notebook diff for #{basename}" +system env, "meta/nb-diff", "-w", notebook, "notebooks-out/#{basename}" + +exit success diff --git a/install/install-finalize.rb b/install/install-finalize.rb new file mode 100755 index 0000000..732642f --- /dev/null +++ b/install/install-finalize.rb @@ -0,0 +1,3 @@ +#!/usr/bin/env ruby +require_relative "../settings.rb" +system %q{julia -e 'include("meta/safepkg.jl"); SafePkg.precompile()'} diff --git a/install/install-finalize.sh b/install/install-finalize.sh deleted file mode 100755 index 4111113..0000000 --- a/install/install-finalize.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -julia -e 'include("meta/safepkg.jl"); SafePkg.precompile()' diff --git a/install/install-gap-packages.rb b/install/install-gap-packages.rb new file mode 100755 index 0000000..e955804 --- /dev/null +++ b/install/install-gap-packages.rb @@ -0,0 +1,11 @@ +#!/usr/bin/env ruby +require_relative "../settings.rb" +require "fileutils" + +packages = [ "NemoLinearAlgebraForCAP" ] +pkgdir = %x{julia meta/gappkgpath.jl}.chomp + +for pkg in packages do + FileUtils.rm_f "#{pkgdir}/#{pkg}" + FileUtils.ln_sf File.realpath(pkg), pkgdir +end diff --git a/install/install-gap-packages.sh b/install/install-gap-packages.sh deleted file mode 100755 index 4ce1b94..0000000 --- a/install/install-gap-packages.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -BASEDIR="$(realpath "$(dirname "$0")")" -"$BASEDIR/install-gap-pkg.sh" NemoLinearAlgebraForCAP diff --git a/install/install-gap-pkg.sh b/install/install-gap-pkg.sh deleted file mode 100755 index 66d56f7..0000000 --- a/install/install-gap-pkg.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash -PKGDIR="$(julia meta/gappkgpath.jl)" -rm -f "$PKGDIR"/`basename $1` -ln -s "$(realpath "$1")" "$PKGDIR/" diff --git a/install/install-gap.rb b/install/install-gap.rb new file mode 100755 index 0000000..2260d6e --- /dev/null +++ b/install/install-gap.rb @@ -0,0 +1,5 @@ +#!/usr/bin/env ruby +require_relative "../settings.rb" +require "fileutils" + +FileUtils.ln_sf %x{julia meta/gappath.jl}.chomp, "local/bin/gap" diff --git a/install/install-gap.sh b/install/install-gap.sh deleted file mode 100755 index 33d6797..0000000 --- a/install/install-gap.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -set -x -ln -sf "$(julia meta/gappath.jl)" local/bin/gap diff --git a/install/install-julia.rb b/install/install-julia.rb new file mode 100755 index 0000000..1eb9aba --- /dev/null +++ b/install/install-julia.rb @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../settings.rb" +require "fileutils" + +system "make -C julia -j#{ENV['BUILDJOBS'] || 4}" +FileUtils.ln_sf "#{$WORKSPACE}/julia/julia", "local/bin" diff --git a/install/install-julia.sh b/install/install-julia.sh deleted file mode 100755 index b893edb..0000000 --- a/install/install-julia.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -set -x -cd julia -make -j"$BUILDJOBS" -ln -sf "$WORKSPACE/julia/julia" "$WORKSPACE/local/bin" diff --git a/install/install-jupyter.rb b/install/install-jupyter.rb new file mode 100755 index 0000000..ff554c0 --- /dev/null +++ b/install/install-jupyter.rb @@ -0,0 +1,15 @@ +#!/usr/bin/env ruby +require_relative "../settings.rb" +require "fileutils" + +FileUtils.mkdir_p $JUPYTER_BASE +system "python3", "-m", "venv", $IPYTHON +system "#{$IPYTHON}/bin/pip", "install", "--cache-dir", + "#{$JUPYTER_BASE}/.pip-cache", "jupyter", "notebook" +system "julia", "meta/install/install-jupyter.jl" +jupyter = "#{$IPYTHON}/bin/jupyter" +FileUtils.ln_sf jupyter, "#{$WORKSPACE}/local/bin" +jupyter_data_dir = ENV["JUPYTER_DATA_DIR"] +kernel_json = Dir.glob("#{jupyter_data_dir}/**/julia-*/kernel.json", + File::FNM_DOTMATCH).first +system "sed", "-i", "-e", "/--project=/d", kernel_json diff --git a/install/install-jupyter.sh b/install/install-jupyter.sh deleted file mode 100755 index 90d6e8b..0000000 --- a/install/install-jupyter.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -mkdir -p jupyter -python3 -m venv "$JUPYTER_BASE/ipython-env" -source jupyter/ipython-env/bin/activate -pip install --cache-dir "$JUPYTER_BASE/.pip-cache" jupyter notebook -source meta/jupyter-env.sh -julia "meta/install/install-jupyter.jl" -# The IJulia kernel starts up with --project=@., which is not what we -# need, so we delete the option from the kernel invocation. -sed -i -e '/--project=/d' "$JUPYTER_DATA_DIR"/kernels/julia-*/kernel.json -# cd "$(julia gappkgpath.jl)" -# cd JupyterKernel-* -# python3 setup.py install --user - diff --git a/install/install-oscar.rb b/install/install-oscar.rb new file mode 100755 index 0000000..86cc648 --- /dev/null +++ b/install/install-oscar.rb @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +require_relative "../settings.rb" +require "fileutils" + +FileUtils.rm_rf $JULIA_ENV +system "julia", "meta/install/install-oscar.jl" diff --git a/install/install-oscar.sh b/install/install-oscar.sh deleted file mode 100755 index 2fe5fbe..0000000 --- a/install/install-oscar.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -# set -x -# touch .pkgstatus -# find . -maxdepth 2 -name Project.toml -type f -print0 | \ -# xargs -0 shasum >.pkgstatus.tmp -# if ! cmp .pkgstatus .pkgstatus.tmp >/dev/null 2>&1; then -# rm -rf julia-env .pkgstatus -# mv -f .pkgstatus.tmp .pkgstatus -# fi -rm -rf julia-env -linebuf julia "meta/install/install-oscar.jl" diff --git a/jenkins-env.rb b/jenkins-env.rb new file mode 100644 index 0000000..4a34299 --- /dev/null +++ b/jenkins-env.rb @@ -0,0 +1,6 @@ +$OSCAR_CI_NAME = ENV["OSCAR_CI_NAME"] || "oscar-ci" +$OSCAR_CI_IMAGE = ENV["OSCAR_CI_IMAGE"] || $OSCAR_CI_NAME +$JENKINS_HOME = ENV["JENKINS_HOME"] || + "#{ENV["HOME"]}/jenkins/#{ENV["OSCAR_CI_NAME"]}" +ENV["JENKINS_HOME"] = $JENKINS_HOME +$JENKINS_WAR = ENV["JENKINS_WAR"] || File.expand_path("#{__dir__}/jenkins.war") diff --git a/jenkins-env.sh b/jenkins-env.sh deleted file mode 100644 index bdcd040..0000000 --- a/jenkins-env.sh +++ /dev/null @@ -1,4 +0,0 @@ -export OSCAR_CI_NAME="${OSCAR_CI_NAME:-oscar-ci}" -export OSCAR_CI_IMAGE="${OSCAR_CI_IMAGE:-$OSCAR_CI_NAME}" -export JENKINS_HOME="$HOME/jenkins/$OSCAR_CI_NAME" -JENKINS_WAR="$BASEDIR/jenkins.war" diff --git a/jupyter-env.sh b/jupyter-env.sh deleted file mode 100644 index 2ec81e2..0000000 --- a/jupyter-env.sh +++ /dev/null @@ -1,3 +0,0 @@ -export JUPYTER_CONFIG_DIR="$JUPYTER_BASE/jupyterenv/config" -export JUPYTER_DATA_DIR="$JUPYTER_BASE/jupyterenv/data" -export JUPYTER_RUNTIME_DIR="$JUPYTER_BASE/jupyterenv/runtime" diff --git a/layout/.gitignore b/layout/.gitignore new file mode 100644 index 0000000..f40fbd8 --- /dev/null +++ b/layout/.gitignore @@ -0,0 +1,5 @@ +_site +.sass-cache +.jekyll-cache +.jekyll-metadata +vendor diff --git a/layout/404.html b/layout/404.html new file mode 100644 index 0000000..086a5c9 --- /dev/null +++ b/layout/404.html @@ -0,0 +1,25 @@ +--- +permalink: /404.html +layout: default +--- + + + +
+

404

+ +

Page not found :(

+

The requested page could not be found.

+
diff --git a/layout/Gemfile b/layout/Gemfile new file mode 100644 index 0000000..14e8351 --- /dev/null +++ b/layout/Gemfile @@ -0,0 +1,30 @@ +source "https://rubygems.org" +# Hello! This is where you manage which Jekyll version is used to run. +# When you want to use a different version, change it below, save the +# file and run `bundle install`. Run Jekyll with `bundle exec`, like so: +# +# bundle exec jekyll serve +# +# This will help ensure the proper Jekyll version is running. +# Happy Jekylling! +# gem "jekyll", "~> 4.0.0" +# This is the default theme for new Jekyll sites. You may change this to anything you like. +# gem "minima", "~> 2.5" +# If you want to use GitHub Pages, remove the "gem "jekyll"" above and +# uncomment the line below. To upgrade, run `bundle update github-pages`. +gem "github-pages", group: :jekyll_plugins +# If you have any plugins, put them here! +group :jekyll_plugins do + gem "jekyll-feed", "~> 0.12" +end + +# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem +# and associated library. +install_if -> { RUBY_PLATFORM =~ %r!mingw|mswin|java! } do + gem "tzinfo", "~> 1.2" + gem "tzinfo-data" +end + +# Performance-booster for watching directories on Windows +gem "wdm", "~> 0.1.1", :install_if => Gem.win_platform? + diff --git a/layout/Gemfile.lock b/layout/Gemfile.lock new file mode 100644 index 0000000..57baae1 --- /dev/null +++ b/layout/Gemfile.lock @@ -0,0 +1,255 @@ +GEM + remote: https://rubygems.org/ + specs: + activesupport (6.0.3.1) + concurrent-ruby (~> 1.0, >= 1.0.2) + i18n (>= 0.7, < 2) + minitest (~> 5.1) + tzinfo (~> 1.1) + zeitwerk (~> 2.2, >= 2.2.2) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) + coffee-script (2.4.1) + coffee-script-source + execjs + coffee-script-source (1.11.1) + colorator (1.1.0) + commonmarker (0.17.13) + ruby-enum (~> 0.5) + concurrent-ruby (1.1.6) + dnsruby (1.61.3) + addressable (~> 2.5) + em-websocket (0.5.1) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0.6.0) + ethon (0.12.0) + ffi (>= 1.3.0) + eventmachine (1.2.7) + execjs (2.7.0) + faraday (1.0.1) + multipart-post (>= 1.2, < 3) + ffi (1.13.0) + forwardable-extended (2.6.0) + gemoji (3.0.1) + github-pages (206) + github-pages-health-check (= 1.16.1) + jekyll (= 3.8.7) + jekyll-avatar (= 0.7.0) + jekyll-coffeescript (= 1.1.1) + jekyll-commonmark-ghpages (= 0.1.6) + jekyll-default-layout (= 0.1.4) + jekyll-feed (= 0.13.0) + jekyll-gist (= 1.5.0) + jekyll-github-metadata (= 2.13.0) + jekyll-mentions (= 1.5.1) + jekyll-optional-front-matter (= 0.3.2) + jekyll-paginate (= 1.1.0) + jekyll-readme-index (= 0.3.0) + jekyll-redirect-from (= 0.15.0) + jekyll-relative-links (= 0.6.1) + jekyll-remote-theme (= 0.4.1) + jekyll-sass-converter (= 1.5.2) + jekyll-seo-tag (= 2.6.1) + jekyll-sitemap (= 1.4.0) + jekyll-swiss (= 1.0.0) + jekyll-theme-architect (= 0.1.1) + jekyll-theme-cayman (= 0.1.1) + jekyll-theme-dinky (= 0.1.1) + jekyll-theme-hacker (= 0.1.1) + jekyll-theme-leap-day (= 0.1.1) + jekyll-theme-merlot (= 0.1.1) + jekyll-theme-midnight (= 0.1.1) + jekyll-theme-minimal (= 0.1.1) + jekyll-theme-modernist (= 0.1.1) + jekyll-theme-primer (= 0.5.4) + jekyll-theme-slate (= 0.1.1) + jekyll-theme-tactile (= 0.1.1) + jekyll-theme-time-machine (= 0.1.1) + jekyll-titles-from-headings (= 0.5.3) + jemoji (= 0.11.1) + kramdown (= 1.17.0) + liquid (= 4.0.3) + mercenary (~> 0.3) + minima (= 2.5.1) + nokogiri (>= 1.10.4, < 2.0) + rouge (= 3.19.0) + terminal-table (~> 1.4) + github-pages-health-check (1.16.1) + addressable (~> 2.3) + dnsruby (~> 1.60) + octokit (~> 4.0) + public_suffix (~> 3.0) + typhoeus (~> 1.3) + html-pipeline (2.13.0) + activesupport (>= 2) + nokogiri (>= 1.4) + http_parser.rb (0.6.0) + i18n (0.9.5) + concurrent-ruby (~> 1.0) + jekyll (3.8.7) + addressable (~> 2.4) + colorator (~> 1.0) + em-websocket (~> 0.5) + i18n (~> 0.7) + jekyll-sass-converter (~> 1.0) + jekyll-watch (~> 2.0) + kramdown (~> 1.14) + liquid (~> 4.0) + mercenary (~> 0.3.3) + pathutil (~> 0.9) + rouge (>= 1.7, < 4) + safe_yaml (~> 1.0) + jekyll-avatar (0.7.0) + jekyll (>= 3.0, < 5.0) + jekyll-coffeescript (1.1.1) + coffee-script (~> 2.2) + coffee-script-source (~> 1.11.1) + jekyll-commonmark (1.3.1) + commonmarker (~> 0.14) + jekyll (>= 3.7, < 5.0) + jekyll-commonmark-ghpages (0.1.6) + commonmarker (~> 0.17.6) + jekyll-commonmark (~> 1.2) + rouge (>= 2.0, < 4.0) + jekyll-default-layout (0.1.4) + jekyll (~> 3.0) + jekyll-feed (0.13.0) + jekyll (>= 3.7, < 5.0) + jekyll-gist (1.5.0) + octokit (~> 4.2) + jekyll-github-metadata (2.13.0) + jekyll (>= 3.4, < 5.0) + octokit (~> 4.0, != 4.4.0) + jekyll-mentions (1.5.1) + html-pipeline (~> 2.3) + jekyll (>= 3.7, < 5.0) + jekyll-optional-front-matter (0.3.2) + jekyll (>= 3.0, < 5.0) + jekyll-paginate (1.1.0) + jekyll-readme-index (0.3.0) + jekyll (>= 3.0, < 5.0) + jekyll-redirect-from (0.15.0) + jekyll (>= 3.3, < 5.0) + jekyll-relative-links (0.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-remote-theme (0.4.1) + addressable (~> 2.0) + jekyll (>= 3.5, < 5.0) + rubyzip (>= 1.3.0) + jekyll-sass-converter (1.5.2) + sass (~> 3.4) + jekyll-seo-tag (2.6.1) + jekyll (>= 3.3, < 5.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-swiss (1.0.0) + jekyll-theme-architect (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-cayman (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-dinky (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-hacker (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-leap-day (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-merlot (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-midnight (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-minimal (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-modernist (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-primer (0.5.4) + jekyll (> 3.5, < 5.0) + jekyll-github-metadata (~> 2.9) + jekyll-seo-tag (~> 2.0) + jekyll-theme-slate (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-tactile (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-theme-time-machine (0.1.1) + jekyll (~> 3.5) + jekyll-seo-tag (~> 2.0) + jekyll-titles-from-headings (0.5.3) + jekyll (>= 3.3, < 5.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.11.1) + gemoji (~> 3.0) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + kramdown (1.17.0) + liquid (4.0.3) + listen (3.2.1) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + mercenary (0.3.6) + mini_portile2 (2.4.0) + minima (2.5.1) + jekyll (>= 3.5, < 5.0) + jekyll-feed (~> 0.9) + jekyll-seo-tag (~> 2.1) + minitest (5.14.1) + multipart-post (2.1.1) + nokogiri (1.10.9) + mini_portile2 (~> 2.4.0) + octokit (4.18.0) + faraday (>= 0.9) + sawyer (~> 0.8.0, >= 0.5.3) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (3.1.1) + rb-fsevent (0.10.4) + rb-inotify (0.10.1) + ffi (~> 1.0) + rouge (3.19.0) + ruby-enum (0.8.0) + i18n + rubyzip (2.3.0) + safe_yaml (1.0.5) + sass (3.7.4) + sass-listen (~> 4.0.0) + sass-listen (4.0.0) + rb-fsevent (~> 0.9, >= 0.9.4) + rb-inotify (~> 0.9, >= 0.9.7) + sawyer (0.8.2) + addressable (>= 2.3.5) + faraday (> 0.8, < 2.0) + terminal-table (1.8.0) + unicode-display_width (~> 1.1, >= 1.1.1) + thread_safe (0.3.6) + typhoeus (1.4.0) + ethon (>= 0.9.0) + tzinfo (1.2.7) + thread_safe (~> 0.1) + tzinfo-data (1.2020.1) + tzinfo (>= 1.0.0) + unicode-display_width (1.7.0) + wdm (0.1.1) + zeitwerk (2.3.0) + +PLATFORMS + ruby + +DEPENDENCIES + github-pages + jekyll-feed (~> 0.12) + tzinfo (~> 1.2) + tzinfo-data + wdm (~> 0.1.1) + +BUNDLED WITH + 2.1.2 diff --git a/layout/README.md b/layout/README.md new file mode 100644 index 0000000..7096b67 --- /dev/null +++ b/layout/README.md @@ -0,0 +1,35 @@ +## [Build 9886](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/) + +* Started on: 2020-06-09 +* Ended on: 2020-06-09 + +| Test Name | Result | Start | Duration | Last Success | First Failure | +|:-------------|:-------|:------|:---------|:-------------|:--------------| +| Singular.jl | ❌ [Failure (status = 1)](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Singular.jl.log) | 11:55 | 32 seconds | [9821](https://oscarci.mathematik.uni-kl.de/job/oscar/9821/) | [9822](https://oscarci.mathematik.uni-kl.de/job/oscar/9822/) | +| Oscar.jl | ❌ [Failure (status = 1)](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Oscar.jl.log) | 12:05 | 153 seconds | [9435](https://oscarci.mathematik.uni-kl.de/job/oscar/9435/) | [9436](https://oscarci.mathematik.uni-kl.de/job/oscar/9436/) | +| wronski-poly.ipynb | ❌ [Failure (status = 1)](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/wronski-poly.ipynb.log) | 12:19 | 88 seconds | [9884](https://oscarci.mathematik.uni-kl.de/job/oscar/9884/) | [9885](https://oscarci.mathematik.uni-kl.de/job/oscar/9885/) | +| CheckPackages | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/CheckPackages.log) | 11:18 | 64 seconds | | | +| GAP | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GAP.log) | 11:19 | 154 seconds | | | +| GAP.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GAP.jl.log) | 11:21 | 45 seconds | | | +| Nemo.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Nemo.jl.log) | 11:22 | 294 seconds | | | +| Hecke.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Hecke.jl.log) | 11:27 | 1372 seconds | | | +| AbstractAlgebra.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/AbstractAlgebra.jl.log) | 11:50 | 314 seconds | | | +| HomalgProject.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/HomalgProject.jl.log) | 11:56 | 93 seconds | | | +| Polymake.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Polymake.jl.log) | 11:57 | 353 seconds | | | +| GroupAtlas.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GroupAtlas.jl.log) | 12:03 | 45 seconds | | | +| GroebnerBasis.jl | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GroebnerBasis.jl.log) | 12:04 | 21 seconds | | | +| JuliaInterface | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/JuliaInterface.log) | 12:04 | 16 seconds | | | +| JuliaExperimental | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/JuliaExperimental.log) | 12:05 | 29 seconds | | | +| NemoLinearAlgebraForCAP | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/NemoLinearAlgebraForCAP.log) | 12:08 | 34 seconds | | | +| AbstractAlgebra.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/AbstractAlgebra.ipynb.log) | 12:08 | 32 seconds | | | +| CohP1.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/CohP1.ipynb.log) | 12:09 | 62 seconds | | | +| TiltingEquivalence.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/TiltingEquivalence.ipynb.log) | 12:10 | 154 seconds | | | +| Hecke.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Hecke.ipynb.log) | 12:12 | 74 seconds | | | +| Singular.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Singular.ipynb.log) | 12:14 | 33 seconds | | | +| g-vectors.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/g-vectors.ipynb.log) | 12:14 | 122 seconds | | | +| K3-16.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/K3-16.ipynb.log) | 12:16 | 59 seconds | | | +| c-automorphisms.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/c-automorphisms.ipynb.log) | 12:17 | 90 seconds | | | +| Tropicalization.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Tropicalization.ipynb.log) | 12:20 | 70 seconds | | | +| uMPS(2,2,4)_0dim.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/uMPS-2-2-4-_0dim.ipynb.log) | 12:21 | 83 seconds | | | +| GITFans.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GITFans.ipynb.log) | 12:23 | 138 seconds | | | +| GroebnerBasis.ipynb | ✅ [Success](https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GroebnerBasis.ipynb.log) | 12:25 | 48 seconds | | | diff --git a/layout/_config.yml b/layout/_config.yml new file mode 100644 index 0000000..f531cd0 --- /dev/null +++ b/layout/_config.yml @@ -0,0 +1,3 @@ +title: OSCAR CI Status +baseurl: "/oscar-ci-status" +url: "https://oscar-system.github.io" diff --git a/layout/_data/ci.yml b/layout/_data/ci.yml new file mode 100644 index 0000000..b92e278 --- /dev/null +++ b/layout/_data/ci.yml @@ -0,0 +1,340 @@ +build: 9886 +build_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/ +job: oscar +tests: +- duration: 64 + exitcode: 0 + first_failure: false + first_failure_url: null + id: checkpackages + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/CheckPackages.log + name: CheckPackages + start: 2020-06-09 11:18 + status: success + success: true +- duration: 154 + exitcode: 0 + first_failure: false + first_failure_url: null + id: gap + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GAP.log + name: GAP + start: 2020-06-09 11:19 + status: success + success: true +- duration: 45 + exitcode: 0 + first_failure: false + first_failure_url: null + id: gap-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GAP.jl.log + name: GAP.jl + start: 2020-06-09 11:21 + status: success + success: true +- duration: 294 + exitcode: 0 + first_failure: false + first_failure_url: null + id: nemo-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Nemo.jl.log + name: Nemo.jl + start: 2020-06-09 11:22 + status: success + success: true +- duration: 1372 + exitcode: 0 + first_failure: false + first_failure_url: null + id: hecke-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Hecke.jl.log + name: Hecke.jl + start: 2020-06-09 11:27 + status: success + success: true +- duration: 314 + exitcode: 0 + first_failure: false + first_failure_url: null + id: abstractalgebra-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/AbstractAlgebra.jl.log + name: AbstractAlgebra.jl + start: 2020-06-09 11:50 + status: success + success: true +- duration: 32 + exitcode: 1 + first_failure: 9822 + first_failure_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9822/ + id: singular-jl + last_success: 9821 + last_success_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9821/ + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Singular.jl.log + name: Singular.jl + start: 2020-06-09 11:55 + status: failure + success: false +- duration: 93 + exitcode: 0 + first_failure: false + first_failure_url: null + id: homalgproject-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/HomalgProject.jl.log + name: HomalgProject.jl + start: 2020-06-09 11:56 + status: success + success: true +- duration: 353 + exitcode: 0 + first_failure: false + first_failure_url: null + id: polymake-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Polymake.jl.log + name: Polymake.jl + start: 2020-06-09 11:57 + status: success + success: true +- duration: 45 + exitcode: 0 + first_failure: false + first_failure_url: null + id: groupatlas-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GroupAtlas.jl.log + name: GroupAtlas.jl + start: 2020-06-09 12:03 + status: success + success: true +- duration: 21 + exitcode: 0 + first_failure: false + first_failure_url: null + id: groebnerbasis-jl + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GroebnerBasis.jl.log + name: GroebnerBasis.jl + start: 2020-06-09 12:04 + status: success + success: true +- duration: 16 + exitcode: 0 + first_failure: false + first_failure_url: null + id: juliainterface + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/JuliaInterface.log + name: JuliaInterface + start: 2020-06-09 12:04 + status: success + success: true +- duration: 29 + exitcode: 0 + first_failure: false + first_failure_url: null + id: juliaexperimental + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/JuliaExperimental.log + name: JuliaExperimental + start: 2020-06-09 12:05 + status: success + success: true +- duration: 153 + exitcode: 1 + first_failure: 9436 + first_failure_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9436/ + id: oscar-jl + last_success: 9435 + last_success_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9435/ + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Oscar.jl.log + name: Oscar.jl + start: 2020-06-09 12:05 + status: failure + success: false +- duration: 34 + exitcode: 0 + first_failure: false + first_failure_url: null + id: nemolinearalgebraforcap + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/NemoLinearAlgebraForCAP.log + name: NemoLinearAlgebraForCAP + start: 2020-06-09 12:08 + status: success + success: true +- duration: 32 + exitcode: 0 + first_failure: false + first_failure_url: null + id: abstractalgebra-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/AbstractAlgebra.ipynb.log + name: AbstractAlgebra.ipynb + start: 2020-06-09 12:08 + status: success + success: true +- duration: 62 + exitcode: 0 + first_failure: false + first_failure_url: null + id: cohp1-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/CohP1.ipynb.log + name: CohP1.ipynb + start: 2020-06-09 12:09 + status: success + success: true +- duration: 154 + exitcode: 0 + first_failure: false + first_failure_url: null + id: tiltingequivalence-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/TiltingEquivalence.ipynb.log + name: TiltingEquivalence.ipynb + start: 2020-06-09 12:10 + status: success + success: true +- duration: 74 + exitcode: 0 + first_failure: false + first_failure_url: null + id: hecke-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Hecke.ipynb.log + name: Hecke.ipynb + start: 2020-06-09 12:12 + status: success + success: true +- duration: 33 + exitcode: 0 + first_failure: false + first_failure_url: null + id: singular-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Singular.ipynb.log + name: Singular.ipynb + start: 2020-06-09 12:14 + status: success + success: true +- duration: 122 + exitcode: 0 + first_failure: false + first_failure_url: null + id: g-vectors-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/g-vectors.ipynb.log + name: g-vectors.ipynb + start: 2020-06-09 12:14 + status: success + success: true +- duration: 59 + exitcode: 0 + first_failure: false + first_failure_url: null + id: k3-16-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/K3-16.ipynb.log + name: K3-16.ipynb + start: 2020-06-09 12:16 + status: success + success: true +- duration: 90 + exitcode: 0 + first_failure: false + first_failure_url: null + id: c-automorphisms-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/c-automorphisms.ipynb.log + name: c-automorphisms.ipynb + start: 2020-06-09 12:17 + status: success + success: true +- duration: 88 + exitcode: 1 + first_failure: 9885 + first_failure_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9885/ + id: wronski-poly-ipynb + last_success: 9884 + last_success_url: https://oscarci.mathematik.uni-kl.de/job/oscar/9884/ + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/wronski-poly.ipynb.log + name: wronski-poly.ipynb + start: 2020-06-09 12:19 + status: failure + success: false +- duration: 70 + exitcode: 0 + first_failure: false + first_failure_url: null + id: tropicalization-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/Tropicalization.ipynb.log + name: Tropicalization.ipynb + start: 2020-06-09 12:20 + status: success + success: true +- duration: 83 + exitcode: 0 + first_failure: false + first_failure_url: null + id: umps-2-2-4-0dim-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/uMPS-2-2-4-_0dim.ipynb.log + name: uMPS(2,2,4)_0dim.ipynb + start: 2020-06-09 12:21 + status: success + success: true +- duration: 138 + exitcode: 0 + first_failure: false + first_failure_url: null + id: gitfans-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GITFans.ipynb.log + name: GITFans.ipynb + start: 2020-06-09 12:23 + status: success + success: true +- duration: 48 + exitcode: 0 + first_failure: false + first_failure_url: null + id: groebnerbasis-ipynb + last_success: false + last_success_url: null + log: https://oscarci.mathematik.uni-kl.de/job/oscar/9886/artifact/logs/build-9886/GroebnerBasis.ipynb.log + name: GroebnerBasis.ipynb + start: 2020-06-09 12:25 + status: success + success: true diff --git a/layout/_data/github.yml b/layout/_data/github.yml new file mode 100644 index 0000000..055d381 --- /dev/null +++ b/layout/_data/github.yml @@ -0,0 +1,29 @@ +#CheckPackages: +OscarForHomalg: https://github.com/homalg-project/OscarForHomalg +#GAP: +GAP.jl: https://github.com/oscar-system/GAP.jl +Nemo.jl: https://github.com/Nemocas/Nemo.jl +Hecke.jl: https://github.com/thofma/Hecke.jl +AbstractAlgebra.jl: https://github.com/Nemocas/AbstractAlgebra.jl +Singular.jl: https://github.com/oscar-system/Singular.jl +HomalgProject.jl: https://github.com/homalg-project/HomalgProject.jl +Polymake.jl: https://github.com/oscar-system/Polymake.jl +GroupAtlas.jl: https://github.com/oscar-system/GroupAtlas.jl +JuliaInterface: https://github.com/oscar-system/GAP.jl +JuliaExperimental: https://github.com/oscar-system/GAP.jl +Oscar.jl: https://github.com/oscar-system/Oscar.jl +NemoLinearAlgebraForCAP: https://github.com/sebastianpos/NemoLinearAlgebraForCAP +AbstractAlgebra.ipynb: https://github.com/oscar-system/OSCARBinder +CohP1.ipynb: https://github.com/homalg-project/CapHomalgNotebooks +Hecke.ipynb: https://github.com/oscar-system/OSCARBinder +Polymake.ipynb: https://github.com/oscar-system/OSCARBinder +Singular.ipynb: https://github.com/oscar-system/OSCARBinder +g-vectors.ipynb: https://github.com/micjoswig/oscar-notebooks +K3-16.ipynb: https://github.com/micjoswig/oscar-notebooks +c-automorphisms.ipynb: https://github.com/micjoswig/oscar-notebooks +wronski-poly.ipynb: https://github.com/micjoswig/oscar-notebooks +Tropicalization.ipynb: https://github.com/micjoswig/oscar-notebooks +"uMPS(2,2,4)_0dim.ipynb": https://github.com/homalg-project/CapHomalgNotebooks +GITFans.ipynb: https://github.com/oscar-system/GITFans +GroebnerBasis.ipynb: https://github.com/ederc/GroebnerBasisNotebooks +TiltingEquivalence.ipynb: https://github.com/homalg-project/CapHomalgNotebooks diff --git a/layout/_includes/head.html b/layout/_includes/head.html new file mode 100644 index 0000000..4de768d --- /dev/null +++ b/layout/_includes/head.html @@ -0,0 +1,12 @@ + + + + + + {%- seo -%} + + {%- feed_meta -%} + {%- if jekyll.environment == 'production' and site.google_analytics -%} + {%- include google-analytics.html -%} + {%- endif -%} + diff --git a/layout/_layouts/default.html b/layout/_layouts/default.html new file mode 100644 index 0000000..198c80f --- /dev/null +++ b/layout/_layouts/default.html @@ -0,0 +1,44 @@ + + + + + + + + + +Build {{site.data.ci.build}} | {{page.title}} + + + + + + + + + + + + + + + + +
+
+ Build {{site.data.ci.build}} +
+
+ Card view - Table view + - GitHub +
+
+ {% assign tests = site.data.ci.tests | sort: "start" %} + run from {{ tests[0].start }} until {{ tests[-1].start }} +
+
+ + {{content}} + + diff --git a/layout/assets/css/cards.css b/layout/assets/css/cards.css new file mode 100644 index 0000000..676644f --- /dev/null +++ b/layout/assets/css/cards.css @@ -0,0 +1,98 @@ +/* +Based on https://travishorn.com/responsive-grid-in-2-minutes-with-css-grid-layout-4842a41420fe + */ + +.card { + color: black; + padding-left: 0.7rem; + padding-right: 0.7rem; + height: 6rem; + border-radius: 16px; + text-align: center; +} + +.cards { +/* max-width: 1500px; */ + margin: 0 auto; + display: grid; + padding: 0.5rem; + grid-gap: 0.5rem; + grid-template-columns: repeat(auto-fit, minmax(16rem, 1fr)); +} +/* + +@media (min-width: 600px) { + .cards { grid-template-columns: repeat(2, 1fr); } +} + +@media (min-width: 900px) { + .cards { grid-template-columns: repeat(3, 1fr); } +} + +@media (min-width: 1200px) { + .cards { grid-template-columns: repeat(4, 1fr); } +} + */ + +.success { background-color: #A4E945; } + +.failure { background-color: #FF4E4E; } + +/* unvisited link */ +.card a:link { + color: black; + text-decoration:underline; +} + +/* visited link */ +.card a:visited { + color: black; +} + +/* mouse over link */ +.card a:hover { + color: #444; +} + +/* selected link */ +.card a:active { + color: blue; +} + +.card h3 { + color: black; + font-size:2em +} + +.nemolinearalgebraforcap h3 { + font-size:1.3em !important +} + +.abstractalgebra-ipynb h3 { + font-size:1.6em !important +} + +.c-automorphisms-ipynb h3 { + font-size:1.3em !important +} + +.wronski-poly-ipynb h3 { + font-size:1.6em !important +} + +.tropicalization-ipynb h3 { + font-size:1.6em !important +} + +.umps-2-2-4-0dim-ipynb h3 { + font-size:1.3em !important +} + +.groebnerbasis-ipynb h3 { + font-size:1.6em !important +} + +.tiltingequivalence-ipynb h3 { + font-size:1.3em !important +} + diff --git a/layout/assets/css/style.css b/layout/assets/css/style.css new file mode 100644 index 0000000..ed4b825 --- /dev/null +++ b/layout/assets/css/style.css @@ -0,0 +1,6712 @@ +/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust:100% +} + +body { + margin:0 +} + +article, aside, details, figcaption, figure, footer, header, main, menu, nav, section { + display:block +} + +summary { + display:list-item +} + +audio, canvas, progress, video { + display:inline-block +} + +audio:not([controls]) { + display: none; + height:0 +} + +progress { + vertical-align:baseline +} + +template, [hidden] { + display:none !important +} + +a { + background-color:transparent +} + +a:active, a:hover { + outline-width:0 +} + +abbr[title] { + border-bottom: none; + text-decoration: underline; + text-decoration:underline dotted +} + +b, strong { + font-weight:inherit +} + +b, strong { + font-weight:bolder +} + +dfn { + font-style:italic +} + +h1 { + font-size: 2em; + margin:0.67em 0 +} + +mark { + background-color: #ff0; + color:#000 +} + +small { + font-size:80% +} + +sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align:baseline +} + +sub { + bottom:-0.25em +} + +sup { + top:-0.5em +} + +img { + border-style:none +} + +svg:not(:root) { + overflow:hidden +} + +code, kbd, pre, samp { + font-family: monospace, monospace; + font-size:1em +} + +figure { + margin:1em 40px +} + +hr { + box-sizing: content-box; + height: 0; + overflow:visible +} + +button, input, select, textarea { + font: inherit; + margin:0 +} + +optgroup { + font-weight:bold +} + +button, input { + overflow:visible +} + +button, select { + text-transform: none +} + +button, html [type="button"], [type="reset"], [type="submit"] { + -webkit-appearance: button +} + +button::-moz-focus-inner, [type="button"]::-moz-focus-inner, [type="reset"]::-moz-focus-inner, [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0 +} + +button:-moz-focusring, [type="button"]:-moz-focusring, [type="reset"]:-moz-focusring, [type="submit"]:-moz-focusring { + outline:1px dotted ButtonText +} + +fieldset { + border: 1px solid #c0c0c0; + margin: 0 2px; + padding:0.35em 0.625em 0.75em +} + +legend { + box-sizing: border-box; + color: inherit; + display: table; + max-width: 100%; + padding: 0; + white-space:normal +} + +textarea { + overflow: auto +} + +[type="checkbox"], [type="radio"] { + box-sizing: border-box; + padding: 0 +} + +[type="number"]::-webkit-inner-spin-button, [type="number"]::-webkit-outer-spin-button { + height: auto +} + +[type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px +} + +[type="search"]::-webkit-search-cancel-button, [type="search"]::-webkit-search-decoration { + -webkit-appearance:none +} + +::-webkit-input-placeholder { + color: inherit; + opacity:0.54 +} + +::-webkit-file-upload-button { + -webkit-appearance: button; + font:inherit +} + +* { + box-sizing:border-box +} + +input, select, textarea, button { + font-family: inherit; + font-size: inherit; + line-height:inherit +} + +body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 14px; + line-height: 1.5; + color: #24292e; + background-color:#fff +} + +a { + color: #0366d6; + text-decoration:none +} + +a:hover { + text-decoration:underline +} + +b, strong { + font-weight:600 +} + +hr, .rule { + height: 0; + margin: 15px 0; + overflow: hidden; + background: transparent; + border: 0; + border-bottom:1px solid #dfe2e5 +} + +hr::before, .rule::before { + display: table; + content: "" +} + +hr::after, .rule::after { + display: table; + clear: both; + content: "" +} + +table { + border-spacing: 0; + border-collapse:collapse +} + +td, th { + padding:0 +} + +button { + cursor: pointer; + border-radius:0 +} + +[hidden][hidden] { + display:none !important +} + +details summary { + cursor:pointer +} + +details:not([open]) > * :not(summary) { + display:none !important +} + +h1, h2, h3, h4, h5, h6 { + margin-top: 0; + margin-bottom:0 +} + +h1 { + font-size: 32px; + font-weight:600 +} + +h2 { + font-size: 24px; + font-weight:600 +} + +h3 { + font-size: 20px; + font-weight:600 +} + +h4 { + font-size: 16px; + font-weight:600 +} + +h5 { + font-size: 14px; + font-weight:600 +} + +h6 { + font-size: 12px; + font-weight:600 +} + +p { + margin-top: 0; + margin-bottom:10px +} + +small { + font-size:90% +} + +blockquote { + margin:0 +} + +ul, ol { + padding-left: 0; + margin-top: 0; + margin-bottom:0 +} + +ol ol, ul ol { + list-style-type:lower-roman +} + +ul ul ol, ul ol ol, ol ul ol, ol ol ol { + list-style-type:lower-alpha +} + +dd { + margin-left:0 +} + +tt, code { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size:12px +} + +pre { + margin-top: 0; + margin-bottom: 0; + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; + font-size:12px +} + +.octicon { + vertical-align:text-bottom +} + +.anim-fade-in { + animation-name: fade-in; + animation-duration: 1s; + animation-timing-function:ease-in-out +} + +.anim-fade-in.fast { + animation-duration:300ms +} + +@keyframes fade-in { + 0% { + opacity:0 + } + + 100% { + opacity:1 + } +} + +.anim-fade-out { + animation-name: fade-out; + animation-duration: 1s; + animation-timing-function:ease-out +} + +.anim-fade-out.fast { + animation-duration:0.3s +} + +@keyframes fade-out { + 0% { + opacity:1 + } + + 100% { + opacity:0 + } +} + +.anim-fade-up { + opacity: 0; + animation-name: fade-up; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease-out; + animation-delay:1s +} + +@keyframes fade-up { + 0% { + opacity: 0.8; + transform:translateY(100%) + } + + 100% { + opacity: 1; + transform:translateY(0) + } +} + +.anim-fade-down { + animation-name: fade-down; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function:ease-in +} + +@keyframes fade-down { + 0% { + opacity: 1; + transform:translateY(0) + } + + 100% { + opacity: 0.5; + transform:translateY(100%) + } +} + +.anim-grow-x { + width: 0%; + animation-name: grow-x; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease; + animation-delay:0.5s +} + +@keyframes grow-x { + to { + width:100% + } +} + +.anim-shrink-x { + animation-name: shrink-x; + animation-duration: 0.3s; + animation-fill-mode: forwards; + animation-timing-function: ease-in-out; + animation-delay:0.5s +} + +@keyframes shrink-x { + to { + width:0% + } +} + +.anim-scale-in { + animation-name: scale-in; + animation-duration: 0.15s; + animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5) +} + +@keyframes scale-in { + 0% { + opacity: 0; + transform:scale(0.5) + } + + 100% { + opacity: 1; + transform:scale(1) + } +} + +.anim-pulse { + animation-name: pulse; + animation-duration: 2s; + animation-timing-function: linear; + animation-iteration-count:infinite +} + +@keyframes pulse { + 0% { + opacity:0.3 + } + + 10% { + opacity:1 + } + + 100% { + opacity:0.3 + } +} + +.anim-pulse-in { + animation-name: pulse-in; + animation-duration:0.5s +} + +@keyframes pulse-in { + 0% { + transform:scale3d(1, 1, 1) + } + + 50% { + transform:scale3d(1.1, 1.1, 1.1) + } + + 100% { + transform:scale3d(1, 1, 1) + } +} + +.hover-grow { + transition: transform 0.3s; + backface-visibility:hidden +} + +.hover-grow:hover { + transform:scale(1.025) +} + +.border { + border:1px #e1e4e8 solid !important +} + +.border-y { + border-top: 1px #e1e4e8 solid !important; + border-bottom:1px #e1e4e8 solid !important +} + +.border-0 { + border:0 !important +} + +.border-dashed { + border-style:dashed !important +} + +.border-blue { + border-color:#0366d6 !important +} + +.border-blue-light { + border-color:#c8e1ff !important +} + +.border-green { + border-color:#34d058 !important +} + +.border-green-light { + border-color:#a2cbac !important +} + +.border-red { + border-color:#d73a49 !important +} + +.border-red-light { + border-color:#cea0a5 !important +} + +.border-purple { + border-color:#6f42c1 !important +} + +.border-yellow { + border-color:#d9d0a5 !important +} + +.border-gray-light { + border-color:#eaecef !important +} + +.border-gray-dark { + border-color:#d1d5da !important +} + +.border-black-fade { + border-color:rgba(27, 31, 35, 0.15) !important +} + +.border-top { + border-top:1px #e1e4e8 solid !important +} + +.border-right { + border-right:1px #e1e4e8 solid !important +} + +.border-bottom { + border-bottom:1px #e1e4e8 solid !important +} + +.border-left { + border-left:1px #e1e4e8 solid !important +} + +.border-top-0 { + border-top:0 !important +} + +.border-right-0 { + border-right:0 !important +} + +.border-bottom-0 { + border-bottom:0 !important +} + +.border-left-0 { + border-left:0 !important +} + +.rounded-0 { + border-radius:0 !important +} + +.rounded-1 { + border-radius:3px !important +} + +.rounded-2 { + border-radius:6px !important +} + +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius:0 !important +} + +.rounded-top-1 { + border-top-left-radius: 3px !important; + border-top-right-radius:3px !important +} + +.rounded-top-2 { + border-top-left-radius: 6px !important; + border-top-right-radius:6px !important +} + +.rounded-right-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius:0 !important +} + +.rounded-right-1 { + border-top-right-radius: 3px !important; + border-bottom-right-radius:3px !important +} + +.rounded-right-2 { + border-top-right-radius: 6px !important; + border-bottom-right-radius:6px !important +} + +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius:0 !important +} + +.rounded-bottom-1 { + border-bottom-right-radius: 3px !important; + border-bottom-left-radius:3px !important +} + +.rounded-bottom-2 { + border-bottom-right-radius: 6px !important; + border-bottom-left-radius:6px !important +} + +.rounded-left-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius:0 !important +} + +.rounded-left-1 { + border-bottom-left-radius: 3px !important; + border-top-left-radius:3px !important +} + +.rounded-left-2 { + border-bottom-left-radius: 6px !important; + border-top-left-radius:6px !important +} + +@media (min-width: 544px) { + .border-sm-top { + border-top:1px #e1e4e8 solid !important + } + + .border-sm-right { + border-right:1px #e1e4e8 solid !important + } + + .border-sm-bottom { + border-bottom:1px #e1e4e8 solid !important + } + + .border-sm-left { + border-left:1px #e1e4e8 solid !important + } + + .border-sm-top-0 { + border-top:0 !important + } + + .border-sm-right-0 { + border-right:0 !important + } + + .border-sm-bottom-0 { + border-bottom:0 !important + } + + .border-sm-left-0 { + border-left:0 !important + } + + .rounded-sm-0 { + border-radius:0 !important + } + + .rounded-sm-1 { + border-radius:3px !important + } + + .rounded-sm-2 { + border-radius:6px !important + } + + .rounded-sm-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius:0 !important + } + + .rounded-sm-top-1 { + border-top-left-radius: 3px !important; + border-top-right-radius:3px !important + } + + .rounded-sm-top-2 { + border-top-left-radius: 6px !important; + border-top-right-radius:6px !important + } + + .rounded-sm-right-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius:0 !important + } + + .rounded-sm-right-1 { + border-top-right-radius: 3px !important; + border-bottom-right-radius:3px !important + } + + .rounded-sm-right-2 { + border-top-right-radius: 6px !important; + border-bottom-right-radius:6px !important + } + + .rounded-sm-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius:0 !important + } + + .rounded-sm-bottom-1 { + border-bottom-right-radius: 3px !important; + border-bottom-left-radius:3px !important + } + + .rounded-sm-bottom-2 { + border-bottom-right-radius: 6px !important; + border-bottom-left-radius:6px !important + } + + .rounded-sm-left-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius:0 !important + } + + .rounded-sm-left-1 { + border-bottom-left-radius: 3px !important; + border-top-left-radius:3px !important + } + + .rounded-sm-left-2 { + border-bottom-left-radius: 6px !important; + border-top-left-radius:6px !important + } +} + +@media (min-width: 768px) { + .border-md-top { + border-top:1px #e1e4e8 solid !important + } + + .border-md-right { + border-right:1px #e1e4e8 solid !important + } + + .border-md-bottom { + border-bottom:1px #e1e4e8 solid !important + } + + .border-md-left { + border-left:1px #e1e4e8 solid !important + } + + .border-md-top-0 { + border-top:0 !important + } + + .border-md-right-0 { + border-right:0 !important + } + + .border-md-bottom-0 { + border-bottom:0 !important + } + + .border-md-left-0 { + border-left:0 !important + } + + .rounded-md-0 { + border-radius:0 !important + } + + .rounded-md-1 { + border-radius:3px !important + } + + .rounded-md-2 { + border-radius:6px !important + } + + .rounded-md-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius:0 !important + } + + .rounded-md-top-1 { + border-top-left-radius: 3px !important; + border-top-right-radius:3px !important + } + + .rounded-md-top-2 { + border-top-left-radius: 6px !important; + border-top-right-radius:6px !important + } + + .rounded-md-right-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius:0 !important + } + + .rounded-md-right-1 { + border-top-right-radius: 3px !important; + border-bottom-right-radius:3px !important + } + + .rounded-md-right-2 { + border-top-right-radius: 6px !important; + border-bottom-right-radius:6px !important + } + + .rounded-md-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius:0 !important + } + + .rounded-md-bottom-1 { + border-bottom-right-radius: 3px !important; + border-bottom-left-radius:3px !important + } + + .rounded-md-bottom-2 { + border-bottom-right-radius: 6px !important; + border-bottom-left-radius:6px !important + } + + .rounded-md-left-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius:0 !important + } + + .rounded-md-left-1 { + border-bottom-left-radius: 3px !important; + border-top-left-radius:3px !important + } + + .rounded-md-left-2 { + border-bottom-left-radius: 6px !important; + border-top-left-radius:6px !important + } +} + +@media (min-width: 1012px) { + .border-lg-top { + border-top:1px #e1e4e8 solid !important + } + + .border-lg-right { + border-right:1px #e1e4e8 solid !important + } + + .border-lg-bottom { + border-bottom:1px #e1e4e8 solid !important + } + + .border-lg-left { + border-left:1px #e1e4e8 solid !important + } + + .border-lg-top-0 { + border-top:0 !important + } + + .border-lg-right-0 { + border-right:0 !important + } + + .border-lg-bottom-0 { + border-bottom:0 !important + } + + .border-lg-left-0 { + border-left:0 !important + } + + .rounded-lg-0 { + border-radius:0 !important + } + + .rounded-lg-1 { + border-radius:3px !important + } + + .rounded-lg-2 { + border-radius:6px !important + } + + .rounded-lg-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius:0 !important + } + + .rounded-lg-top-1 { + border-top-left-radius: 3px !important; + border-top-right-radius:3px !important + } + + .rounded-lg-top-2 { + border-top-left-radius: 6px !important; + border-top-right-radius:6px !important + } + + .rounded-lg-right-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius:0 !important + } + + .rounded-lg-right-1 { + border-top-right-radius: 3px !important; + border-bottom-right-radius:3px !important + } + + .rounded-lg-right-2 { + border-top-right-radius: 6px !important; + border-bottom-right-radius:6px !important + } + + .rounded-lg-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius:0 !important + } + + .rounded-lg-bottom-1 { + border-bottom-right-radius: 3px !important; + border-bottom-left-radius:3px !important + } + + .rounded-lg-bottom-2 { + border-bottom-right-radius: 6px !important; + border-bottom-left-radius:6px !important + } + + .rounded-lg-left-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius:0 !important + } + + .rounded-lg-left-1 { + border-bottom-left-radius: 3px !important; + border-top-left-radius:3px !important + } + + .rounded-lg-left-2 { + border-bottom-left-radius: 6px !important; + border-top-left-radius:6px !important + } +} + +@media (min-width: 1280px) { + .border-xl-top { + border-top:1px #e1e4e8 solid !important + } + + .border-xl-right { + border-right:1px #e1e4e8 solid !important + } + + .border-xl-bottom { + border-bottom:1px #e1e4e8 solid !important + } + + .border-xl-left { + border-left:1px #e1e4e8 solid !important + } + + .border-xl-top-0 { + border-top:0 !important + } + + .border-xl-right-0 { + border-right:0 !important + } + + .border-xl-bottom-0 { + border-bottom:0 !important + } + + .border-xl-left-0 { + border-left:0 !important + } + + .rounded-xl-0 { + border-radius:0 !important + } + + .rounded-xl-1 { + border-radius:3px !important + } + + .rounded-xl-2 { + border-radius:6px !important + } + + .rounded-xl-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius:0 !important + } + + .rounded-xl-top-1 { + border-top-left-radius: 3px !important; + border-top-right-radius:3px !important + } + + .rounded-xl-top-2 { + border-top-left-radius: 6px !important; + border-top-right-radius:6px !important + } + + .rounded-xl-right-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius:0 !important + } + + .rounded-xl-right-1 { + border-top-right-radius: 3px !important; + border-bottom-right-radius:3px !important + } + + .rounded-xl-right-2 { + border-top-right-radius: 6px !important; + border-bottom-right-radius:6px !important + } + + .rounded-xl-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius:0 !important + } + + .rounded-xl-bottom-1 { + border-bottom-right-radius: 3px !important; + border-bottom-left-radius:3px !important + } + + .rounded-xl-bottom-2 { + border-bottom-right-radius: 6px !important; + border-bottom-left-radius:6px !important + } + + .rounded-xl-left-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius:0 !important + } + + .rounded-xl-left-1 { + border-bottom-left-radius: 3px !important; + border-top-left-radius:3px !important + } + + .rounded-xl-left-2 { + border-bottom-left-radius: 6px !important; + border-top-left-radius:6px !important + } +} + +.circle { + border-radius:50% !important +} + +.box-shadow { + box-shadow:0 1px 1px rgba(27, 31, 35, 0.1) !important +} + +.box-shadow-medium { + box-shadow:0 1px 5px rgba(27, 31, 35, 0.15) !important +} + +.box-shadow-large { + box-shadow:0 1px 15px rgba(27, 31, 35, 0.15) !important +} + +.box-shadow-extra-large { + box-shadow:0 10px 50px rgba(27, 31, 35, 0.07) !important +} + +.box-shadow-none { + box-shadow:none !important +} + +.bg-white { + background-color:#fff !important +} + +.bg-blue { + background-color:#0366d6 !important +} + +.bg-blue-light { + background-color:#f1f8ff !important +} + +.bg-gray-dark { + background-color:#24292e !important +} + +.bg-gray { + background-color:#f6f8fa !important +} + +.bg-gray-light { + background-color:#fafbfc !important +} + +.bg-green { + background-color:#28a745 !important +} + +.bg-green-light { + background-color:#dcffe4 !important +} + +.bg-red { + background-color:#d73a49 !important +} + +.bg-red-light { + background-color:#ffdce0 !important +} + +.bg-yellow { + background-color:#ffd33d !important +} + +.bg-yellow-light { + background-color:#fff5b1 !important +} + +.bg-purple { + background-color:#6f42c1 !important +} + +.bg-purple-light { + background-color:#f5f0ff !important +} + +.bg-shade-gradient { + background-image: linear-gradient(180deg, rgba(27, 31, 35, 0.065), rgba(27, 31, 35, 0)) !important; + background-repeat: no-repeat !important; + background-size:100% 200px !important +} + +.text-blue { + color:#0366d6 !important +} + +.text-red { + color:#cb2431 !important +} + +.text-gray-light { + color:#6a737d !important +} + +.text-gray { + color:#586069 !important +} + +.text-gray-dark { + color:#24292e !important +} + +.text-green { + color:#28a745 !important +} + +.text-orange { + color:#a04100 !important +} + +.text-orange-light { + color:#e36209 !important +} + +.text-purple { + color:#6f42c1 !important +} + +.text-white { + color:#fff !important +} + +.text-inherit { + color:inherit !important +} + +.text-pending { + color:#b08800 !important +} + +.bg-pending { + color:#dbab09 !important +} + +.link-gray { + color:#586069 !important +} + +.link-gray:hover { + color:#0366d6 !important +} + +.link-gray-dark { + color:#24292e !important +} + +.link-gray-dark:hover { + color:#0366d6 !important +} + +.link-hover-blue:hover { + color:#0366d6 !important +} + +.muted-link { + color:#586069 !important +} + +.muted-link:hover { + color: #0366d6 !important; + text-decoration:none +} + +.details-overlay[open] > summary::before { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 80; + display: block; + cursor: default; + content: " "; + background:transparent +} + +.details-overlay-dark[open] > summary::before { + z-index: 99; + background:rgba(27, 31, 35, 0.5) +} + +.flex-row { + flex-direction:row !important +} + +.flex-row-reverse { + flex-direction:row-reverse !important +} + +.flex-column { + flex-direction:column !important +} + +.flex-wrap { + flex-wrap:wrap !important +} + +.flex-nowrap { + flex-wrap:nowrap !important +} + +.flex-justify-start { + justify-content:flex-start !important +} + +.flex-justify-end { + justify-content:flex-end !important +} + +.flex-justify-center { + justify-content:center !important +} + +.flex-justify-between { + justify-content:space-between !important +} + +.flex-justify-around { + justify-content:space-around !important +} + +.flex-items-start { + align-items:flex-start !important +} + +.flex-items-end { + align-items:flex-end !important +} + +.flex-items-center { + align-items:center !important +} + +.flex-items-baseline { + align-items:baseline !important +} + +.flex-items-stretch { + align-items:stretch !important +} + +.flex-content-start { + align-content:flex-start !important +} + +.flex-content-end { + align-content:flex-end !important +} + +.flex-content-center { + align-content:center !important +} + +.flex-content-between { + align-content:space-between !important +} + +.flex-content-around { + align-content:space-around !important +} + +.flex-content-stretch { + align-content:stretch !important +} + +.flex-auto { + flex:1 1 auto !important +} + +.flex-shrink-0 { + flex-shrink:0 !important +} + +.flex-self-auto { + align-self:auto !important +} + +.flex-self-start { + align-self:flex-start !important +} + +.flex-self-end { + align-self:flex-end !important +} + +.flex-self-center { + align-self:center !important +} + +.flex-self-baseline { + align-self:baseline !important +} + +.flex-self-stretch { + align-self:stretch !important +} + +.flex-item-equal { + flex-grow: 1; + flex-basis:0 +} + +@media (min-width: 544px) { + .flex-sm-row { + flex-direction:row !important + } + + .flex-sm-row-reverse { + flex-direction:row-reverse !important + } + + .flex-sm-column { + flex-direction:column !important + } + + .flex-sm-wrap { + flex-wrap:wrap !important + } + + .flex-sm-nowrap { + flex-wrap:nowrap !important + } + + .flex-sm-justify-start { + justify-content:flex-start !important + } + + .flex-sm-justify-end { + justify-content:flex-end !important + } + + .flex-sm-justify-center { + justify-content:center !important + } + + .flex-sm-justify-between { + justify-content:space-between !important + } + + .flex-sm-justify-around { + justify-content:space-around !important + } + + .flex-sm-items-start { + align-items:flex-start !important + } + + .flex-sm-items-end { + align-items:flex-end !important + } + + .flex-sm-items-center { + align-items:center !important + } + + .flex-sm-items-baseline { + align-items:baseline !important + } + + .flex-sm-items-stretch { + align-items:stretch !important + } + + .flex-sm-content-start { + align-content:flex-start !important + } + + .flex-sm-content-end { + align-content:flex-end !important + } + + .flex-sm-content-center { + align-content:center !important + } + + .flex-sm-content-between { + align-content:space-between !important + } + + .flex-sm-content-around { + align-content:space-around !important + } + + .flex-sm-content-stretch { + align-content:stretch !important + } + + .flex-sm-auto { + flex:1 1 auto !important + } + + .flex-sm-shrink-0 { + flex-shrink:0 !important + } + + .flex-sm-self-auto { + align-self:auto !important + } + + .flex-sm-self-start { + align-self:flex-start !important + } + + .flex-sm-self-end { + align-self:flex-end !important + } + + .flex-sm-self-center { + align-self:center !important + } + + .flex-sm-self-baseline { + align-self:baseline !important + } + + .flex-sm-self-stretch { + align-self:stretch !important + } + + .flex-sm-item-equal { + flex-grow: 1; + flex-basis:0 + } +} + +@media (min-width: 768px) { + .flex-md-row { + flex-direction:row !important + } + + .flex-md-row-reverse { + flex-direction:row-reverse !important + } + + .flex-md-column { + flex-direction:column !important + } + + .flex-md-wrap { + flex-wrap:wrap !important + } + + .flex-md-nowrap { + flex-wrap:nowrap !important + } + + .flex-md-justify-start { + justify-content:flex-start !important + } + + .flex-md-justify-end { + justify-content:flex-end !important + } + + .flex-md-justify-center { + justify-content:center !important + } + + .flex-md-justify-between { + justify-content:space-between !important + } + + .flex-md-justify-around { + justify-content:space-around !important + } + + .flex-md-items-start { + align-items:flex-start !important + } + + .flex-md-items-end { + align-items:flex-end !important + } + + .flex-md-items-center { + align-items:center !important + } + + .flex-md-items-baseline { + align-items:baseline !important + } + + .flex-md-items-stretch { + align-items:stretch !important + } + + .flex-md-content-start { + align-content:flex-start !important + } + + .flex-md-content-end { + align-content:flex-end !important + } + + .flex-md-content-center { + align-content:center !important + } + + .flex-md-content-between { + align-content:space-between !important + } + + .flex-md-content-around { + align-content:space-around !important + } + + .flex-md-content-stretch { + align-content:stretch !important + } + + .flex-md-auto { + flex:1 1 auto !important + } + + .flex-md-shrink-0 { + flex-shrink:0 !important + } + + .flex-md-self-auto { + align-self:auto !important + } + + .flex-md-self-start { + align-self:flex-start !important + } + + .flex-md-self-end { + align-self:flex-end !important + } + + .flex-md-self-center { + align-self:center !important + } + + .flex-md-self-baseline { + align-self:baseline !important + } + + .flex-md-self-stretch { + align-self:stretch !important + } + + .flex-md-item-equal { + flex-grow: 1; + flex-basis:0 + } +} + +@media (min-width: 1012px) { + .flex-lg-row { + flex-direction:row !important + } + + .flex-lg-row-reverse { + flex-direction:row-reverse !important + } + + .flex-lg-column { + flex-direction:column !important + } + + .flex-lg-wrap { + flex-wrap:wrap !important + } + + .flex-lg-nowrap { + flex-wrap:nowrap !important + } + + .flex-lg-justify-start { + justify-content:flex-start !important + } + + .flex-lg-justify-end { + justify-content:flex-end !important + } + + .flex-lg-justify-center { + justify-content:center !important + } + + .flex-lg-justify-between { + justify-content:space-between !important + } + + .flex-lg-justify-around { + justify-content:space-around !important + } + + .flex-lg-items-start { + align-items:flex-start !important + } + + .flex-lg-items-end { + align-items:flex-end !important + } + + .flex-lg-items-center { + align-items:center !important + } + + .flex-lg-items-baseline { + align-items:baseline !important + } + + .flex-lg-items-stretch { + align-items:stretch !important + } + + .flex-lg-content-start { + align-content:flex-start !important + } + + .flex-lg-content-end { + align-content:flex-end !important + } + + .flex-lg-content-center { + align-content:center !important + } + + .flex-lg-content-between { + align-content:space-between !important + } + + .flex-lg-content-around { + align-content:space-around !important + } + + .flex-lg-content-stretch { + align-content:stretch !important + } + + .flex-lg-auto { + flex:1 1 auto !important + } + + .flex-lg-shrink-0 { + flex-shrink:0 !important + } + + .flex-lg-self-auto { + align-self:auto !important + } + + .flex-lg-self-start { + align-self:flex-start !important + } + + .flex-lg-self-end { + align-self:flex-end !important + } + + .flex-lg-self-center { + align-self:center !important + } + + .flex-lg-self-baseline { + align-self:baseline !important + } + + .flex-lg-self-stretch { + align-self:stretch !important + } + + .flex-lg-item-equal { + flex-grow: 1; + flex-basis:0 + } +} + +@media (min-width: 1280px) { + .flex-xl-row { + flex-direction:row !important + } + + .flex-xl-row-reverse { + flex-direction:row-reverse !important + } + + .flex-xl-column { + flex-direction:column !important + } + + .flex-xl-wrap { + flex-wrap:wrap !important + } + + .flex-xl-nowrap { + flex-wrap:nowrap !important + } + + .flex-xl-justify-start { + justify-content:flex-start !important + } + + .flex-xl-justify-end { + justify-content:flex-end !important + } + + .flex-xl-justify-center { + justify-content:center !important + } + + .flex-xl-justify-between { + justify-content:space-between !important + } + + .flex-xl-justify-around { + justify-content:space-around !important + } + + .flex-xl-items-start { + align-items:flex-start !important + } + + .flex-xl-items-end { + align-items:flex-end !important + } + + .flex-xl-items-center { + align-items:center !important + } + + .flex-xl-items-baseline { + align-items:baseline !important + } + + .flex-xl-items-stretch { + align-items:stretch !important + } + + .flex-xl-content-start { + align-content:flex-start !important + } + + .flex-xl-content-end { + align-content:flex-end !important + } + + .flex-xl-content-center { + align-content:center !important + } + + .flex-xl-content-between { + align-content:space-between !important + } + + .flex-xl-content-around { + align-content:space-around !important + } + + .flex-xl-content-stretch { + align-content:stretch !important + } + + .flex-xl-auto { + flex:1 1 auto !important + } + + .flex-xl-shrink-0 { + flex-shrink:0 !important + } + + .flex-xl-self-auto { + align-self:auto !important + } + + .flex-xl-self-start { + align-self:flex-start !important + } + + .flex-xl-self-end { + align-self:flex-end !important + } + + .flex-xl-self-center { + align-self:center !important + } + + .flex-xl-self-baseline { + align-self:baseline !important + } + + .flex-xl-self-stretch { + align-self:stretch !important + } + + .flex-xl-item-equal { + flex-grow: 1; + flex-basis:0 + } +} + +.position-static { + position:static !important +} + +.position-relative { + position:relative !important +} + +.position-absolute { + position:absolute !important +} + +.position-fixed { + position:fixed !important +} + +.top-0 { + top:0 !important +} + +.right-0 { + right:0 !important +} + +.bottom-0 { + bottom:0 !important +} + +.left-0 { + left:0 !important +} + +.v-align-middle { + vertical-align:middle !important +} + +.v-align-top { + vertical-align:top !important +} + +.v-align-bottom { + vertical-align:bottom !important +} + +.v-align-text-top { + vertical-align:text-top !important +} + +.v-align-text-bottom { + vertical-align:text-bottom !important +} + +.v-align-baseline { + vertical-align:baseline !important +} + +.overflow-hidden { + overflow:hidden !important +} + +.overflow-scroll { + overflow:scroll !important +} + +.overflow-auto { + overflow:auto !important +} + +.clearfix::before { + display: table; + content: "" +} + +.clearfix::after { + display: table; + clear: both; + content: "" +} + +.float-left { + float:left !important +} + +.float-right { + float:right !important +} + +.float-none { + float:none !important +} + +@media (min-width: 544px) { + .float-sm-left { + float:left !important + } + + .float-sm-right { + float:right !important + } + + .float-sm-none { + float:none !important + } +} + +@media (min-width: 768px) { + .float-md-left { + float:left !important + } + + .float-md-right { + float:right !important + } + + .float-md-none { + float:none !important + } +} + +@media (min-width: 1012px) { + .float-lg-left { + float:left !important + } + + .float-lg-right { + float:right !important + } + + .float-lg-none { + float:none !important + } +} + +@media (min-width: 1280px) { + .float-xl-left { + float:left !important + } + + .float-xl-right { + float:right !important + } + + .float-xl-none { + float:none !important + } +} + +.width-fit { + max-width:100% !important +} + +.width-full { + width:100% !important +} + +.height-fit { + max-height:100% !important +} + +.height-full { + height:100% !important +} + +.min-width-0 { + min-width:0 !important +} + +.direction-rtl { + direction:rtl !important +} + +.direction-ltr { + direction:ltr !important +} + +@media (min-width: 544px) { + .direction-sm-rtl { + direction:rtl !important + } + + .direction-sm-ltr { + direction:ltr !important + } +} + +@media (min-width: 768px) { + .direction-md-rtl { + direction:rtl !important + } + + .direction-md-ltr { + direction:ltr !important + } +} + +@media (min-width: 1012px) { + .direction-lg-rtl { + direction:rtl !important + } + + .direction-lg-ltr { + direction:ltr !important + } +} + +@media (min-width: 1280px) { + .direction-xl-rtl { + direction:rtl !important + } + + .direction-xl-ltr { + direction:ltr !important + } +} + +.m-0 { + margin:0 !important +} + +.mt-0 { + margin-top:0 !important +} + +.mr-0 { + margin-right:0 !important +} + +.mb-0 { + margin-bottom:0 !important +} + +.ml-0 { + margin-left:0 !important +} + +.mx-0 { + margin-right: 0 !important; + margin-left:0 !important +} + +.my-0 { + margin-top: 0 !important; + margin-bottom:0 !important +} + +.m-1 { + margin:4px !important +} + +.mt-1 { + margin-top:4px !important +} + +.mr-1 { + margin-right:4px !important +} + +.mb-1 { + margin-bottom:4px !important +} + +.ml-1 { + margin-left:4px !important +} + +.mt-n1 { + margin-top:-4px !important +} + +.mr-n1 { + margin-right:-4px !important +} + +.mb-n1 { + margin-bottom:-4px !important +} + +.ml-n1 { + margin-left:-4px !important +} + +.mx-1 { + margin-right: 4px !important; + margin-left:4px !important +} + +.my-1 { + margin-top: 4px !important; + margin-bottom:4px !important +} + +.m-2 { + margin:8px !important +} + +.mt-2 { + margin-top:8px !important +} + +.mr-2 { + margin-right:8px !important +} + +.mb-2 { + margin-bottom:8px !important +} + +.ml-2 { + margin-left:8px !important +} + +.mt-n2 { + margin-top:-8px !important +} + +.mr-n2 { + margin-right:-8px !important +} + +.mb-n2 { + margin-bottom:-8px !important +} + +.ml-n2 { + margin-left:-8px !important +} + +.mx-2 { + margin-right: 8px !important; + margin-left:8px !important +} + +.my-2 { + margin-top: 8px !important; + margin-bottom:8px !important +} + +.m-3 { + margin:16px !important +} + +.mt-3 { + margin-top:16px !important +} + +.mr-3 { + margin-right:16px !important +} + +.mb-3 { + margin-bottom:16px !important +} + +.ml-3 { + margin-left:16px !important +} + +.mt-n3 { + margin-top:-16px !important +} + +.mr-n3 { + margin-right:-16px !important +} + +.mb-n3 { + margin-bottom:-16px !important +} + +.ml-n3 { + margin-left:-16px !important +} + +.mx-3 { + margin-right: 16px !important; + margin-left:16px !important +} + +.my-3 { + margin-top: 16px !important; + margin-bottom:16px !important +} + +.m-4 { + margin:24px !important +} + +.mt-4 { + margin-top:24px !important +} + +.mr-4 { + margin-right:24px !important +} + +.mb-4 { + margin-bottom:24px !important +} + +.ml-4 { + margin-left:24px !important +} + +.mt-n4 { + margin-top:-24px !important +} + +.mr-n4 { + margin-right:-24px !important +} + +.mb-n4 { + margin-bottom:-24px !important +} + +.ml-n4 { + margin-left:-24px !important +} + +.mx-4 { + margin-right: 24px !important; + margin-left:24px !important +} + +.my-4 { + margin-top: 24px !important; + margin-bottom:24px !important +} + +.m-5 { + margin:32px !important +} + +.mt-5 { + margin-top:32px !important +} + +.mr-5 { + margin-right:32px !important +} + +.mb-5 { + margin-bottom:32px !important +} + +.ml-5 { + margin-left:32px !important +} + +.mt-n5 { + margin-top:-32px !important +} + +.mr-n5 { + margin-right:-32px !important +} + +.mb-n5 { + margin-bottom:-32px !important +} + +.ml-n5 { + margin-left:-32px !important +} + +.mx-5 { + margin-right: 32px !important; + margin-left:32px !important +} + +.my-5 { + margin-top: 32px !important; + margin-bottom:32px !important +} + +.m-6 { + margin:40px !important +} + +.mt-6 { + margin-top:40px !important +} + +.mr-6 { + margin-right:40px !important +} + +.mb-6 { + margin-bottom:40px !important +} + +.ml-6 { + margin-left:40px !important +} + +.mt-n6 { + margin-top:-40px !important +} + +.mr-n6 { + margin-right:-40px !important +} + +.mb-n6 { + margin-bottom:-40px !important +} + +.ml-n6 { + margin-left:-40px !important +} + +.mx-6 { + margin-right: 40px !important; + margin-left:40px !important +} + +.my-6 { + margin-top: 40px !important; + margin-bottom:40px !important +} + +.mx-auto { + margin-right: auto !important; + margin-left:auto !important +} + +@media (min-width: 544px) { + .m-sm-0 { + margin:0 !important + } + + .mt-sm-0 { + margin-top:0 !important + } + + .mr-sm-0 { + margin-right:0 !important + } + + .mb-sm-0 { + margin-bottom:0 !important + } + + .ml-sm-0 { + margin-left:0 !important + } + + .mx-sm-0 { + margin-right: 0 !important; + margin-left:0 !important + } + + .my-sm-0 { + margin-top: 0 !important; + margin-bottom:0 !important + } + + .m-sm-1 { + margin:4px !important + } + + .mt-sm-1 { + margin-top:4px !important + } + + .mr-sm-1 { + margin-right:4px !important + } + + .mb-sm-1 { + margin-bottom:4px !important + } + + .ml-sm-1 { + margin-left:4px !important + } + + .mt-sm-n1 { + margin-top:-4px !important + } + + .mr-sm-n1 { + margin-right:-4px !important + } + + .mb-sm-n1 { + margin-bottom:-4px !important + } + + .ml-sm-n1 { + margin-left:-4px !important + } + + .mx-sm-1 { + margin-right: 4px !important; + margin-left:4px !important + } + + .my-sm-1 { + margin-top: 4px !important; + margin-bottom:4px !important + } + + .m-sm-2 { + margin:8px !important + } + + .mt-sm-2 { + margin-top:8px !important + } + + .mr-sm-2 { + margin-right:8px !important + } + + .mb-sm-2 { + margin-bottom:8px !important + } + + .ml-sm-2 { + margin-left:8px !important + } + + .mt-sm-n2 { + margin-top:-8px !important + } + + .mr-sm-n2 { + margin-right:-8px !important + } + + .mb-sm-n2 { + margin-bottom:-8px !important + } + + .ml-sm-n2 { + margin-left:-8px !important + } + + .mx-sm-2 { + margin-right: 8px !important; + margin-left:8px !important + } + + .my-sm-2 { + margin-top: 8px !important; + margin-bottom:8px !important + } + + .m-sm-3 { + margin:16px !important + } + + .mt-sm-3 { + margin-top:16px !important + } + + .mr-sm-3 { + margin-right:16px !important + } + + .mb-sm-3 { + margin-bottom:16px !important + } + + .ml-sm-3 { + margin-left:16px !important + } + + .mt-sm-n3 { + margin-top:-16px !important + } + + .mr-sm-n3 { + margin-right:-16px !important + } + + .mb-sm-n3 { + margin-bottom:-16px !important + } + + .ml-sm-n3 { + margin-left:-16px !important + } + + .mx-sm-3 { + margin-right: 16px !important; + margin-left:16px !important + } + + .my-sm-3 { + margin-top: 16px !important; + margin-bottom:16px !important + } + + .m-sm-4 { + margin:24px !important + } + + .mt-sm-4 { + margin-top:24px !important + } + + .mr-sm-4 { + margin-right:24px !important + } + + .mb-sm-4 { + margin-bottom:24px !important + } + + .ml-sm-4 { + margin-left:24px !important + } + + .mt-sm-n4 { + margin-top:-24px !important + } + + .mr-sm-n4 { + margin-right:-24px !important + } + + .mb-sm-n4 { + margin-bottom:-24px !important + } + + .ml-sm-n4 { + margin-left:-24px !important + } + + .mx-sm-4 { + margin-right: 24px !important; + margin-left:24px !important + } + + .my-sm-4 { + margin-top: 24px !important; + margin-bottom:24px !important + } + + .m-sm-5 { + margin:32px !important + } + + .mt-sm-5 { + margin-top:32px !important + } + + .mr-sm-5 { + margin-right:32px !important + } + + .mb-sm-5 { + margin-bottom:32px !important + } + + .ml-sm-5 { + margin-left:32px !important + } + + .mt-sm-n5 { + margin-top:-32px !important + } + + .mr-sm-n5 { + margin-right:-32px !important + } + + .mb-sm-n5 { + margin-bottom:-32px !important + } + + .ml-sm-n5 { + margin-left:-32px !important + } + + .mx-sm-5 { + margin-right: 32px !important; + margin-left:32px !important + } + + .my-sm-5 { + margin-top: 32px !important; + margin-bottom:32px !important + } + + .m-sm-6 { + margin:40px !important + } + + .mt-sm-6 { + margin-top:40px !important + } + + .mr-sm-6 { + margin-right:40px !important + } + + .mb-sm-6 { + margin-bottom:40px !important + } + + .ml-sm-6 { + margin-left:40px !important + } + + .mt-sm-n6 { + margin-top:-40px !important + } + + .mr-sm-n6 { + margin-right:-40px !important + } + + .mb-sm-n6 { + margin-bottom:-40px !important + } + + .ml-sm-n6 { + margin-left:-40px !important + } + + .mx-sm-6 { + margin-right: 40px !important; + margin-left:40px !important + } + + .my-sm-6 { + margin-top: 40px !important; + margin-bottom:40px !important + } + + .mx-sm-auto { + margin-right: auto !important; + margin-left:auto !important + } +} + +@media (min-width: 768px) { + .m-md-0 { + margin:0 !important + } + + .mt-md-0 { + margin-top:0 !important + } + + .mr-md-0 { + margin-right:0 !important + } + + .mb-md-0 { + margin-bottom:0 !important + } + + .ml-md-0 { + margin-left:0 !important + } + + .mx-md-0 { + margin-right: 0 !important; + margin-left:0 !important + } + + .my-md-0 { + margin-top: 0 !important; + margin-bottom:0 !important + } + + .m-md-1 { + margin:4px !important + } + + .mt-md-1 { + margin-top:4px !important + } + + .mr-md-1 { + margin-right:4px !important + } + + .mb-md-1 { + margin-bottom:4px !important + } + + .ml-md-1 { + margin-left:4px !important + } + + .mt-md-n1 { + margin-top:-4px !important + } + + .mr-md-n1 { + margin-right:-4px !important + } + + .mb-md-n1 { + margin-bottom:-4px !important + } + + .ml-md-n1 { + margin-left:-4px !important + } + + .mx-md-1 { + margin-right: 4px !important; + margin-left:4px !important + } + + .my-md-1 { + margin-top: 4px !important; + margin-bottom:4px !important + } + + .m-md-2 { + margin:8px !important + } + + .mt-md-2 { + margin-top:8px !important + } + + .mr-md-2 { + margin-right:8px !important + } + + .mb-md-2 { + margin-bottom:8px !important + } + + .ml-md-2 { + margin-left:8px !important + } + + .mt-md-n2 { + margin-top:-8px !important + } + + .mr-md-n2 { + margin-right:-8px !important + } + + .mb-md-n2 { + margin-bottom:-8px !important + } + + .ml-md-n2 { + margin-left:-8px !important + } + + .mx-md-2 { + margin-right: 8px !important; + margin-left:8px !important + } + + .my-md-2 { + margin-top: 8px !important; + margin-bottom:8px !important + } + + .m-md-3 { + margin:16px !important + } + + .mt-md-3 { + margin-top:16px !important + } + + .mr-md-3 { + margin-right:16px !important + } + + .mb-md-3 { + margin-bottom:16px !important + } + + .ml-md-3 { + margin-left:16px !important + } + + .mt-md-n3 { + margin-top:-16px !important + } + + .mr-md-n3 { + margin-right:-16px !important + } + + .mb-md-n3 { + margin-bottom:-16px !important + } + + .ml-md-n3 { + margin-left:-16px !important + } + + .mx-md-3 { + margin-right: 16px !important; + margin-left:16px !important + } + + .my-md-3 { + margin-top: 16px !important; + margin-bottom:16px !important + } + + .m-md-4 { + margin:24px !important + } + + .mt-md-4 { + margin-top:24px !important + } + + .mr-md-4 { + margin-right:24px !important + } + + .mb-md-4 { + margin-bottom:24px !important + } + + .ml-md-4 { + margin-left:24px !important + } + + .mt-md-n4 { + margin-top:-24px !important + } + + .mr-md-n4 { + margin-right:-24px !important + } + + .mb-md-n4 { + margin-bottom:-24px !important + } + + .ml-md-n4 { + margin-left:-24px !important + } + + .mx-md-4 { + margin-right: 24px !important; + margin-left:24px !important + } + + .my-md-4 { + margin-top: 24px !important; + margin-bottom:24px !important + } + + .m-md-5 { + margin:32px !important + } + + .mt-md-5 { + margin-top:32px !important + } + + .mr-md-5 { + margin-right:32px !important + } + + .mb-md-5 { + margin-bottom:32px !important + } + + .ml-md-5 { + margin-left:32px !important + } + + .mt-md-n5 { + margin-top:-32px !important + } + + .mr-md-n5 { + margin-right:-32px !important + } + + .mb-md-n5 { + margin-bottom:-32px !important + } + + .ml-md-n5 { + margin-left:-32px !important + } + + .mx-md-5 { + margin-right: 32px !important; + margin-left:32px !important + } + + .my-md-5 { + margin-top: 32px !important; + margin-bottom:32px !important + } + + .m-md-6 { + margin:40px !important + } + + .mt-md-6 { + margin-top:40px !important + } + + .mr-md-6 { + margin-right:40px !important + } + + .mb-md-6 { + margin-bottom:40px !important + } + + .ml-md-6 { + margin-left:40px !important + } + + .mt-md-n6 { + margin-top:-40px !important + } + + .mr-md-n6 { + margin-right:-40px !important + } + + .mb-md-n6 { + margin-bottom:-40px !important + } + + .ml-md-n6 { + margin-left:-40px !important + } + + .mx-md-6 { + margin-right: 40px !important; + margin-left:40px !important + } + + .my-md-6 { + margin-top: 40px !important; + margin-bottom:40px !important + } + + .mx-md-auto { + margin-right: auto !important; + margin-left:auto !important + } +} + +@media (min-width: 1012px) { + .m-lg-0 { + margin:0 !important + } + + .mt-lg-0 { + margin-top:0 !important + } + + .mr-lg-0 { + margin-right:0 !important + } + + .mb-lg-0 { + margin-bottom:0 !important + } + + .ml-lg-0 { + margin-left:0 !important + } + + .mx-lg-0 { + margin-right: 0 !important; + margin-left:0 !important + } + + .my-lg-0 { + margin-top: 0 !important; + margin-bottom:0 !important + } + + .m-lg-1 { + margin:4px !important + } + + .mt-lg-1 { + margin-top:4px !important + } + + .mr-lg-1 { + margin-right:4px !important + } + + .mb-lg-1 { + margin-bottom:4px !important + } + + .ml-lg-1 { + margin-left:4px !important + } + + .mt-lg-n1 { + margin-top:-4px !important + } + + .mr-lg-n1 { + margin-right:-4px !important + } + + .mb-lg-n1 { + margin-bottom:-4px !important + } + + .ml-lg-n1 { + margin-left:-4px !important + } + + .mx-lg-1 { + margin-right: 4px !important; + margin-left:4px !important + } + + .my-lg-1 { + margin-top: 4px !important; + margin-bottom:4px !important + } + + .m-lg-2 { + margin:8px !important + } + + .mt-lg-2 { + margin-top:8px !important + } + + .mr-lg-2 { + margin-right:8px !important + } + + .mb-lg-2 { + margin-bottom:8px !important + } + + .ml-lg-2 { + margin-left:8px !important + } + + .mt-lg-n2 { + margin-top:-8px !important + } + + .mr-lg-n2 { + margin-right:-8px !important + } + + .mb-lg-n2 { + margin-bottom:-8px !important + } + + .ml-lg-n2 { + margin-left:-8px !important + } + + .mx-lg-2 { + margin-right: 8px !important; + margin-left:8px !important + } + + .my-lg-2 { + margin-top: 8px !important; + margin-bottom:8px !important + } + + .m-lg-3 { + margin:16px !important + } + + .mt-lg-3 { + margin-top:16px !important + } + + .mr-lg-3 { + margin-right:16px !important + } + + .mb-lg-3 { + margin-bottom:16px !important + } + + .ml-lg-3 { + margin-left:16px !important + } + + .mt-lg-n3 { + margin-top:-16px !important + } + + .mr-lg-n3 { + margin-right:-16px !important + } + + .mb-lg-n3 { + margin-bottom:-16px !important + } + + .ml-lg-n3 { + margin-left:-16px !important + } + + .mx-lg-3 { + margin-right: 16px !important; + margin-left:16px !important + } + + .my-lg-3 { + margin-top: 16px !important; + margin-bottom:16px !important + } + + .m-lg-4 { + margin:24px !important + } + + .mt-lg-4 { + margin-top:24px !important + } + + .mr-lg-4 { + margin-right:24px !important + } + + .mb-lg-4 { + margin-bottom:24px !important + } + + .ml-lg-4 { + margin-left:24px !important + } + + .mt-lg-n4 { + margin-top:-24px !important + } + + .mr-lg-n4 { + margin-right:-24px !important + } + + .mb-lg-n4 { + margin-bottom:-24px !important + } + + .ml-lg-n4 { + margin-left:-24px !important + } + + .mx-lg-4 { + margin-right: 24px !important; + margin-left:24px !important + } + + .my-lg-4 { + margin-top: 24px !important; + margin-bottom:24px !important + } + + .m-lg-5 { + margin:32px !important + } + + .mt-lg-5 { + margin-top:32px !important + } + + .mr-lg-5 { + margin-right:32px !important + } + + .mb-lg-5 { + margin-bottom:32px !important + } + + .ml-lg-5 { + margin-left:32px !important + } + + .mt-lg-n5 { + margin-top:-32px !important + } + + .mr-lg-n5 { + margin-right:-32px !important + } + + .mb-lg-n5 { + margin-bottom:-32px !important + } + + .ml-lg-n5 { + margin-left:-32px !important + } + + .mx-lg-5 { + margin-right: 32px !important; + margin-left:32px !important + } + + .my-lg-5 { + margin-top: 32px !important; + margin-bottom:32px !important + } + + .m-lg-6 { + margin:40px !important + } + + .mt-lg-6 { + margin-top:40px !important + } + + .mr-lg-6 { + margin-right:40px !important + } + + .mb-lg-6 { + margin-bottom:40px !important + } + + .ml-lg-6 { + margin-left:40px !important + } + + .mt-lg-n6 { + margin-top:-40px !important + } + + .mr-lg-n6 { + margin-right:-40px !important + } + + .mb-lg-n6 { + margin-bottom:-40px !important + } + + .ml-lg-n6 { + margin-left:-40px !important + } + + .mx-lg-6 { + margin-right: 40px !important; + margin-left:40px !important + } + + .my-lg-6 { + margin-top: 40px !important; + margin-bottom:40px !important + } + + .mx-lg-auto { + margin-right: auto !important; + margin-left:auto !important + } +} + +@media (min-width: 1280px) { + .m-xl-0 { + margin:0 !important + } + + .mt-xl-0 { + margin-top:0 !important + } + + .mr-xl-0 { + margin-right:0 !important + } + + .mb-xl-0 { + margin-bottom:0 !important + } + + .ml-xl-0 { + margin-left:0 !important + } + + .mx-xl-0 { + margin-right: 0 !important; + margin-left:0 !important + } + + .my-xl-0 { + margin-top: 0 !important; + margin-bottom:0 !important + } + + .m-xl-1 { + margin:4px !important + } + + .mt-xl-1 { + margin-top:4px !important + } + + .mr-xl-1 { + margin-right:4px !important + } + + .mb-xl-1 { + margin-bottom:4px !important + } + + .ml-xl-1 { + margin-left:4px !important + } + + .mt-xl-n1 { + margin-top:-4px !important + } + + .mr-xl-n1 { + margin-right:-4px !important + } + + .mb-xl-n1 { + margin-bottom:-4px !important + } + + .ml-xl-n1 { + margin-left:-4px !important + } + + .mx-xl-1 { + margin-right: 4px !important; + margin-left:4px !important + } + + .my-xl-1 { + margin-top: 4px !important; + margin-bottom:4px !important + } + + .m-xl-2 { + margin:8px !important + } + + .mt-xl-2 { + margin-top:8px !important + } + + .mr-xl-2 { + margin-right:8px !important + } + + .mb-xl-2 { + margin-bottom:8px !important + } + + .ml-xl-2 { + margin-left:8px !important + } + + .mt-xl-n2 { + margin-top:-8px !important + } + + .mr-xl-n2 { + margin-right:-8px !important + } + + .mb-xl-n2 { + margin-bottom:-8px !important + } + + .ml-xl-n2 { + margin-left:-8px !important + } + + .mx-xl-2 { + margin-right: 8px !important; + margin-left:8px !important + } + + .my-xl-2 { + margin-top: 8px !important; + margin-bottom:8px !important + } + + .m-xl-3 { + margin:16px !important + } + + .mt-xl-3 { + margin-top:16px !important + } + + .mr-xl-3 { + margin-right:16px !important + } + + .mb-xl-3 { + margin-bottom:16px !important + } + + .ml-xl-3 { + margin-left:16px !important + } + + .mt-xl-n3 { + margin-top:-16px !important + } + + .mr-xl-n3 { + margin-right:-16px !important + } + + .mb-xl-n3 { + margin-bottom:-16px !important + } + + .ml-xl-n3 { + margin-left:-16px !important + } + + .mx-xl-3 { + margin-right: 16px !important; + margin-left:16px !important + } + + .my-xl-3 { + margin-top: 16px !important; + margin-bottom:16px !important + } + + .m-xl-4 { + margin:24px !important + } + + .mt-xl-4 { + margin-top:24px !important + } + + .mr-xl-4 { + margin-right:24px !important + } + + .mb-xl-4 { + margin-bottom:24px !important + } + + .ml-xl-4 { + margin-left:24px !important + } + + .mt-xl-n4 { + margin-top:-24px !important + } + + .mr-xl-n4 { + margin-right:-24px !important + } + + .mb-xl-n4 { + margin-bottom:-24px !important + } + + .ml-xl-n4 { + margin-left:-24px !important + } + + .mx-xl-4 { + margin-right: 24px !important; + margin-left:24px !important + } + + .my-xl-4 { + margin-top: 24px !important; + margin-bottom:24px !important + } + + .m-xl-5 { + margin:32px !important + } + + .mt-xl-5 { + margin-top:32px !important + } + + .mr-xl-5 { + margin-right:32px !important + } + + .mb-xl-5 { + margin-bottom:32px !important + } + + .ml-xl-5 { + margin-left:32px !important + } + + .mt-xl-n5 { + margin-top:-32px !important + } + + .mr-xl-n5 { + margin-right:-32px !important + } + + .mb-xl-n5 { + margin-bottom:-32px !important + } + + .ml-xl-n5 { + margin-left:-32px !important + } + + .mx-xl-5 { + margin-right: 32px !important; + margin-left:32px !important + } + + .my-xl-5 { + margin-top: 32px !important; + margin-bottom:32px !important + } + + .m-xl-6 { + margin:40px !important + } + + .mt-xl-6 { + margin-top:40px !important + } + + .mr-xl-6 { + margin-right:40px !important + } + + .mb-xl-6 { + margin-bottom:40px !important + } + + .ml-xl-6 { + margin-left:40px !important + } + + .mt-xl-n6 { + margin-top:-40px !important + } + + .mr-xl-n6 { + margin-right:-40px !important + } + + .mb-xl-n6 { + margin-bottom:-40px !important + } + + .ml-xl-n6 { + margin-left:-40px !important + } + + .mx-xl-6 { + margin-right: 40px !important; + margin-left:40px !important + } + + .my-xl-6 { + margin-top: 40px !important; + margin-bottom:40px !important + } + + .mx-xl-auto { + margin-right: auto !important; + margin-left:auto !important + } +} + +.p-0 { + padding:0 !important +} + +.pt-0 { + padding-top:0 !important +} + +.pr-0 { + padding-right:0 !important +} + +.pb-0 { + padding-bottom:0 !important +} + +.pl-0 { + padding-left:0 !important +} + +.px-0 { + padding-right: 0 !important; + padding-left:0 !important +} + +.py-0 { + padding-top: 0 !important; + padding-bottom:0 !important +} + +.p-1 { + padding:4px !important +} + +.pt-1 { + padding-top:4px !important +} + +.pr-1 { + padding-right:4px !important +} + +.pb-1 { + padding-bottom:4px !important +} + +.pl-1 { + padding-left:4px !important +} + +.px-1 { + padding-right: 4px !important; + padding-left:4px !important +} + +.py-1 { + padding-top: 4px !important; + padding-bottom:4px !important +} + +.p-2 { + padding:8px !important +} + +.pt-2 { + padding-top:8px !important +} + +.pr-2 { + padding-right:8px !important +} + +.pb-2 { + padding-bottom:8px !important +} + +.pl-2 { + padding-left:8px !important +} + +.px-2 { + padding-right: 8px !important; + padding-left:8px !important +} + +.py-2 { + padding-top: 8px !important; + padding-bottom:8px !important +} + +.p-3 { + padding:16px !important +} + +.pt-3 { + padding-top:16px !important +} + +.pr-3 { + padding-right:16px !important +} + +.pb-3 { + padding-bottom:16px !important +} + +.pl-3 { + padding-left:16px !important +} + +.px-3 { + padding-right: 16px !important; + padding-left:16px !important +} + +.py-3 { + padding-top: 16px !important; + padding-bottom:16px !important +} + +.p-4 { + padding:24px !important +} + +.pt-4 { + padding-top:24px !important +} + +.pr-4 { + padding-right:24px !important +} + +.pb-4 { + padding-bottom:24px !important +} + +.pl-4 { + padding-left:24px !important +} + +.px-4 { + padding-right: 24px !important; + padding-left:24px !important +} + +.py-4 { + padding-top: 24px !important; + padding-bottom:24px !important +} + +.p-5 { + padding:32px !important +} + +.pt-5 { + padding-top:32px !important +} + +.pr-5 { + padding-right:32px !important +} + +.pb-5 { + padding-bottom:32px !important +} + +.pl-5 { + padding-left:32px !important +} + +.px-5 { + padding-right: 32px !important; + padding-left:32px !important +} + +.py-5 { + padding-top: 32px !important; + padding-bottom:32px !important +} + +.p-6 { + padding:40px !important +} + +.pt-6 { + padding-top:40px !important +} + +.pr-6 { + padding-right:40px !important +} + +.pb-6 { + padding-bottom:40px !important +} + +.pl-6 { + padding-left:40px !important +} + +.px-6 { + padding-right: 40px !important; + padding-left:40px !important +} + +.py-6 { + padding-top: 40px !important; + padding-bottom:40px !important +} + +@media (min-width: 544px) { + .p-sm-0 { + padding:0 !important + } + + .pt-sm-0 { + padding-top:0 !important + } + + .pr-sm-0 { + padding-right:0 !important + } + + .pb-sm-0 { + padding-bottom:0 !important + } + + .pl-sm-0 { + padding-left:0 !important + } + + .px-sm-0 { + padding-right: 0 !important; + padding-left:0 !important + } + + .py-sm-0 { + padding-top: 0 !important; + padding-bottom:0 !important + } + + .p-sm-1 { + padding:4px !important + } + + .pt-sm-1 { + padding-top:4px !important + } + + .pr-sm-1 { + padding-right:4px !important + } + + .pb-sm-1 { + padding-bottom:4px !important + } + + .pl-sm-1 { + padding-left:4px !important + } + + .px-sm-1 { + padding-right: 4px !important; + padding-left:4px !important + } + + .py-sm-1 { + padding-top: 4px !important; + padding-bottom:4px !important + } + + .p-sm-2 { + padding:8px !important + } + + .pt-sm-2 { + padding-top:8px !important + } + + .pr-sm-2 { + padding-right:8px !important + } + + .pb-sm-2 { + padding-bottom:8px !important + } + + .pl-sm-2 { + padding-left:8px !important + } + + .px-sm-2 { + padding-right: 8px !important; + padding-left:8px !important + } + + .py-sm-2 { + padding-top: 8px !important; + padding-bottom:8px !important + } + + .p-sm-3 { + padding:16px !important + } + + .pt-sm-3 { + padding-top:16px !important + } + + .pr-sm-3 { + padding-right:16px !important + } + + .pb-sm-3 { + padding-bottom:16px !important + } + + .pl-sm-3 { + padding-left:16px !important + } + + .px-sm-3 { + padding-right: 16px !important; + padding-left:16px !important + } + + .py-sm-3 { + padding-top: 16px !important; + padding-bottom:16px !important + } + + .p-sm-4 { + padding:24px !important + } + + .pt-sm-4 { + padding-top:24px !important + } + + .pr-sm-4 { + padding-right:24px !important + } + + .pb-sm-4 { + padding-bottom:24px !important + } + + .pl-sm-4 { + padding-left:24px !important + } + + .px-sm-4 { + padding-right: 24px !important; + padding-left:24px !important + } + + .py-sm-4 { + padding-top: 24px !important; + padding-bottom:24px !important + } + + .p-sm-5 { + padding:32px !important + } + + .pt-sm-5 { + padding-top:32px !important + } + + .pr-sm-5 { + padding-right:32px !important + } + + .pb-sm-5 { + padding-bottom:32px !important + } + + .pl-sm-5 { + padding-left:32px !important + } + + .px-sm-5 { + padding-right: 32px !important; + padding-left:32px !important + } + + .py-sm-5 { + padding-top: 32px !important; + padding-bottom:32px !important + } + + .p-sm-6 { + padding:40px !important + } + + .pt-sm-6 { + padding-top:40px !important + } + + .pr-sm-6 { + padding-right:40px !important + } + + .pb-sm-6 { + padding-bottom:40px !important + } + + .pl-sm-6 { + padding-left:40px !important + } + + .px-sm-6 { + padding-right: 40px !important; + padding-left:40px !important + } + + .py-sm-6 { + padding-top: 40px !important; + padding-bottom:40px !important + } +} + +@media (min-width: 768px) { + .p-md-0 { + padding:0 !important + } + + .pt-md-0 { + padding-top:0 !important + } + + .pr-md-0 { + padding-right:0 !important + } + + .pb-md-0 { + padding-bottom:0 !important + } + + .pl-md-0 { + padding-left:0 !important + } + + .px-md-0 { + padding-right: 0 !important; + padding-left:0 !important + } + + .py-md-0 { + padding-top: 0 !important; + padding-bottom:0 !important + } + + .p-md-1 { + padding:4px !important + } + + .pt-md-1 { + padding-top:4px !important + } + + .pr-md-1 { + padding-right:4px !important + } + + .pb-md-1 { + padding-bottom:4px !important + } + + .pl-md-1 { + padding-left:4px !important + } + + .px-md-1 { + padding-right: 4px !important; + padding-left:4px !important + } + + .py-md-1 { + padding-top: 4px !important; + padding-bottom:4px !important + } + + .p-md-2 { + padding:8px !important + } + + .pt-md-2 { + padding-top:8px !important + } + + .pr-md-2 { + padding-right:8px !important + } + + .pb-md-2 { + padding-bottom:8px !important + } + + .pl-md-2 { + padding-left:8px !important + } + + .px-md-2 { + padding-right: 8px !important; + padding-left:8px !important + } + + .py-md-2 { + padding-top: 8px !important; + padding-bottom:8px !important + } + + .p-md-3 { + padding:16px !important + } + + .pt-md-3 { + padding-top:16px !important + } + + .pr-md-3 { + padding-right:16px !important + } + + .pb-md-3 { + padding-bottom:16px !important + } + + .pl-md-3 { + padding-left:16px !important + } + + .px-md-3 { + padding-right: 16px !important; + padding-left:16px !important + } + + .py-md-3 { + padding-top: 16px !important; + padding-bottom:16px !important + } + + .p-md-4 { + padding:24px !important + } + + .pt-md-4 { + padding-top:24px !important + } + + .pr-md-4 { + padding-right:24px !important + } + + .pb-md-4 { + padding-bottom:24px !important + } + + .pl-md-4 { + padding-left:24px !important + } + + .px-md-4 { + padding-right: 24px !important; + padding-left:24px !important + } + + .py-md-4 { + padding-top: 24px !important; + padding-bottom:24px !important + } + + .p-md-5 { + padding:32px !important + } + + .pt-md-5 { + padding-top:32px !important + } + + .pr-md-5 { + padding-right:32px !important + } + + .pb-md-5 { + padding-bottom:32px !important + } + + .pl-md-5 { + padding-left:32px !important + } + + .px-md-5 { + padding-right: 32px !important; + padding-left:32px !important + } + + .py-md-5 { + padding-top: 32px !important; + padding-bottom:32px !important + } + + .p-md-6 { + padding:40px !important + } + + .pt-md-6 { + padding-top:40px !important + } + + .pr-md-6 { + padding-right:40px !important + } + + .pb-md-6 { + padding-bottom:40px !important + } + + .pl-md-6 { + padding-left:40px !important + } + + .px-md-6 { + padding-right: 40px !important; + padding-left:40px !important + } + + .py-md-6 { + padding-top: 40px !important; + padding-bottom:40px !important + } +} + +@media (min-width: 1012px) { + .p-lg-0 { + padding:0 !important + } + + .pt-lg-0 { + padding-top:0 !important + } + + .pr-lg-0 { + padding-right:0 !important + } + + .pb-lg-0 { + padding-bottom:0 !important + } + + .pl-lg-0 { + padding-left:0 !important + } + + .px-lg-0 { + padding-right: 0 !important; + padding-left:0 !important + } + + .py-lg-0 { + padding-top: 0 !important; + padding-bottom:0 !important + } + + .p-lg-1 { + padding:4px !important + } + + .pt-lg-1 { + padding-top:4px !important + } + + .pr-lg-1 { + padding-right:4px !important + } + + .pb-lg-1 { + padding-bottom:4px !important + } + + .pl-lg-1 { + padding-left:4px !important + } + + .px-lg-1 { + padding-right: 4px !important; + padding-left:4px !important + } + + .py-lg-1 { + padding-top: 4px !important; + padding-bottom:4px !important + } + + .p-lg-2 { + padding:8px !important + } + + .pt-lg-2 { + padding-top:8px !important + } + + .pr-lg-2 { + padding-right:8px !important + } + + .pb-lg-2 { + padding-bottom:8px !important + } + + .pl-lg-2 { + padding-left:8px !important + } + + .px-lg-2 { + padding-right: 8px !important; + padding-left:8px !important + } + + .py-lg-2 { + padding-top: 8px !important; + padding-bottom:8px !important + } + + .p-lg-3 { + padding:16px !important + } + + .pt-lg-3 { + padding-top:16px !important + } + + .pr-lg-3 { + padding-right:16px !important + } + + .pb-lg-3 { + padding-bottom:16px !important + } + + .pl-lg-3 { + padding-left:16px !important + } + + .px-lg-3 { + padding-right: 16px !important; + padding-left:16px !important + } + + .py-lg-3 { + padding-top: 16px !important; + padding-bottom:16px !important + } + + .p-lg-4 { + padding:24px !important + } + + .pt-lg-4 { + padding-top:24px !important + } + + .pr-lg-4 { + padding-right:24px !important + } + + .pb-lg-4 { + padding-bottom:24px !important + } + + .pl-lg-4 { + padding-left:24px !important + } + + .px-lg-4 { + padding-right: 24px !important; + padding-left:24px !important + } + + .py-lg-4 { + padding-top: 24px !important; + padding-bottom:24px !important + } + + .p-lg-5 { + padding:32px !important + } + + .pt-lg-5 { + padding-top:32px !important + } + + .pr-lg-5 { + padding-right:32px !important + } + + .pb-lg-5 { + padding-bottom:32px !important + } + + .pl-lg-5 { + padding-left:32px !important + } + + .px-lg-5 { + padding-right: 32px !important; + padding-left:32px !important + } + + .py-lg-5 { + padding-top: 32px !important; + padding-bottom:32px !important + } + + .p-lg-6 { + padding:40px !important + } + + .pt-lg-6 { + padding-top:40px !important + } + + .pr-lg-6 { + padding-right:40px !important + } + + .pb-lg-6 { + padding-bottom:40px !important + } + + .pl-lg-6 { + padding-left:40px !important + } + + .px-lg-6 { + padding-right: 40px !important; + padding-left:40px !important + } + + .py-lg-6 { + padding-top: 40px !important; + padding-bottom:40px !important + } +} + +@media (min-width: 1280px) { + .p-xl-0 { + padding:0 !important + } + + .pt-xl-0 { + padding-top:0 !important + } + + .pr-xl-0 { + padding-right:0 !important + } + + .pb-xl-0 { + padding-bottom:0 !important + } + + .pl-xl-0 { + padding-left:0 !important + } + + .px-xl-0 { + padding-right: 0 !important; + padding-left:0 !important + } + + .py-xl-0 { + padding-top: 0 !important; + padding-bottom:0 !important + } + + .p-xl-1 { + padding:4px !important + } + + .pt-xl-1 { + padding-top:4px !important + } + + .pr-xl-1 { + padding-right:4px !important + } + + .pb-xl-1 { + padding-bottom:4px !important + } + + .pl-xl-1 { + padding-left:4px !important + } + + .px-xl-1 { + padding-right: 4px !important; + padding-left:4px !important + } + + .py-xl-1 { + padding-top: 4px !important; + padding-bottom:4px !important + } + + .p-xl-2 { + padding:8px !important + } + + .pt-xl-2 { + padding-top:8px !important + } + + .pr-xl-2 { + padding-right:8px !important + } + + .pb-xl-2 { + padding-bottom:8px !important + } + + .pl-xl-2 { + padding-left:8px !important + } + + .px-xl-2 { + padding-right: 8px !important; + padding-left:8px !important + } + + .py-xl-2 { + padding-top: 8px !important; + padding-bottom:8px !important + } + + .p-xl-3 { + padding:16px !important + } + + .pt-xl-3 { + padding-top:16px !important + } + + .pr-xl-3 { + padding-right:16px !important + } + + .pb-xl-3 { + padding-bottom:16px !important + } + + .pl-xl-3 { + padding-left:16px !important + } + + .px-xl-3 { + padding-right: 16px !important; + padding-left:16px !important + } + + .py-xl-3 { + padding-top: 16px !important; + padding-bottom:16px !important + } + + .p-xl-4 { + padding:24px !important + } + + .pt-xl-4 { + padding-top:24px !important + } + + .pr-xl-4 { + padding-right:24px !important + } + + .pb-xl-4 { + padding-bottom:24px !important + } + + .pl-xl-4 { + padding-left:24px !important + } + + .px-xl-4 { + padding-right: 24px !important; + padding-left:24px !important + } + + .py-xl-4 { + padding-top: 24px !important; + padding-bottom:24px !important + } + + .p-xl-5 { + padding:32px !important + } + + .pt-xl-5 { + padding-top:32px !important + } + + .pr-xl-5 { + padding-right:32px !important + } + + .pb-xl-5 { + padding-bottom:32px !important + } + + .pl-xl-5 { + padding-left:32px !important + } + + .px-xl-5 { + padding-right: 32px !important; + padding-left:32px !important + } + + .py-xl-5 { + padding-top: 32px !important; + padding-bottom:32px !important + } + + .p-xl-6 { + padding:40px !important + } + + .pt-xl-6 { + padding-top:40px !important + } + + .pr-xl-6 { + padding-right:40px !important + } + + .pb-xl-6 { + padding-bottom:40px !important + } + + .pl-xl-6 { + padding-left:40px !important + } + + .px-xl-6 { + padding-right: 40px !important; + padding-left:40px !important + } + + .py-xl-6 { + padding-top: 40px !important; + padding-bottom:40px !important + } +} + +.p-responsive { + padding-right: 16px !important; + padding-left:16px !important +} + +@media (min-width: 544px) { + .p-responsive { + padding-right: 40px !important; + padding-left:40px !important + } +} + +@media (min-width: 1012px) { + .p-responsive { + padding-right: 16px !important; + padding-left:16px !important + } +} + +.h1 { + font-size:26px !important +} + +@media (min-width: 768px) { + .h1 { + font-size:32px !important + } +} + +.h2 { + font-size:22px !important +} + +@media (min-width: 768px) { + .h2 { + font-size:24px !important + } +} + +.h3 { + font-size:18px !important +} + +@media (min-width: 768px) { + .h3 { + font-size:20px !important + } +} + +.h4 { + font-size:16px !important +} + +.h5 { + font-size:14px !important +} + +.h6 { + font-size:12px !important +} + +.h1, .h2, .h3, .h4, .h5, .h6 { + font-weight:600 !important +} + +.f1 { + font-size:26px !important +} + +@media (min-width: 768px) { + .f1 { + font-size:32px !important + } +} + +.f2 { + font-size:22px !important +} + +@media (min-width: 768px) { + .f2 { + font-size:24px !important + } +} + +.f3 { + font-size:18px !important +} + +@media (min-width: 768px) { + .f3 { + font-size:20px !important + } +} + +.f4 { + font-size:16px !important +} + +@media (min-width: 768px) { + .f4 { + font-size:16px !important + } +} + +.f5 { + font-size:14px !important +} + +.f6 { + font-size:12px !important +} + +.f00-light { + font-size: 40px !important; + font-weight:300 !important +} + +@media (min-width: 768px) { + .f00-light { + font-size:48px !important + } +} + +.f0-light { + font-size: 32px !important; + font-weight:300 !important +} + +@media (min-width: 768px) { + .f0-light { + font-size:40px !important + } +} + +.f1-light { + font-size: 26px !important; + font-weight:300 !important +} + +@media (min-width: 768px) { + .f1-light { + font-size:32px !important + } +} + +.f2-light { + font-size: 22px !important; + font-weight:300 !important +} + +@media (min-width: 768px) { + .f2-light { + font-size:24px !important + } +} + +.f3-light { + font-size: 18px !important; + font-weight:300 !important +} + +@media (min-width: 768px) { + .f3-light { + font-size:20px !important + } +} + +.text-small { + font-size:12px !important +} + +.lead { + margin-bottom: 30px; + font-size: 20px; + font-weight: 300; + color:#586069 +} + +.lh-condensed-ultra { + line-height:1 !important +} + +.lh-condensed { + line-height:1.25 !important +} + +.lh-default { + line-height:1.5 !important +} + +.lh-0 { + line-height:0 !important +} + +.text-right { + text-align:right !important +} + +.text-left { + text-align:left !important +} + +.text-center { + text-align:center !important +} + +@media (min-width: 544px) { + .text-sm-right { + text-align:right !important + } + + .text-sm-left { + text-align:left !important + } + + .text-sm-center { + text-align:center !important + } +} + +@media (min-width: 768px) { + .text-md-right { + text-align:right !important + } + + .text-md-left { + text-align:left !important + } + + .text-md-center { + text-align:center !important + } +} + +@media (min-width: 1012px) { + .text-lg-right { + text-align:right !important + } + + .text-lg-left { + text-align:left !important + } + + .text-lg-center { + text-align:center !important + } +} + +@media (min-width: 1280px) { + .text-xl-right { + text-align:right !important + } + + .text-xl-left { + text-align:left !important + } + + .text-xl-center { + text-align:center !important + } +} + +.text-normal { + font-weight:400 !important +} + +.text-bold { + font-weight:600 !important +} + +.text-italic { + font-style:italic !important +} + +.text-uppercase { + text-transform:uppercase !important +} + +.text-underline { + text-decoration:underline !important +} + +.no-underline { + text-decoration:none !important +} + +.no-wrap { + white-space:nowrap !important +} + +.ws-normal { + white-space:normal !important +} + +.wb-break-all { + word-break:break-all !important +} + +.text-emphasized { + font-weight: 600; + color:#24292e +} + +.list-style-none { + list-style:none !important +} + +.text-shadow-dark { + text-shadow:0 1px 1px rgba(27, 31, 35, 0.25), 0 1px 25px rgba(27, 31, 35, 0.75) +} + +.text-shadow-light { + text-shadow:0 1px 0 rgba(255, 255, 255, 0.5) +} + +.text-mono { + font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace +} + +.user-select-none { + user-select:none !important +} + +.d-block { + display:block !important +} + +.d-flex { + display:flex !important +} + +.d-inline { + display:inline !important +} + +.d-inline-block { + display:inline-block !important +} + +.d-inline-flex { + display:inline-flex !important +} + +.d-none { + display:none !important +} + +.d-table { + display:table !important +} + +.d-table-cell { + display:table-cell !important +} + +@media (min-width: 544px) { + .d-sm-block { + display:block !important + } + + .d-sm-flex { + display:flex !important + } + + .d-sm-inline { + display:inline !important + } + + .d-sm-inline-block { + display:inline-block !important + } + + .d-sm-inline-flex { + display:inline-flex !important + } + + .d-sm-none { + display:none !important + } + + .d-sm-table { + display:table !important + } + + .d-sm-table-cell { + display:table-cell !important + } +} + +@media (min-width: 768px) { + .d-md-block { + display:block !important + } + + .d-md-flex { + display:flex !important + } + + .d-md-inline { + display:inline !important + } + + .d-md-inline-block { + display:inline-block !important + } + + .d-md-inline-flex { + display:inline-flex !important + } + + .d-md-none { + display:none !important + } + + .d-md-table { + display:table !important + } + + .d-md-table-cell { + display:table-cell !important + } +} + +@media (min-width: 1012px) { + .d-lg-block { + display:block !important + } + + .d-lg-flex { + display:flex !important + } + + .d-lg-inline { + display:inline !important + } + + .d-lg-inline-block { + display:inline-block !important + } + + .d-lg-inline-flex { + display:inline-flex !important + } + + .d-lg-none { + display:none !important + } + + .d-lg-table { + display:table !important + } + + .d-lg-table-cell { + display:table-cell !important + } +} + +@media (min-width: 1280px) { + .d-xl-block { + display:block !important + } + + .d-xl-flex { + display:flex !important + } + + .d-xl-inline { + display:inline !important + } + + .d-xl-inline-block { + display:inline-block !important + } + + .d-xl-inline-flex { + display:inline-flex !important + } + + .d-xl-none { + display:none !important + } + + .d-xl-table { + display:table !important + } + + .d-xl-table-cell { + display:table-cell !important + } +} + +.v-hidden { + visibility:hidden !important +} + +.v-visible { + visibility:visible !important +} + +@media (max-width: 544px) { + .hide-sm { + display:none !important + } +} + +@media (min-width: 544px) and(max-width: 768px) { + .hide-md { + display:none !important + } +} + +@media (min-width: 768px) and(max-width: 1012px) { + .hide-lg { + display:none !important + } +} + +@media (min-width: 1012px) { + .hide-xl { + display:none !important + } +} + +.table-fixed { + table-layout:fixed !important +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + word-wrap: normal; + border:0 +} + +.show-on-focus { + position: absolute; + width: 1px; + height: 1px; + margin: 0; + overflow: hidden; + clip:rect(1px, 1px, 1px, 1px) +} + +.show-on-focus:focus { + z-index: 20; + width: auto; + height: auto; + clip:auto +} + +.container { + width: 980px; + margin-right: auto; + margin-left:auto +} + +.container::before { + display: table; + content: "" +} + +.container::after { + display: table; + clear: both; + content: "" +} + +.container-md { + max-width: 768px; + margin-right: auto; + margin-left:auto +} + +.container-lg { + max-width: 1012px; + margin-right: auto; + margin-left:auto +} + +.container-xl { + max-width: 1280px; + margin-right: auto; + margin-left:auto +} + +.columns { + margin-right: -10px; + margin-left:-10px +} + +.columns::before { + display: table; + content: "" +} + +.columns::after { + display: table; + clear: both; + content: "" +} + +.column { + float: left; + padding-right: 10px; + padding-left:10px +} + +.one-third { + width:33.333333% +} + +.two-thirds { + width:66.666667% +} + +.one-fourth { + width:25% +} + +.one-half { + width:50% +} + +.three-fourths { + width:75% +} + +.one-fifth { + width:20% +} + +.four-fifths { + width:80% +} + +.centered { + display: block; + float: none; + margin-right: auto; + margin-left:auto +} + +.col-1 { + width:8.3333333333% +} + +.col-2 { + width:16.6666666667% +} + +.col-3 { + width:25% +} + +.col-4 { + width:33.3333333333% +} + +.col-5 { + width:41.6666666667% +} + +.col-6 { + width:50% +} + +.col-7 { + width:58.3333333333% +} + +.col-8 { + width:66.6666666667% +} + +.col-9 { + width:75% +} + +.col-10 { + width:83.3333333333% +} + +.col-11 { + width:91.6666666667% +} + +.col-12 { + width:100% +} + +@media (min-width: 544px) { + .col-sm-1 { + width:8.3333333333% + } + + .col-sm-2 { + width:16.6666666667% + } + + .col-sm-3 { + width:25% + } + + .col-sm-4 { + width:33.3333333333% + } + + .col-sm-5 { + width:41.6666666667% + } + + .col-sm-6 { + width:50% + } + + .col-sm-7 { + width:58.3333333333% + } + + .col-sm-8 { + width:66.6666666667% + } + + .col-sm-9 { + width:75% + } + + .col-sm-10 { + width:83.3333333333% + } + + .col-sm-11 { + width:91.6666666667% + } + + .col-sm-12 { + width:100% + } +} + +@media (min-width: 768px) { + .col-md-1 { + width:8.3333333333% + } + + .col-md-2 { + width:16.6666666667% + } + + .col-md-3 { + width:25% + } + + .col-md-4 { + width:33.3333333333% + } + + .col-md-5 { + width:41.6666666667% + } + + .col-md-6 { + width:50% + } + + .col-md-7 { + width:58.3333333333% + } + + .col-md-8 { + width:66.6666666667% + } + + .col-md-9 { + width:75% + } + + .col-md-10 { + width:83.3333333333% + } + + .col-md-11 { + width:91.6666666667% + } + + .col-md-12 { + width:100% + } +} + +@media (min-width: 1012px) { + .col-lg-1 { + width:8.3333333333% + } + + .col-lg-2 { + width:16.6666666667% + } + + .col-lg-3 { + width:25% + } + + .col-lg-4 { + width:33.3333333333% + } + + .col-lg-5 { + width:41.6666666667% + } + + .col-lg-6 { + width:50% + } + + .col-lg-7 { + width:58.3333333333% + } + + .col-lg-8 { + width:66.6666666667% + } + + .col-lg-9 { + width:75% + } + + .col-lg-10 { + width:83.3333333333% + } + + .col-lg-11 { + width:91.6666666667% + } + + .col-lg-12 { + width:100% + } +} + +@media (min-width: 1280px) { + .col-xl-1 { + width:8.3333333333% + } + + .col-xl-2 { + width:16.6666666667% + } + + .col-xl-3 { + width:25% + } + + .col-xl-4 { + width:33.3333333333% + } + + .col-xl-5 { + width:41.6666666667% + } + + .col-xl-6 { + width:50% + } + + .col-xl-7 { + width:58.3333333333% + } + + .col-xl-8 { + width:66.6666666667% + } + + .col-xl-9 { + width:75% + } + + .col-xl-10 { + width:83.3333333333% + } + + .col-xl-11 { + width:91.6666666667% + } + + .col-xl-12 { + width:100% + } +} + +.gutter { + margin-right: -16px; + margin-left: -16px +} + +.gutter > [class * ="col-"] { + padding-right: 16px !important; + padding-left:16px !important +} + +.gutter-condensed { + margin-right: -8px; + margin-left: -8px +} + +.gutter-condensed > [class * ="col-"] { + padding-right: 8px !important; + padding-left:8px !important +} + +.gutter-spacious { + margin-right: -24px; + margin-left: -24px +} + +.gutter-spacious > [class * ="col-"] { + padding-right: 24px !important; + padding-left:24px !important +} + +@media (min-width: 544px) { + .gutter-sm { + margin-right: -16px; + margin-left: -16px + } + + .gutter-sm > [class * ="col-"] { + padding-right: 16px !important; + padding-left:16px !important + } + + .gutter-sm-condensed { + margin-right: -8px; + margin-left: -8px + } + + .gutter-sm-condensed > [class * ="col-"] { + padding-right: 8px !important; + padding-left:8px !important + } + + .gutter-sm-spacious { + margin-right: -24px; + margin-left: -24px + } + + .gutter-sm-spacious > [class * ="col-"] { + padding-right: 24px !important; + padding-left:24px !important + } +} + +@media (min-width: 768px) { + .gutter-md { + margin-right: -16px; + margin-left: -16px + } + + .gutter-md > [class * ="col-"] { + padding-right: 16px !important; + padding-left:16px !important + } + + .gutter-md-condensed { + margin-right: -8px; + margin-left: -8px + } + + .gutter-md-condensed > [class * ="col-"] { + padding-right: 8px !important; + padding-left:8px !important + } + + .gutter-md-spacious { + margin-right: -24px; + margin-left: -24px + } + + .gutter-md-spacious > [class * ="col-"] { + padding-right: 24px !important; + padding-left:24px !important + } +} + +@media (min-width: 1012px) { + .gutter-lg { + margin-right: -16px; + margin-left: -16px + } + + .gutter-lg > [class * ="col-"] { + padding-right: 16px !important; + padding-left:16px !important + } + + .gutter-lg-condensed { + margin-right: -8px; + margin-left: -8px + } + + .gutter-lg-condensed > [class * ="col-"] { + padding-right: 8px !important; + padding-left:8px !important + } + + .gutter-lg-spacious { + margin-right: -24px; + margin-left: -24px + } + + .gutter-lg-spacious > [class * ="col-"] { + padding-right: 24px !important; + padding-left:24px !important + } +} + +@media (min-width: 1280px) { + .gutter-xl { + margin-right: -16px; + margin-left: -16px + } + + .gutter-xl > [class * ="col-"] { + padding-right: 16px !important; + padding-left:16px !important + } + + .gutter-xl-condensed { + margin-right: -8px; + margin-left: -8px + } + + .gutter-xl-condensed > [class * ="col-"] { + padding-right: 8px !important; + padding-left:8px !important + } + + .gutter-xl-spacious { + margin-right: -24px; + margin-left: -24px + } + + .gutter-xl-spacious > [class * ="col-"] { + padding-right: 24px !important; + padding-left:24px !important + } +} + +.offset-1 { + margin-left:8.3333333333% !important +} + +.offset-2 { + margin-left:16.6666666667% !important +} + +.offset-3 { + margin-left:25% !important +} + +.offset-4 { + margin-left:33.3333333333% !important +} + +.offset-5 { + margin-left:41.6666666667% !important +} + +.offset-6 { + margin-left:50% !important +} + +.offset-7 { + margin-left:58.3333333333% !important +} + +.offset-8 { + margin-left:66.6666666667% !important +} + +.offset-9 { + margin-left:75% !important +} + +.offset-10 { + margin-left:83.3333333333% !important +} + +.offset-11 { + margin-left:91.6666666667% !important +} + +@media (min-width: 544px) { + .offset-sm-1 { + margin-left:8.3333333333% !important + } + + .offset-sm-2 { + margin-left:16.6666666667% !important + } + + .offset-sm-3 { + margin-left:25% !important + } + + .offset-sm-4 { + margin-left:33.3333333333% !important + } + + .offset-sm-5 { + margin-left:41.6666666667% !important + } + + .offset-sm-6 { + margin-left:50% !important + } + + .offset-sm-7 { + margin-left:58.3333333333% !important + } + + .offset-sm-8 { + margin-left:66.6666666667% !important + } + + .offset-sm-9 { + margin-left:75% !important + } + + .offset-sm-10 { + margin-left:83.3333333333% !important + } + + .offset-sm-11 { + margin-left:91.6666666667% !important + } +} + +@media (min-width: 768px) { + .offset-md-1 { + margin-left:8.3333333333% !important + } + + .offset-md-2 { + margin-left:16.6666666667% !important + } + + .offset-md-3 { + margin-left:25% !important + } + + .offset-md-4 { + margin-left:33.3333333333% !important + } + + .offset-md-5 { + margin-left:41.6666666667% !important + } + + .offset-md-6 { + margin-left:50% !important + } + + .offset-md-7 { + margin-left:58.3333333333% !important + } + + .offset-md-8 { + margin-left:66.6666666667% !important + } + + .offset-md-9 { + margin-left:75% !important + } + + .offset-md-10 { + margin-left:83.3333333333% !important + } + + .offset-md-11 { + margin-left:91.6666666667% !important + } +} + +@media (min-width: 1012px) { + .offset-lg-1 { + margin-left:8.3333333333% !important + } + + .offset-lg-2 { + margin-left:16.6666666667% !important + } + + .offset-lg-3 { + margin-left:25% !important + } + + .offset-lg-4 { + margin-left:33.3333333333% !important + } + + .offset-lg-5 { + margin-left:41.6666666667% !important + } + + .offset-lg-6 { + margin-left:50% !important + } + + .offset-lg-7 { + margin-left:58.3333333333% !important + } + + .offset-lg-8 { + margin-left:66.6666666667% !important + } + + .offset-lg-9 { + margin-left:75% !important + } + + .offset-lg-10 { + margin-left:83.3333333333% !important + } + + .offset-lg-11 { + margin-left:91.6666666667% !important + } +} + +@media (min-width: 1280px) { + .offset-xl-1 { + margin-left:8.3333333333% !important + } + + .offset-xl-2 { + margin-left:16.6666666667% !important + } + + .offset-xl-3 { + margin-left:25% !important + } + + .offset-xl-4 { + margin-left:33.3333333333% !important + } + + .offset-xl-5 { + margin-left:41.6666666667% !important + } + + .offset-xl-6 { + margin-left:50% !important + } + + .offset-xl-7 { + margin-left:58.3333333333% !important + } + + .offset-xl-8 { + margin-left:66.6666666667% !important + } + + .offset-xl-9 { + margin-left:75% !important + } + + .offset-xl-10 { + margin-left:83.3333333333% !important + } + + .offset-xl-11 { + margin-left:91.6666666667% !important + } +} + +.markdown-body { + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + font-size: 16px; + line-height: 1.5; + word-wrap:break-word +} + +.markdown-body::before { + display: table; + content: "" +} + +.markdown-body::after { + display: table; + clear: both; + content: "" +} + +.markdown-body > * :first-child { + margin-top:0 !important +} + +.markdown-body > * :last-child { + margin-bottom:0 !important +} + +.markdown-body a:not([href]) { + color: inherit; + text-decoration:none +} + +.markdown-body .absent { + color:#cb2431 +} + +.markdown-body .anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height:1 +} + +.markdown-body .anchor:focus { + outline:none +} + +.markdown-body p, .markdown-body blockquote, .markdown-body ul, .markdown-body ol, .markdown-body dl, .markdown-body table, .markdown-body pre { + margin-top: 0; + margin-bottom:16px +} + +.markdown-body hr { + height: .25em; + padding: 0; + margin: 24px 0; + background-color: #e1e4e8; + border:0 +} + +.markdown-body blockquote { + padding: 0 1em; + color: #6a737d; + border-left:0.25em solid #dfe2e5 +} + +.markdown-body blockquote > :first-child { + margin-top:0 +} + +.markdown-body blockquote > :last-child { + margin-bottom:0 +} + +.markdown-body kbd { + display: inline-block; + padding: 3px 5px; + font-size: 11px; + line-height: 10px; + color: #444d56; + vertical-align: middle; + background-color: #fafbfc; + border: solid 1px #c6cbd1; + border-bottom-color: #959da5; + border-radius: 3px; + box-shadow:inset 0 -1px 0 #959da5 +} + +.markdown-body h1, .markdown-body h2, .markdown-body h3, .markdown-body h4, .markdown-body h5, .markdown-body h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height:1.25 +} + +.markdown-body h1 .octicon-link, .markdown-body h2 .octicon-link, .markdown-body h3 .octicon-link, .markdown-body h4 .octicon-link, .markdown-body h5 .octicon-link, .markdown-body h6 .octicon-link { + color: #1b1f23; + vertical-align: middle; + visibility:hidden +} + +.markdown-body h1:hover .anchor, .markdown-body h2:hover .anchor, .markdown-body h3:hover .anchor, .markdown-body h4:hover .anchor, .markdown-body h5:hover .anchor, .markdown-body h6:hover .anchor { + text-decoration:none +} + +.markdown-body h1:hover .anchor .octicon-link, .markdown-body h2:hover .anchor .octicon-link, .markdown-body h3:hover .anchor .octicon-link, .markdown-body h4:hover .anchor .octicon-link, .markdown-body h5:hover .anchor .octicon-link, .markdown-body h6:hover .anchor .octicon-link { + visibility:visible +} + +.markdown-body h1 tt, .markdown-body h1 code, .markdown-body h2 tt, .markdown-body h2 code, .markdown-body h3 tt, .markdown-body h3 code, .markdown-body h4 tt, .markdown-body h4 code, .markdown-body h5 tt, .markdown-body h5 code, .markdown-body h6 tt, .markdown-body h6 code { + font-size:inherit +} + +.markdown-body h1 { + padding-bottom: 0.3em; + font-size: 2em; + border-bottom:1px solid #eaecef +} + +.markdown-body h2 { + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom:1px solid #eaecef +} + +.markdown-body h3 { + font-size:1.25em +} + +.markdown-body h4 { + font-size:1em +} + +.markdown-body h5 { + font-size:0.875em +} + +.markdown-body h6 { + font-size: 0.85em; + color:#6a737d +} + +.markdown-body ul, .markdown-body ol { + padding-left:2em +} + +.markdown-body ul.no-list, .markdown-body ol.no-list { + padding: 0; + list-style-type:none +} + +.markdown-body ul ul, .markdown-body ul ol, .markdown-body ol ol, .markdown-body ol ul { + margin-top: 0; + margin-bottom:0 +} + +.markdown-body li { + word-wrap:break-all +} + +.markdown-body li > p { + margin-top:16px +} + +.markdown-body li + li { + margin-top:.25em +} + +.markdown-body dl { + padding:0 +} + +.markdown-body dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight:600 +} + +.markdown-body dl dd { + padding: 0 16px; + margin-bottom:16px +} + +.markdown-body table { + display: block; + width: 100%; + overflow:auto +} + +.markdown-body table th { + font-weight:600 +} + +.markdown-body table th, .markdown-body table td { + padding: 6px 13px; + border:1px solid #dfe2e5 +} + +.markdown-body table tr { + background-color: #fff; + border-top:1px solid #c6cbd1 +} + +.markdown-body table tr:nth-child(2n) { + background-color:#f6f8fa +} + +.markdown-body table img { + background-color:transparent +} + +.markdown-body img { + max-width: 100%; + box-sizing: content-box; + background-color:#fff +} + +.markdown-body img[align=right] { + padding-left:20px +} + +.markdown-body img[align=left] { + padding-right:20px +} + +.markdown-body .emoji { + max-width: none; + vertical-align: text-top; + background-color:transparent +} + +.markdown-body span.frame { + display: block; + overflow:hidden +} + +.markdown-body span.frame > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border:1px solid #dfe2e5 +} + +.markdown-body span.frame span img { + display: block; + float:left +} + +.markdown-body span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color:#24292e +} + +.markdown-body span.align-center { + display: block; + overflow: hidden; + clear:both +} + +.markdown-body span.align-center > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align:center +} + +.markdown-body span.align-center span img { + margin: 0 auto; + text-align:center +} + +.markdown-body span.align-right { + display: block; + overflow: hidden; + clear:both +} + +.markdown-body span.align-right > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align:right +} + +.markdown-body span.align-right span img { + margin: 0; + text-align:right +} + +.markdown-body span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow:hidden +} + +.markdown-body span.float-left span { + margin:13px 0 0 +} + +.markdown-body span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow:hidden +} + +.markdown-body span.float-right > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align:right +} + +.markdown-body code, .markdown-body tt { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + background-color: rgba(27, 31, 35, 0.05); + border-radius:3px +} + +.markdown-body code br, .markdown-body tt br { + display:none +} + +.markdown-body del code { + text-decoration:inherit +} + +.markdown-body pre { + word-wrap:normal +} + +.markdown-body pre > code { + padding: 0; + margin: 0; + font-size: 100%; + word-break: normal; + white-space: pre; + background: transparent; + border:0 +} + +.markdown-body .highlight { + margin-bottom:16px +} + +.markdown-body .highlight pre { + margin-bottom: 0; + word-break:normal +} + +.markdown-body .highlight pre, .markdown-body pre { + padding: 16px; + overflow: auto; + font-size: 85%; + line-height: 1.45; + background-color: #f6f8fa; + border-radius:3px +} + +.markdown-body pre code, .markdown-body pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border:0 +} + +.markdown-body .csv-data td, .markdown-body .csv-data th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space:nowrap +} + +.markdown-body .csv-data .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: #fff; + border:0 +} + +.markdown-body .csv-data tr { + border-top:0 +} + +.markdown-body .csv-data th { + font-weight: 600; + background: #f6f8fa; + border-top:0 +} + +.highlight table td { + padding:5px +} + +.highlight table pre { + margin:0 +} + +.highlight .cm { + color: #999988; + font-style:italic +} + +.highlight .cp { + color: #999999; + font-weight:bold +} + +.highlight .c1 { + color: #999988; + font-style:italic +} + +.highlight .cs { + color: #999999; + font-weight: bold; + font-style:italic +} + +.highlight .c, .highlight .cd { + color: #999988; + font-style:italic +} + +.highlight .err { + color: #a61717; + background-color:#e3d2d2 +} + +.highlight .gd { + color: #000000; + background-color:#ffdddd +} + +.highlight .ge { + color: #000000; + font-style:italic +} + +.highlight .gr { + color:#aa0000 +} + +.highlight .gh { + color:#999999 +} + +.highlight .gi { + color: #000000; + background-color:#ddffdd +} + +.highlight .go { + color:#888888 +} + +.highlight .gp { + color:#555555 +} + +.highlight .gs { + font-weight:bold +} + +.highlight .gu { + color:#aaaaaa +} + +.highlight .gt { + color:#aa0000 +} + +.highlight .kc { + color: #000000; + font-weight:bold +} + +.highlight .kd { + color: #000000; + font-weight:bold +} + +.highlight .kn { + color: #000000; + font-weight:bold +} + +.highlight .kp { + color: #000000; + font-weight:bold +} + +.highlight .kr { + color: #000000; + font-weight:bold +} + +.highlight .kt { + color: #445588; + font-weight:bold +} + +.highlight .k, .highlight .kv { + color: #000000; + font-weight:bold +} + +.highlight .mf { + color:#009999 +} + +.highlight .mh { + color:#009999 +} + +.highlight .il { + color:#009999 +} + +.highlight .mi { + color:#009999 +} + +.highlight .mo { + color:#009999 +} + +.highlight .m, .highlight .mb, .highlight .mx { + color:#009999 +} + +.highlight .sb { + color:#d14 +} + +.highlight .sc { + color:#d14 +} + +.highlight .sd { + color:#d14 +} + +.highlight .s2 { + color:#d14 +} + +.highlight .se { + color:#d14 +} + +.highlight .sh { + color:#d14 +} + +.highlight .si { + color:#d14 +} + +.highlight .sx { + color:#d14 +} + +.highlight .sr { + color:#009926 +} + +.highlight .s1 { + color:#d14 +} + +.highlight .ss { + color:#990073 +} + +.highlight .s { + color:#d14 +} + +.highlight .na { + color:#008080 +} + +.highlight .bp { + color:#999999 +} + +.highlight .nb { + color:#0086B3 +} + +.highlight .nc { + color: #445588; + font-weight:bold +} + +.highlight .no { + color:#008080 +} + +.highlight .nd { + color: #3c5d5d; + font-weight:bold +} + +.highlight .ni { + color:#800080 +} + +.highlight .ne { + color: #990000; + font-weight:bold +} + +.highlight .nf { + color: #990000; + font-weight:bold +} + +.highlight .nl { + color: #990000; + font-weight:bold +} + +.highlight .nn { + color:#555555 +} + +.highlight .nt { + color:#000080 +} + +.highlight .vc { + color:#008080 +} + +.highlight .vg { + color:#008080 +} + +.highlight .vi { + color:#008080 +} + +.highlight .nv { + color:#008080 +} + +.highlight .ow { + color: #000000; + font-weight:bold +} + +.highlight .o { + color: #000000; + font-weight:bold +} + +.highlight .w { + color:#bbbbbb +} + +.highlight { + background-color: #f8f8f8 +} + diff --git a/layout/index.html b/layout/index.html new file mode 100644 index 0000000..f86beea --- /dev/null +++ b/layout/index.html @@ -0,0 +1,25 @@ +--- +title: Card view +layout: default +--- + + +
+ {% for t in site.data.ci.tests %} +
+

{{t.name}}

+ + [ log ] + {% if site.data.github[t.name] %} +   + [ github ] + {% endif %} + + {% if t.last_success %}
[ Last success ]{% endif %} + {% if t.first_failure %} [ First failure ]{% endif %} +
+ {% endfor %} +
diff --git a/layout/table.html b/layout/table.html new file mode 100644 index 0000000..7596c79 --- /dev/null +++ b/layout/table.html @@ -0,0 +1,38 @@ +--- +title: Table view +layout: default +--- +
+ + + + + + + + + + + + + {% for t in site.data.ci.tests %} + + + + + + + + + {% endfor %} + +
Test NameResultStartDurationLast SuccessFirst Failure
{{t.name}} + {% if t.success %} + + {{t.status}} + {% else %} + + {{t.status}} (status = {{t.exitcode}}) + {% endif %} + {{t.start | date: "%H:%M"}}{{t.duration}} seconds{% if t.last_success %}{{t.last_success}}{% endif %}{% if t.first_failure %}{{t.first_failure}}{% endif %}
+ \ No newline at end of file diff --git a/prepare.rb b/prepare.rb new file mode 100755 index 0000000..f90bc91 --- /dev/null +++ b/prepare.rb @@ -0,0 +1,4 @@ +#!/usr/bin/env ruby +require_relative "settings.rb" +require "fileutils" +FileUtils.mkdir_p "#{$WORKSPACE}/local/bin" diff --git a/prepare.sh b/prepare.sh deleted file mode 100755 index c51afb8..0000000 --- a/prepare.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -set -e -source meta/stdenv.sh -set -x -mkdir -p "$WORKSPACE/local/bin" diff --git a/run-tests.py b/run-tests.py deleted file mode 100644 index e268979..0000000 --- a/run-tests.py +++ /dev/null @@ -1,364 +0,0 @@ -# Uploading reports to GitHub - -credentials = { } - -def read_credentials(): - import os, yaml - credentials_path = \ - os.environ.get("CREDENTIALS", "/config/credentials.yaml") - global credentials - try: - path = os.path.expanduser(credentials_path) - with open(path) as credsfile: - creds = yaml.safe_load(credsfile.read()) - if creds: - credentials = creds - except: - pass - -def ssh_info(job): - info = credentials[job] - if info is None: - return None - repo = info["repo"] - key = info["key"] - url = "ssh://git@github.com/%s" % repo - return (url, key) - -def mkpath(*args): - import os - return os.path.join(*args) - -def git(*subcmd): - import subprocess - cmd = [ "git" ] - subcmd = list(subcmd) - if subcmd[0].startswith("!"): - subcmd[0] = subcmd[0][1:] - elif subcmd[0] != "-C": - cmd.extend(["-C", "report"]) - cmd.extend(subcmd) - result = subprocess.run(cmd, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - return result - -def clone(url): - import os, shutil - if os.path.exists("report"): - git("remote", "set-url", "origin", url) - git("pull", "--ff-only", "origin", "master") - else: - shutil.rmtree("report.tmp", ignore_errors=True) - git("!clone", url, "report.tmp") - git("-C", "report.tmp", "config", - "--local", "user.email", "oscar@computeralgebra.de") - git("-C", "report.tmp", "config", - "--local", "user.name", "OSCAR Automation") - git("-C", "report.tmp", "reset", "--hard", "master") - shutil.move("report.tmp", "report") - -def push(url): - git("remote", "set-url", "origin", url) - git("push", "-f", "origin", "master") - -def add_file(path, contents): - import os - dir = os.path.dirname(path) - if dir != "": - os.makedirs(mkpath("report", dir), exist_ok=True) - with open(mkpath("report", path), "wb") as outfile: - outfile.write(contents.encode()) - git("add", path) - -def commit(msg): - git("commit", "-m", msg) - -def upload(job, build, files): - import os - read_credentials() - if job not in credentials: - return - url, key = ssh_info(job) - keyfile = os.path.expanduser("~/.ssh_git_key." + job) - with open(keyfile, "w") as keyfp: - keyfp.write(key) - os.chmod(keyfile, 0o600) - os.environ["GIT_SSH_COMMAND"] = "ssh -o 'StrictHostKeyChecking no' -i " + keyfile - clone(url) - for path, contents in files.items(): - add_file(path, contents) - commit("Build " + str(build)) - push(url) - try: os.remove(keyfile) - except: pass - -# Test runner - -default_timeout = 1800 - -class YamlDB(dict): - def __init__(self, path): - import yaml, fcntl - super(YamlDB, self).__init__() - self.path = path - self.lock = open("%s.lock" % path, "w+") - fcntl.lockf(self.lock, fcntl.LOCK_EX) - try: - with open(path, "r") as fp: - self.update(yaml.safe_load(fp)) - except FileNotFoundError: - pass - def sync(self): - import os, yaml - tmppath = "%s.tmp" % self.path - data = {} - data.update(self) - with open(tmppath, "w") as fp: - fp.write(yaml.safe_dump(data)) - os.rename(tmppath, self.path) - def _unlock(self): - import fcntl - fcntl.lockf(self.lock, fcntl.LOCK_UN) - self.lock = None - def close(self): - self.sync() - self._unlock() - def __del__(self): - if self.lock is not None: - self._unlock() - -def load_config(): - import yaml - with open("meta/tests/config.yaml") as config: - return yaml.safe_load(config.read()) - -def make_job_url(buildnum): - import os - url = os.environ["JENKINS_URL"] - job = os.environ["JOB_NAME"] - if not url.endswith("/"): url += "/" - url += "job/%s/%s/" % (job, buildnum) - return url - -class TestRunner: - def __init__(self, parallelize = 0): - # Init instance variables - import os, threading, concurrent.futures as futures - self.failed_tests = False - self.buildnum = os.environ.get("BUILD_NUMBER", "0") - self.jenkins_home = "/var/jenkins_home" - self.workspace = os.environ["WORKSPACE"] - self.job = os.environ["JOB_NAME"] - self.build_url = os.environ["BUILD_URL"] - self.maxjobs = int(os.environ.get("BUILDJOBS", 4)) - if type(parallelize) is int and parallelize > 0: - self.maxjobs = parallelize - if not self.build_url.endswith("/"): self.build_url += "/" - self.log_url = self.build_url + "artifact/logs/build-" + self.buildnum - self.logdir = "logs/build-%s" % self.buildnum - self.start_date = None - self.end_date = None - self.successes = [] - self.failures = [] - self.testresults = [] - self.lock = threading.Lock() - self.threadpool = futures.ThreadPoolExecutor(max_workers=self.maxjobs) - self.futures = {} - # Create log dir for this build - try: os.makedirs(self.logdir, exist_ok=True) - except: pass - def report(self, msg, index, exitcode): - if exitcode == 0: - self.successes.append((index, msg)) - else: - self.failures.append((index, msg)) - def _run(self, test, index = 0): - import os, subprocess, datetime, yaml, re, shutil - # Retrieve information about this test. - testscript = "meta/tests/" + test["script"] - testname = test["name"] - testfilename = re.sub("[^-._a-zA-Z0-9]+", "-", testname) - testid = re.sub("[^a-zA-Z0-9]+", "-", testname).lower() - info = {} - info["name"] = testname - info["id"] = testid - if "timeout" in test: - timeout = test["timeout"] - else: - timeout = default_timeout - logfile = os.path.join(self.logdir, testfilename + ".log") - info["log"] = "%s/%s.log" % (self.log_url, testfilename) - def log(s): - with open(logfile, "ab") as logfp: - if type(s) == type(u""): - s = s.encode() - logfp.write(s) - # Run the test and record its status - try: - start_time = datetime.datetime.now() - with self.lock: - if self.start_date is None: - self.start_date = start_time.strftime("%Y-%m-%d") - start = start_time.strftime("%Y-%m-%d %H:%M") - info["start"] = start - start_short = start_time.strftime("%H:%M") - log("=== %s (%s) at %s\n" % (testname, testscript, start)) - cmd = testscript - cmd += " >>" + logfile + " 2>&1" - polymake_user_dir = mkpath(self.workspace, ".polymake", - testfilename) - shutil.rmtree(polymake_user_dir, ignore_errors=True) - os.makedirs(polymake_user_dir, exist_ok=True) - result = subprocess.run(cmd, shell=True, timeout = timeout, - env = { **os.environ, "POLYMAKE_USER_DIR": polymake_user_dir}) - exitcode = result.returncode - if exitcode == 0: - verbose_status = "SUCCESS" - statuscode = "\u2705" - else: - verbose_status = "FAILURE" - statuscode = "\u274C" - except subprocess.TimeoutExpired as result: - output = result.stdout - exitcode = -1 - verbose_status = "TIMEOUT" - statuscode = "\u26A0" - except: - output = "INTERNAL ERROR\n" - verbose_status = "INTERNAL ERROR" - statuscode = "\u2049" - exitcode = -1 - with self.lock: - self.failed_tests = self.failed_tests or exitcode != 0 - info["success"] = (exitcode == 0) - info["exitcode"] = exitcode - info["status"] = verbose_status.lower() - if verbose_status == "FAILURE": - verbose_status += " (status = %d)" % exitcode - # Timing information - stop_time = datetime.datetime.now() - stop = stop_time.strftime("%Y-%m-%d %H:%M") - with self.lock: - new_end_date = stop_time.strftime("%Y-%m-%d") - if self.end_date is None or new_end_date > self.end_date: - self.end_date = new_end_date - duration = (stop_time - start_time).seconds - info["duration"] = duration - # Make a persistent record of the last success/first failure - jobstate_dir = self.jenkins_home + "/jobstate" - jobstate = mkpath(jobstate_dir, self.job + ".yaml") - os.makedirs(jobstate_dir, exist_ok=True) - with self.lock: - db = YamlDB(jobstate) - info["last_success"] = False - info["last_success_url"] = None - info["first_failure"] = False - info["first_failure_url"] = None - if exitcode == 0: - last_success = "" - first_failure = "" - db[testname] = [ self.buildnum, "" ] - else: - if testname in db: - if db[testname][1] == "": - db[testname][1] = self.buildnum - else: - db[testname] = [ "", self.buildnum ] - if db[testname][0] == "": - last_success = "unknown" - first_failure = "unknown" - else: - err = db[testname] - url = [ make_job_url(str(n)) for n in err ] - last_success = "[%s](%s)" % (err[0], url[0]) - first_failure = "[%s](%s)" % (err[1], url[1]) - info["last_success"] = int(err[0]) - info["last_success_url"] = url[0] - info["first_failure"] = int(err[1]) - info["first_failure_url"] = url[1] - db.close() - # Log test results - testsummary = "| %s | %s [%s](%s) | %s | %s | %s | %s |" % \ - (testname, statuscode, verbose_status.lower().capitalize(), - self.log_url + "/" + testfilename + ".log", start_short, - "%d seconds" % duration, last_success, first_failure) - with self.lock: - self.report(testsummary, index, exitcode) - self.testresults.append((index, info)) - log("=== %s at %s\n" % (verbose_status, stop)) - return "Testing: %-19s at %s => %s" % (testname, start, verbose_status) - def run(self, test): - import sys - msg = self._run(test) - print(msg) - sys.stdout.flush() - def _start(self, test, index): - after = test.get("after", None) - dep = self.futures.get(after, None) - if after is not None and dep is None: - print("Warning: Invalid dependency %s => %s" % (test["name"], - after)) - else: - if dep is not None: - self.futures[after].result() - return self._run(test, index) - def start(self, test, index=0): - with self.lock: - future = self.threadpool.submit(self._start, test, index) - self.futures[test["name"]] = future - return future - def finish(self): - import yaml - def reindex(l): - l.sort(key = lambda a: a[0]) - l[:] = [ item for index, item in l ] - print("Logs: " + self.log_url + "/") - # Print a human readable report - report_form = "" - report_form += "## [Build %s](%s)\n\n" % (self.buildnum, self.build_url) - report_form += "* Started on: %s\n" % self.start_date - report_form += "* Ended on: %s\n\n" % self.end_date - report_form += \ - "| Test Name | Result | Start | Duration | Last Success | First Failure |\n" + \ - "|:-------------|:-------|:------|:---------|:-------------|:--------------|\n" - reindex(self.failures) - reindex(self.successes) - reindex(self.testresults) - if len(self.failures) > 0: - report_form += "\n".join(self.failures) - report_form += "\n" - if len(self.successes) > 0: - report_form += "\n".join(self.successes) - report_form += "\n" - # Dump report into a yaml file - upload(self.job, self.buildnum, { - "README.md" : report_form, - "_data/ci.yml" : yaml.dump({ - "build": int(self.buildnum), - "build_url": self.build_url, - "job": self.job, - "tests": self.testresults - }, default_flow_style=False) - }) - -def run_tests(config): - import sys - tests = config["tests"] - parallelize = config["parallelize"] - testrunner = TestRunner(parallelize) - if parallelize: - tasks = [ testrunner.start(test, index) - for index, test in zip(range(len(tests)), tests) ] - for task in tasks: - print(task.result()) - sys.stdout.flush() - else: - for test in tests: - testrunner.run(test) - testrunner.finish() - if testrunner.failed_tests: - exit(1) - -if __name__ == "__main__": - config = load_config() - run_tests(config) diff --git a/run-tests.rb b/run-tests.rb new file mode 100755 index 0000000..a819bf7 --- /dev/null +++ b/run-tests.rb @@ -0,0 +1,422 @@ +#!/usr/bin/env ruby + +require "fileutils" +require "timeout" +require "yaml" +require "yaml/store" +require "open3" + +require_relative "settings.rb" +require_relative "settings.rb" + +class GitServer + def initialize(sshbase, httpsbase, credfile) + @sshbase = sshbase + @httpsbase = httpsbase + @credentials = File.open(credfile) do | fp | + YAML.safe_load(fp.read) + end + end + + def [](job) + @credentials[job] + end + + def repo_info(job) + info = @credentials[job] + if not info then + return nil + end + repo = info["repo"] + key = info["key"] + sshurl = "#{@sshbase}/#{repo}" + httpsurl = "#{@httpsbase}/#{repo}" + return repo, key, sshurl, httpsurl + end +end + +class GitRepo + + attr_reader :job, :path, :sshurl, :httpsurl, :key + + def initialize(server, job) + @server = server + @env = { } + @job = job + @path, @key, @sshurl, @httpsurl = server.repo_info(job) + end + + def git(*subcmd, autocd: true) + cmd = [ "git" ] + if autocd then + cmd += [ "-C", "report" ] + end + cmd += subcmd + stdout, stderr, status = Open3.capture3(@env, *cmd, stdin_data: "") + File.open(".gitlog", "a") do | fp | + fp.puts(YAML.dump({ + "time" => Time.now.to_s, + "cmd" => cmd.join(" "), + "stdout" => stdout, + "stderr" => stderr, + })) + end + return stdout, stderr, status + end + + def fetch + if Dir.exist?("report") then + git("remote", "set-url", "origin", "--", @sshurl) + git("pull", "--ff-only", "origin", "master") + else + FileUtils.rm_rf("report.tmp") + git("clone", @sshurl, "report.tmp", autocd: false) + git("-C", "report.tmp", "config", + "--local", "user.email", "oscar@computeralgebra.de", autocd: false) + git("-C", "report.tmp", "config", + "--local", "user.name", "OSCAR Automation", autocd: false) + git("-C", "report.tmp", "reset", "--hard", "master") + FileUtils.mv("report.tmp", "report") + end + end + + def push + git("remote", "set-url", "origin", "--", @sshurl) + git("push", "-f", "origin", "master") + end + + def add_file(path, contents) + dir = File.dirname(path) + if dir != "" then + dir = "report/#{dir}" + FileUtils.mkdir_p(dir) + File.open("report/#{path}", "wb") do | fp | + fp.write(contents) + end + end + git("add", "--", path) + end + + def add_tree(path) + Dir.glob("**/{*,.*}", base: path) do | relpath | + loc = File.join(path, relpath) + add_file relpath, File.read(loc) if File.file?(loc) + end + end + + def commit(msg) + git("commit", "-m", msg) + end + + def upload(job, msg, files: {}, dirs: []) + return if not @server[job] + keyfile = File.expand_path("~/.ssh_git_key.#{job}") + File.write(keyfile, @key) + FileUtils.chmod(0o600, keyfile) + @env = { + "GIT_SSH_COMMAND" => "ssh -o 'StrictHostKeyChecking no' -i #{keyfile}" + } + fetch + dirs.each do | path | + add_tree(path) + end + files.each do | path, contents | + add_file(path, contents) + end + commit(msg) + push + FileUtils.rm_f(keyfile) + end +end + +class Logger + def initialize(path) + @path = path + FileUtils.mkdir_p(File.dirname(@path)) + end + + def <<(msg) + File.open(@path, "a") do | fp | + fp.write msg + end + end +end + +class TestRunner + + attr_reader :failed_tests + + DEFAULT_TIMEOUT = 1800 + + def initialize(repo, tests) + @repo = repo + @tests = tests + @failed_tests = false + @buildnum = ENV["BUILD_NUMBER"] || "0" + @workspace = $WORKSPACE + @job = repo.job + @buildurl = strip_trailing_slashes(ENV["BUILD_URL"]) + @artifacturl = "#{@buildurl}/artifact" + @jenkinsurl = strip_trailing_slashes(ENV["JENKINS_URL"]) + @maxjobs = (ENV["BUILDJOBS"] || 4).to_i + @logdir = "logs/build-#{@buildnum}" + @logurlbase = "#{@artifacturl}/#{@logdir}" + @startdate = nil + @enddate = nil + @successes = [] + @failures = [] + @testresults = {} + @jenkinshome = ENV["JENKINS_HOME"] || "/var/jenkins_home" + @jobstatepath = "#{@jenkinshome}/jobstate/#{@job}.yaml" + FileUtils.mkdir_p(File.dirname(@jobstatepath)) + @jobstate = YAML::Store.new(@jobstatepath) + @lock = Thread::Mutex.new + end + + private def strip_trailing_slashes(url) + url = url.dup + while url.end_with?("/") do url.chop! end + url + end + + private def report(msg, success:) + if success then + @successes.append(msg) + else + @failures.append(msg) + end + end + + private def buildurl + "#{@buildurl}/" + end + + private def make_build_url(buildnum) + "#{@jenkinsurl}job/#{@job}/#{buildnum}/" + end + + private def update_jobstate(info, testname, exitcode) + last_success = first_failure = nil + @lock.synchronize do + @jobstate.transaction do + info["last_success"] = false + info["last_success_url"] = nil + info["first_failure"] = false + info["first_failure_url"] = nil + if exitcode.zero? then + last_success = "" + first_failure = "" + @jobstate[testname] = [ @buildnum, "" ] + else + if @jobstate[testname] then + if @jobstate[testname][1] == "" + @jobstate[testname][1] = @buildnum + end + else + @jobstate[testname] = [ "", @buildnum ] + end + if @jobstate[testname][0] == "" then + last_success = "unknown" + first_failure = "unknown" + else + err = @jobstate[testname] + url = err.map { | n | make_build_url(n.to_s) } + last_success = "[#{err[0]}](#{url[0]})" + first_failure = "[#{err[1]}](#{url[1]})" + info["last_success"] = err[0].to_i + info["last_success_url"] = url[0] + info["first_failure"] = err[1].to_i + info["first_failure_url"] = url[1] + end + end + end + end + return last_success, first_failure + end + + private def test_command(test) + if test["script"] then + %Q{meta/tests/#{test["script"]}} + elsif test["sh"] then + test["sh"] + elsif test["julia"] then + %w{julia -e} + [ test["julia"] ] + elsif test["package"] then + %w{julia -e} + [ %Q{import Pkg; Pkg.test("#{test["package"]}")} ] + elsif test["gap"] then + %w{gap --quitonbreak -c} + [ test["gap"] ] + elsif test["gappkg"] then + gapcode = %Q{Read(Filename(DirectoriesPackageLibrary("#{test["gappkg"]}", "tst"), "testall.g"));} + %w{gap --quitonbreak -c} + [ gapcode ] + elsif test["notebook"] then + [ "ruby", "meta/check-julia-notebook.rb", test["notebook"] ] + else + fail "invalid test type" # TODO + end + end + + private def run_test(test) + testname = test["name"] + testfilename = testname.gsub(/[^-._a-zA-Z0-9]+/, "-") + testid = testname.gsub(/[^a-zA-Z0-9]+/, "-").downcase + info = { "name" => testname, "id" => testid } + timeout = test["timeout"] || DEFAULT_TIMEOUT + logfile = "#{@logdir}/#{testfilename}.log" + logurl = info["log"] = "#{@logurlbase}/#{testfilename}.log" + log = Logger.new(logfile) + begin + start_time = Time.now + @lock.synchronize do + @start_date ||= start_time.strftime("%Y-%m-%d") + end + start = start_time.strftime("%Y-%m-%d %H:%M") + info["start"] = start + start_short = start_time.strftime("%H:%M") + log << "=== #{testname} at #{start_short}\n" + testcmd = test_command(test) + polymake_user_dir = "#{$WORKSPACE}/.polymake/#{testfilename}" + FileUtils.rm_rf(polymake_user_dir) + FileUtils.mkdir_p(polymake_user_dir) + testenv = { + "POLYMAKE_USER_DIR" => polymake_user_dir + } + pid = -1 + status = nil + Timeout.timeout(timeout) do + if testcmd.is_a?(String) then + pid = spawn(testenv, testcmd, + err: [ :child, :out ], out: [ logfile, "a" ], pgroup: true) + else + pid = spawn(testenv, [testcmd.first, testcmd.first], *testcmd[1..-1], + err: [ :child, :out ], out: [ logfile, "a" ], pgroup: true) + end + _, status = Process.waitpid2(pid) + end + exitcode = status.exitstatus + if exitcode.zero? then + verbose_status = "SUCCESS" + statuscode = "\u2705" + else + verbose_status = "FAILURE" + statuscode = "\u274C" + end + rescue Timeout::Error + if pid >= 0 then + pgid = Process.getpgid(pid) + Process.kill("TERM", pgid) + sleep 5 + Process.kill("KILL", pgid) + end + exitcode = -1 + verbose_status = "TIMEOUT" + statuscode = "\u26A0" + rescue StandardError => ex + log << "#{ex.backtrace.join("\n")}\n" + log << "#{ex.inspect}\n" + exitcode = -1 + verbose_status = "INTERNAL ERROR" + statuscode = "\u2049" + end + @lock.synchronize do + @failed_tests ||= exitcode != 0 + end + info["success"] = exitcode.zero? + info["exitcode"] = exitcode + info["status"] = verbose_status.downcase + if verbose_status == "FAILURE" then + verbose_status += " (status = #{exitcode})" + end + stop_time = Time.now + stop = stop_time.strftime("%Y-%m-%d %H:%M") + @lock.synchronize do + new_end_date = stop_time.strftime("%Y-%m-%d") + @end_date ||= new_end_date + @end_date = new_end_date if new_end_date > @end_date + end + duration = (stop_time - start_time).round + info["duration"] = duration + last_success, first_failure = update_jobstate(info, testname, exitcode) + @testresults[testname] = info + testsummary = "| #{testname} " + testsummary << "| #{statuscode} [#{verbose_status}](#{logurl}) " + testsummary << "| #{start_short} | #{duration} seconds " + testsummary << "| #{last_success} | #{first_failure} " + testsummary << "|" + @lock.synchronize do + report(testsummary, success: exitcode.zero?) + end + log << "=== #{verbose_status} at #{stop}\n" + return format("Testing: %-19s at %