~nicohman/raven

fddad9bf536ec0801edfb6f47315b72de367e499 — nicohman 2 years ago 52658d0 + 60bb673
Move gui and ravenlib to seperate repos
10 files changed, 49 insertions(+), 2833 deletions(-)

A .build.yml
M Cargo.lock
M Cargo.toml
M README.md
D src/gui.css
D src/gui.rs
M src/main.rs
D src/ravenlib.rs
D src/ravenserver.rs
D src/themes.rs
A .build.yml => .build.yml +22 -0
@@ 0,0 1,22 @@
image: archlinux
packages:
  - cargo
  - cmake
  - fontconfig
  - rsync
  - python3
secrets:
  - 89991b16-705b-4276-9178-bfc81c7fdd28
environment:
  deploy: nicohman@demenses.net
sources:
  - https://git.sr.ht/~nicohman/raven
tasks:
  - build: |
      cd raven
      cargo build --release
  - deploy: |
      cd raven/target/release
      sshopts="ssh -o StrictHostKeyChecking=no"
      rsync --rsh="$sshopts" -rP raven $deploy:/home/nicohman/ravenserver/public/static/raven-nightly
      rsync --rsh="$sshopts" -rP ravend $deploy:/home/nicohman/ravenserver/public/static/ravend-nightly

M Cargo.lock => Cargo.lock +15 -1141
@@ 12,11 12,6 @@ dependencies = [
]

[[package]]
name = "android_glue"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "ansi_term"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 25,23 20,6 @@ dependencies = [
]

[[package]]
name = "app_units"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "approx"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "argon2rs"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 74,32 52,6 @@ dependencies = [
]

[[package]]
name = "azul"
version = "0.1.0"
source = "git+https://github.com/maps4print/azul?rev=7aa88a06c5da9d44052d7f71992042f0161b149e#7aa88a06c5da9d44052d7f71992042f0161b149e"
dependencies = [
 "app_units 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 "clipboard2 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "euclid 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "fern 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "font-loader 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "gleam 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "glium 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "lyon 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "nfd 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "rusttype 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "simplecss 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "tinyfiledialogs 3.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "unicode-normalization 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "webrender 0.57.2 (git+https://github.com/servo/webrender?rev=f8213800c600c8058556e962dd4f28dbc88a5931)",
]

[[package]]
name = "backtrace"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 139,20 91,6 @@ dependencies = [
]

[[package]]
name = "binary-space-partition"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "bincode"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "bitflags"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 167,11 105,6 @@ dependencies = [
]

[[package]]
name = "block"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "buf_redux"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 211,15 144,6 @@ version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "cgl"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "gleam 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "chrono"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 249,26 173,6 @@ dependencies = [
]

[[package]]
name = "clipboard-win"
version = "2.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "clipboard2"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "clipboard-win 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "x11-clipboard 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "cloudabi"
version = "0.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 277,31 181,6 @@ dependencies = [
]

[[package]]
name = "cmake"
version = "0.1.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "cocoa"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "color_quant"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "constant_time_eq"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 316,15 195,6 @@ dependencies = [
]

[[package]]
name = "core-foundation"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "core-foundation-sys"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 333,55 203,6 @@ dependencies = [
]

[[package]]
name = "core-foundation-sys"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "core-graphics"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "core-graphics"
version = "0.17.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "core-text"
version = "10.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "core-text"
version = "13.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "crc"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 391,15 212,6 @@ dependencies = [

[[package]]
name = "crossbeam-deque"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "crossbeam-deque"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [


@@ 409,20 221,6 @@ dependencies = [

[[package]]
name = "crossbeam-epoch"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "crossbeam-epoch"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [


@@ 436,14 234,6 @@ dependencies = [

[[package]]
name = "crossbeam-utils"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "crossbeam-utils"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [


@@ 451,15 241,6 @@ dependencies = [
]

[[package]]
name = "deflate"
version = "0.7.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "dirs"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 470,41 251,11 @@ dependencies = [
]

[[package]]
name = "dlib"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "downcast-rs"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "dtoa"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "dwrote"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "either"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "encoding"
version = "0.2.33"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 570,32 321,6 @@ dependencies = [
]

[[package]]
name = "euclid"
version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "euclid"
version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "expat-sys"
version = "2.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "failure"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 616,14 341,6 @@ dependencies = [
]

[[package]]
name = "fern"
version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "filetime"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 639,20 356,6 @@ version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "font-loader"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-text 10.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "servo-fontconfig 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "foreign-types"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 666,15 369,6 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "freetype"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "servo-freetype-sys 4.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "fuchsia-zircon"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 703,100 397,6 @@ dependencies = [
]

[[package]]
name = "fxhash"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "gcc"
version = "0.3.55"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "gdi32-sys"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "gif"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "gl_generator"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "gl_generator"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "gleam"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "glium"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
 "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "glutin 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "glutin"
version = "0.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "cocoa 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-client 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "winit 0.16.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "x11-dl 2.18.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "groupable"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 900,35 500,11 @@ dependencies = [
]

[[package]]
name = "image"
version = "0.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "gif 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)",
 "lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "indexmap"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "inflate"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "iovec"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 958,14 534,6 @@ version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "jpeg-decoder"
version = "0.1.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "kernel32-sys"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 975,16 543,6 @@ dependencies = [
]

[[package]]
name = "khronos_api"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "khronos_api"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "language-tags"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1015,24 573,6 @@ dependencies = [
]

[[package]]
name = "libloading"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "lock_api"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "log"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1049,55 589,6 @@ dependencies = [
]

[[package]]
name = "lyon"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lyon_algorithms 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "lyon_tessellation 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "lyon_algorithms"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lyon_path 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "lyon_geom"
version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "euclid 0.18.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "lyon_path"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lyon_geom 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "lyon_tessellation"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lyon_path 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "sid 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "lzw"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "mach"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1106,14 597,6 @@ dependencies = [
]

[[package]]
name = "malloc_buf"
version = "0.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "matches"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1127,15 610,6 @@ dependencies = [
]

[[package]]
name = "memmap"
version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "memoffset"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1269,14 743,6 @@ dependencies = [
]

[[package]]
name = "nfd"
version = "0.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "nickel"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1296,34 762,11 @@ dependencies = [
]

[[package]]
name = "nix"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
 "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "nodrop"
version = "0.1.12"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "num-derive"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)",
 "quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "syn 0.15.15 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-integer"
version = "0.1.39"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1332,32 775,6 @@ dependencies = [
]

[[package]]
name = "num-iter"
version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-rational"
version = "0.1.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-traits"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "num-traits"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1371,103 788,32 @@ dependencies = [
]

[[package]]
name = "objc"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "objc-foundation"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "objc_id"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "openssl"
version = "0.10.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "openssl-probe"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "openssl-sys"
version = "0.9.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "ordered-float"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "osmesa-sys"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "owning_ref"
version = "0.3.3"
name = "openssl"
version = "0.10.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "parking_lot"
version = "0.6.4"
name = "openssl-probe"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "parking_lot_core"
version = "0.3.1"
name = "openssl-sys"
version = "0.9.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]


@@ 1516,17 862,6 @@ version = "0.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "plane-split"
version = "0.13.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "euclid 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "plugin"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1535,17 870,6 @@ dependencies = [
]

[[package]]
name = "png"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)",
 "inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "proc-macro2"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1597,7 921,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
name = "raventhemer"
version = "1.5.0"
dependencies = [
 "azul 0.1.0 (git+https://github.com/maps4print/azul?rev=7aa88a06c5da9d44052d7f71992042f0161b149e)",
 "dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "multipart 0.15.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "reqwest 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)",


@@ 1610,27 933,6 @@ dependencies = [
]

[[package]]
name = "rayon"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rayon-core"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "redox_syscall"
version = "0.1.37"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1719,33 1021,6 @@ version = "0.3.24"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "rustc_version"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rusttype"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "rusttype"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)",
 "ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "safemem"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1795,33 1070,9 @@ dependencies = [
]

[[package]]
name = "semver"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "semver-parser"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "serde"
version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "serde_bytes"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "serde_derive"


@@ 1855,56 1106,6 @@ dependencies = [
]

[[package]]
name = "servo-fontconfig"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "servo-fontconfig-sys 4.0.7 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "servo-fontconfig-sys"
version = "4.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "expat-sys 2.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "servo-freetype-sys 4.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "servo-freetype-sys"
version = "4.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "shared_library"
version = "0.1.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "sid"
version = "0.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "simplecss"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "siphasher"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 1925,44 1126,6 @@ dependencies = [
]

[[package]]
name = "smallvec"
version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "smithay-client-toolkit"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "tempfile 3.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-client 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-commons 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-protocols 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "stable_deref_trait"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "stb_truetype"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "string"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2083,11 1246,6 @@ dependencies = [
]

[[package]]
name = "thread_profiler"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "time"
version = "0.1.39"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2111,15 1269,6 @@ dependencies = [
]

[[package]]
name = "tinyfiledialogs"
version = "3.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "tokio"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2338,15 1487,6 @@ dependencies = [
]

[[package]]
name = "user32-sys"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "utf8-ranges"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2390,104 1530,6 @@ dependencies = [
]

[[package]]
name = "wayland-client"
version = "0.20.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-commons 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-scanner 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-sys 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "wayland-commons"
version = "0.20.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "downcast-rs 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-sys 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "wayland-protocols"
version = "0.20.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-client 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-commons 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-scanner 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-sys 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "wayland-scanner"
version = "0.20.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "wayland-sys"
version = "0.20.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "webrender"
version = "0.57.2"
source = "git+https://github.com/servo/webrender?rev=f8213800c600c8058556e962dd4f28dbc88a5931#f8213800c600c8058556e962dd4f28dbc88a5931"
dependencies = [
 "app_units 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-text 13.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "dwrote 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "euclid 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "gleam 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "plane-split 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "thread_profiler 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
 "webrender_api 0.57.2 (git+https://github.com/servo/webrender?rev=f8213800c600c8058556e962dd4f28dbc88a5931)",
]

[[package]]
name = "webrender_api"
version = "0.57.2"
source = "git+https://github.com/servo/webrender?rev=f8213800c600c8058556e962dd4f28dbc88a5931#f8213800c600c8058556e962dd4f28dbc88a5931"
dependencies = [
 "app_units 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "dwrote 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "euclid 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)",
 "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "winapi"
version = "0.2.8"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2517,27 1559,6 @@ version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[[package]]
name = "winit"
version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "cocoa 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "core-graphics 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)",
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
 "objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
 "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
 "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
 "smithay-client-toolkit 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "wayland-client 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)",
 "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
 "x11-dl 2.18.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "ws2_32-sys"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2547,24 1568,6 @@ dependencies = [
]

[[package]]
name = "x11-clipboard"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "xcb 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "x11-dl"
version = "2.18.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "xattr"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"


@@ 2572,88 1575,39 @@ dependencies = [
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "xcb"
version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)",
 "log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "xml-rs"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
 "bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
]

[[package]]
name = "xml-rs"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"

[metadata]
"checksum adler32 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7e522997b529f05601e05166c07ed17789691f562762c7f3b987263d2dedee5c"
"checksum aho-corasick 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c1c6d463cbe7ed28720b5b489e7c083eeb8f90d08be2a0d6bb9e1ffea9ce1afa"
"checksum android_glue 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "000444226fcff248f2bc4c7625be32c63caccfecc2723a2b9f78a7487a49c407"
"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b"
"checksum app_units 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fc3ec9d4c47b25a5a9e5c848e053640331c7cedb1637434d75db68b79fee8a7f"
"checksum approx 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f71f10b5c4946a64aad7b8cf65e3406cd3da22fc448595991d22423cf6db67b4"
"checksum argon2rs 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3f67b0b6a86dae6e67ff4ca2b6201396074996379fba2b92ff649126f37cb392"
"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)" = "a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef"
"checksum ascii 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "97be891acc47ca214468e09425d02cef3af2c94d0d82081cd02061f996802f14"
"checksum atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "9a7d5b8723950951411ee34d271d99dddcc2035a16ab25310ea2c8cfd4369652"
"checksum azul 0.1.0 (git+https://github.com/maps4print/azul?rev=7aa88a06c5da9d44052d7f71992042f0161b149e)" = "<none>"
"checksum backtrace 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "89a47830402e9981c5c41223151efcced65a0510c13097c769cede7efb34782a"
"checksum backtrace-sys 0.1.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c66d56ac8dabd07f6aacdaf633f4b8262f5b3601a810a0dcddffd5c22c69daa0"
"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9"
"checksum base64 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "85415d2594767338a74a30c1d370b2f3262ec1b4ed2d7bba5b3faf4de40467d9"
"checksum binary-space-partition 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88ceb0d16c4fd0e42876e298d7d3ce3780dd9ebdcbe4199816a32c77e08597ff"
"checksum bincode 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9f2fb9e29e72fd6bc12071533d5dc7664cb01480c59406f656d7ac25c7bd8ff7"
"checksum bitflags 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d0c54bb8f454c567f21197eefcdbf5679d0bd99f2ddbe52e84c77061952e6789"
"checksum blake2-rfc 0.2.18 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6d530bdd2d52966a6d03b7a964add7ae1a288d25214066fd4b600f0f796400"
"checksum block 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a"
"checksum buf_redux 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20c6687a26c9ce967594b78038c06139a0d3a5b3005d16572284d543924a01aa"
"checksum build_const 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "39092a32794787acd8525ee150305ff051b0aa6cc2abaf193924f5ab05425f39"
"checksum byteorder 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8389c509ec62b9fe8eca58c502a0acaf017737355615243496cde4994f8fa4f9"
"checksum bytes 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e178b8e0e239e844b083d5a0d4a156b2654e67f9f80144d48398fcd736a24fb8"
"checksum cc 1.0.18 (registry+https://github.com/rust-lang/crates.io-index)" = "2119ea4867bd2b8ed3aecab467709720b2d55b1bcfe09f772fd68066eaf15275"
"checksum cfg-if 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "efe5c877e17a9c717a0bf3613b2709f723202c4e4675cc8f12926ded29bcb17e"
"checksum cgl 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "55e7ec0b74fe5897894cbc207092c577e87c52f8a59e8ca8d97ef37551f60a49"
"checksum chrono 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e48d85528df61dc964aa43c5f6ca681a19cfa74939b2348d204bd08a981f2fb0"
"checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87"
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
"checksum clipboard-win 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "289da2fc09ab964a4948a63287c94fcb4698fa823c46da84c3792928c9d36110"
"checksum clipboard2 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "240f0df217fb302a7d47f78a52403e2405c2b363fbdb34ac488dbc57126280e5"
"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
"checksum cmake 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "6ec65ee4f9c9d16f335091d23693457ed4928657ba4982289d7fafee03bc614a"
"checksum cocoa 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b44bd25bd275e9d74a5dff8ca55f2fb66c9ad5e12170d58697701df21a56e0e"
"checksum color_quant 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0dbbb57365263e881e805dc77d94697c9118fd94d8da011240555aa7b23445bd"
"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e"
"checksum core-foundation 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "286e0b41c3a20da26536c6000a280585d519fd07b3956b43aed8a79e9edce980"
"checksum core-foundation 0.6.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4e2640d6d0bf22e82bed1b73c6aef8d5dd31e5abe6666c57e6d45e2649f4f887"
"checksum core-foundation-sys 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "716c271e8613ace48344f723b60b900a93150271e5be206212d052bbc0883efa"
"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b"
"checksum core-graphics 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e54c4ab33705fa1fc8af375bb7929d68e1c1546c1ecef408966d8c3e49a1d84a"
"checksum core-graphics 0.17.3 (registry+https://github.com/rust-lang/crates.io-index)" = "56790968ab1c8a1202a102e6de05fc6e1ec87da99e4e93e9a7d13efbfc1e95a9"
"checksum core-text 10.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "81f59bff773954e5cd058a3f5983406b52bec7cc65202bef340ba64a0c40ac91"
"checksum core-text 13.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7210eea4baa4b51d7319d90e4787d8a2b472c8d5d9926dc39be85fecac0e6df7"
"checksum crc 1.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d663548de7f5cca343f1e0a48d14dcfb0e9eb4e079ec58883b7251539fa10aeb"
"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
"checksum crossbeam-deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe8153ef04a7594ded05b427ffad46ddeaf22e63fd48d42b3e1e3bb4db07cae7"
"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150"
"checksum crossbeam-epoch 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2af0e75710d6181e234c8ecc79f14a97907850a541b13b0be1dd10992f2e4620"
"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9"
"checksum crossbeam-utils 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d636a8b3bcc1b409d7ffd3facef8f21dcb4009626adbd0c5e6c4305c07253c7b"
"checksum deflate 0.7.19 (registry+https://github.com/rust-lang/crates.io-index)" = "8a6abb26e16e8d419b5c78662aa9f82857c2386a073da266840e474d5055ec86"
"checksum dirs 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "88972de891f6118092b643d85a0b28e0678e0f948d7f879aa32f2d5aafe97d2a"
"checksum dlib 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "77e51249a9d823a4cb79e3eca6dcd756153e8ed0157b6c04775d04bf1b13b76a"
"checksum downcast-rs 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "18df8ce4470c189d18aa926022da57544f31e154631eb4cfe796aea97051fe6c"
"checksum dtoa 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6d301140eb411af13d3115f9a562c85cc6b541ade9dfa314132244aaee7489dd"
"checksum dwrote 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "18e895b763d82cafef31c7c1e2f4f17fb70f385ac651b0918a46ff5790664a63"
"checksum either 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3be565ca5c557d7f59e7cfcf1844f9e3033650c929c6566f511e8005f205c1d0"
"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec"
"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91"
"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81"


@@ 2662,31 1616,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18"
"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569"
"checksum encoding_rs 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)" = "21a550ec129ca2f8593227888625c7c5331c6ad878e2cee6b7ac25e1c7d05746"
"checksum euclid 0.18.2 (registry+https://github.com/rust-lang/crates.io-index)" = "59b34ec7d95d70d5cda27301d6182bc17abce8b5b52e260f5ff32c677923bbb0"
"checksum euclid 0.19.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4019b11e3498dd84d8893848c3d70e40c6dc71bb277ae5252cc16af006d06872"
"checksum expat-sys 2.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "658f19728920138342f68408b7cf7644d90d4784353d8ebc32e7e8663dbe45fa"
"checksum failure 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6dd377bcc1b1b7ce911967e3ec24fa19c3224394ec05b54aa7b083d498341ac7"
"checksum failure_derive 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "64c2d913fe8ed3b6c6518eedf4538255b989945c14c2a7d5cbff62a5e2120596"
"checksum fern 0.5.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b48af88aaf938b11baef948a5599e66e709cf92854aa2b87c71f1bcf20f80a01"
"checksum filetime 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "da4b9849e77b13195302c174324b5ba73eec9b236b24c221a61000daefb95c5f"
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
"checksum font-loader 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fd330f40acb3016432cbfa4c54b3d6e6e893a538df79d8df8fd8c26e21c36aaa"
"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
"checksum freetype 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "11926b2b410b469d0e9399eca4cbbe237a9ef02176c485803b29216307e8e028"
"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82"
"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
"checksum futures 0.1.23 (registry+https://github.com/rust-lang/crates.io-index)" = "884dbe32a6ae4cd7da5c6db9b78114449df9953b8d490c9d7e1b51720b922c62"
"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4"
"checksum fxhash 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
"checksum gcc 0.3.55 (registry+https://github.com/rust-lang/crates.io-index)" = "8f5f3913fa0bfe7ee1fd8248b6b9f42a5af4b9d65ec2dd2c3c26132b950ecfc2"
"checksum gdi32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0912515a8ff24ba900422ecda800b52f4016a56251922d397c576bf92c690518"
"checksum gif 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dd4bca55ac1f213920ce3527ccd62386f1f15fa3f1714aeee1cf93f2c416903f"
"checksum gl_generator 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a0ffaf173cf76c73a73e080366bf556b4776ece104b06961766ff11449f38604"
"checksum gl_generator 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a795170cbd85b5a7baa58d6d7525cae6a03e486859860c220f7ebbbdd379d0a"
"checksum gleam 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f5d2f879e1548675cf46169cd7e770f6a6916f6263052fe4e6afc3b41bb7f63c"
"checksum glium 0.22.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6ec8f9506ee0379c931299f280a6e06767b0dc6ac0f1890cf1cb6c30d600fca5"
"checksum glutin 0.17.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a70c5fe78efbd5a3b243a804ea1032053c584510f8822819f94cfb29b2100317"
"checksum groupable 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "32619942b8be646939eaf3db0602b39f5229b74575b67efc897811ded1db4e57"
"checksum h2 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "a27e7ed946e8335bdf9a191bc1b9b14a03ba822d013d2f58437f4fabcbd7fc2c"
"checksum http 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "24f58e8c2d8e886055c3ead7b28793e1455270b5fb39650984c224bc538ba581"


@@ 2695,36 1634,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum hyper 0.12.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2f60ae467ef4fc5eba9a34d31648c9c8ed902faf45a217f6734ce9ea64779ac7"
"checksum hyper-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "caaee4dea92794a9e697038bd401e264307d1f22c883dbcb6f6618ba0d3b3bd3"
"checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e"
"checksum image 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ebdff791af04e30089bde8ad2a632b86af433b40c04db8d70ad4b21487db7a6a"
"checksum indexmap 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "08173ba1e906efb6538785a8844dd496f5d34f0a2d88038e95195172fc667220"
"checksum inflate 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6f53b811ee8e2057ccf9643ca6b4277de90efaf5e61e55fd5254576926bb4245"
"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08"
"checksum iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8e17268922834707e1c29e8badbf9c712c9c43378e1b6a3388946baff10be2"
"checksum itoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5adb58558dcd1d786b5f0bd15f3226ee23486e24b7b58304b60f64dc68e62606"
"checksum jpeg-decoder 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "c8b7d43206b34b3f94ea9445174bda196e772049b9bddbc620c9d29b2d20110d"
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
"checksum khronos_api 2.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "037ab472c33f67b5fbd3e9163a2645319e5356fcd355efa6d4eb7fff4bbcb554"
"checksum khronos_api 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "62237e6d326bd5871cd21469323bf096de81f1618cd82cbaf5d87825335aeb49"
"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
"checksum lazy_static 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fb497c35d362b6a331cfd94956a07fc2c78a4604cdbee844a81170386b996dd3"
"checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef"
"checksum libc 0.2.43 (registry+https://github.com/rust-lang/crates.io-index)" = "76e3a3ef172f1a0b9a9ff0dd1491ae5e6c948b94479a3021819ba7d860c8645d"
"checksum libflate 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "21138fc6669f438ed7ae3559d5789a5f0ba32f28c1f0608d1e452b0bb06ee936"
"checksum libloading 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c3ad660d7cb8c5822cd83d10897b0f1f1526792737a179e73896152f85b88c2"
"checksum lock_api 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "775751a3e69bde4df9b38dd00a1b5d6ac13791e4223d4a0506577f0dd27cfb7a"
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
"checksum log 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "61bd98ae7f7b754bc53dca7d44b604f733c6bba044ea6f41bc8d89272d8161d2"
"checksum lyon 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c767172681d5e43842e9f46a392aecc11fc8ead62b2199389e7332375aef721"
"checksum lyon_algorithms 0.11.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b3ebe7b9bffa94e7d8d332992bd1d8b9c0318170862487f0a2d7e04bcc5aabbe"
"checksum lyon_geom 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c8ee0dc4aec93a8fd9109362bebfbad0ace69b8629937f954ecc8eea1de63146"
"checksum lyon_path 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "98c39b845796d4590197e2b2b97202e31b69071116a541bfddb52f50680318f0"
"checksum lyon_tessellation 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b8449ff06a89995f90e4b6b36f97ef05ae2abcb8227beae9398f542e5a78e1f4"
"checksum lzw 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7d947cbb889ed21c2a84be6ffbaebf5b4e0f4340638cba0444907e38b56be084"
"checksum mach 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b549fa8738e27dcf6c8c5d6d35211e786aa02715a22b60c33b9488fdd634a90b"
"checksum malloc_buf 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb"
"checksum matches 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "835511bab37c34c47da5cb44844bea2cfde0236db0b506f90ea4224482c9774a"
"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
"checksum memoffset 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0f9dc261e2b62d7a622bf416ea3c5245cdd5d9a7fcc428c0d06804dfce1775b3"
"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0"
"checksum mime 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "fe51c8699d2dc522bf8c1ebe26ea2193d151fb54bcdfd7d0318750c189994cd9"


@@ 2737,45 1661,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum mustache 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ddb004e419334fc9172d0a5ff91c0770bdd6239091b0b343eb5926101f0a7d13"
"checksum native-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8b0a7bd714e83db15676d31caf968ad7318e9cc35f93c85a90231c8f22867549"
"checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0"
"checksum nfd 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e752e3c216bc8a491c5b59fa46da10f1379ae450b19ac688e07f4bb55042e98"
"checksum nickel 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "22b40e35b9f46a076dcbd8193125cea0e4130b1c015f68655038010f3e826e04"
"checksum nix 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d37e713a259ff641624b6cb20e3b12b2952313ba36b6823c0f16e6cfd9e5de17"
"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2"
"checksum num-derive 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8af1847c907c2f04d7bfd572fb25bbb4385c637fe5be163cf2f8c5d778fe1e7d"
"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea"
"checksum num-iter 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "af3fdbbc3291a5464dc57b03860ec37ca6bf915ed6ee385e7c6c052c422b2124"
"checksum num-rational 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "ee314c74bd753fc86b4780aa9475da469155f3848473a261d2d18e35245a784e"
"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
"checksum num-traits 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "630de1ef5cc79d0cdd78b7e33b81f083cbfe90de0f4b2b2f07f905867c70e9fe"
"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30"
"checksum objc 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "9833ab0efe5361b1e2122a0544a5d3359576911a42cb098c2e59be8650807367"
"checksum objc-foundation 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9"
"checksum objc_id 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b"
"checksum openssl 0.10.12 (registry+https://github.com/rust-lang/crates.io-index)" = "5e2e79eede055813a3ac52fb3915caf8e1c9da2dec1587871aec9f6f7b48508d"
"checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de"
"checksum openssl-sys 0.9.36 (registry+https://github.com/rust-lang/crates.io-index)" = "409d77eeb492a1aebd6eb322b2ee72ff7c7496b4434d98b3bf8be038755de65e"
"checksum ordered-float 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2f0015e9e8e28ee20c581cfbfe47c650cedeb9ed0721090e0b7ebb10b9cdbcc2"
"checksum osmesa-sys 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "88cfece6e95d2e717e0872a7f53a8684712ad13822a7979bc760b9c77ec0013b"
"checksum owning_ref 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "cdf84f41639e037b484f93433aa3897863b561ed65c6e59c7073d7c561710f37"
"checksum parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "f0802bff09003b291ba756dc7e79313e51cc31667e94afbe847def490424cde5"
"checksum parking_lot_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ad7f7e6ebdc79edff6fdcb87a55b620174f7a989e3eb31b65231f4af57f00b8c"
"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831"
"checksum phf 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "7d37a244c75a9748e049225155f56dbcb98fe71b192fd25fd23cb914b5ad62f2"
"checksum phf_codegen 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "4e4048fe7dd7a06b8127ecd6d3803149126e9b33c7558879846da3a63f734f2b"
"checksum phf_generator 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "05a079dd052e7b674d21cb31cbb6c05efd56a2cd2827db7692e2f1a507ebd998"
"checksum phf_shared 0.7.22 (registry+https://github.com/rust-lang/crates.io-index)" = "c2261d544c2bb6aa3b10022b0be371b9c7c64f762ef28c6f5d4f1ef6d97b5930"
"checksum pkg-config 0.3.12 (registry+https://github.com/rust-lang/crates.io-index)" = "6a52e4dbc8354505ee07e484ab07127e06d87ca6fa7f0a516a2b294e5ad5ad16"
"checksum plane-split 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9b1d9a84aa3bbc2dafd06856bdb1dc333eb1d442ad8987b9d596c7344b3ed969"
"checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0"
"checksum png 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f54b9600d584d3b8a739e1662a595fab051329eff43f20e7d8cc22872962145b"
"checksum proc-macro2 0.4.9 (registry+https://github.com/rust-lang/crates.io-index)" = "cccdc7557a98fe98453030f077df7f3a042052fae465bb61d2c2c41435cfd9b6"
"checksum quick-error 1.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9274b940887ce9addde99c4eee6b5c44cc494b182b97e73dc8ffdcb3397fd3f0"
"checksum quote 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b71f9f575d55555aa9c06188be9d4e2bfc83ed02537948ac0d520c24d0419f1a"
"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5"
"checksum rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e464cd887e869cddcae8792a4ee31d23c7edd516700695608f5b98c67ee0131c"
"checksum rand_core 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "edecf0f94da5551fc9b492093e30b041a891657db7940ee221f9d2f66e82eef2"
"checksum rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "373814f27745b2686b350dd261bfd24576a6fb0e2c5919b3a2b6005f820b0473"
"checksum rayon-core 1.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b055d1e92aba6877574d8fe604a63c8b5df60f60e5982bf7ccbb1338ea527356"
"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd"
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
"checksum redox_users 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "214a97e49be64fd2c86f568dd0cb2c757d2cc53de95b273b6ad0a1c908482f26"


@@ 2785,9 1691,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum reqwest 0.9.5 (registry+https://github.com/rust-lang/crates.io-index)" = "ab52e462d1e15891441aeefadff68bdea005174328ce3da0a314f2ad313ec837"
"checksum rustc-demangle 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bcfe5b13211b4d78e5c2cadfebd7769197d95c639c35a50057eb4c05de811395"
"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda"
"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
"checksum rusttype 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "320899ed15d373f4bad3c1288da0a98dd50cef5c0b2e8d21c84d327a585917c5"
"checksum rusttype 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b8eb11f5b0a98c8eca2fb1483f42646d8c340e83e46ab416f8a063a0fd0eeb20"
"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f"
"checksum safemem 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8dca453248a96cb0749e36ccdfe2b0b4e54a61bfef89fb97ec621eb8e0a93dd9"
"checksum schannel 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "dc1fabf2a7b6483a141426e1afd09ad543520a77ac49bd03c286e7696ccfd77f"


@@ 2795,26 1698,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27"
"checksum security-framework 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "697d3f3c23a618272ead9e1fb259c1411102b31c6af8b93f1d64cca9c3b0e8e0"
"checksum security-framework-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ab01dfbe5756785b5b4d46e0289e5a18071dfa9a7c2b24213ea00b9ef9b665bf"
"checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
"checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
"checksum serde 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "e9a2d9a9ac5120e0f768801ca2b58ad6eec929dc9d1d616c162f208869c2ce95"
"checksum serde_bytes 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "adb6e51a6b3696b301bc221d785f898b4457c619b51d7ce195a6d20baecb37b3"
"checksum serde_derive 1.0.66 (registry+https://github.com/rust-lang/crates.io-index)" = "0a90213fa7e0f5eac3f7afe2d5ff6b088af515052cc7303bd68c7e3b91a3fb79"
"checksum serde_json 1.0.24 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c6908c7b925cd6c590358a4034de93dbddb20c45e1d021931459fd419bf0e2"
"checksum serde_urlencoded 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e703cef904312097cfceab9ce131ff6bbe09e8c964a0703345a5f49238757bc1"
"checksum servo-fontconfig 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a088f8d775a5c5314aae09bd77340bc9c67d72b9a45258be34c83548b4814cd9"
"checksum servo-fontconfig-sys 4.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b46d201addcfbd25c1798ad1281d98c40743824e0b0f1e611bd3d5d0d31a7b8d"
"checksum servo-freetype-sys 4.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d00ab791f66cd2ec58e72c91b6076cee20fac560463aa871404eb31dfc9c4ff"
"checksum shared_library 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5a9e7e0f2bfae24d8a5b5a66c5b257a83c7412304311512a0c054cd5e619da11"
"checksum sid 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "29e0a6006cf04d568a49363baca3dabddbbe46538f7c76692d405f5f5d140ecd"
"checksum simplecss 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "135685097a85a64067df36e28a243e94a94f76d829087ce0be34eeb014260c0e"
"checksum siphasher 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac"
"checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d"
"checksum slice-deque 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d9a5f495de574fc059720e2d7b865676d3812aac26d51f0542a0ef8580a1f2ca"
"checksum smallvec 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "153ffa32fd170e9944f7e0838edf824a754ec4c1fc64746fcc9fe1f8fa602e5d"
"checksum smithay-client-toolkit 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2051bffc6cbf271176e8ba1527f801b6444567daee15951ff5152aaaf7777b2f"
"checksum stable_deref_trait 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dba1a27d3efae4351c8051072d619e3ade2820635c3958d826bfea39d59b54c8"
"checksum stb_truetype 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "48fa7d3136d8645909de1f7c7eb5416cc43057a75ace08fc39ae736bc9da8af1"
"checksum string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00caf261d6f90f588f8450b8e1230fa0d5be49ee6140fdfbcb55335aff350970"
"checksum strsim 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550"
"checksum structopt 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)" = "d8e9ad6a11096cbecdcca0cc6aa403fdfdbaeda2fb3323a39c98e6a166a1e45a"


@@ 2828,10 1718,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963"
"checksum thread_profiler 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "5920e77802b177479ab5795767fa48e68f61b2f516c2ac0041e2978dd8efe483"
"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098"
"checksum tiny_http 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a442681f9f72e440be192700eeb2861e4174b9983f16f4877c93a134cb5e5f63"
"checksum tinyfiledialogs 3.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d79833ca2c493c726ea6a7b651ba0ff8a790add5156cd11bf3743f346005c0c8"
"checksum tokio 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8ee337e5f4e501fc32966fec6fe0ca0cc1c237b0b1b14a335f8bfe3c5f06e286"
"checksum tokio-codec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "881e9645b81c2ce95fcb799ded2c29ffb9f25ef5bef909089a420e5961dd8ccb"
"checksum tokio-executor 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8cac2a7883ff3567e9d66bb09100d09b33d90311feca0206c7ca034bc0c55113"


@@ 2857,7 1745,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
"checksum unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f"
"checksum url 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2a321979c09843d272956e73700d12c4e7d3d92b2ee112b31548aef0d4efc5a6"
"checksum user32-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ef4711d107b21b410a3a974b1204d9accc8b10dad75d8324b5d755de1617d47"
"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
"checksum uuid 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dab5c5526c5caa3d106653401a267fed923e7046f35895ffcb5ca42db64942e6"
"checksum vcpkg 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cbe533e138811704c0e3cbde65a818b35d3240409b4346256c5ede403e082474"


@@ 2865,23 1752,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
"checksum version_check 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7716c242968ee87e5542f8021178248f267f295a5c4803beae8b8b7fd9bc6051"
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
"checksum want 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "797464475f30ddb8830cc529aaaae648d581f99e2036a928877dfde027ddf6b3"
"checksum wayland-client 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e7516a23419a55bd2e6d466c75a6a52c85718e5013660603289c2b8bee794b12"
"checksum wayland-commons 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)" = "d8609d59b95bf198bae4f3b064d55a712f2d529eec6aac98cc1f6e9cc911d47a"
"checksum wayland-protocols 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)" = "bd4d31a96be6ecdbaddbf35200f5af2daee01be592afecd8feaf443d417e9230"
"checksum wayland-scanner 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)" = "e674d85ae9c67cbbc590374d8f2e20a7a02fff87ce3a31fc52213afece8d05ad"
"checksum wayland-sys 0.20.12 (registry+https://github.com/rust-lang/crates.io-index)" = "87c82ee658aa657fdfd7061f22e442030d921cfefc5bad68bcf41973e67922f7"
"checksum webrender 0.57.2 (git+https://github.com/servo/webrender?rev=f8213800c600c8058556e962dd4f28dbc88a5931)" = "<none>"
"checksum webrender_api 0.57.2 (git+https://github.com/servo/webrender?rev=f8213800c600c8058556e962dd4f28dbc88a5931)" = "<none>"
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0"
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
"checksum winit 0.16.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec43db5991cc509f5b0c68cb0a0d3614f697c888999990a186a2e895c7f723c0"
"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e"
"checksum x11-clipboard 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d8617c6185c96e5fcf57ff156496d73c9c82b7f09a5fea21b518dd32c10e2e05"
"checksum x11-dl 2.18.3 (registry+https://github.com/rust-lang/crates.io-index)" = "940586acb859ea05c53971ac231685799a7ec1dee66ac0bccc0e6ad96e06b4e3"
"checksum xattr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c"
"checksum xcb 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5e917a3f24142e9ff8be2414e36c649d47d6cc2ba81f16201cdef96e533e02de"
"checksum xml-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3c1cb601d29fe2c2ac60a2b2e5e293994d87a1f6fa9687a31a15270f909be9c2"
"checksum xml-rs 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "541b12c998c5b56aa2b4e6f18f03664eef9a4fd0a246a55594efae6cc2d964b5"

M Cargo.toml => Cargo.toml +4 -13
@@ 2,7 2,7 @@
name = "raventhemer"
version = "1.5.0"
authors = ["nicohman <nicohman@demenses.net>"]
repository="https://github.com/nicohman/raven"
repository="https://git.sr.ht/~nicohman/raven"
description="A theme manager and switcher for desktop linux"
readme="README.md"
keywords=["linux","cli","customization"]


@@ 12,19 12,10 @@ license="GPL-3.0"
name = "raven"
path = "src/main.rs"
[[bin]]
name = "graven"
path = "src/gui.rs"
[lib]
name = "ravenlib"
path = "src/ravenlib.rs"
name = "ravend"
path = "src/ravend.rs"
[dependencies]
azul = { git = "https://github.com/maps4print/azul", rev = "7aa88a06c5da9d44052d7f71992042f0161b149e" }
ravenlib = "1.0.0"
time = "0.1"
serde = "1.0.66"
serde_derive = "1.0"
serde_json = "1.0"
tar = "0.4"
reqwest = "0.9.5"
multipart = "0.15.2"
structopt = "0.2.10"
dirs = "1.0"

M README.md => README.md +8 -4
@@ 1,6 1,6 @@
# Raven

A theme manager for linux, currently focusing on i3. Supports multiple different configuration files, and is fast and portable.
A theme manager for linux, currently focusing on i3. Supports multiple different configuration files, and is fast and portable. Upstream now hosted at [sr.ht](https://git.sr.ht/~nicohman/raven).

### Example



@@ 8,7 8,11 @@ A theme manager for linux, currently focusing on i3. Supports multiple different

## ThemeHub

Raven supports installing themes from and publishing themes to [ThemeHub](https://demenses.net), or your own instance of [ravenserver](https://github.com/nicohman/ravenserver). I encourage everyone to share their themes and rices there!
Raven supports installing themes from and publishing themes to [ThemeHub](https://demenses.net), or your own instance of [ravenserver](https://git.sr.ht/~nicohman/ravenserver). I encourage everyone to share their themes and rices there!

## Contributing and Issues

I'm very happy to take pull requests and bug reports, but I'm migrating to [sr.ht](http://sr.ht), and I would prefer it if you would put issues into the [todo.sr.ht tracker](https://todo.sr.ht/~nicohman/raven) and send patches/pull requests to the [mailing list](https://lists.sr.ht/~nicohman/raven). There's a guide for submitting patches [here](https://man.sr.ht/git.sr.ht/send-email.md). Issues and pull requests will still remain open, but sr.ht is preferred.

## Installation



@@ 17,7 21,7 @@ You can install from [crates.io](https://crates.io/crates/raventhemer) by runnin

Run:

`git clone https://github.com/nicohman/raven.git && cd raven`
`git clone https://git.sr.ht/~nicohman/raven && cd raven`

`cargo install --path . --force`



@@ 140,4 144,4 @@ With the cycle command you can control a daemon that will automatically cycle th

Plain text containing `sublt/<filename>.<extension>` (which you must create on your theme folder) or the name of an already installed theme (e.g `DA.sublime-theme`)

Extensions: st_tmtheme (`.tmTheme`), st_scs (`.sublime-color-scheme`) and st_subltheme (`.sublime-theme`)
\ No newline at end of file
Extensions: st_tmtheme (`.tmTheme`), st_scs (`.sublime-color-scheme`) and st_subltheme (`.sublime-theme`)

D src/gui.css => src/gui.css +0 -84
@@ 1,84 0,0 @@
* {
  color: #93a1a1;
}

#themes-list {
  border: 1px solid #2aa198;
  width: 280px;
  background-color: #1a7770;
  font-size: 12px;
}

.theme-item {
  height: 65px;
  border: 1px solid #2aa198;
  padding: 16px;
  background-color: #073642;
}
.option-list {
  text-align: left;
  font-size:12px;
  margin-left:64px;
}
.theme-image {
  max-width:500px;
  margin-left: 32px;
  max-height:400px;
  margin-bottom: 32px;
}
.theme-name {
  height: 64px;
  text-align: left;
  margin-left: 48px;
  font-size: 20px;
}
.theme-item .selected {
  background-color: #657b83;
  height: 64px;
  border: 1px solid #2aa198;
  padding: 16px;
}

#cur-theme {
  border: 1px solid #2aa198;
  background-color: #002b36;
  width: 700px;
}

#right {
  width: 700px;
  border: 1px solid #2aa198;
  flex-direction: column;
}

#bottom-bar {
  height: 80px;
  width: 700px;
  background-color: #073642;
  border: 1px solid #2aa198;
  flex-direction: row-reverse;
  justify-content: flex-end;
}

.bot-button {
  margin-left: 10px;
  width: 100px;
  height: 60px;
  margin-right: 10px;
  background-color: #002b36;
  font-size:15px;
}

#main {
  flex-direction: row;
  width:980px;
}

/*:root {
	--main-bg: #073642;
	--text: #93a1a1;
	--sec-bg:  #002b36;
	--border: #2aa198;
	--link: #657b83;
	--shadow: #1a7770;
}*/

D src/gui.rs => src/gui.rs +0 -265
@@ 1,265 0,0 @@
extern crate azul;
extern crate ravenlib;
extern crate reqwest;
use azul::window_state::WindowSize;
use azul::{prelude::*, widgets::button::Button};
use config::*;
use ravenlib::*;
use std::cell::RefCell;
use std::collections::BTreeSet;
use std::fs;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;
use std::io::Write;
use std::process::Command;
use std::sync::Arc;
use themes::*;
use NodeType::*;
struct DataModel {
    config: Config,
    themes: Vec<Theme>,
    selected_theme: Option<usize>,
    text: Vec<TextId>,
    screenshots: Vec<Option<String>>,
}
impl Layout for DataModel {
    fn layout(&self, info: WindowInfo<Self>) -> Dom<Self> {
        let mut set = vec![On::MouseUp];
        let buts = self
            .themes
            .iter()
            .enumerate()
            .map(|(i, theme)| NodeData {
                node_type: NodeType::Label(theme.name.clone()),
                classes: if self.selected_theme == Some(i) {
                    vec!["theme-item".into(), "selected".into()]
                } else {
                    vec!["theme-item".into()]
                },
                force_enable_hit_test: set.clone(),
                ..Default::default()
            })
            .collect::<Dom<Self>>()
            .with_id("themes-list")
            .with_callback(On::MouseUp, Callback(select_theme));
        let delete_button = Button::with_label("Delete Theme")
            .dom().with_class("bot-button")
            .with_callback(On::MouseUp, Callback(delete_callback));
        let load_button = Button::with_label("Load Theme")
            .dom().with_class("bot-button")
            .with_callback(On::MouseUp, Callback(load_callback));
        let refresh_button = Button::with_label("Refresh Last Theme")
            .dom().with_class("bot-button")
            .with_callback(On::MouseUp, Callback(refresh_callback));
        let mut cur_theme = Dom::new(Div).with_id("cur-theme");
        let online_button = Button::with_label("View on ThemeHub")
            .dom().with_class("bot-button")
            .with_callback(On::MouseUp, Callback(online_callback));
        let open_button = Button::with_label("View in File Manager").dom().with_class("bot-button").with_callback(On::MouseUp, Callback(open_callback));
        if self.selected_theme.is_some() {
            let theme = &self.themes[self.selected_theme.unwrap()];
            let name = Dom::new(Label(theme.name.clone())).with_class("theme-name");
            let option_list =
                Dom::new(Text(self.text[self.selected_theme.unwrap()])).with_class("option-list");
            cur_theme = cur_theme.with_child(name);
            if theme.screenshot != default_screen() && theme.screenshot.len() > 0 {
                if info.resources.has_image(theme.name.clone()) {
                    let screenshot =
                        Dom::new(Image(info.resources.get_image(theme.name.clone()).unwrap()))
                            .with_class("theme-image");
                    cur_theme = cur_theme.with_child(screenshot);
                }
            }
            cur_theme = cur_theme.with_child(option_list);
        } else {
            cur_theme = cur_theme.with_child(Dom::new(Label(format!("No Theme selected"))));
        }
        let mut bottom_bar = Dom::new(Div)
            .with_id("bottom-bar")
            .with_child(online_button)
            .with_child(open_button)
            .with_child(refresh_button)
            .with_child(load_button)
            .with_child(delete_button);
        let right = Dom::new(Div)
            .with_id("right")
            .with_child(cur_theme)
            .with_child(bottom_bar);
        Dom::new(Div)
            .with_id("main")
            .with_child(buts)
            .with_child(right)
    }
}
fn load_callback(state: &mut AppState<DataModel>, event: WindowEvent<DataModel>) -> UpdateScreen {
    let data = state.data.lock().unwrap();
    if data.selected_theme.is_some() {
        println!(
            "Loading theme {}",
            data.themes[data.selected_theme.unwrap()].name
        );
        run_theme(&data.themes[data.selected_theme.unwrap()]);
        UpdateScreen::Redraw
    } else {
        UpdateScreen::DontRedraw
    }
}
fn open_callback(state: &mut AppState<DataModel>, event: WindowEvent<DataModel>) -> UpdateScreen {
    let data = state.data.lock().unwrap();
    if data.selected_theme.is_some() {
        let path = get_home()+"/.config/raven/themes/"+&data.themes[data.selected_theme.unwrap()].name;
        println!("{}",path);
        let output = Command::new("xdg-open")
            .arg(path)
            .spawn()
            .expect("Couldn't use xdg-open to open folder");
    }
    UpdateScreen::DontRedraw

}
fn delete_callback(state: &mut AppState<DataModel>, event: WindowEvent<DataModel>) -> UpdateScreen {
    let mut up = UpdateScreen::DontRedraw;
    state.data.modify(|data| {
        if data.selected_theme.is_some() {
            println!(
                "Deleting theme {}",
                data.themes[data.selected_theme.unwrap()].name
            );
            del_theme(data.themes[data.selected_theme.unwrap()].name.as_str());
            data.themes.remove(data.selected_theme.unwrap());
            data.selected_theme = Some(0);
            up = UpdateScreen::Redraw
        }
    });
    up
}
fn refresh_callback(
    state: &mut AppState<DataModel>,
    event: WindowEvent<DataModel>,
) -> UpdateScreen {
    refresh_theme(state.data.lock().unwrap().config.last.clone());
    UpdateScreen::DontRedraw
}
fn online_callback(state: &mut AppState<DataModel>, event: WindowEvent<DataModel>) -> UpdateScreen {
    let data = state.data.lock().unwrap();
    if data.selected_theme.is_some() {
        let host = data.config.host.clone();
        let uri = host + "/themes/view/" + &data.themes[data.selected_theme.unwrap()].name;
        let output = Command::new("xdg-open")
            .arg(uri)
            .output()
            .expect("Couldn't use xdg-open to launch website");
    }
    UpdateScreen::DontRedraw
}
fn select_theme(
    app_state: &mut AppState<DataModel>,
    event: WindowEvent<DataModel>,
) -> UpdateScreen {
    println!("{}", event.hit_dom_node);
    let selected = event
        .get_first_hit_child(event.hit_dom_node, On::MouseUp)
        .and_then(|x| Some(x.0));
    let mut should_redraw = UpdateScreen::DontRedraw;
    app_state.data.modify(|state| {
        if selected.is_some() && selected != state.selected_theme {
            state.selected_theme = selected;
            should_redraw = UpdateScreen::Redraw;
        }
        println!("Selected theme: {:?}", state.selected_theme);
    });
    should_redraw
}
fn main() {
    if fs::metadata(get_home() + "/.config/raven/screenshots").is_err() {
        let cres = fs::create_dir(get_home() + "/.config/raven/screenshots");
        if cres.is_err() {
            println!(
                "Failed to init screenshot directory. Error Message: {:?}\n",
                cres
            );
        }
    }
    macro_rules! CSS_PATH {
        () => {
            concat!(env!("CARGO_MANIFEST_DIR"), "/src/gui.css")
        };
    }
    println!("Starting GUI");
    let mut themes = load_themes();
    let mut app = App::new(
        DataModel {
            config: get_config(),
            selected_theme: None,
            themes: themes.clone(),
            text: vec![],
            screenshots: vec![],
        },
        AppConfig::default(),
    );

    let font_id = FontId::BuiltinFont("sans-serif".into());
    for (i, theme) in themes.iter().enumerate() {
        if theme.screenshot != default_screen() {
            let mut buf: Vec<u8> = vec![];
            let spath = get_home()
                + "/.config/raven/screenshots/"
                + &theme.screenshot.clone().replace("/", "").replace(":", "");
            if fs::metadata(&spath).is_err() {
                print!(
                    "Downloading {}'s screenshot from {}",
                    theme.name, theme.screenshot
                );
                let mut fd = fs::File::create(&spath).unwrap();
                let res = reqwest::get(&theme.screenshot.clone());
                if res.is_ok() {
                    let r = res.unwrap().read_to_end(&mut buf);
                    if r.is_err() {
                        println!("Failed reading. Error Message: \n{:?}", r);
                        continue;
                    } else {
                        fd.seek(SeekFrom::Start(0));
                        fd.write_all(&mut buf).expect("Couldn't write to file");
                    }
                } else {
                    println!("Failed downloading. Error Message: \n{:?}", res);
                    continue;
                }
            } else {
                let mut fd = fs::File::open(&spath).unwrap();
                fd.read_to_end(&mut buf).expect("Couldn't read file");
            }
            let ires = app.add_image(
                theme.name.clone(),
                &mut buf.as_slice(),
                ImageType::GuessImageFormat,
            );
            app.app_state.data.modify(|state| {
                state.screenshots.resize(i + 1, Some(String::new()));
                state.screenshots[i] = Some(theme.name.clone());
            });
        }
        let mut text = String::new();
        if theme.description != default_desc() && theme.description.len() > 0 {
            text = text + "Description:\n\n" + theme.description.as_str() + "\n\n";
        }
        text += "Options Added: \n\n";
        let option_string = theme
            .options
            .iter()
            .fold(text, |acc, opt| acc + &format!("- {}\n", opt));
        let text_id = app.add_text_cached(option_string, &font_id, PixelValue::px(10.0), None);
        app.app_state.data.modify(|state| {
            state.text.push(text_id);
        });
    }
    let mut create_options = WindowCreateOptions::default();
    let mut size = WindowSize::default();
    size.dimensions = LogicalSize::new(980.0, 600.0);
    create_options.state.title = String::from("graven");
    create_options.state.size = size;
    let css = Css::override_native(include_str!(CSS_PATH!())).unwrap();
    let window = Window::new(create_options, css).unwrap();
    app.run(window).unwrap();
}

M src/main.rs => src/main.rs +0 -3
@@ 1,9 1,6 @@
use std::{env, fs, fs::DirEntry, io, process::Command};
extern crate dirs;
extern crate ravenlib;
extern crate serde;
extern crate serde_derive;
extern crate serde_json;
#[macro_use]
extern crate structopt;
use structopt::StructOpt;

D src/ravenlib.rs => src/ravenlib.rs +0 -254
@@ 1,254 0,0 @@
extern crate serde_json;
#[macro_use]
extern crate serde_derive;
extern crate dirs;
extern crate multipart;
extern crate reqwest;
extern crate tar;
pub mod ravenserver;
use std::fs::DirEntry;
/// Module for theme manipulation
pub mod themes;
/// Config module
pub mod config {
    use crate::themes::*;
    use dirs::home_dir;
    use std::{fs, fs::OpenOptions, io::Read, io::Write};
    use serde_json::value::Map;
    /// Returns home directory as string
    pub fn get_home() -> String {
        return String::from(home_dir().unwrap().to_str().unwrap());
    }
    /// Default ravenserver host
    pub fn default_host() -> String {
        String::from("https://demenses.net")
    }
    /// Default screenshot url
    pub fn default_screen() -> String {
        String::new()
    }
    /// Default raven theme description
    pub fn default_desc() -> String {
        String::from("A raven theme.")
    }
    /// Config structure for holding all main config options
    #[derive(Serialize, Deserialize, Debug)]
    pub struct Config {
        pub monitors: i32,
        pub polybar: Vec<String>,
        pub menu_command: String,
        pub last: String,
        pub editing: String,
        #[serde(default = "default_host")]
        pub host: String,
    }
    impl Config {
        /// Default method for config file
        pub fn default() -> Config {
            Config {
                monitors: 1,
                polybar: vec!["main".to_string(), "other".to_string()],
                menu_command: "rofi -theme sidebar -mesg 'raven:' -p '> ' -dmenu".to_string(),
                last: "".to_string(),
                editing: "".to_string(),
                host: default_host(),
            }
        }
    }
    /// Check to see if there are themes still using the old format
    pub fn check_themes() {
        let entries = get_themes();
        for entry in entries {
            if fs::metadata(get_home() + "/.config/raven/themes/" + &entry + "/theme").is_ok() {
                convert_theme(entry);
            }
        }
    }
    /// Create base raven directories and config file(s)
    pub fn init() {
        if fs::metadata(get_home() + "/.config/raven/config").is_err() {
            fs::create_dir(get_home() + "/.config/raven").unwrap();
            fs::create_dir(get_home() + "/.config/raven/themes").unwrap();
        } else {
            println!(
                    "The config file format has changed. Please check ~/.config/raven/config.json to reconfigure raven."
                );
        }
        let mut file = OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/raven/config.json")
            .unwrap();
        let default = serde_json::to_string(&Config::default()).unwrap();
        file.write_all(default.as_bytes()).unwrap();
        println!("Correctly initialized base config. Please run again to use raven.");
    }
    /// Checks to see if base config/directories need to be initialized
    pub fn check_init() -> bool {
        fs::metadata(get_home() + "/.config/raven").is_err()
            || fs::metadata(get_home() + "/.config/raven/config.json").is_err()
            || fs::metadata(get_home() + "/.config/raven/themes").is_err()
    }
    /// Updates the written config with a new config
    pub fn up_config(conf: Config) {
        OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/raven/~config.json")
            .expect("Couldn't open last theme file")
            .write_all(serde_json::to_string(&conf).unwrap().as_bytes())
            .expect("Couldn't write to last theme file");
        fs::copy(
            get_home() + "/.config/raven/~config.json",
            get_home() + "/.config/raven/config.json",
        )
        .unwrap();
        fs::remove_file(get_home() + "/.config/raven/~config.json").unwrap();
    }
    pub fn up_theme(theme: ThemeStore) {
        let wthemepath = get_home() + "/.config/raven/themes/" + &theme.name + "/~theme.json";
        let themepath = get_home() + "/.config/raven/themes/" + &theme.name + "/theme.json";
        OpenOptions::new()
            .create(true)
            .write(true)
            .open(&wthemepath)
            .expect("Couldn't open theme file")
            .write_all(serde_json::to_string(&theme).unwrap().as_bytes())
            .expect("Couldn't write to theme file");
        fs::copy(&wthemepath, &themepath).unwrap();
        fs::remove_file(&wthemepath).unwrap();
    }

    pub fn convert_theme<N>(theme_name: N)
    where
        N: Into<String>,
    {
        let theme_name = theme_name.into();
        let mut theme = String::new();
        let otp = get_home() + "/.config/raven/themes/" + &theme_name + "/theme";
        fs::File::open(&otp)
            .expect("Couldn't read theme")
            .read_to_string(&mut theme)
            .unwrap();
        let options = theme
            .split('|')
            .map(|x| String::from(String::from(x).trim()))
            .filter(|x| x.len() > 0)
            .filter(|x| x != "|")
            .collect::<Vec<String>>();
        fs::remove_file(otp).unwrap();
        let themes = ThemeStore {
            name: theme_name.clone(),
            enabled: Vec::new(),
            options: options,
            screenshot: default_screen(),
            description: default_desc(),
            kv: Map::new()
        };
        OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/raven/themes/" + &theme_name + "/theme.json")
            .expect("Can't open theme.json")
            .write_all(serde_json::to_string(&themes).unwrap().as_bytes())
            .unwrap();
    }
    pub fn load_store<N>(theme: N) -> ThemeStore
    where
        N: Into<String>,
    {
        let theme = theme.into();
        let mut st = String::new();
        fs::File::open(get_home() + "/.config/raven/themes/" + &theme + "/theme.json")
            .unwrap()
            .read_to_string(&mut st)
            .unwrap();
        serde_json::from_str(&st).unwrap()
    }
    /// Load in data for and run loading methods for a specific theme
    pub fn load_theme<N>(theme_name: N) -> Result<Theme, &'static str>
    where
        N: Into<String>,
    {
        let theme_name = theme_name.into();

        let conf = get_config();
        let ent_res = fs::read_dir(get_home() + "/.config/raven/themes/" + &theme_name);
        if ent_res.is_ok() {
            println!("Found theme {}", theme_name);
            if fs::metadata(get_home() + "/.config/raven/themes/" + &theme_name + "/theme.json")
                .is_ok()
            {
                let theme_info = load_store(theme_name.as_str());
                let opts: Vec<String> = theme_info.options;
                let new_theme = Theme {
                    name: theme_name,
                    options: opts,
                    monitor: conf.monitors,
                    enabled: theme_info.enabled,
                    order: conf.polybar,
                    kv: theme_info.kv,
                    screenshot: theme_info.screenshot,
                    description: theme_info.description
                };
                Ok(new_theme)
            } else {
                Err("Can't find Theme data")
            }
        } else {
            println!("Theme does not exist.");
            Err("Theme does not exist")
        }
    }
    /// Loads all themes
    pub fn load_themes() -> Vec<Theme> {
        get_themes().iter().map(|x| load_theme(x.as_str())).filter(|x| x.is_ok()).map(|x| x.unwrap()).collect::<Vec<Theme>>()
    }
    /// Retrieve config settings from file
    pub fn get_config() -> Config {
        let mut conf = String::new();
        fs::File::open(get_home() + "/.config/raven/config.json")
            .expect("Couldn't read config")
            .read_to_string(&mut conf)
            .unwrap();
        serde_json::from_str(&conf).expect("Couldn't read config file")
    }
}
/// Ravend control
pub mod daemon {
    use std::process::Command;
    /// Starts ravend
    pub fn start_daemon() {
        Command::new("sh")
            .arg("-c")
            .arg("ravend")
            .spawn()
            .expect("Couldn't start daemon.");
        println!("Started cycle daemon.");
    }
    /// Stops ravend
    pub fn stop_daemon() {
        Command::new("pkill")
            .arg("-SIGKILL")
            .arg("ravend")
            .output()
            .expect("Couldn't stop daemon.");
        println!("Stopped cycle daemon.");
    }
    /// Checks if the ravend daemon is running
    pub fn check_daemon() -> bool {
        let out = Command::new("ps")
            .arg("aux")
            .output()
            .expect("Couldn't find daemon");
        let form_out = String::from_utf8_lossy(&out.stdout);
        let line_num = form_out.lines().filter(|x| x.contains("ravend")).count();
        line_num > 0
    }

}

/// Converts DirEntry into a fully processed file/directory name
pub fn proc_path(path: DirEntry) -> String {
    path.file_name().into_string().unwrap()
}

D src/ravenserver.rs => src/ravenserver.rs +0 -458
@@ 1,458 0,0 @@
use config::*;
use dirs::home_dir;
use reqwest;
use serde_json;
use std::{
    fs,
    fs::{File, OpenOptions},
    io,
    io::{Read, Write},
};
use tar::{Archive, Builder};
fn get_home() -> String {
    return String::from(home_dir().unwrap().to_str().unwrap());
}
#[derive(Serialize, Deserialize, Debug)]
pub struct UserInfo {
    name: String,
    token: String,
}
#[derive(Serialize, Deserialize, Debug)]
pub struct MetaRes {
    screen: String,
    description: String,
}
pub fn load_info() -> Result<UserInfo, String> {
    if fs::metadata(get_home() + "/.config/raven/ravenserver.json").is_ok() {
        let mut info = String::new();
        File::open(get_home() + "/.config/raven/ravenserver.json")
            .expect("Couldn't read user info")
            .read_to_string(&mut info)
            .unwrap();
        let un = serde_json::from_str(&info);
        if un.is_ok() {
            Ok(un.unwrap())
        } else {
            Err("User info file in incorrect state".to_string())
        }
    } else {
        Err("Not logged in".to_string())
    }
}
pub fn export<N>(theme_name: N, tmp: bool) -> String
where
    N: Into<String>,
{
    let theme_name = theme_name.into();
    if fs::metadata(get_home() + "/.config/raven/themes/" + &theme_name).is_ok() {
        let mut tname = String::new();
        if tmp {
            tname = tname + "/tmp/";
        }
        tname = tname + &theme_name.to_string() + ".tar";
        let tb = File::create(&tname).unwrap();
        let mut b = Builder::new(tb);
        b.append_dir_all(
            theme_name.to_string(),
            get_home() + "/.config/raven/themes/" + &theme_name,
        )
        .expect("Couldn't add theme to archive");
        b.into_inner().expect("Couldn't write tar archive");
        println!("Wrote theme to {}", tname);
        tname
    } else {
        println!("Theme does not exist");
        ::std::process::exit(64);
    }
}
pub fn import<N>(file_name: N)
where
    N: Into<String>,
{
    let fname: String = file_name.into();
    if fs::metadata(&fname).is_ok() {
        let mut arch = Archive::new(File::open(fname).unwrap());
        arch.unpack(get_home() + "/.config/raven/themes/")
            .expect("Couldn't unpack theme archive");
        println!("Imported theme.");
    }
}
fn up_info(inf: UserInfo) {
    let winfpath = get_home() + "/.config/raven/~ravenserver.json";
    let infpath = get_home() + "/.config/raven/ravenserver.json";
    OpenOptions::new()
        .create(true)
        .write(true)
        .open(&winfpath)
        .expect("Couldn't open user info file")
        .write_all(serde_json::to_string(&inf).unwrap().as_bytes())
        .expect("Couldn't write to user info file");
    fs::copy(&winfpath, &infpath).unwrap();
    fs::remove_file(&winfpath).unwrap();
}
pub fn logout() {
    fs::remove_file(get_home() + "/.config/raven/ravenserver.json")
        .expect("Couldn't delete user info file");
    println!("Successfully logged you out");
}
pub fn get_host() -> String {
    let conf = get_config();
    conf.host
}
pub fn delete_user<N>(pass: N)
where
    N: Into<String>,
{
    let info = load_info().unwrap();
    let client = reqwest::Client::new();
    let res = client
        .post(
            &(get_host()
                + "/themes/users/delete/"
                + &info.name
                + "?token="
                + &info.token
                + "&pass="
                + &pass.into()),
        )
        .send();
    if res.is_ok() {
        let res = res.unwrap();
        if res.status().is_success() {
            println!("Successfully deleted user and all owned themes. Logging out");
            logout();
        } else {
            if res.status() == reqwest::StatusCode::FORBIDDEN {
                println!("You are trying to delete a user you are not. Bad!");
            } else if res.status() == reqwest::StatusCode::UNAUTHORIZED {
                println!("You're trying to delete a user w/o providing authentication credentials");
            } else if res.status() == reqwest::StatusCode::NOT_FOUND {
                println!("You're trying to delete a user that doesn't exist");
            } else {
                println!("Server error. Code {:?}", res.status());
            }
        }
    } else {
        println!("Something went wrong with deleting your user. Error message:");
        println!("{:?}", res);
    }
}
pub fn create_user<N>(name: N, pass: N, pass2: N)
where
    N: Into<String>,
{
    let (name, pass, pass2): (String, String, String) = (name.into(), pass.into(), pass2.into());
    if pass == pass2 {
        let client = reqwest::Client::new();
        let res = client
            .post(&(get_host() + "/themes/user/create?name=" + &name + "&pass=" + &pass))
            .send();
        if res.is_ok() {
            let res = res.unwrap();
            if res.status().is_success() {
                println!("Successfully created user. Sign in with `raven login [name] [password]`");
            } else {
                if res.status() == reqwest::StatusCode::FORBIDDEN {
                    println!("User already created. Pick a different name!");
                } else if res.status() == reqwest::StatusCode::PAYLOAD_TOO_LARGE {
                    println!(
                            "Either your username or password was too long. The limit is 20 characters for username, and 100 for password."
                        );
                } else {
                    println!("Server error. Code {:?}", res.status());
                }
            }
        } else {
            println!("Something went wrong with creating a user. Error message:");
            println!("{:?}", res);
        }
    } else {
        println!("Passwords need to match");
    }
}
pub fn upload_theme<N>(name: N)
where
    N: Into<String>,
{
    let name = name.into();
    let info = load_info().unwrap();
    if fs::metadata(get_home() + "/.config/raven/themes/" + &name).is_ok() {
        let tname = export(name.as_str(), true);
        if fs::metadata(name.clone() + ".tar").is_ok() {
            let form = reqwest::multipart::Form::new()
                .file("fileupload", &tname)
                .unwrap();
            let res = reqwest::Client::new()
                .post(&(get_host() + "/themes/upload?name=" + &name + "&token=" + &info.token))
                .multipart(form)
                .send();
            if res.is_ok() {
                let res = res.unwrap();
                if res.status().is_success() {
                    if res.status() == reqwest::StatusCode::CREATED {
                        println!("Theme successfully uploaded.");
                    } else {
                        println!("Theme successfully updated.");
                    }
                    let theme_st = load_store(name.as_str());
                    if theme_st.screenshot != default_screen() {
                        pub_metadata(name.as_str(), "screen".into(), &theme_st.screenshot);
                    }
                    pub_metadata(name, "description".into(), theme_st.description);
                    fs::remove_file(tname).unwrap();
                } else {
                    if res.status() == reqwest::StatusCode::FORBIDDEN {
                        println!("That theme already exists, and you are not its owner.");
                    } else {
                        println!("Server error. Code {:?}", res.status());
                    }
                }
            } else {
                println!("Something went wrong with uploading the theme. Error message:");
                println!("{:?}", res);
            }
        } else {
            println!(
                    "Something has gone wrong. Check if the theme file was written to current directory."
                );
        }
    } else {
        println!("That theme does not exist");
    }
}
pub fn get_metadata<N>(name: N) -> Result<MetaRes, String>
where
    N: Into<String>,
{
    let client = reqwest::Client::new();
    let res = client
        .get(&(get_host() + "/themes/meta/" + &name.into()))
        .send();
    if res.is_ok() {
        let mut res = res.unwrap();
        if res.status().is_success() {
            let meta: MetaRes = res.json().expect("Couldn't deserialize metadata responnse");
            Ok(meta)
        } else {
            if res.status() == reqwest::StatusCode::NOT_FOUND {
                Err("Theme not found".to_string())
            } else {
                Err("Internal Server Error".to_string())
            }
        }
    } else {
        Err("Could not fetch metadata".to_string())
    }
}
pub fn pub_metadata<N>(name: N, typem: N, value: N)
where
    N: Into<String>,
{
    let info = load_info().unwrap();
    let client = reqwest::Client::new();
    let res = client
        .post(
            &(get_host()
                + "/themes/meta/"
                + &name.into()
                + "?typem="
                + &typem.into()
                + "&value="
                + &value.into()
                + "&token="
                + &info.token),
        )
        .send();
    if res.is_ok() {
        let res = res.unwrap();
        if res.status().is_success() {
            println!("Successfully updated theme metadata");
        } else {
            if res.status() == reqwest::StatusCode::NOT_FOUND {
                println!("That theme hasn't been published");
            } else if res.status() == reqwest::StatusCode::FORBIDDEN {
                println!("Can't edit the metadata of a theme that isn't yours");
            } else if res.status() == reqwest::StatusCode::PRECONDITION_FAILED {
                println!("That isn't a valid metadata type");
            } else if res.status() == reqwest::StatusCode::PAYLOAD_TOO_LARGE {
                println!(
                        "Your description or screenshot url was more than 200 characters long. Please shorten it."
                    );
            } else {
                println!("Server error. Code {:?}", res.status());
            }
        }
    }
}
pub fn unpublish_theme<N>(name: N)
where
    N: Into<String>,
{
    let name = name.into();
    let info = load_info().unwrap();
    let client = reqwest::Client::new();
    let res = client
        .post(&(get_host() + "/themes/delete/" + &name + "?token=" + &info.token))
        .send();
    if res.is_ok() {
        let res = res.unwrap();
        if res.status().is_success() {
            println!("Successfully unpublished theme");
        } else {
            if res.status() == reqwest::StatusCode::NOT_FOUND {
                println!("Can't unpublish a nonexistent theme");
            } else if res.status() == reqwest::StatusCode::FORBIDDEN {
                println!("Can't unpublish a theme that isn't yours");
            } else if res.status() == reqwest::StatusCode::UNAUTHORIZED {
                println!("Did not provide a valid login token");
            } else {
                println!("Server error. Code {:?}", res.status());
            }
        }
    } else {
        println!("Something went wrong with unpublishing the theme. Error message: ");
        println!("{:?}", res);
    }
}
pub fn install_warning(esp: bool) {
    println!(
            "Warning: When you install themes from the online repo, there is some danger. Please evaluate the theme files before loading the theme, and if you find any malicious theme, please report it on the theme's page at {} and it will be removed.",
            get_host()
        );
    if esp {
        println!(
                "This theme should be scrutinized more carefully as it includes a bash script which will be run automatically."
            );
    }
    println!("Thank you for helping keep the repo clean!");
}
pub fn check_tmp() -> bool {
    fs::metadata("/tmp").is_ok()
}
pub fn download_theme<N>(name: N, force: bool)
where
    N: Into<String>,
{
    let name = name.into();
    let mut tname = String::new();
    if check_tmp() {
        tname = tname + "/tmp/";
    }
    tname = tname + &name + ".tar";
    println!("{}", tname);
    let client = reqwest::Client::new();
    let res = client.get(&(get_host() + "/themes/repo/" + &name)).send();
    if res.is_ok() {
        let mut res = res.unwrap();
        if res.status().is_success() {
            let mut file = OpenOptions::new()
                .create(true)
                .write(true)
                .open(&tname)
                .expect("Couldn't write theme file");
            res.copy_to(&mut file).expect("Couldn't pipe to archive");
            println!("Downloaded theme.");
            if res.status() == reqwest::StatusCode::ALREADY_REPORTED && !force {
                print!(
                        "This theme has recently been reported, and has not been approved by an admin. It is not advisable to install this theme. Are you sure you would like to continue? (y/n)"
                    );
                io::stdout().flush().unwrap();
                let mut r = String::new();
                io::stdin().read_line(&mut r).unwrap();
                if r.trim() == "y" {
                    println!(
                            "Continuing. Please look carefully at the theme files in ~/.config/raven/themes/{} before loading this theme.",
                            name
                        );
                    import(tname.as_str());
                    println!("Imported theme. Removing archive.");
                    fs::remove_file(&tname).unwrap();
                    println!("Downloading metadata.");
                    let meta = get_metadata(name.as_str()).unwrap();
                    let mut st = load_store(name.as_str());
                    st.screenshot = meta.screen;
                    st.description = meta.description;
                    up_theme(st);
                    if fs::metadata(get_home() + "/.config/raven/themes/" + &name + "/script")
                        .is_ok()
                        || fs::metadata(get_home() + "/.config/raven/themes/" + &name + "/lemonbar")
                            .is_ok()
                    {
                        if !force {
                            install_warning(true);
                        }
                    } else {
                        if !force {
                            install_warning(false);
                        }
                    }
                } else {
                    println!("Removing downloaded archive.");
                    fs::remove_file(&tname).unwrap();
                }
            } else {
                if res.status() == reqwest::StatusCode::ALREADY_REPORTED {
                    print!(
                            "This theme has recently been reported, and has not been approved by an admin. It is not advisable to install this theme. Continuing because of --force."
                        );
                }
                import(tname.as_str());
                println!("Imported theme. Removing archive.");
                fs::remove_file(tname).unwrap();
                println!("Downloading metadata.");
                let meta = get_metadata(name.as_str()).unwrap();
                let mut st = load_store(name.as_str());
                st.screenshot = meta.screen;
                st.description = meta.description;
                up_theme(st);
                if fs::metadata(get_home() + "/.config/raven/themes/" + &name + "/script").is_ok()
                    || fs::metadata(get_home() + "/.config/raven/themes/" + &name + "/lemonbar")
                        .is_ok()
                {
                    if !force {
                        install_warning(true);
                    }
                } else {
                    if !force {
                        install_warning(false);
                    }
                }
            }
        } else {
            if res.status() == reqwest::StatusCode::NOT_FOUND {
                println!("Theme has not been uploaded");
            } else {
                println!("Server error. Code {:?}", res.status());
            }
        }
    } else {
        println!("Something went wrong with downloading the theme. Error message:");
        println!("{:?}", res);
    }
}
pub fn login_user<N>(name: N, pass: N)
where
    N: Into<String>,
{
    let client = reqwest::Client::new();
    let res = client
        .get(&(get_host() + "/themes/user/login?name=" + &name.into() + "&pass=" + &pass.into()))
        .send();
    if res.is_ok() {
        let mut res = res.unwrap();
        if res.status().is_success() {
            println!("Successfully signed in. Writing login info to disk.");
            let info = res.json().unwrap();
            up_info(info);
        } else {
            if res.status() == reqwest::StatusCode::FORBIDDEN {
                println!("Wrong login info. Try again!");
            } else {
                println!("Server error. Code {:?}", res.status());
            }
        }
    } else {
        println!("Something went wrong with logging in. Error message:");
        println!("{:?}", res);
    }
}

D src/themes.rs => src/themes.rs +0 -611
@@ 1,611 0,0 @@
use crate::config::*;
use proc_path;
use serde_json::value::{Map, Value};
use std::{
    env, fs, fs::DirEntry, fs::OpenOptions, io, io::Read, io::Write, os::unix::fs::OpenOptionsExt,
    process::Command,
};
/// Structure for holding theme info, stored in theme.json
#[derive(Serialize, Deserialize, Debug)]
pub struct ThemeStore {
    pub name: String,
    pub options: Vec<String>,
    pub enabled: Vec<String>,
    #[serde(default = "default_screen")]
    pub screenshot: String,
    #[serde(default = "default_desc")]
    pub description: String,
    #[serde(default)]
    pub kv: Map<String, Value>,
}
/// Structure that holds all methods and data for individual themes.
#[derive(Clone)]
pub struct Theme {
    pub name: String,
    pub options: Vec<String>,
    pub monitor: i32,
    pub enabled: Vec<String>,
    pub order: Vec<String>,
    pub kv: Map<String, Value>,
    pub screenshot: String,
    pub description: String
}

/// Methods for a loaded theme
impl Theme {
    /// Loads options held within theme.json key-value storage
    pub fn load_kv(&self) {
        for (k, v) in &self.kv {
            self.load_k(k.as_str(), v.as_str().unwrap());
        }
    }
    /// Loads a single key option
    pub fn load_k<N>(&self, k: N, v: N)
    where
        N: Into<String>,
    {
        let (k, v) = (k.into(), v.into());
        match k.as_str() {
            "st_tmtheme" => self.load_sublt("st_tmtheme", v.as_str()),
            "st_scs" => self.load_sublt("st_scs", v.as_str()),
            "st_subltheme" => self.load_sublt("st_subltheme", v.as_str()),
            "vscode" => self.load_vscode(v.as_str()),
            _ => println!("Unrecognized key {}", k),
        }
        println!("Loaded key option {}", k);
    }
    /// Converts old single-string file options into key-value storage
    pub fn convert_single<N>(&self, name: N)
    where
        N: Into<String>,
    {
        let key = name.into();
        let mut value = String::new();
        fs::File::open(get_home() + "/.config/raven/themes/" + &self.name + "/" + &key)
            .expect("Couldn't open file")
            .read_to_string(&mut value)
            .unwrap();
        let mut store = load_store(self.name.clone());
        store.kv.insert(key.clone(),serde_json::Value::String(value.clone().trim().to_string()));
        store.options = store.options.iter().filter(|x| x.as_str() != key.as_str()).map(|x|x.to_owned()).collect();
        up_theme(store);
        println!("Converted option {} to new key-value system", key);
        self.load_k(key, value);
    }
    /// Iterates through options and loads them with submethods
    pub fn load_all(&self) {
        let opt = &self.options;
        let mut i = 1;
        let len = opt.len();
        while i <= len {
            let ref option = opt[len - i];
            match option.to_lowercase().as_ref() {
                "poly" => self.load_poly(self.monitor),
                "wm" => self.load_i3(true),
                "i3" => self.load_i3(false),
                "xres" => self.load_xres(false),
                "xres_m" => self.load_xres(true),
                "pywal" => self.load_pywal(),
                "wall" => self.load_wall(),
                "ncmpcpp" => self.load_ncm(),
                "termite" => self.load_termite(),
                "script" => self.load_script(),
                "bspwm" => self.load_bspwm(),
                "rofi" => self.load_rofi(),
                "ranger" => self.load_ranger(),
                "lemonbar" => self.load_lemon(),
                "openbox" => self.load_openbox(),
                "dunst" => self.load_dunst(),
                "st_tmtheme" => self.convert_single("st_tmtheme"),
                "st_scs" => self.convert_single("st_scs"),
                "st_subltheme" => self.convert_single("st_subltheme"),
                "vscode" => self.convert_single("vscode"),
                "|" => {}
                _ => println!("Unknown option"),
            };
            if !option.contains("|") {
                println!("Loaded option {}", option);
            }
            i += 1;
        }
        self.load_kv();
        println!("Loaded all options for theme {}", self.name);
    }
    /// Edits the value of a key in hjson files
    fn edit_hjson<N, S, T>(&self, file: N, pat: S, value: T)
    where
        N: Into<String>,
        S: Into<String>,
        T: Into<String>,
    {
        let file = &file.into();
        let pat = &pat.into();
        let value = &value.into();
        let mut finals = String::new();
        if fs::metadata(file).is_ok() {
            let mut pre = String::new();
            fs::File::open(file)
                .expect("Couldn't open hjson file")
                .read_to_string(&mut pre)
                .unwrap();
            let mut patfound = false;
            for line in pre.lines() {
                if line.contains(pat) {
                    patfound = true;
                    if line.ends_with(",") {
                        finals = finals + "\n" + "    " + pat + "\"" + &value + "\","
                    } else {
                        finals = finals + "\n" + "    " + pat + "\"" + &value + "\""
                    }
                } else if line.ends_with("}") && !patfound {
                    finals =
                        finals + "," + "\n" + "    " + pat + "\"" + &value + "\"" + "\n" + line;
                } else {
                    finals = finals + "\n" + line;
                }
            }
            OpenOptions::new()
                .create(true)
                .write(true)
                .truncate(true)
                .open(file)
                .expect("Couldn't open hjson file")
                .write_all(finals.trim().as_bytes())
                .unwrap();
        } else {
            finals = finals + "{\n    " + pat + "\"" + &value + "\"\n}";
            OpenOptions::new()
                .create(true)
                .write(true)
                .open(file)
                .expect("Couldn't open hjson file")
                .write_all(finals.as_bytes())
                .unwrap();
        }
    }
    pub fn load_rofi(&self) {
        if fs::metadata(get_home() + "/.config/rofi").is_err() {
            fs::create_dir(get_home() + "/.config/rofi").unwrap();
        }
        fs::copy(
            get_home() + "/.config/raven/themes/" + &self.name + "/rofi",
            get_home() + "/.config/rofi/theme.rasi",
        )
        .expect("Couldn't copy rofi theme");
    }
    pub fn load_pywal(&self) {
        let arg = get_home() + "/.config/raven/themes/" + &self.name + "/pywal";
        Command::new("wal")
            .arg("-n")
            .arg("-i")
            .arg(arg)
            .output()
            .expect("Couldn't run pywal");
    }
    pub fn load_script(&self) {
        Command::new("sh")
            .arg("-c")
            .arg(get_home() + "/.config/raven/themes/" + &self.name + "/script")
            .output()
            .expect("Couldn't run custom script");
    }

    pub fn load_openbox(&self) {
        let mut base = String::new();
        if fs::metadata(get_home() + "/.config/raven/base_rc.xml").is_ok() {
            fs::File::open(get_home() + "/.config/raven/base_rc.xml")
                .unwrap()
                .read_to_string(&mut base)
                .unwrap();
        }
        let mut rest = String::new();
        fs::File::open(get_home() + "/.config/raven/themes/" + &self.name + "/openbox")
            .unwrap()
            .read_to_string(&mut rest)
            .unwrap();
        base.push_str(&rest);
        fs::remove_file(get_home() + "/.config/openbox/rc.xml").unwrap();
        OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/openbox/rc.xml")
            .expect("Couldn't open rc.xml")
            .write_all(base.as_bytes())
            .unwrap();
        Command::new("openbox")
            .arg("--reconfigure")
            .output()
            .expect("Couldn't reload openbox");
    }
    pub fn load_ranger(&self) {
        fs::copy(
            get_home() + "/.config/raven/themes/" + &self.name + "/ranger",
            get_home() + "/.config/ranger/rc.conf",
        )
        .expect("Couldn't overwrite ranger config");
    }

    pub fn load_dunst(&self) {
        let mut config = String::new();
        if fs::metadata(get_home() + "/.config/raven/base_dunst").is_ok() {
            fs::File::open(get_home() + "/.config/raven/base_dunst")
                .unwrap()
                .read_to_string(&mut config)
                .unwrap();
        }
        let mut app = String::new();
        fs::File::open(get_home() + "/.config/raven/themes/" + &self.name + "/dunst")
            .unwrap()
            .read_to_string(&mut app)
            .unwrap();
        config.push_str(&app);
        fs::remove_file(get_home() + "/.config/dunst/dunstrc").unwrap();
        OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/dunst/dunstrc")
            .expect("Couldn't open dunstrc")
            .write_all(config.as_bytes())
            .unwrap();
        Command::new("dunst").spawn().expect("Failed to run dunst");
    }
    pub fn load_vscode<N>(&self, value: N)
    where
        N: Into<String>,
    {
        let path1 = get_home() + "/.config/Code/User";
        let path2 = get_home() + "/.config/Code - OSS/User";
        if fs::metadata(&path1).is_err() && fs::metadata(&path2).is_err() {
            println!(
                "Couldn't find neither .config/Code nor .config/Code - OSS. Do you have VSCode installed? \
                Skipping."
            );
            return;
        }
        let pattern = "\"workbench.colorTheme\": ";
        let value = value.into();
        if fs::metadata(&path1).is_ok() {
            self.edit_hjson(path1 + "/settings.json", pattern, value.as_str())
        }
        if fs::metadata(&path2).is_ok() {
            self.edit_hjson(path2 + "/settings.json", pattern, value)
        }
    }
    pub fn load_sublt<N>(&self, stype: N, value: N)
    where
        N: Into<String>,
    {
        let stype = &stype.into();
        let path = get_home() + "/.config/sublime-text-3/Packages/User";
        if fs::metadata(&path).is_err() {
            println!(
                "Couldn't find {}. Do you have sublime text 3 installed? \
                 Skipping.",
                &path
            );
            return;
        }

        let mut value = value.into();
        if value.starts_with("sublt/") {
            value = value.trim_start_matches("sublt/").to_string();
            fs::copy(
                get_home() + "/.config/raven/themes/" + &self.name + "/sublt/" + &value,
                path.clone() + "/" + &value
            )
            .expect("Couldn't overwrite sublt theme");
        }

        let mut pattern = "";
        if stype == "st_tmtheme" || stype == "st_scs" {
            pattern = "\"color_scheme\": ";
        } else if stype == "st_subltheme" {
            pattern = "\"theme\": ";
        }
        self.edit_hjson(path + "/Preferences.sublime-settings", pattern, value)
    }

    pub fn load_ncm(&self) {
        if fs::metadata(get_home() + "/.config/ncmpcpp").is_ok() {
            fs::copy(
                get_home() + "/.config/raven/themes/" + &self.name + "/ncmpcpp",
                get_home() + "/.config/ncmpcpp/config",
            )
            .expect("Couldn't overwrite ncmpcpp config");
        } else if fs::metadata(get_home() + "/.ncmpcpp").is_ok() {
            fs::copy(
                get_home() + "/.config/raven/themes/" + &self.name + "/ncmpcpp",
                get_home() + "/.ncmpcpp/config",
            )
            .expect("Couldn't overwrite ncmpcpp config");
        } else {
            println!(
                "Couldn't detect a ncmpcpp config directory in ~/.config/ncmppcp or ~/.ncmpcpp."
            );
        }
    }
    pub fn load_bspwm(&self) {
        let mut config = String::new();
        if fs::metadata(get_home() + "/.config/raven/base_bspwm").is_ok() {
            fs::File::open(get_home() + "/.config/raven/base_bspwm")
                .unwrap()
                .read_to_string(&mut config)
                .unwrap();
        }
        let mut app = String::new();
        fs::File::open(get_home() + "/.config/raven/themes/" + &self.name + "/bspwm")
            .unwrap()
            .read_to_string(&mut app)
            .unwrap();

        config.push_str(&app);
        fs::remove_file(get_home() + "/.config/bspwm/bspwmrc").unwrap();
        OpenOptions::new()
            .create(true)
            .write(true)
            .mode(0o744)
            .open(get_home() + "/.config/bspwm/bspwmrc")
            .expect("Couldn't open bspwmrc file")
            .write_all(config.as_bytes())
            .unwrap();
        Command::new("sh")
            .arg("-c")
            .arg(get_home() + "/.config/bspwm/bspwmrc")
            .output()
            .expect("Couldn't reload bspwm");
    }
    pub fn load_i3(&self, isw: bool) {
        let mut config = String::new();
        if fs::metadata(get_home() + "/.config/raven/base_i3").is_ok() {
            fs::File::open(get_home() + "/.config/raven/base_i3")
                .unwrap()
                .read_to_string(&mut config)
                .unwrap();
        }
        let mut app = String::new();
        if isw {
            fs::File::open(get_home() + "/.config/raven/themes/" + &self.name + "/wm")
                .unwrap()
                .read_to_string(&mut app)
                .unwrap();
        } else {
            fs::File::open(get_home() + "/.config/raven/themes/" + &self.name + "/i3")
                .unwrap()
                .read_to_string(&mut app)
                .unwrap();
        }
        config.push_str(&app);
        if fs::metadata(get_home() + "/.config/i3").is_err() {
            fs::create_dir(get_home() + "/.config/i3").expect("Couldn't create i3 config dir");
        }
        if fs::metadata(get_home() + "/.config/i3/config").is_ok() {
            fs::remove_file(get_home() + "/.config/i3/config")
                .expect("Couldn't remove previous i3 config");
        }
        OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/i3/config")
            .expect("Couldn't open i3 file")
            .write_all(config.as_bytes())
            .unwrap();
        Command::new("i3-msg")
            .arg("reload")
            .output()
            .expect("Couldn't reload i3");
    }
    pub fn load_termite(&self) {
        fs::copy(
            get_home() + "/.config/raven/themes/" + &self.name + "/termite",
            get_home() + "/.config/termite/config",
        )
        .expect("Couldn't overwrite termite config");
        Command::new("pkill")
            .arg("-SIGUSR1")
            .arg("termite")
            .output()
            .expect("Couldn't reload termite");
    }
    pub fn load_poly(&self, monitor: i32) {
        for number in 0..monitor {
            Command::new("sh")
                .arg("-c")
                .arg(
                    String::from("polybar --config=")
                        + &get_home()
                        + "/.config/raven/themes/"
                        + &self.name
                        + "/poly "
                        + &self.order[number as usize]
                        + " > /dev/null 2> /dev/null",
                )
                .spawn()
                .expect("Failed to run polybar");
        }
    }
    fn load_lemon(&self) {
        Command::new("sh")
            .arg(get_home() + "/.config/raven/themes/" + &self.name + "/lemonbar")
            .spawn()
            .expect("Failed to run lemonbar script");
    }
    fn load_wall(&self) {
        Command::new("feh")
            .arg("--bg-scale")
            .arg(get_home() + "/.config/raven/themes/" + &self.name + "/wall")
            .output()
            .expect("Failed to change wallpaper");
    }
    fn load_xres(&self, merge: bool) {
        let mut xres = Command::new("xrdb");
        let mut name = String::from("xres");
        if merge {
            name.push_str("_m");
            xres.arg("-merge");
        }
        xres.arg(get_home() + "/.config/raven/themes/" + &self.name + "/" + &name)
            .output()
            .expect("Could not run xrdb");
    }
}

/// Changes the theme that is currently being edited
pub fn edit<N>(theme_name: N)
where
    N: Into<String>,
{
    let theme_name = theme_name.into();
    if fs::metadata(get_home() + "/.config/raven/themes/" + &theme_name).is_ok() {
        let mut conf = get_config();
        conf.editing = theme_name.to_string();
        up_config(conf);
        println!("You are now editing the theme {}", &theme_name);
    } else {
        println!("That theme does not exist");
    }
}
/// Clears possible remnants of old themes
pub fn clear_prev() {
    Command::new("pkill").arg("polybar").output().unwrap();
    Command::new("pkill").arg("lemonbar").output().unwrap();
    Command::new("pkill").arg("dunst").output().unwrap();
}
/// Deletes theme from registry
pub fn del_theme<N>(theme_name: N)
where
    N: Into<String>,
{
    fs::remove_dir_all(get_home() + "/.config/raven/themes/" + &theme_name.into())
        .expect("Couldn't delete theme");;
}
/// Loads last loaded theme from string of last theme's name
pub fn refresh_theme<N>(last: N)
where
    N: Into<String>,
{
    let last = last.into();
    if last.chars().count() > 0 {
        run_theme(&load_theme(last.trim()).unwrap());
    } else {
        println!("No last theme saved. Cannot refresh.");
    }
}
/// Create new theme directory and 'theme' file
pub fn new_theme<N>(theme_name: N)
where
    N: Into<String>,
{
    let theme_name = theme_name.into();
    let res = fs::create_dir(get_home() + "/.config/raven/themes/" + &theme_name);
    if res.is_ok() {
        res.unwrap();
        let mut file = OpenOptions::new()
            .create(true)
            .write(true)
            .open(get_home() + "/.config/raven/themes/" + &theme_name + "/theme.json")
            .expect("can open");
        let stdef = ThemeStore {
            name: theme_name.clone(),
            options: vec![],
            enabled: vec![],
            screenshot: default_screen(),
            description: default_desc(),
            kv: Map::new(),
        };
        let st = serde_json::to_string(&stdef).unwrap();
        file.write_all(st.as_bytes()).unwrap();
        edit(theme_name);
    } else {
        println!("Theme {} already exists", &theme_name);
    }
}
/// Add an option to a theme
pub fn add_to_theme<N>(theme_name: N, option: N, path: N)
where
    N: Into<String>,
{
    let (theme_name, option, path) = (theme_name.into(), option.into(), path.into());
    let cur_theme = load_theme(theme_name.as_str()).unwrap();
    let cur_st = load_store(theme_name.as_str());
    let mut new_themes = ThemeStore {
        name: theme_name.clone(),
        options: cur_theme.options,
        enabled: cur_theme.enabled,
        screenshot: cur_st.screenshot,
        description: cur_st.description,
        kv: Map::new(),
    };
    let mut already_used = false;
    for opt in &new_themes.options {
        if opt == &option {
            already_used = true;
        }
    }
    if !already_used {
        new_themes.options.push(option.clone());
        up_theme(new_themes);
    }
    let mut totpath = env::current_dir().unwrap();
    totpath.push(path);
    fs::copy(
        totpath,
        get_home() + "/.config/raven/themes/" + &theme_name + "/" + &option,
    )
    .expect("Couldn't copy config in");
}
/// Remove an option from a theme
pub fn rm_from_theme<N>(theme_name: N, option: N)
where
    N: Into<String>,
{
    let (theme_name, option) = (theme_name.into(), option.into());
    let cur_theme = load_theme(theme_name.as_str()).unwrap();
    let cur_st = load_store(theme_name.as_str());
    let mut new_themes = ThemeStore {
        name: theme_name,
        options: cur_theme.options,
        enabled: cur_theme.enabled,
        screenshot: cur_st.screenshot,
        description: cur_st.description,
        kv: Map::new(),
    };
    let mut found = false;
    let mut i = 0;
    while i < new_themes.options.len() {
        if &new_themes.options[i] == &option {
            println!("Found option {}", option);
            found = true;
            new_themes.options.remove(i);
        }
        i += 1;
    }
    if found {
        up_theme(new_themes);
    } else {
        println!("Couldn't find option {}", option);
    }
}
/// Run/refresh a loaded Theme
pub fn run_theme(new_theme: &Theme) {
    clear_prev();
    new_theme.load_all();
    // Updates the 'last loaded theme' information for later use by raven refresh
    let mut conf = get_config();
    conf.last = new_theme.name.clone();
    up_config(conf);
}
/// Get all themes
pub fn get_themes() -> Vec<String> {
    fs::read_dir(get_home() + "/.config/raven/themes")
        .expect("Couldn't read themes")
        .collect::<Vec<io::Result<DirEntry>>>()
        .into_iter()
        .map(|x| proc_path(x.unwrap()))
        .collect::<Vec<String>>()
}
/// Changes a key-value option
pub fn key_value<N, S, T>(key: N, value: S, theme: T) where N : Into<String>, S: Into<String>, T: Into<String> {
    let mut store = load_store(theme.into());
    store.kv.insert(key.into(), serde_json::Value::String(value.into()));
    up_theme(store);
}