commit bb8162e4c1271ef3e238b6a405733ac2ba8b23b7
Author: Markus Wagner
Date: Mon Dec 28 23:30:20 2020 +0100
Initial commit
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..40e2f97
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,11 @@
+*.dae filter=lfs diff=lfs merge=lfs -text
+*.blend filter=lfs diff=lfs merge=lfs -text
+*.gltf filter=lfs diff=lfs merge=lfs -text
+*.glb filter=lfs diff=lfs merge=lfs -text
+*.bin filter=lfs diff=lfs merge=lfs -text
+*.png filter=lfs diff=lfs merge=lfs -text
+*.jpg filter=lfs diff=lfs merge=lfs -text
+*.jpeg filter=lfs diff=lfs merge=lfs -text
+*.wav filter=lfs diff=lfs merge=lfs -text
+*.ogg filter=lfs diff=lfs merge=lfs -text
+*.ttf filter=lfs diff=lfs merge=lfs -text
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea8c4bf
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..e6d51ec
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,1751 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "aead"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "aes"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561"
+dependencies = [
+ "aes-soft",
+ "aesni",
+ "cipher",
+]
+
+[[package]]
+name = "aes-gcm"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da"
+dependencies = [
+ "aead",
+ "aes",
+ "cipher",
+ "ctr",
+ "ghash",
+ "subtle",
+]
+
+[[package]]
+name = "aes-soft"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072"
+dependencies = [
+ "cipher",
+ "opaque-debug",
+]
+
+[[package]]
+name = "aesni"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce"
+dependencies = [
+ "cipher",
+ "opaque-debug",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68803225a7b13e47191bab76f2687382b60d259e8cf37f6e1893658b84bb9479"
+
+[[package]]
+name = "arrayref"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "async-attributes"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "efd3d156917d94862e779f356c5acae312b08fd3121e792c857d7928c8088423"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "async-channel"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59740d83946db6a5af71ae25ddf9562c2b176b2ca42cf99a455f09f4a220d6b9"
+dependencies = [
+ "concurrent-queue",
+ "event-listener",
+ "futures-core",
+]
+
+[[package]]
+name = "async-dup"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7427a12b8dc09291528cfb1da2447059adb4a257388c2acd6497a79d55cf6f7c"
+dependencies = [
+ "futures-io",
+ "simple-mutex",
+]
+
+[[package]]
+name = "async-executor"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb877970c7b440ead138f6321a3b5395d6061183af779340b65e20c0fede9146"
+dependencies = [
+ "async-task",
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "once_cell",
+ "vec-arena",
+]
+
+[[package]]
+name = "async-global-executor"
+version = "1.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73079b49cd26b8fd5a15f68fc7707fc78698dc2a3d61430f2a7a9430230dfa04"
+dependencies = [
+ "async-executor",
+ "async-io",
+ "futures-lite",
+ "num_cpus",
+ "once_cell",
+]
+
+[[package]]
+name = "async-h1"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5c68a75f812ff0f299e142c06dd0c34e3295a594d935e61eeb6c77041d1d4dc"
+dependencies = [
+ "async-channel",
+ "async-dup",
+ "async-std",
+ "byte-pool",
+ "futures-core",
+ "http-types",
+ "httparse",
+ "lazy_static",
+ "log",
+ "pin-project",
+]
+
+[[package]]
+name = "async-io"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd"
+dependencies = [
+ "concurrent-queue",
+ "fastrand",
+ "futures-lite",
+ "libc",
+ "log",
+ "nb-connect",
+ "once_cell",
+ "parking",
+ "polling",
+ "vec-arena",
+ "waker-fn",
+ "winapi",
+]
+
+[[package]]
+name = "async-mutex"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "async-process"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c8cea09c1fb10a317d1b5af8024eeba256d6554763e85ecd90ff8df31c7bbda"
+dependencies = [
+ "async-io",
+ "blocking",
+ "cfg-if 0.1.10",
+ "event-listener",
+ "futures-lite",
+ "once_cell",
+ "signal-hook",
+ "winapi",
+]
+
+[[package]]
+name = "async-session"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "345022a2eed092cd105cc1b26fd61c341e100bd5fcbbd792df4baf31c2cc631f"
+dependencies = [
+ "anyhow",
+ "async-std",
+ "async-trait",
+ "base64 0.12.3",
+ "bincode",
+ "blake3",
+ "chrono",
+ "hmac 0.8.1",
+ "kv-log-macro",
+ "rand",
+ "serde",
+ "serde_json",
+ "sha2",
+]
+
+[[package]]
+name = "async-sse"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53bba003996b8fd22245cd0c59b869ba764188ed435392cf2796d03b805ade10"
+dependencies = [
+ "async-channel",
+ "async-std",
+ "http-types",
+ "log",
+ "memchr",
+ "pin-project-lite 0.1.11",
+]
+
+[[package]]
+name = "async-std"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f9f84f1280a2b436a2c77c2582602732b6c2f4321d5494d6e799e6c367859a8"
+dependencies = [
+ "async-attributes",
+ "async-channel",
+ "async-global-executor",
+ "async-io",
+ "async-mutex",
+ "async-process",
+ "blocking",
+ "crossbeam-utils 0.8.1",
+ "futures-channel",
+ "futures-core",
+ "futures-io",
+ "futures-lite",
+ "gloo-timers",
+ "kv-log-macro",
+ "log",
+ "memchr",
+ "num_cpus",
+ "once_cell",
+ "pin-project-lite 0.2.0",
+ "pin-utils",
+ "slab",
+ "wasm-bindgen-futures",
+]
+
+[[package]]
+name = "async-task"
+version = "4.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0"
+
+[[package]]
+name = "async-trait"
+version = "0.1.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d3a45e77e34375a7923b1e8febb049bb011f064714a8e17a1a616fef01da13d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "async-tungstenite"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39eca8dd578b18e557361e50ca767df55c5e62f690a5e53868c3c7a8123145b7"
+dependencies = [
+ "futures-io",
+ "futures-util",
+ "log",
+ "pin-project",
+ "tungstenite",
+]
+
+[[package]]
+name = "atomic-waker"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a"
+
+[[package]]
+name = "autocfg"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
+
+[[package]]
+name = "base-x"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b"
+
+[[package]]
+name = "base64"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+
+[[package]]
+name = "base64"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
+
+[[package]]
+name = "bincode"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f30d3a39baa26f9651f17b375061f3233dde33424a8b72b0dbe93a68a0bc896d"
+dependencies = [
+ "byteorder",
+ "serde",
+]
+
+[[package]]
+name = "blake3"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9ff35b701f3914bdb8fad3368d822c766ef2858b2583198e41639b936f09d3f"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "cc",
+ "cfg-if 0.1.10",
+ "constant_time_eq",
+ "crypto-mac 0.8.0",
+ "digest",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "blocking"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5e170dbede1f740736619b776d7251cb1b9095c435c34d8ca9f57fcd2f335e9"
+dependencies = [
+ "async-channel",
+ "async-task",
+ "atomic-waker",
+ "fastrand",
+ "futures-lite",
+ "once_cell",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2e8c087f005730276d1096a652e92a8bacee2e2472bcc9715a74d2bec38b5820"
+
+[[package]]
+name = "byte-pool"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38e98299d518ec351ca016363e0cbfc77059dcd08dfa9700d15e405536097a"
+dependencies = [
+ "crossbeam-queue",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de"
+
+[[package]]
+name = "bytes"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38"
+
+[[package]]
+name = "cache-padded"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba"
+
+[[package]]
+name = "cc"
+version = "1.0.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"
+
+[[package]]
+name = "cfg-if"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "chrono"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73"
+dependencies = [
+ "libc",
+ "num-integer",
+ "num-traits",
+ "serde",
+ "time 0.1.44",
+ "winapi",
+]
+
+[[package]]
+name = "cipher"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "concurrent-queue"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3"
+dependencies = [
+ "cache-padded",
+]
+
+[[package]]
+name = "const_fn"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd51eab21ab4fd6a3bf889e2d0958c0a6e3a61ad04260325e919e652a2a62826"
+
+[[package]]
+name = "constant_time_eq"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
+
+[[package]]
+name = "cookie"
+version = "0.14.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "784ad0fbab4f3e9cef09f20e0aea6000ae08d2cb98ac4c0abc53df18803d702f"
+dependencies = [
+ "aes-gcm",
+ "base64 0.12.3",
+ "hkdf",
+ "hmac 0.10.1",
+ "percent-encoding",
+ "rand",
+ "sha2",
+ "time 0.2.23",
+ "version_check",
+]
+
+[[package]]
+name = "cpuid-bool"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634"
+
+[[package]]
+name = "cpuid-bool"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba"
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"
+dependencies = [
+ "cfg-if 0.1.10",
+ "crossbeam-utils 0.7.2",
+ "maybe-uninit",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8"
+dependencies = [
+ "autocfg",
+ "cfg-if 0.1.10",
+ "lazy_static",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"
+dependencies = [
+ "autocfg",
+ "cfg-if 1.0.0",
+ "lazy_static",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "ctr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f"
+dependencies = [
+ "cipher",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "993a608597367c6377b258c25d7120740f00ed23a2252b729b1932dd7866f908"
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "discard"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0"
+
+[[package]]
+name = "dominion"
+version = "0.1.0"
+dependencies = [
+ "async-std",
+ "html-escape",
+ "serde",
+ "serde_json",
+ "tide",
+ "tide-websockets",
+ "uuid",
+]
+
+[[package]]
+name = "event-listener"
+version = "2.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59"
+
+[[package]]
+name = "fastrand"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca5faf057445ce5c9d4329e382b2ce7ca38550ef3b73a5348362d5f24e0c7fe3"
+dependencies = [
+ "instant",
+]
+
+[[package]]
+name = "femme"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2af1a24f391a5a94d756db5092c6576aad494b88a71a5a36b20c67b63e0df034"
+dependencies = [
+ "cfg-if 0.1.10",
+ "js-sys",
+ "log",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "form_urlencoded"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"
+dependencies = [
+ "matches",
+ "percent-encoding",
+]
+
+[[package]]
+name = "futures-channel"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b7109687aa4e177ef6fe84553af6280ef2778bdb7783ba44c9dc3399110fe64"
+dependencies = [
+ "futures-core",
+]
+
+[[package]]
+name = "futures-core"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "847ce131b72ffb13b6109a221da9ad97a64cbe48feb1028356b836b47b8f1748"
+
+[[package]]
+name = "futures-io"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "611834ce18aaa1bd13c4b374f5d653e1027cf99b6b502584ff8c9a64413b30bb"
+
+[[package]]
+name = "futures-lite"
+version = "1.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4481d0cd0de1d204a4fa55e7d45f07b1d958abcb06714b3446438e2eff695fb"
+dependencies = [
+ "fastrand",
+ "futures-core",
+ "futures-io",
+ "memchr",
+ "parking",
+ "pin-project-lite 0.2.0",
+ "waker-fn",
+]
+
+[[package]]
+name = "futures-macro"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77408a692f1f97bcc61dc001d752e00643408fbc922e4d634c655df50d595556"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "futures-sink"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f878195a49cee50e006b02b93cf7e0a95a38ac7b776b4c4d9cc1207cd20fcb3d"
+
+[[package]]
+name = "futures-task"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c554eb5bf48b2426c4771ab68c6b14468b6e76cc90996f528c3338d761a4d0d"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "futures-util"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d304cff4a7b99cfb7986f7d43fbe93d175e72e704a8860787cc95e9ffd85cbd2"
+dependencies = [
+ "futures-core",
+ "futures-macro",
+ "futures-sink",
+ "futures-task",
+ "pin-project",
+ "pin-utils",
+ "proc-macro-hack",
+ "proc-macro-nested",
+ "slab",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.14.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "ghash"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6e27f0689a6e15944bdce7e45425efb87eaa8ab0c6e87f11d0987a9133e2531"
+dependencies = [
+ "polyval",
+]
+
+[[package]]
+name = "gloo-timers"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47204a46aaff920a1ea58b11d03dec6f704287d27561724a4631e450654a891f"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aca5565f760fb5b220e499d72710ed156fdb74e631659e99377d9ebfbd13ae8"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hkdf"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f"
+dependencies = [
+ "digest",
+ "hmac 0.10.1",
+]
+
+[[package]]
+name = "hmac"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840"
+dependencies = [
+ "crypto-mac 0.8.0",
+ "digest",
+]
+
+[[package]]
+name = "hmac"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15"
+dependencies = [
+ "crypto-mac 0.10.0",
+ "digest",
+]
+
+[[package]]
+name = "html-escape"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d348900ce941b7474395ba922ed3735a517df4546a2939ddb416ce85eeaa988e"
+dependencies = [
+ "utf8-width",
+]
+
+[[package]]
+name = "http"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84129d298a6d57d246960ff8eb831ca4af3f96d29e2e28848dae275408658e26"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-client"
+version = "6.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "010092b71b94ee49293995625ce7a607778b8b4099c8088fa84fd66bd3e0f21c"
+dependencies = [
+ "async-trait",
+ "http-types",
+ "log",
+]
+
+[[package]]
+name = "http-types"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2ab8d0085fb82859c9adf050bd53992297ecdd03a665a230dfa50c8c964bf3d"
+dependencies = [
+ "anyhow",
+ "async-channel",
+ "async-std",
+ "base64 0.13.0",
+ "cookie",
+ "futures-lite",
+ "infer",
+ "pin-project-lite 0.1.11",
+ "rand",
+ "serde",
+ "serde_json",
+ "serde_qs",
+ "serde_urlencoded",
+ "url",
+]
+
+[[package]]
+name = "httparse"
+version = "1.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9"
+
+[[package]]
+name = "idna"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"
+dependencies = [
+ "matches",
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "infer"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64e9829a50b42bb782c1df523f78d332fe371b10c661e78b7a3c34b0198e9fac"
+
+[[package]]
+name = "input_buffer"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19a8a95243d5a0398cae618ec29477c6e3cb631152be5c19481f80bc71559754"
+dependencies = [
+ "bytes",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "itoa"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
+
+[[package]]
+name = "js-sys"
+version = "0.3.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf3d7383929f7c9c7c2d0fa596f325832df98c3704f2c60553080f7127a58175"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kv-log-macro"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
+dependencies = [
+ "log",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1482821306169ec4d07f6aca392a4681f66c75c9918aa49641a2595db64053cb"
+
+[[package]]
+name = "log"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fabed175da42fed1fa0746b0ea71f412aa9d35e76e95e59b192c64b9dc2bf8b"
+dependencies = [
+ "cfg-if 0.1.10",
+]
+
+[[package]]
+name = "matches"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08"
+
+[[package]]
+name = "maybe-uninit"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00"
+
+[[package]]
+name = "memchr"
+version = "2.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525"
+
+[[package]]
+name = "nb-connect"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8123a81538e457d44b933a02faf885d3fe8408806b23fa700e8f01c6c3a98998"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db"
+dependencies = [
+ "autocfg",
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"
+
+[[package]]
+name = "opaque-debug"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
+
+[[package]]
+name = "parking"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72"
+
+[[package]]
+name = "percent-encoding"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
+
+[[package]]
+name = "pin-project"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ccc2237c2c489783abd8c4c80e5450fc0e98644555b1364da68cc29aa151ca7"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8e8d2bf0b23038a4424865103a4df472855692821aab4e4f5c3312d461d9e5f"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c917123afa01924fc84bb20c4c03f004d9c38e5127e3c039bbf7f4b9c76a2f6b"
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b063f57ec186e6140e2b8b6921e5f1bd89c7356dda5b33acc5401203ca6131c"
+
+[[package]]
+name = "pin-utils"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
+
+[[package]]
+name = "polling"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2a7bc6b2a29e632e45451c941832803a18cce6781db04de8a04696cdca8bde4"
+dependencies = [
+ "cfg-if 0.1.10",
+ "libc",
+ "log",
+ "wepoll-sys",
+ "winapi",
+]
+
+[[package]]
+name = "polyval"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4fd92d8e0c06d08525d2e2643cc2b5c80c69ae8eb12c18272d501cd7079ccc0"
+dependencies = [
+ "cpuid-bool 0.2.0",
+ "universal-hash",
+]
+
+[[package]]
+name = "ppv-lite86"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+
+[[package]]
+name = "proc-macro-hack"
+version = "0.5.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
+
+[[package]]
+name = "proc-macro-nested"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eba180dafb9038b050a4c280019bbedf9f2467b61e5d892dcad585bb57aadc5a"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
+dependencies = [
+ "unicode-xid",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rand"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom",
+ "libc",
+ "rand_chacha",
+ "rand_core",
+ "rand_hc",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "route-recognizer"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56770675ebc04927ded3e60633437841581c285dc6236109ea25fbf3beb7b59e"
+
+[[package]]
+name = "rustc_version"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver",
+]
+
+[[package]]
+name = "ryu"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e"
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.118"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.118"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1500e84d27fe482ed1dc791a56eddc2f230046a040fa908c08bda1d9fb615779"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_qs"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5af82de3c6549b001bec34961ff2d6a54339a87bab37ce901b693401f27de6cb"
+dependencies = [
+ "data-encoding",
+ "percent-encoding",
+ "serde",
+ "thiserror",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha-1"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce3cdf1b5e620a498ee6f2a171885ac7e22f0e12089ec4b3d22b84921792507c"
+dependencies = [
+ "block-buffer",
+ "cfg-if 1.0.0",
+ "cpuid-bool 0.1.2",
+ "digest",
+ "opaque-debug",
+]
+
+[[package]]
+name = "sha1"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d"
+
+[[package]]
+name = "sha2"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e7aab86fe2149bad8c507606bdb3f4ef5e7b2380eb92350f56122cca72a42a8"
+dependencies = [
+ "block-buffer",
+ "cfg-if 1.0.0",
+ "cpuid-bool 0.1.2",
+ "digest",
+ "opaque-debug",
+]
+
+[[package]]
+name = "signal-hook"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "604508c1418b99dfe1925ca9224829bb2a8a9a04dda655cc01fcad46f4ab05ed"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce32ea0c6c56d5eacaeb814fbed9960547021d3edd010ded1425f180536b20ab"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "simple-mutex"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38aabbeafa6f6dead8cebf246fe9fae1f9215c8d29b3a69f93bd62a9e4a3dcd6"
+dependencies = [
+ "event-listener",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "standback"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf906c8b8fc3f6ecd1046e01da1d8ddec83e48c8b08b84dcc02b585a6bedf5a8"
+dependencies = [
+ "version_check",
+]
+
+[[package]]
+name = "stdweb"
+version = "0.4.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5"
+dependencies = [
+ "discard",
+ "rustc_version",
+ "stdweb-derive",
+ "stdweb-internal-macros",
+ "stdweb-internal-runtime",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "stdweb-derive"
+version = "0.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-macros"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11"
+dependencies = [
+ "base-x",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "sha1",
+ "syn",
+]
+
+[[package]]
+name = "stdweb-internal-runtime"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0"
+
+[[package]]
+name = "subtle"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2"
+
+[[package]]
+name = "syn"
+version = "1.0.55"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a571a711dddd09019ccc628e1b17fe87c59b09d513c06c026877aa708334f37a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e9ae34b84616eedaaf1e9dd6026dbe00dcafa92aa0c8077cb69df1fcfe5e53e"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ba20f23e85b10754cd195504aebf6a27e2e6cbe28c17778a0c930724628dd56"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tide"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c832ca099a0645f6446b6c8900b09e3b76978dedc0d7383438698b32ff07f734"
+dependencies = [
+ "async-h1",
+ "async-session",
+ "async-sse",
+ "async-std",
+ "async-trait",
+ "femme",
+ "futures-util",
+ "http-client",
+ "http-types",
+ "kv-log-macro",
+ "log",
+ "pin-project-lite 0.1.11",
+ "route-recognizer",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "tide-websockets"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4aee1eac9c3385cd9fe60de592b84f89b5c57f711da604128b9c1ea3377d072c"
+dependencies = [
+ "async-dup",
+ "async-std",
+ "async-tungstenite",
+ "base64 0.13.0",
+ "futures-util",
+ "pin-project",
+ "serde",
+ "serde_json",
+ "sha-1",
+ "tide",
+]
+
+[[package]]
+name = "time"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"
+dependencies = [
+ "libc",
+ "wasi 0.10.0+wasi-snapshot-preview1",
+ "winapi",
+]
+
+[[package]]
+name = "time"
+version = "0.2.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcdaeea317915d59b2b4cd3b5efcd156c309108664277793f5351700c02ce98b"
+dependencies = [
+ "const_fn",
+ "libc",
+ "standback",
+ "stdweb",
+ "time-macros",
+ "version_check",
+ "winapi",
+]
+
+[[package]]
+name = "time-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1"
+dependencies = [
+ "proc-macro-hack",
+ "time-macros-impl",
+]
+
+[[package]]
+name = "time-macros-impl"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5c3be1edfad6027c69f5491cf4cb310d1a71ecd6af742788c6ff8bced86b8fa"
+dependencies = [
+ "proc-macro-hack",
+ "proc-macro2",
+ "quote",
+ "standback",
+ "syn",
+]
+
+[[package]]
+name = "tinyvec"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf8dbc19eb42fba10e8feaaec282fb50e2c14b2726d6301dbfeed0f73306a6f"
+dependencies = [
+ "tinyvec_macros",
+]
+
+[[package]]
+name = "tinyvec_macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
+
+[[package]]
+name = "tungstenite"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0308d80d86700c5878b9ef6321f020f29b1bb9d5ff3cab25e75e23f3a492a23"
+dependencies = [
+ "base64 0.12.3",
+ "byteorder",
+ "bytes",
+ "http",
+ "httparse",
+ "input_buffer",
+ "log",
+ "rand",
+ "sha-1",
+ "url",
+ "utf-8",
+]
+
+[[package]]
+name = "typenum"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "373c8a200f9e67a0c95e62a4f52fbf80c23b4381c05a17845531982fa99e6b33"
+
+[[package]]
+name = "unicode-bidi"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5"
+dependencies = [
+ "matches",
+]
+
+[[package]]
+name = "unicode-normalization"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606"
+dependencies = [
+ "tinyvec",
+]
+
+[[package]]
+name = "unicode-xid"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
+
+[[package]]
+name = "universal-hash"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8326b2c654932e3e4f9196e69d08fdf7cfd718e1dc6f66b347e6024a0c961402"
+dependencies = [
+ "generic-array",
+ "subtle",
+]
+
+[[package]]
+name = "url"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "matches",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf-8"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05e42f7c18b8f902290b009cde6d651262f956c98bc51bca4cd1d511c9cd85c7"
+
+[[package]]
+name = "utf8-width"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9071ac216321a4470a69fb2b28cfc68dcd1a39acd877c8be8e014df6772d8efa"
+
+[[package]]
+name = "uuid"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9fde2f6a4bea1d6e007c4ad38c6839fa71cbb63b6dbf5b595aa38dc9b1093c11"
+dependencies = [
+ "rand",
+ "serde",
+]
+
+[[package]]
+name = "vec-arena"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eafc1b9b2dfc6f5529177b62cf806484db55b32dc7c9658a118e11bbeb33061d"
+
+[[package]]
+name = "version_check"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed"
+
+[[package]]
+name = "waker-fn"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[package]]
+name = "wasi"
+version = "0.10.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3cd364751395ca0f68cafb17666eee36b63077fb5ecd972bbcd74c90c4bf736e"
+dependencies = [
+ "cfg-if 1.0.0",
+ "serde",
+ "serde_json",
+ "wasm-bindgen-macro",
+]
+
+[[package]]
+name = "wasm-bindgen-backend"
+version = "0.2.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1114f89ab1f4106e5b55e688b828c0ab0ea593a1ea7c094b141b14cbaaec2d62"
+dependencies = [
+ "bumpalo",
+ "lazy_static",
+ "log",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fe9756085a84584ee9457a002b7cdfe0bfff169f45d2591d8be1345a6780e35"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a6ac8995ead1f084a8dea1e65f194d0973800c7f571f6edd70adf06ecf77084"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5a48c72f299d80557c7c62e37e7225369ecc0c963964059509fbafe917c7549"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-backend",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e7811dd7f9398f14cc76efd356f98f03aa30419dea46aa810d71e819fc97158"
+
+[[package]]
+name = "web-sys"
+version = "0.3.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "222b1ef9334f92a21d3fb53dc3fd80f30836959a90f9274a626d7e06315ba3c3"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "wepoll-sys"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fcb14dea929042224824779fbc82d9fab8d2e6d3cbc0ac404de8edf489e77ff"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..4240e64
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,16 @@
+[package]
+name = "dominion"
+version = "0.1.0"
+authors = ["Markus Wagner "]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+async-std = { version = "1.8.0", features = ["attributes"] }
+html-escape = "0.2.6"
+serde = { version = "1.0", features = ["derive"] }
+serde_json = "1.0.60"
+tide = "0.15.0"
+tide-websockets = "0.1.0"
+uuid = { version = "0.8.1", features = ["v4", "serde"] }
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..568f8c9
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,238 @@
+extern crate html_escape;
+
+use async_std::{
+ prelude::*,
+ sync::RwLock
+};
+use std::{
+ collections::HashMap,
+ sync::{Arc}
+};
+use serde::{Deserialize, Serialize};
+use tide::{Body, Redirect, Request, Response};
+use tide_websockets::{Message, WebSocket, WebSocketConnection};
+use uuid::Uuid;
+
+#[derive(Deserialize, Clone)]
+struct CreateGameMessage {
+ name: String,
+}
+
+#[derive(Serialize)]
+struct GameStateMessage {
+ id: String,
+ state: GameState,
+}
+
+#[derive(Serialize)]
+struct GameSetupMessage {
+ id: String,
+ setup: GameSetup,
+}
+
+#[derive(Deserialize)]
+#[serde(tag = "type")]
+enum ClientMessage {
+ Chat {
+ message: String,
+ },
+ StartGame,
+}
+
+#[derive(Serialize)]
+#[serde(tag = "type")]
+enum ServerMessage {
+ Chat {
+ sender: String,
+ message: String,
+ },
+ PlayerJoined {
+ player: String,
+ },
+}
+
+struct Player {
+ name: String,
+}
+
+#[derive(Copy, Clone, Serialize)]
+enum GameState {
+ Setup,
+ InProgress,
+}
+
+#[derive(Clone, Serialize)]
+struct GameSetup {
+ deck: Vec,
+}
+
+impl Default for GameSetup {
+ fn default() -> GameSetup {
+ GameSetup {
+ deck: vec!["Copper".into(), "Copper".into(), "Copper".into(), "Copper".into(), "Copper".into(),
+ "Copper".into(), "Copper".into(), "Estate".into(), "Estate".into(), "Estate".into()]
+ }
+ }
+}
+
+struct Game {
+ players: Vec,
+ state: GameState,
+ setup: GameSetup,
+ connections: HashMap,
+}
+
+
+impl Game {
+ fn new(player: Player) -> Self {
+ Self {
+ players: vec![player],
+ state: GameState::Setup,
+ setup: GameSetup::default(),
+ connections: HashMap::new(),
+ }
+ }
+}
+
+#[derive(Clone, Default)]
+struct State {
+ games: Arc>>,
+}
+
+
+#[async_std::main]
+async fn main() -> Result<(), std::io::Error> {
+ tide::log::with_level(tide::log::LevelFilter::Debug);
+
+ let mut app = tide::with_state(State::default());
+
+ app.with(tide::sessions::SessionMiddleware::new(
+ tide::sessions::MemoryStore::new(),
+ "1234567890abcdef1234567890abcdef".as_bytes(),
+ ));
+
+ app.at("/").get(|_| async { Ok(Body::from_file("static/index.html").await?) });
+ app.at("/static").serve_dir("static/")?;
+
+ app.at("/game").post(|mut req: Request| async move {
+ let msg: CreateGameMessage = req.body_form().await?;
+ let session = req.session_mut();
+
+ session.insert("player_name", msg.name.clone()).unwrap();
+
+ let id = Uuid::new_v4();
+ let mut games = req.state().games.write().await;
+ let player = Player { name: msg.name };
+
+ games.insert(id, Game::new(player));
+
+ let url = format!("/game/{}", id.to_simple().to_string());
+ let res: tide::Result = Ok(Redirect::new(url).into());
+ res
+ });
+
+ app.at("/game/:id").get(|req: Request| async move {
+ let games = req.state().games.read().await;
+ let id = req.param("id")?;
+ let game_id = Uuid::parse_str(&id).unwrap();
+
+ match games.get(&game_id) {
+ None => Ok(Response::new(404)),
+ Some(_) => {
+ let mut res = Response::new(200);
+ res.set_body(Body::from_file("static/game.html").await?);
+ Ok(res)
+ }
+ }
+ });
+
+
+ app.at("/game/:id/ws")
+ .get(WebSocket::new(|req: Request, mut stream| async move {
+ let id = req.param("id")?;
+ let game_id = Uuid::parse_str(&id).unwrap();
+ let mut games = req.state().games.write().await;
+ let game = games.get_mut(&game_id).unwrap();
+ let session = req.session();
+
+ let client_id = Uuid::new_v4();
+ game.connections.insert(client_id, stream.clone());
+
+ //Ensure the write locks are freed, possibly better to move to a function
+ //with implicit drop?
+ drop(game);
+ drop(games);
+
+ let games = req.state().games.read().await;
+ let game = games.get(&game_id).unwrap();
+
+ let msg = GameStateMessage {
+ id: "state".into(),
+ state: game.state,
+ };
+
+ stream.send_json(&msg).await?;
+
+ let msg = GameSetupMessage {
+ id: "setup".into(),
+ setup: game.setup.clone(),
+ };
+
+ stream.send_json(&msg).await?;
+
+ let player: String = session.get("player_name").unwrap_or("SOMEONE".into());
+ let sm = ServerMessage::PlayerJoined {
+ player: html_escape::encode_text(&player).into(),
+ };
+
+ for (_, con) in game.connections.iter() {
+ con.send_json(&sm).await?;
+ }
+
+ drop(game); drop(games);
+
+ while let Some(Ok(Message::Text(input))) = stream.next().await {
+ let msg: ClientMessage = serde_json::from_str(&input)?;
+
+ match msg {
+ ClientMessage::Chat { message } => {
+ let sender: String = session.get("player_name").unwrap_or("SOMEONE".into());
+ let sm = ServerMessage::Chat {
+ sender: html_escape::encode_text(&sender).into(),
+ message: html_escape::encode_text(&message).into(),
+ };
+
+ let games = req.state().games.read().await;
+ let game = games.get(&game_id).unwrap();
+
+ for (_, con) in game.connections.iter() {
+ con.send_json(&sm).await?;
+ }
+ }
+
+ ClientMessage::StartGame => {
+ let mut games = req.state().games.write().await;
+ let game = games.get_mut(&game_id).unwrap();
+
+ match game.state {
+ GameState::Setup => {
+ game.state = GameState::InProgress;
+ }
+ _ => {} //Ignore, if game not in setup state
+ }
+ }
+ }
+ }
+
+ let mut games = req.state().games.write().await;
+ let game = games.get_mut(&game_id).unwrap();
+
+ game.connections.remove(&client_id);
+
+ Ok(())
+ }));
+
+ app.listen("0.0.0.0:5000").await?;
+ Ok(())
+}
+
diff --git a/static/game.html b/static/game.html
new file mode 100644
index 0000000..2955cd9
--- /dev/null
+++ b/static/game.html
@@ -0,0 +1,523 @@
+
+
+
+
+
+ DnD
+
+
+
+
+
+
+
+
+
+
diff --git a/static/images/64px-Coin.png b/static/images/64px-Coin.png
new file mode 100644
index 0000000..bad8467
--- /dev/null
+++ b/static/images/64px-Coin.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e37f777c81e65c23524c104e2947f7cee62a4c4bdf5d4acc27a4dc2efa41ab5
+size 12193
diff --git a/static/images/cards/Card_back.jpg b/static/images/cards/Card_back.jpg
new file mode 100644
index 0000000..dd7292e
--- /dev/null
+++ b/static/images/cards/Card_back.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4e9adff079461b474e0a5506c5db86a250734ad278f14c349dd7236943877776
+size 35552
diff --git a/static/images/cards/abandoned-mine.jpg b/static/images/cards/abandoned-mine.jpg
new file mode 100644
index 0000000..ab8632e
--- /dev/null
+++ b/static/images/cards/abandoned-mine.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b071aa325752f56f48aa455d91c2063bf5b98fe9c65d7a18ec4102d5eddb0791
+size 150339
diff --git a/static/images/cards/academy.jpg b/static/images/cards/academy.jpg
new file mode 100644
index 0000000..a301572
--- /dev/null
+++ b/static/images/cards/academy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:447c41d939b6c0e38bb6c5b87d65b3ec9ef97b43059f0726e853aac65b928942
+size 194350
diff --git a/static/images/cards/acting-troupe.jpg b/static/images/cards/acting-troupe.jpg
new file mode 100644
index 0000000..78f4580
--- /dev/null
+++ b/static/images/cards/acting-troupe.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:88237d4e271abf1b6914c9a9f2bec34ff7383aa8082985f540534bb766cf7a52
+size 151929
diff --git a/static/images/cards/advance.jpg b/static/images/cards/advance.jpg
new file mode 100644
index 0000000..3b035e9
--- /dev/null
+++ b/static/images/cards/advance.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bae02e173112975a0090863628fb58622d477b9fafdc31387c3eaaa0b2e092bd
+size 245726
diff --git a/static/images/cards/adventurer.jpg b/static/images/cards/adventurer.jpg
new file mode 100644
index 0000000..fd767ee
--- /dev/null
+++ b/static/images/cards/adventurer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09139fa75118a762d75229e937d0d2bc30edb7ec4256bb3a4a770ca316e925c2
+size 110080
diff --git a/static/images/cards/advisor.jpg b/static/images/cards/advisor.jpg
new file mode 100644
index 0000000..5086e0e
--- /dev/null
+++ b/static/images/cards/advisor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cdb85d34d89433c06e1cc944f959ccf18d4b1dfd3f96076113d0e2ab82996a32
+size 167554
diff --git a/static/images/cards/alchemist.jpg b/static/images/cards/alchemist.jpg
new file mode 100644
index 0000000..5c98e27
--- /dev/null
+++ b/static/images/cards/alchemist.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aa3847b3c58445f884f3bb15d4c6c002d02b8fddf53872029685f15e65e6a7e7
+size 190487
diff --git a/static/images/cards/alms.jpg b/static/images/cards/alms.jpg
new file mode 100644
index 0000000..e75ad0e
--- /dev/null
+++ b/static/images/cards/alms.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:062e7a67f039832e4adfc8b88dd630b0e371f91ac5413b7bce722f47875da69d
+size 259180
diff --git a/static/images/cards/altar.jpg b/static/images/cards/altar.jpg
new file mode 100644
index 0000000..6f94d40
--- /dev/null
+++ b/static/images/cards/altar.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:89662bef29e265a68f9df61618df185f39db2f036bbf3f73dc76a059fe122d6b
+size 149501
diff --git a/static/images/cards/ambassador.jpg b/static/images/cards/ambassador.jpg
new file mode 100644
index 0000000..4f22f64
--- /dev/null
+++ b/static/images/cards/ambassador.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:054a540237572ec65d0175186a0346030262f3f36193d438ab37921fdfb5b49d
+size 187719
diff --git a/static/images/cards/amulet.jpg b/static/images/cards/amulet.jpg
new file mode 100644
index 0000000..b63ce69
--- /dev/null
+++ b/static/images/cards/amulet.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cc8f51053b1478cf455632e0d42b839c1c3a776972080c7636548fe3d6aca56
+size 178270
diff --git a/static/images/cards/annex.jpg b/static/images/cards/annex.jpg
new file mode 100644
index 0000000..497eadb
--- /dev/null
+++ b/static/images/cards/annex.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:00314d2d32720773f2b20434e3f221605446083be1948a87097b53102c906d71
+size 299894
diff --git a/static/images/cards/apothecary.jpg b/static/images/cards/apothecary.jpg
new file mode 100644
index 0000000..6eba884
--- /dev/null
+++ b/static/images/cards/apothecary.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3e12182c196cc7550d92616971257ce514233fe0ebc15d9bb901f8d7db182bc3
+size 194152
diff --git a/static/images/cards/apprentice.jpg b/static/images/cards/apprentice.jpg
new file mode 100644
index 0000000..0213d73
--- /dev/null
+++ b/static/images/cards/apprentice.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96ec49381eb8b0bfaf9e7a91f335dca787c9288dcc16bbf944d4bdcc48dbc9f4
+size 163152
diff --git a/static/images/cards/aqueduct.jpg b/static/images/cards/aqueduct.jpg
new file mode 100644
index 0000000..2d7a64b
--- /dev/null
+++ b/static/images/cards/aqueduct.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:18485e2ab702a1a0dd85fe9e25673c83911f2d2a9420db245b18328411b03578
+size 283601
diff --git a/static/images/cards/archive.jpg b/static/images/cards/archive.jpg
new file mode 100644
index 0000000..ec203a5
--- /dev/null
+++ b/static/images/cards/archive.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ed787897a87cc14484d911155d975b377e078f6f446aecf6369703ac2987f85a
+size 192583
diff --git a/static/images/cards/arena.jpg b/static/images/cards/arena.jpg
new file mode 100644
index 0000000..7435f86
--- /dev/null
+++ b/static/images/cards/arena.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6077fe94e730a55d43a3c9af3f4097a896cd1f9ba29d26deba53c61a991198e9
+size 269741
diff --git a/static/images/cards/armory.jpg b/static/images/cards/armory.jpg
new file mode 100644
index 0000000..619d417
--- /dev/null
+++ b/static/images/cards/armory.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65c9f381e70f627a29e15b40be47426b228a100922b4d20d94effb1255132ee6
+size 171332
diff --git a/static/images/cards/artificer.jpg b/static/images/cards/artificer.jpg
new file mode 100644
index 0000000..6a98a37
--- /dev/null
+++ b/static/images/cards/artificer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96a972cc9b2aa10ad04e93e7e856486e677d9709e2af156a983c9eb73237be14
+size 172668
diff --git a/static/images/cards/artisan.jpg b/static/images/cards/artisan.jpg
new file mode 100644
index 0000000..bc1191e
--- /dev/null
+++ b/static/images/cards/artisan.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:81708bd50937be2a91ff24e3c2999f656e0cb9e844532d077e6ab8d68bf7eda8
+size 175989
diff --git a/static/images/cards/avanto.jpg b/static/images/cards/avanto.jpg
new file mode 100644
index 0000000..1d33b61
--- /dev/null
+++ b/static/images/cards/avanto.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:73357df3a1d5d6a80c0672ba359703eb428a1ac40c01ae3678b67630983cb011
+size 161743
diff --git a/static/images/cards/bad-omens.jpg b/static/images/cards/bad-omens.jpg
new file mode 100644
index 0000000..bcc227c
--- /dev/null
+++ b/static/images/cards/bad-omens.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f26743407b164aac97d4ceb49ac73eb44d1939a440d305eab1400e97da9ea74f
+size 210059
diff --git a/static/images/cards/bag-of-gold.jpg b/static/images/cards/bag-of-gold.jpg
new file mode 100644
index 0000000..3b26f30
--- /dev/null
+++ b/static/images/cards/bag-of-gold.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f85f540d9565f84a5c0818120b6f8bb294670f8ca4723109c4ec7c3f71007554
+size 174949
diff --git a/static/images/cards/baker.jpg b/static/images/cards/baker.jpg
new file mode 100644
index 0000000..782edb0
--- /dev/null
+++ b/static/images/cards/baker.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf3f7f7592490689e62da04502af7f0e80d5c96dddde7a37861cbebaf245a25d
+size 158658
diff --git a/static/images/cards/ball.jpg b/static/images/cards/ball.jpg
new file mode 100644
index 0000000..a4d0450
--- /dev/null
+++ b/static/images/cards/ball.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16066e1253935b34bca556dbf3e8c95a04dc9640676660b1e95d3fea9e36d1ce
+size 248574
diff --git a/static/images/cards/band-of-misfits.jpg b/static/images/cards/band-of-misfits.jpg
new file mode 100644
index 0000000..3d8b75b
--- /dev/null
+++ b/static/images/cards/band-of-misfits.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43578486add5242918cfce626f2c76a050869948c770c8143964dbaf4da0ccf2
+size 157662
diff --git a/static/images/cards/bandit-camp.jpg b/static/images/cards/bandit-camp.jpg
new file mode 100644
index 0000000..123f016
--- /dev/null
+++ b/static/images/cards/bandit-camp.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a92d093799c86761adeeadc9c3690ffe2f9a5bef040fc0535e6b207329252497
+size 137573
diff --git a/static/images/cards/bandit-fort.jpg b/static/images/cards/bandit-fort.jpg
new file mode 100644
index 0000000..74dad3c
--- /dev/null
+++ b/static/images/cards/bandit-fort.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0ca7090bed09b35e19d42eb78217ca84b2c38fa23b86c980b993519bfc84e719
+size 247609
diff --git a/static/images/cards/bandit.jpg b/static/images/cards/bandit.jpg
new file mode 100644
index 0000000..1570959
--- /dev/null
+++ b/static/images/cards/bandit.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69c1e217091377e7dcb5e458cc21221b14fd7c3fb46b7f641a2550d03799cdd4
+size 195741
diff --git a/static/images/cards/bank.jpg b/static/images/cards/bank.jpg
new file mode 100644
index 0000000..b111140
--- /dev/null
+++ b/static/images/cards/bank.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bad30b9fcda38c2d1f95a5ade0bebc95e1bd377ab54cc4af02397323e2e7cf1f
+size 172046
diff --git a/static/images/cards/banquet.jpg b/static/images/cards/banquet.jpg
new file mode 100644
index 0000000..309ffbc
--- /dev/null
+++ b/static/images/cards/banquet.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:acdde628b245f3c96d3632cdc1efd0eb2947eb0c403cfec09b2fb06dd5871af5
+size 249520
diff --git a/static/images/cards/bard.jpg b/static/images/cards/bard.jpg
new file mode 100644
index 0000000..503b600
--- /dev/null
+++ b/static/images/cards/bard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:59e59a9277278e40d36a89091a4c5931814e659a8c5672503caa1d2f97e78375
+size 149934
diff --git a/static/images/cards/baron.jpg b/static/images/cards/baron.jpg
new file mode 100644
index 0000000..08e0f2f
--- /dev/null
+++ b/static/images/cards/baron.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8fa6c78b6d3c1e38f84789dc5aeb99f212b751a8c7e7b150b58f58eb6bf6606a
+size 164270
diff --git a/static/images/cards/barracks.jpg b/static/images/cards/barracks.jpg
new file mode 100644
index 0000000..a5344d6
--- /dev/null
+++ b/static/images/cards/barracks.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9519c7b09720024e4fa861e00c68938ee0acf7c9853205f6c8f4f110a6ebf407
+size 183491
diff --git a/static/images/cards/basilica.jpg b/static/images/cards/basilica.jpg
new file mode 100644
index 0000000..9c9e0e2
--- /dev/null
+++ b/static/images/cards/basilica.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:082f0b9ed3157e8f3339f0b281fc2b58d89136076a61b38a882737faac1352e0
+size 229080
diff --git a/static/images/cards/bat.jpg b/static/images/cards/bat.jpg
new file mode 100644
index 0000000..7bc0f83
--- /dev/null
+++ b/static/images/cards/bat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a45c1825e177e70bb6a8fc335c39d0f2ec4bd7ea1c15df79ab17cac6693f2656
+size 152138
diff --git a/static/images/cards/baths.jpg b/static/images/cards/baths.jpg
new file mode 100644
index 0000000..79e5651
--- /dev/null
+++ b/static/images/cards/baths.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2c9dfdf4f8e9b20ec7cafe5f41896f1c093c3eb9954f1a7850abfda0177a5b2f
+size 201506
diff --git a/static/images/cards/battlefield.jpg b/static/images/cards/battlefield.jpg
new file mode 100644
index 0000000..2b1bce2
--- /dev/null
+++ b/static/images/cards/battlefield.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:55b8edfd3c2c273b2bdd66300529c012fcc0e3761b249eb3362dcdff6617f5cb
+size 262265
diff --git a/static/images/cards/bazaar.jpg b/static/images/cards/bazaar.jpg
new file mode 100644
index 0000000..12dc40c
--- /dev/null
+++ b/static/images/cards/bazaar.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2cfb81cedf87009129556cb70bb596c1e330fb85b31bb180e265dca6221b0a67
+size 151082
diff --git a/static/images/cards/beggar.jpg b/static/images/cards/beggar.jpg
new file mode 100644
index 0000000..7ac2871
--- /dev/null
+++ b/static/images/cards/beggar.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:33d07fc769db25641401fe1bce01638f284f1c8adef8f89dad4b3a2ddc0d4273
+size 174626
diff --git a/static/images/cards/bishop.jpg b/static/images/cards/bishop.jpg
new file mode 100644
index 0000000..09a18a0
--- /dev/null
+++ b/static/images/cards/bishop.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b7ad756158087fa44426fff7eb09ca1edbe99d1c7c5366b68604d9cfc9fdb60d
+size 176946
diff --git a/static/images/cards/black-market.jpg b/static/images/cards/black-market.jpg
new file mode 100644
index 0000000..623c11f
--- /dev/null
+++ b/static/images/cards/black-market.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3da4157471de19f82458837178bc09a926ed2feccc741fb6c3db46069e024d13
+size 199567
diff --git a/static/images/cards/blessed-village.jpg b/static/images/cards/blessed-village.jpg
new file mode 100644
index 0000000..ec22d97
--- /dev/null
+++ b/static/images/cards/blessed-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0cfbb32b7e34fb2833f294dec9c852bf86a32066624c3e4787a5a1bfae43060a
+size 196459
diff --git a/static/images/cards/bonfire.jpg b/static/images/cards/bonfire.jpg
new file mode 100644
index 0000000..4df5fbc
--- /dev/null
+++ b/static/images/cards/bonfire.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3782c39a32fde7cd7fdfac58e6f91533f20e500d3c273457bf6e65ff0c49cc70
+size 238401
diff --git a/static/images/cards/border-guard.jpg b/static/images/cards/border-guard.jpg
new file mode 100644
index 0000000..721f9e5
--- /dev/null
+++ b/static/images/cards/border-guard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c821a46a896f703667a2ac81e64dc22ff24ceac120440aa1824cf09e5df1d009
+size 172404
diff --git a/static/images/cards/border-village.jpg b/static/images/cards/border-village.jpg
new file mode 100644
index 0000000..291dfa5
--- /dev/null
+++ b/static/images/cards/border-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d009401a3b573ebaf68c369cac003b57ea8ef67a146805548b7b597b2d645a9d
+size 161989
diff --git a/static/images/cards/borrow.jpg b/static/images/cards/borrow.jpg
new file mode 100644
index 0000000..3cf4fe7
--- /dev/null
+++ b/static/images/cards/borrow.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:47036214bcdfe6280e35953d6af0bc4ae4d4c3817d147a4ebbea60ebd553d455
+size 239320
diff --git a/static/images/cards/bridge-troll.jpg b/static/images/cards/bridge-troll.jpg
new file mode 100644
index 0000000..5c1f66e
--- /dev/null
+++ b/static/images/cards/bridge-troll.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc7a76ff6f87654a3a527f8779674a57ee4ecc2446f139d57fc32b2b2097a990
+size 212165
diff --git a/static/images/cards/bridge.jpg b/static/images/cards/bridge.jpg
new file mode 100644
index 0000000..9c3a1f1
--- /dev/null
+++ b/static/images/cards/bridge.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:604698da6e2954fb32cda26af73945e61337b30a74e762db65892cd07e9071a1
+size 167134
diff --git a/static/images/cards/bureaucrat.jpg b/static/images/cards/bureaucrat.jpg
new file mode 100644
index 0000000..95ceb56
--- /dev/null
+++ b/static/images/cards/bureaucrat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8149f187d0b854ae60ca176f9771305a0a3eebe8fdab58c6f84c3c9cbf5911ea
+size 187687
diff --git a/static/images/cards/bustling-village.jpg b/static/images/cards/bustling-village.jpg
new file mode 100644
index 0000000..f1b2748
--- /dev/null
+++ b/static/images/cards/bustling-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2efeacae02f264541ddb048da1ccd86205d47dac756e037f136b3ea23c79e27
+size 157262
diff --git a/static/images/cards/butcher.jpg b/static/images/cards/butcher.jpg
new file mode 100644
index 0000000..099f6de
--- /dev/null
+++ b/static/images/cards/butcher.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1485c5a75098e1a075dd899d505c7ba8b54f19d3262d1ee2ac904ebd5ee5374
+size 190185
diff --git a/static/images/cards/cache.jpg b/static/images/cards/cache.jpg
new file mode 100644
index 0000000..c0d4a6d
--- /dev/null
+++ b/static/images/cards/cache.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f5dbb76f50b127083c19aa0e67baa4a1990cdfce02960f180b03a9650f80dc88
+size 179616
diff --git a/static/images/cards/canal.jpg b/static/images/cards/canal.jpg
new file mode 100644
index 0000000..5ae1b80
--- /dev/null
+++ b/static/images/cards/canal.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:701c3ff73dc0daf0bf5e6acca56d5b5c54d3d49afcd6cef5c024a2e822b8b044
+size 237178
diff --git a/static/images/cards/candlestick-maker.jpg b/static/images/cards/candlestick-maker.jpg
new file mode 100644
index 0000000..62ea982
--- /dev/null
+++ b/static/images/cards/candlestick-maker.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e9355ca6dc70ad66223176dc948a0effb2d7d04b70fd4ea65ca23064e05e61f
+size 156463
diff --git a/static/images/cards/capital.jpg b/static/images/cards/capital.jpg
new file mode 100644
index 0000000..b65dd77
--- /dev/null
+++ b/static/images/cards/capital.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e69e3f5df610ce1a513202f0aeb464c2e64d83892a7cc2a4cf109ad15e93ead0
+size 182894
diff --git a/static/images/cards/capitalism.jpg b/static/images/cards/capitalism.jpg
new file mode 100644
index 0000000..305ae88
--- /dev/null
+++ b/static/images/cards/capitalism.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:abe445e7dad825a29215ef721375fcf225b5aba856af65d3ae6a36c6c80f9217
+size 219872
diff --git a/static/images/cards/captain.jpg b/static/images/cards/captain.jpg
new file mode 100644
index 0000000..c176879
--- /dev/null
+++ b/static/images/cards/captain.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8055b83a0de85af86a53004857a1919f0f25b8223ff8544aae1fee51e0facb28
+size 201186
diff --git a/static/images/cards/caravan-guard.jpg b/static/images/cards/caravan-guard.jpg
new file mode 100644
index 0000000..eca1b92
--- /dev/null
+++ b/static/images/cards/caravan-guard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c187ddfed9274d0a4dda68f8bb9f557311e893400c701fc383beb78709f67a4
+size 213036
diff --git a/static/images/cards/caravan.jpg b/static/images/cards/caravan.jpg
new file mode 100644
index 0000000..b7698de
--- /dev/null
+++ b/static/images/cards/caravan.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:87b4e277a877106b0041151d465062f93255e69c7fc049033db41bf51ec3cba2
+size 169551
diff --git a/static/images/cards/cargo-ship.jpg b/static/images/cards/cargo-ship.jpg
new file mode 100644
index 0000000..8450694
--- /dev/null
+++ b/static/images/cards/cargo-ship.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:834b36963efcd94b074821fb829a5091ed9d8927e58ca72d1d51d07aff0be1a1
+size 181322
diff --git a/static/images/cards/cartographer.jpg b/static/images/cards/cartographer.jpg
new file mode 100644
index 0000000..cbde561
--- /dev/null
+++ b/static/images/cards/cartographer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d811a7e8259fc8f48f01109ebed365c78e05fc716f89da56261efe86ea1612c
+size 174909
diff --git a/static/images/cards/castles.jpg b/static/images/cards/castles.jpg
new file mode 100644
index 0000000..f0f1bc5
--- /dev/null
+++ b/static/images/cards/castles.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a623e13b1831d065fbfb4c456d21dd58bae65c7d668ae3fd503e0871ca96adf9
+size 199798
diff --git a/static/images/cards/catacombs.jpg b/static/images/cards/catacombs.jpg
new file mode 100644
index 0000000..b26e615
--- /dev/null
+++ b/static/images/cards/catacombs.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1fee8a3a8df140f58abe431c83833c0f34a73a3c28eecb123d822fdf0c08ff5b
+size 170615
diff --git a/static/images/cards/catapult.jpg b/static/images/cards/catapult.jpg
new file mode 100644
index 0000000..430b042
--- /dev/null
+++ b/static/images/cards/catapult.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c5448e0738b86032b53b8cd4c7f871f175dec8ee7c28df320007744dce7d2f44
+size 193451
diff --git a/static/images/cards/cathedral.jpg b/static/images/cards/cathedral.jpg
new file mode 100644
index 0000000..d105da8
--- /dev/null
+++ b/static/images/cards/cathedral.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c632d0ecfb5776e9aaa223de604be0f245c8c73598de463f86dfb9989bdc3f1c
+size 212353
diff --git a/static/images/cards/cellar.jpg b/static/images/cards/cellar.jpg
new file mode 100644
index 0000000..2a1668b
--- /dev/null
+++ b/static/images/cards/cellar.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03282d5b1c79861b6dcf10aa7dee46280a74b54702358b5bc4c428bca7ac3680
+size 149956
diff --git a/static/images/cards/cemetery.jpg b/static/images/cards/cemetery.jpg
new file mode 100644
index 0000000..1291f49
--- /dev/null
+++ b/static/images/cards/cemetery.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4f5566d4716e0c5f6b9327150cb0e29bab0e0ab081f026ab3d80415aee1831e9
+size 180462
diff --git a/static/images/cards/champion.jpg b/static/images/cards/champion.jpg
new file mode 100644
index 0000000..3977600
--- /dev/null
+++ b/static/images/cards/champion.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4449e9b599138001d12e412544831cc1b787a7f39d43be1c1fcd3c10ace78b4
+size 198176
diff --git a/static/images/cards/chancellor.jpg b/static/images/cards/chancellor.jpg
new file mode 100644
index 0000000..0289feb
--- /dev/null
+++ b/static/images/cards/chancellor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d48acb82c72a6d1bd67f300f0d27af3a5b9252253b0d8dfec46844b8a1aff778
+size 92152
diff --git a/static/images/cards/changeling.jpg b/static/images/cards/changeling.jpg
new file mode 100644
index 0000000..98dc496
--- /dev/null
+++ b/static/images/cards/changeling.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e9ba66e459bbdf108ce5057b9a72bfb1a135d3ac01c5b49977fc84540fa603f
+size 168824
diff --git a/static/images/cards/chapel.jpg b/static/images/cards/chapel.jpg
new file mode 100644
index 0000000..a7ac75c
--- /dev/null
+++ b/static/images/cards/chapel.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02e442f0fd3cf9dc1c57b7414fd8fe05b38980324a5b2905814ef3c9a6965106
+size 134419
diff --git a/static/images/cards/chariot-race.jpg b/static/images/cards/chariot-race.jpg
new file mode 100644
index 0000000..a047533
--- /dev/null
+++ b/static/images/cards/chariot-race.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9ea175d224f0fd2884732e5c60baf2f954adc2dc586274dba633f7f281e8596d
+size 197715
diff --git a/static/images/cards/charm.jpg b/static/images/cards/charm.jpg
new file mode 100644
index 0000000..b0f8640
--- /dev/null
+++ b/static/images/cards/charm.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d39f62b9e807b79c357e82899664163659d544d0bdd619fe3c866c36479b38d
+size 196491
diff --git a/static/images/cards/church.jpg b/static/images/cards/church.jpg
new file mode 100644
index 0000000..2079389
--- /dev/null
+++ b/static/images/cards/church.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dfda2a5b9569200ad7566afb84c88dc7c9b374ee348f670be7829a8db9b43a71
+size 193826
diff --git a/static/images/cards/citadel.jpg b/static/images/cards/citadel.jpg
new file mode 100644
index 0000000..767e221
--- /dev/null
+++ b/static/images/cards/citadel.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5785306fda81af431eea261bd4f9f798e6635064a36295d7bb5d82761952495f
+size 246716
diff --git a/static/images/cards/city-gate.jpg b/static/images/cards/city-gate.jpg
new file mode 100644
index 0000000..7107b9d
--- /dev/null
+++ b/static/images/cards/city-gate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63046deb6bb61a80933bd782be1d8570caf201f773f16b2c08ca0f05c563a75c
+size 257886
diff --git a/static/images/cards/city-quarter.jpg b/static/images/cards/city-quarter.jpg
new file mode 100644
index 0000000..c320df0
--- /dev/null
+++ b/static/images/cards/city-quarter.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fc6950b38f46c46c05e3d8ac2635a0424317c4f48c28055c6887e0d5c51bd532
+size 178784
diff --git a/static/images/cards/city.jpg b/static/images/cards/city.jpg
new file mode 100644
index 0000000..e377422
--- /dev/null
+++ b/static/images/cards/city.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c4e1cbb1d5209beae089f7d08f9515881a0acd58c7c7369a1930be12b1aeb813
+size 173560
diff --git a/static/images/cards/cobbler.jpg b/static/images/cards/cobbler.jpg
new file mode 100644
index 0000000..df79c16
--- /dev/null
+++ b/static/images/cards/cobbler.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:606ce4c6de74acb2c92544a27206d1119e74be951211ab5f4807102b75d427b6
+size 174340
diff --git a/static/images/cards/coin-of-the-realm.jpg b/static/images/cards/coin-of-the-realm.jpg
new file mode 100644
index 0000000..450b28e
--- /dev/null
+++ b/static/images/cards/coin-of-the-realm.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:de965af38817f8987e5821ae8997ffb1bdb01be2d5981a9c0641bb11fd58eb82
+size 212737
diff --git a/static/images/cards/colonnade.jpg b/static/images/cards/colonnade.jpg
new file mode 100644
index 0000000..9736864
--- /dev/null
+++ b/static/images/cards/colonnade.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16ab0ad36c429f127748c1b38a3603bfa0abb6249e73e490636225843400faf6
+size 268985
diff --git a/static/images/cards/colony.jpg b/static/images/cards/colony.jpg
new file mode 100644
index 0000000..1379aed
--- /dev/null
+++ b/static/images/cards/colony.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49c83251fb7c8538c9f77dfee74890294210cc356785afd9e89130e1eb9d2486
+size 141551
diff --git a/static/images/cards/conclave.jpg b/static/images/cards/conclave.jpg
new file mode 100644
index 0000000..386351a
--- /dev/null
+++ b/static/images/cards/conclave.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e16dc1daccb50638aa79aed81cf95feed99277047b2e31f2dd0c56d782d9aa61
+size 168019
diff --git a/static/images/cards/conquest.jpg b/static/images/cards/conquest.jpg
new file mode 100644
index 0000000..4bb15c4
--- /dev/null
+++ b/static/images/cards/conquest.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d133cf85b75df662c4b0886ae35d4d4f6e7af948ee14909db466dbba7e5596b
+size 262368
diff --git a/static/images/cards/conspirator.jpg b/static/images/cards/conspirator.jpg
new file mode 100644
index 0000000..f04046d
--- /dev/null
+++ b/static/images/cards/conspirator.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0b0cff6ce7bd66cf604148647522b59ad8dc93cf5117b70c8533dbfc0b88d1a
+size 165742
diff --git a/static/images/cards/contraband.jpg b/static/images/cards/contraband.jpg
new file mode 100644
index 0000000..41a9767
--- /dev/null
+++ b/static/images/cards/contraband.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:592310bcf9d235304b5d0bc5463032377709625db9d81568f0091c51a38c9f40
+size 208506
diff --git a/static/images/cards/copper.jpg b/static/images/cards/copper.jpg
new file mode 100644
index 0000000..33d7784
--- /dev/null
+++ b/static/images/cards/copper.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49f8cbbba98738d20d6ed9e58cec12d4fc0d1f39692f6cc9e100cb4366c7e264
+size 233771
diff --git a/static/images/cards/coppersmith.jpg b/static/images/cards/coppersmith.jpg
new file mode 100644
index 0000000..c64af6c
--- /dev/null
+++ b/static/images/cards/coppersmith.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1b0e125792a1762d1d325d32138676007383709666e5fb436179293067b12cb
+size 122090
diff --git a/static/images/cards/council-room.jpg b/static/images/cards/council-room.jpg
new file mode 100644
index 0000000..06c84af
--- /dev/null
+++ b/static/images/cards/council-room.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3819f52f9e890424da97a3456e126b6bf2803bb53c17169b70313e078904b003
+size 164277
diff --git a/static/images/cards/count.jpg b/static/images/cards/count.jpg
new file mode 100644
index 0000000..cb4a7ea
--- /dev/null
+++ b/static/images/cards/count.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17753596d5edce7a47157b34d663fd41ed2146b73926874f4b23502777f4bb64
+size 177873
diff --git a/static/images/cards/counterfeit.jpg b/static/images/cards/counterfeit.jpg
new file mode 100644
index 0000000..9f165ba
--- /dev/null
+++ b/static/images/cards/counterfeit.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5e32a36cc70f2eaac5aa52e7896e293028b28a8c8bf41ab075f62a171b4c244
+size 193446
diff --git a/static/images/cards/counting-house.jpg b/static/images/cards/counting-house.jpg
new file mode 100644
index 0000000..9a933da
--- /dev/null
+++ b/static/images/cards/counting-house.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65e35302a3f697b0f32ee85062945e6a241c2e7a0ccbe005736c92ea8a365309
+size 161105
diff --git a/static/images/cards/courtier.jpg b/static/images/cards/courtier.jpg
new file mode 100644
index 0000000..33970d4
--- /dev/null
+++ b/static/images/cards/courtier.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50c46062b3860852a8393bb692e87eedbe5374f73651dd2b558668a028338ca6
+size 181553
diff --git a/static/images/cards/courtyard.jpg b/static/images/cards/courtyard.jpg
new file mode 100644
index 0000000..d20d850
--- /dev/null
+++ b/static/images/cards/courtyard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e054699aa7361d7ca5f6627bc2f1df3f1cc041fe2d517850091a92267dfe8633
+size 196771
diff --git a/static/images/cards/crop-rotation.jpg b/static/images/cards/crop-rotation.jpg
new file mode 100644
index 0000000..d71388f
--- /dev/null
+++ b/static/images/cards/crop-rotation.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6349e9ed6ea225541c26c7f5e0819ab1725c434090d91a3d43c7bf39171a22de
+size 228048
diff --git a/static/images/cards/crossroads.jpg b/static/images/cards/crossroads.jpg
new file mode 100644
index 0000000..a7a98d7
--- /dev/null
+++ b/static/images/cards/crossroads.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:322f284eaf963221200bf2259bf2018186a244ddd46aed47bfb66cd296924e98
+size 171609
diff --git a/static/images/cards/crown.jpg b/static/images/cards/crown.jpg
new file mode 100644
index 0000000..e0484a0
--- /dev/null
+++ b/static/images/cards/crown.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7c23d2d8eb435880bc0d0218052f650897a6dc3ea627e46a3669db54a62d020e
+size 192423
diff --git a/static/images/cards/crumbling-castle.jpg b/static/images/cards/crumbling-castle.jpg
new file mode 100644
index 0000000..4ed63c5
--- /dev/null
+++ b/static/images/cards/crumbling-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:70e2434fbd705cda87c5771e2765eb535515a4838bfd2231ad9212b8909c8c14
+size 177320
diff --git a/static/images/cards/crypt.jpg b/static/images/cards/crypt.jpg
new file mode 100644
index 0000000..6286a67
--- /dev/null
+++ b/static/images/cards/crypt.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:46c266b4d09a7edee1b50ed9121c846d70b3ac2d12c692db1f8799cafdff3446
+size 168498
diff --git a/static/images/cards/cultist.jpg b/static/images/cards/cultist.jpg
new file mode 100644
index 0000000..f8f2a0c
--- /dev/null
+++ b/static/images/cards/cultist.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f299f8b45c4ddb163d9a7eaf88a9832f2d77314a1f61c43fff0a7ff204c7e509
+size 160569
diff --git a/static/images/cards/curse.jpg b/static/images/cards/curse.jpg
new file mode 100644
index 0000000..4dbd2b0
--- /dev/null
+++ b/static/images/cards/curse.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:59369d534d558a078d6da5238305e493c8447d87246a8fcbd9742fa6d917f5be
+size 156548
diff --git a/static/images/cards/cursed-gold.jpg b/static/images/cards/cursed-gold.jpg
new file mode 100644
index 0000000..d874fdc
--- /dev/null
+++ b/static/images/cards/cursed-gold.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2bc7e990a88d556214736b47dbd24a996d1e466c0d2355705855228cc8659de7
+size 192898
diff --git a/static/images/cards/cursed-village.jpg b/static/images/cards/cursed-village.jpg
new file mode 100644
index 0000000..b26009b
--- /dev/null
+++ b/static/images/cards/cursed-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20c4f8bdfbebc0e60022b90cd523dcc4dd946ee70ac372159b3889f9475e46e8
+size 186537
diff --git a/static/images/cards/cutpurse.jpg b/static/images/cards/cutpurse.jpg
new file mode 100644
index 0000000..fc8fc13
--- /dev/null
+++ b/static/images/cards/cutpurse.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12ea1f83216f4185c62c83174eab98b7e8b59ee51e66d06e70c41e5141d16ce0
+size 156923
diff --git a/static/images/cards/dame-anna.jpg b/static/images/cards/dame-anna.jpg
new file mode 100644
index 0000000..e4c243e
--- /dev/null
+++ b/static/images/cards/dame-anna.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ecd39f60da8762597ab982c5195722e0b6d506ba2921c5ab65d891067e37cefe
+size 204764
diff --git a/static/images/cards/dame-josephine.jpg b/static/images/cards/dame-josephine.jpg
new file mode 100644
index 0000000..cac415b
--- /dev/null
+++ b/static/images/cards/dame-josephine.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0016d653bea3173d24c841f6b817047414ef8d2703360ea5839a1d33b3ab995c
+size 199006
diff --git a/static/images/cards/dame-molly.jpg b/static/images/cards/dame-molly.jpg
new file mode 100644
index 0000000..b955324
--- /dev/null
+++ b/static/images/cards/dame-molly.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df389dff6477ae8302e51adb58994c32559d3747c23ab3d400329431eb8be03a
+size 191871
diff --git a/static/images/cards/dame-natalie.jpg b/static/images/cards/dame-natalie.jpg
new file mode 100644
index 0000000..22c0f10
--- /dev/null
+++ b/static/images/cards/dame-natalie.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:da7b50af87c745c9d6fc2de874afbcacdd0fc7c488a3a2611cb22f26eb0eca0a
+size 215165
diff --git a/static/images/cards/dame-sylvia.jpg b/static/images/cards/dame-sylvia.jpg
new file mode 100644
index 0000000..d7075a4
--- /dev/null
+++ b/static/images/cards/dame-sylvia.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:13285e4609fefb00da86be8c8a3b75bb4402a112494eaaae476e926e7433d0ce
+size 176153
diff --git a/static/images/cards/death-cart.jpg b/static/images/cards/death-cart.jpg
new file mode 100644
index 0000000..43acce8
--- /dev/null
+++ b/static/images/cards/death-cart.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c86d5f530329d81956379122cf45777a9b72c297772371927ef41de6b8b35f65
+size 189125
diff --git a/static/images/cards/defiled-shrine.jpg b/static/images/cards/defiled-shrine.jpg
new file mode 100644
index 0000000..212e1dc
--- /dev/null
+++ b/static/images/cards/defiled-shrine.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ebf066e88ccb0c9f17b9178d1a7cf5a0aca14f53437eacf501dca708dda5a030
+size 289201
diff --git a/static/images/cards/deluded.jpg b/static/images/cards/deluded.jpg
new file mode 100644
index 0000000..110168d
--- /dev/null
+++ b/static/images/cards/deluded.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:03ca94092a7cf7f8518e70dbe0c6ad2962112d03da15d93eaeea86c3c924e1e8
+size 253034
diff --git a/static/images/cards/delusion.jpg b/static/images/cards/delusion.jpg
new file mode 100644
index 0000000..b363dba
--- /dev/null
+++ b/static/images/cards/delusion.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb23e3d889c91d6ad938659f91dd19089bd42903ff14661ad2291d9bb3b47e18
+size 229427
diff --git a/static/images/cards/delve.jpg b/static/images/cards/delve.jpg
new file mode 100644
index 0000000..2586615
--- /dev/null
+++ b/static/images/cards/delve.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d4a6177e703443a4820ae2a156f569ebf1826b09c009811efbf642fb6875526
+size 206896
diff --git a/static/images/cards/den-of-sin.jpg b/static/images/cards/den-of-sin.jpg
new file mode 100644
index 0000000..fc050b9
--- /dev/null
+++ b/static/images/cards/den-of-sin.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:492becc3d5119b45884593a5801a9749463193252ad3600244fc40fd7d415232
+size 166034
diff --git a/static/images/cards/develop.jpg b/static/images/cards/develop.jpg
new file mode 100644
index 0000000..b71b736
--- /dev/null
+++ b/static/images/cards/develop.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:11de5710c07a6bf8cc69183099fd0c5c186aad02c977f223beabbe1d7f50ce08
+size 198663
diff --git a/static/images/cards/devils-workshop.jpg b/static/images/cards/devils-workshop.jpg
new file mode 100644
index 0000000..430d321
--- /dev/null
+++ b/static/images/cards/devils-workshop.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4220da74962d1d2162d926fd9769808ec193a55935b2351fe8adcb2695df8f13
+size 187336
diff --git a/static/images/cards/diadem.jpg b/static/images/cards/diadem.jpg
new file mode 100644
index 0000000..4368ad3
--- /dev/null
+++ b/static/images/cards/diadem.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b70988379d80d859393afa0e913e88366937ae2c55ee0b24377d566c289de59c
+size 186889
diff --git a/static/images/cards/diplomat.jpg b/static/images/cards/diplomat.jpg
new file mode 100644
index 0000000..7566fef
--- /dev/null
+++ b/static/images/cards/diplomat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1d499025facc6511c1c9e605921112eced317ff6dbf06247c7277a3dbde19224
+size 200517
diff --git a/static/images/cards/disciple.jpg b/static/images/cards/disciple.jpg
new file mode 100644
index 0000000..fdf7960
--- /dev/null
+++ b/static/images/cards/disciple.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:00442b003340904a865486dac442733b311cc05fda5ce6c389c85c9a2ad297ec
+size 203669
diff --git a/static/images/cards/dismantle.jpg b/static/images/cards/dismantle.jpg
new file mode 100644
index 0000000..e61e7d1
--- /dev/null
+++ b/static/images/cards/dismantle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9842b20e88ca1703dbddd7952aeba1c8f3fa4311d3433804350fed92de4bf9f7
+size 156000
diff --git a/static/images/cards/distant-lands.jpg b/static/images/cards/distant-lands.jpg
new file mode 100644
index 0000000..e4bdeaf
--- /dev/null
+++ b/static/images/cards/distant-lands.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2972bd0ee7ca655418d5a8d1a596283256ba57150d8b7b871ef7851147e28a90
+size 191458
diff --git a/static/images/cards/doctor.jpg b/static/images/cards/doctor.jpg
new file mode 100644
index 0000000..b9f1489
--- /dev/null
+++ b/static/images/cards/doctor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:222841a7b4e1b61dc419232e94862981d90abb31528ef8032d3e22ace9483cab
+size 192004
diff --git a/static/images/cards/dominate.jpg b/static/images/cards/dominate.jpg
new file mode 100644
index 0000000..b09653f
--- /dev/null
+++ b/static/images/cards/dominate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3dd6c8d585485c07e20a0acfe9ddcc2c7b3fe3d6ddffaf7b4984bf8ed3f3c333
+size 238802
diff --git a/static/images/cards/donate.jpg b/static/images/cards/donate.jpg
new file mode 100644
index 0000000..fb6df6b
--- /dev/null
+++ b/static/images/cards/donate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0752836d1c8645797a5f260127c25e58fcdc698a7c98024f5c71628655e98d28
+size 267376
diff --git a/static/images/cards/druid.jpg b/static/images/cards/druid.jpg
new file mode 100644
index 0000000..7e03513
--- /dev/null
+++ b/static/images/cards/druid.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:055eca2956d27ba464b667ea018e669da9ad4cc0db75f657730291c02988fecc
+size 178761
diff --git a/static/images/cards/ducat.jpg b/static/images/cards/ducat.jpg
new file mode 100644
index 0000000..5f57fe2
--- /dev/null
+++ b/static/images/cards/ducat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5543652a67571ac1ccea019f09143a571df1ce6adc2e1d8ceb2c07506533c7bf
+size 177072
diff --git a/static/images/cards/duchery.jpg b/static/images/cards/duchery.jpg
new file mode 100644
index 0000000..7bd64f3
--- /dev/null
+++ b/static/images/cards/duchery.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ffad0228064cce44a159cf0dea7c0affca157d0ec9fc3d2216ace2c72328205c
+size 155282
diff --git a/static/images/cards/duchess.jpg b/static/images/cards/duchess.jpg
new file mode 100644
index 0000000..23d96e7
--- /dev/null
+++ b/static/images/cards/duchess.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:49763633b5eaebb117b2a9dc01b5b2bf580f5b5c490741ab133a67fd720df56a
+size 184192
diff --git a/static/images/cards/duke.jpg b/static/images/cards/duke.jpg
new file mode 100644
index 0000000..0cdd3fc
--- /dev/null
+++ b/static/images/cards/duke.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e662ad9dd46cbf906ccb63360e7957bcbfdf6437b3a86142549477cefe67f2ad
+size 177645
diff --git a/static/images/cards/dungeon.jpg b/static/images/cards/dungeon.jpg
new file mode 100644
index 0000000..c62220a
--- /dev/null
+++ b/static/images/cards/dungeon.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a415d025cb3c8a4e3c2e0e74b8712666be5618549e9d40a77c93cc0a31c4dbb0
+size 171298
diff --git a/static/images/cards/duplicate.jpg b/static/images/cards/duplicate.jpg
new file mode 100644
index 0000000..24f26f3
--- /dev/null
+++ b/static/images/cards/duplicate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3da6c07d0341bbe652e56d82cbf9f8dedcf224099e7f6e8beaf780e33160439d
+size 180362
diff --git a/static/images/cards/embargo.jpg b/static/images/cards/embargo.jpg
new file mode 100644
index 0000000..af0e253
--- /dev/null
+++ b/static/images/cards/embargo.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:207cb34309e0ee75a2c84c34e9ec9e837023df412b3b08ef8eb9b175cdd0e4ca
+size 180600
diff --git a/static/images/cards/embassy.jpg b/static/images/cards/embassy.jpg
new file mode 100644
index 0000000..5f0ac72
--- /dev/null
+++ b/static/images/cards/embassy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1314755325363969978c4f822cb083bd1f797c4e8ebabeef1a5cbd0408d3f773
+size 186477
diff --git a/static/images/cards/emporium.jpg b/static/images/cards/emporium.jpg
new file mode 100644
index 0000000..06f8e54
--- /dev/null
+++ b/static/images/cards/emporium.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:054544ccb04788034677fd910a394a48fdd9f082a5b0fc860d826a37e67c5503
+size 172780
diff --git a/static/images/cards/encampment.jpg b/static/images/cards/encampment.jpg
new file mode 100644
index 0000000..cde6a4f
--- /dev/null
+++ b/static/images/cards/encampment.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:79fef2f2986b09c2b063afe0f4881990465c768b325a4fb08fc1bc54314e7d8e
+size 160009
diff --git a/static/images/cards/enchantress.jpg b/static/images/cards/enchantress.jpg
new file mode 100644
index 0000000..b35644c
--- /dev/null
+++ b/static/images/cards/enchantress.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:663a3ab2c1b1ea7b5c2f4bb07542c88b6a9b9cae4cb0fdb1afbcad779d8769a6
+size 199382
diff --git a/static/images/cards/engineer.jpg b/static/images/cards/engineer.jpg
new file mode 100644
index 0000000..c5fbeef
--- /dev/null
+++ b/static/images/cards/engineer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16c5ff3aea804b0630d05b825292299de3d269aefb28718ea6f9bb480aae7c0e
+size 166273
diff --git a/static/images/cards/envious.jpg b/static/images/cards/envious.jpg
new file mode 100644
index 0000000..c71507f
--- /dev/null
+++ b/static/images/cards/envious.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0f793f4148bc52ef0e9a5efa13beee5414e53b53644df0672af161d0c4a92077
+size 240220
diff --git a/static/images/cards/envoy.jpg b/static/images/cards/envoy.jpg
new file mode 100644
index 0000000..fc30136
--- /dev/null
+++ b/static/images/cards/envoy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cdec2cb9facf7ecaaa4a7435cb14b675f4ef182e85c84168e68134d9c3dc01f5
+size 169110
diff --git a/static/images/cards/envy.jpg b/static/images/cards/envy.jpg
new file mode 100644
index 0000000..0c537dc
--- /dev/null
+++ b/static/images/cards/envy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d2676f31bab4202156e1dee238b8156ccd76cb1947c4a9b18c866409198cfc9
+size 213302
diff --git a/static/images/cards/estate.jpg b/static/images/cards/estate.jpg
new file mode 100644
index 0000000..9b0b3c3
--- /dev/null
+++ b/static/images/cards/estate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86cdbeb2d3e9302d442bfa7dc9be14c9eeb047452366d3b8f326914266117165
+size 146339
diff --git a/static/images/cards/exorcist.jpg b/static/images/cards/exorcist.jpg
new file mode 100644
index 0000000..a25e5f3
--- /dev/null
+++ b/static/images/cards/exorcist.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c43641d482a2afa6996fa0da01539e4defd3e6d4963adcc35f6c6f3a04b78908
+size 170621
diff --git a/static/images/cards/expand.jpg b/static/images/cards/expand.jpg
new file mode 100644
index 0000000..b96ffab
--- /dev/null
+++ b/static/images/cards/expand.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:31c86b79d7313b5d0e96a4922a4f7148c451c87d2fcd91c4c11f767085c45944
+size 166756
diff --git a/static/images/cards/expedition.jpg b/static/images/cards/expedition.jpg
new file mode 100644
index 0000000..9053cec
--- /dev/null
+++ b/static/images/cards/expedition.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20c1db3f88adadc0f8b675ddc2be1768a2b9f03c2271ea761eb7cb0c000503a4
+size 252103
diff --git a/static/images/cards/experiment.jpg b/static/images/cards/experiment.jpg
new file mode 100644
index 0000000..957f0e6
--- /dev/null
+++ b/static/images/cards/experiment.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae08027c5df706cda2ba747ec2af604afb8deb728fb7c5b4cd4f9e8f02824256
+size 168028
diff --git a/static/images/cards/exploration.jpg b/static/images/cards/exploration.jpg
new file mode 100644
index 0000000..61a1925
--- /dev/null
+++ b/static/images/cards/exploration.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50dad3782a88bb335613177145c9ef3b22572a71e95bab15b1a3da38786aa564
+size 222364
diff --git a/static/images/cards/explorer.jpg b/static/images/cards/explorer.jpg
new file mode 100644
index 0000000..05bf37e
--- /dev/null
+++ b/static/images/cards/explorer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4d36a7a168fe8c004e8e8e3edf40c4bef9a4c65de2ad26c6b5a7b404b9c50a34
+size 191075
diff --git a/static/images/cards/fair.jpg b/static/images/cards/fair.jpg
new file mode 100644
index 0000000..fd1651c
--- /dev/null
+++ b/static/images/cards/fair.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7599677b6a89282d76a40de527241cc3818ba91aaec9d4f4c266b40fe55d25d
+size 221873
diff --git a/static/images/cards/fairgrounds.jpg b/static/images/cards/fairgrounds.jpg
new file mode 100644
index 0000000..42a1122
--- /dev/null
+++ b/static/images/cards/fairgrounds.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:add9338d229a931b609a3a4857c1c112c63651e0b73c935e240cd5592e9f45f8
+size 150896
diff --git a/static/images/cards/faithful-hound.jpg b/static/images/cards/faithful-hound.jpg
new file mode 100644
index 0000000..e24f253
--- /dev/null
+++ b/static/images/cards/faithful-hound.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae723cd3d1b39473b325b186fc2651f44a414554891019d56946afb687e4c521
+size 190497
diff --git a/static/images/cards/familiar.jpg b/static/images/cards/familiar.jpg
new file mode 100644
index 0000000..a49c13d
--- /dev/null
+++ b/static/images/cards/familiar.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20c6254036afc4907396c06662061fd91185938e70b82711c230273d8c6cd128
+size 160921
diff --git a/static/images/cards/famine.jpg b/static/images/cards/famine.jpg
new file mode 100644
index 0000000..76c6fb6
--- /dev/null
+++ b/static/images/cards/famine.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7bafe58619f47c5723ce1e99c00c2aeaf09ead66644c731d22e1c27d9af84933
+size 222214
diff --git a/static/images/cards/farmers-market.jpg b/static/images/cards/farmers-market.jpg
new file mode 100644
index 0000000..f7e5104
--- /dev/null
+++ b/static/images/cards/farmers-market.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ffc8565e982b682c60b00684441257e8bc73ab347794f6047756c39d9a65710c
+size 176018
diff --git a/static/images/cards/farming-village.jpg b/static/images/cards/farming-village.jpg
new file mode 100644
index 0000000..fafe4c3
--- /dev/null
+++ b/static/images/cards/farming-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3ee327e7c468313b8dcfc68f2bcb37f770412fa8a3ed0f60cb1f5db68cecbf0
+size 202491
diff --git a/static/images/cards/farmland.jpg b/static/images/cards/farmland.jpg
new file mode 100644
index 0000000..02147d2
--- /dev/null
+++ b/static/images/cards/farmland.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2b8267fa8e3b84f2f94d30f2712a3170badc599b8e114cb609ebcf6092723f9
+size 196423
diff --git a/static/images/cards/fear.jpg b/static/images/cards/fear.jpg
new file mode 100644
index 0000000..315bc47
--- /dev/null
+++ b/static/images/cards/fear.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:267fe8f10262cc09b64f51a0d29d10fa2a86af942f7526922c6c47d9929f6096
+size 213316
diff --git a/static/images/cards/feast.jpg b/static/images/cards/feast.jpg
new file mode 100644
index 0000000..185655f
--- /dev/null
+++ b/static/images/cards/feast.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5deaed990601fd9911d8337492448b9b62eb29e720ac37209b7b86f48ac82e3f
+size 117086
diff --git a/static/images/cards/feodum.jpg b/static/images/cards/feodum.jpg
new file mode 100644
index 0000000..ed3b368
--- /dev/null
+++ b/static/images/cards/feodum.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5ffa6fedb094ed5c89abb86974e7102c125634b995e94ca5818c25821e899c18
+size 154156
diff --git a/static/images/cards/ferry.jpg b/static/images/cards/ferry.jpg
new file mode 100644
index 0000000..eb04ee2
--- /dev/null
+++ b/static/images/cards/ferry.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2988ff72d81e873f6c77a8ab22d940efc9c3f6c2b26202dab869793b9637aad1
+size 228198
diff --git a/static/images/cards/festival.jpg b/static/images/cards/festival.jpg
new file mode 100644
index 0000000..be5702c
--- /dev/null
+++ b/static/images/cards/festival.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e5b89f54eb3357c132dadfb562830b6b4d36a25f77581a27570c721fd6a0c4d6
+size 146433
diff --git a/static/images/cards/fishing-village.jpg b/static/images/cards/fishing-village.jpg
new file mode 100644
index 0000000..b10d515
--- /dev/null
+++ b/static/images/cards/fishing-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:954a7a613229ba45b506c5b34f24926dab52b151be2c0ff25b1a91d97aac7488
+size 192854
diff --git a/static/images/cards/flag-bearer.jpg b/static/images/cards/flag-bearer.jpg
new file mode 100644
index 0000000..c9abcbe
--- /dev/null
+++ b/static/images/cards/flag-bearer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2d14fa08cc609ad2c2472504562bf3ef316097ca249b6594a5bfb8e2d8dad682
+size 142632
diff --git a/static/images/cards/flag.jpg b/static/images/cards/flag.jpg
new file mode 100644
index 0000000..e096961
--- /dev/null
+++ b/static/images/cards/flag.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:910a0418ae507b4e32a8467badcc45416da1e97c7ca8f48462d5ff83506eba51
+size 156602
diff --git a/static/images/cards/fleet.jpg b/static/images/cards/fleet.jpg
new file mode 100644
index 0000000..8ff3ac0
--- /dev/null
+++ b/static/images/cards/fleet.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:206bbf9e5485887f6b57a5bd98e6e44f80f7f17a5338e2585476eda72655d808
+size 218519
diff --git a/static/images/cards/followers.jpg b/static/images/cards/followers.jpg
new file mode 100644
index 0000000..defeaf7
--- /dev/null
+++ b/static/images/cards/followers.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a841d32539149e295e1c484e51740c4030f6bce68bcafd60a624a3a7240565d
+size 203041
diff --git a/static/images/cards/fool.jpg b/static/images/cards/fool.jpg
new file mode 100644
index 0000000..43cf92a
--- /dev/null
+++ b/static/images/cards/fool.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1225b9b049bcd55da1af1fb5415b08a7101297cd14dc217600bb8c6c95197322
+size 200887
diff --git a/static/images/cards/fools-gold.jpg b/static/images/cards/fools-gold.jpg
new file mode 100644
index 0000000..46524fe
--- /dev/null
+++ b/static/images/cards/fools-gold.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1426dac7d60b2af1bfaf708608abf18c5239171ac6e9df55ab41c25c2b543e6c
+size 205547
diff --git a/static/images/cards/forager.jpg b/static/images/cards/forager.jpg
new file mode 100644
index 0000000..1d350f1
--- /dev/null
+++ b/static/images/cards/forager.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:087324c64ec4f0e1cfb9f533899751b314f8b32c1f33e61babd447a4c8cc2e1f
+size 204814
diff --git a/static/images/cards/forge.jpg b/static/images/cards/forge.jpg
new file mode 100644
index 0000000..846e3a5
--- /dev/null
+++ b/static/images/cards/forge.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a3f7109ca2101a5b24caf0ffbbb7967d80e186244f5d0655d958ecaf1a0f10ca
+size 161308
diff --git a/static/images/cards/fortress.jpg b/static/images/cards/fortress.jpg
new file mode 100644
index 0000000..f79f6e4
--- /dev/null
+++ b/static/images/cards/fortress.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:28a187e17711b6e7fed9500ffb483d1bc88262ca1f125b994e50804519a13bf4
+size 157479
diff --git a/static/images/cards/fortune-teller.jpg b/static/images/cards/fortune-teller.jpg
new file mode 100644
index 0000000..04fc157
--- /dev/null
+++ b/static/images/cards/fortune-teller.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4eb100a3d930a7811fd0093f970c8aa6d471869599acfb0ff7df42c883e593ac
+size 173016
diff --git a/static/images/cards/fortune.jpg b/static/images/cards/fortune.jpg
new file mode 100644
index 0000000..1c30c1a
--- /dev/null
+++ b/static/images/cards/fortune.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d1aa76601cbfcd9444eb4156c4f6b41c6e83714495ed8555e10f8ebc51a5f3ad
+size 206214
diff --git a/static/images/cards/forum.jpg b/static/images/cards/forum.jpg
new file mode 100644
index 0000000..7392d77
--- /dev/null
+++ b/static/images/cards/forum.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:646243ac1cc99879495b08f35793a5810c142364c5f55df1ecb557a0fa7db867
+size 144501
diff --git a/static/images/cards/fountain.jpg b/static/images/cards/fountain.jpg
new file mode 100644
index 0000000..893c701
--- /dev/null
+++ b/static/images/cards/fountain.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5481fb577b3869fbfab1f04e466a1a96387aa200bd5edaaaa6a4617022f574e3
+size 192656
diff --git a/static/images/cards/fugitive.jpg b/static/images/cards/fugitive.jpg
new file mode 100644
index 0000000..908ddae
--- /dev/null
+++ b/static/images/cards/fugitive.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a372d39e7e5a571404ad18e6f925c557e3050de73abc8f75a720ac4ab69e0122
+size 197263
diff --git a/static/images/cards/gardens.jpg b/static/images/cards/gardens.jpg
new file mode 100644
index 0000000..9db51b0
--- /dev/null
+++ b/static/images/cards/gardens.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:76b02009c0d5fbc420b4a59cb95feb4a6d7511681a8ceef2b8be141be34aa49a
+size 186575
diff --git a/static/images/cards/gear.jpg b/static/images/cards/gear.jpg
new file mode 100644
index 0000000..2b84495
--- /dev/null
+++ b/static/images/cards/gear.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f49b01184ee8aa173b33ee582b9fd196b670ba85be4f5095c1c6c86f2c692f7b
+size 184188
diff --git a/static/images/cards/ghost-ship.jpg b/static/images/cards/ghost-ship.jpg
new file mode 100644
index 0000000..514faff
--- /dev/null
+++ b/static/images/cards/ghost-ship.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:642687f708dd138b972616ba113295d111b96d2d4e812c5ab8321b3db70ace52
+size 180232
diff --git a/static/images/cards/ghost-town.jpg b/static/images/cards/ghost-town.jpg
new file mode 100644
index 0000000..0f60444
--- /dev/null
+++ b/static/images/cards/ghost-town.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d10bd1ade382a0c50abdd785fa92b199be819f116e5ad41a8a09e4920ec6e1cd
+size 176212
diff --git a/static/images/cards/ghost.jpg b/static/images/cards/ghost.jpg
new file mode 100644
index 0000000..06f9303
--- /dev/null
+++ b/static/images/cards/ghost.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9976be129b62a2394216d1426b9802b7b66b8f19f27266c5c9acab615d5130dd
+size 175985
diff --git a/static/images/cards/giant.jpg b/static/images/cards/giant.jpg
new file mode 100644
index 0000000..036e763
--- /dev/null
+++ b/static/images/cards/giant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f5c7230f72cc39ea2c796ff78aee9ae2d221308b873feb33d9a4b6f93ee3890f
+size 196525
diff --git a/static/images/cards/gladiator.jpg b/static/images/cards/gladiator.jpg
new file mode 100644
index 0000000..37f507f
--- /dev/null
+++ b/static/images/cards/gladiator.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0195f877ec10ed5cd051283e0f7682f91f9b5420f393116e87b166b6aaec016f
+size 183118
diff --git a/static/images/cards/goat.jpg b/static/images/cards/goat.jpg
new file mode 100644
index 0000000..03a5ef5
--- /dev/null
+++ b/static/images/cards/goat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd7502063279d8670d1a738f4d7084450c7978cad7684ff8dc6a8ea1b791e637
+size 192605
diff --git a/static/images/cards/gold.jpg b/static/images/cards/gold.jpg
new file mode 100644
index 0000000..38d8c8e
--- /dev/null
+++ b/static/images/cards/gold.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a484143b84e82cb3a8af3caeb1b86e1e7ea19d7ded0a9e77c95684a85998673
+size 172512
diff --git a/static/images/cards/golem.jpg b/static/images/cards/golem.jpg
new file mode 100644
index 0000000..91f2a7c
--- /dev/null
+++ b/static/images/cards/golem.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:491c1c46d7fedd12528a8e06ad08fafc800a9034d44f33efe3054d0c11e9ca83
+size 182682
diff --git a/static/images/cards/goons.jpg b/static/images/cards/goons.jpg
new file mode 100644
index 0000000..bc5761b
--- /dev/null
+++ b/static/images/cards/goons.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62af741726d9f20587dfc0106cdfaa3050eaa51b1043849479aa1b8670573c04
+size 191174
diff --git a/static/images/cards/governor.jpg b/static/images/cards/governor.jpg
new file mode 100644
index 0000000..5bc935f
--- /dev/null
+++ b/static/images/cards/governor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:092c9f5527d558387276645c000f831d20ead7cee5d9b474d6ce3e0559874cdf
+size 197808
diff --git a/static/images/cards/grand-castle.jpg b/static/images/cards/grand-castle.jpg
new file mode 100644
index 0000000..3bbad4b
--- /dev/null
+++ b/static/images/cards/grand-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ec093e44e6a1fbf3800a2f98b38bb01dc73e7dba43ffae21d9736138c0d0a96
+size 187402
diff --git a/static/images/cards/grand-market.jpg b/static/images/cards/grand-market.jpg
new file mode 100644
index 0000000..da3fb08
--- /dev/null
+++ b/static/images/cards/grand-market.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac8a60ab35c773a83c90d9370ea1e434d877501ec3c75f0832d7ba38cc442fb0
+size 195196
diff --git a/static/images/cards/graverobber.jpg b/static/images/cards/graverobber.jpg
new file mode 100644
index 0000000..7491340
--- /dev/null
+++ b/static/images/cards/graverobber.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd4b54d49cd35c5ff2876efd84f9fc6bbda2092f2b6f013f343943519340ce95
+size 197898
diff --git a/static/images/cards/great-hall.jpg b/static/images/cards/great-hall.jpg
new file mode 100644
index 0000000..ee00250
--- /dev/null
+++ b/static/images/cards/great-hall.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2f38b86a164c57a333de2b7b5f7e700d087d13fac48936114ecbdc7112027739
+size 114704
diff --git a/static/images/cards/greed.jpg b/static/images/cards/greed.jpg
new file mode 100644
index 0000000..f1b001f
--- /dev/null
+++ b/static/images/cards/greed.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5e86cb4ec024c4e33c08fd222d78bbf98ee5d7c3019a5443b13e9bc0c3ef34f3
+size 242310
diff --git a/static/images/cards/groundskeeper.jpg b/static/images/cards/groundskeeper.jpg
new file mode 100644
index 0000000..8fdcb75
--- /dev/null
+++ b/static/images/cards/groundskeeper.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:973363fadbedaef2f68bd4650a1f96f4d41e558725eeed72a0b14874f1a6b9d1
+size 172948
diff --git a/static/images/cards/guardian.jpg b/static/images/cards/guardian.jpg
new file mode 100644
index 0000000..97811e1
--- /dev/null
+++ b/static/images/cards/guardian.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2994389f12eedd29145166884b8b0e1bd6e6187ad574ad6253a63f342f3e1a04
+size 192350
diff --git a/static/images/cards/guide.jpg b/static/images/cards/guide.jpg
new file mode 100644
index 0000000..2e1e9c5
--- /dev/null
+++ b/static/images/cards/guide.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:af5d675fceccdadcc12eccad0ec5ef5ac6aef4706f65c294a563eb4932718ea7
+size 198666
diff --git a/static/images/cards/guildhall.jpg b/static/images/cards/guildhall.jpg
new file mode 100644
index 0000000..fc36ed5
--- /dev/null
+++ b/static/images/cards/guildhall.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a53085dbf37fd9263b06e96f5b52c70b3de23ab28b1294c8c347e38e3edf481
+size 190883
diff --git a/static/images/cards/haggler.jpg b/static/images/cards/haggler.jpg
new file mode 100644
index 0000000..5ad7252
--- /dev/null
+++ b/static/images/cards/haggler.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aecbcbf31b851b23808f989d67344d30405e7cff343dd182906478fb66eeca64
+size 183842
diff --git a/static/images/cards/hamlet.jpg b/static/images/cards/hamlet.jpg
new file mode 100644
index 0000000..fe3abec
--- /dev/null
+++ b/static/images/cards/hamlet.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7f0aedb150889583125893fcdf426ead9914555a4435d17854bd2096c105a6d6
+size 172818
diff --git a/static/images/cards/harbinger.jpg b/static/images/cards/harbinger.jpg
new file mode 100644
index 0000000..eb50019
--- /dev/null
+++ b/static/images/cards/harbinger.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c6ecbee5c186897db807ff4c253f5edaf307e11af90bb4aa196e7e2f6380f0b0
+size 178965
diff --git a/static/images/cards/harem.jpg b/static/images/cards/harem.jpg
new file mode 100644
index 0000000..93d6eed
--- /dev/null
+++ b/static/images/cards/harem.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eed5217c74295cd5059295f886d4c9806922c6fb1d9ae6c8dadc98c03a74296
+size 204561
diff --git a/static/images/cards/harvest.jpg b/static/images/cards/harvest.jpg
new file mode 100644
index 0000000..08d9354
--- /dev/null
+++ b/static/images/cards/harvest.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b974a6f3d3a7ffef1891ad8a2f598859c568840acea3db2bce169a55ed7711d1
+size 187616
diff --git a/static/images/cards/haunted-castle.jpg b/static/images/cards/haunted-castle.jpg
new file mode 100644
index 0000000..593cb0f
--- /dev/null
+++ b/static/images/cards/haunted-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b167dcc6624a7bfb7d64e461cbcec2f1352a8bc78a8c5be5c68a6bf7d334dfda
+size 201935
diff --git a/static/images/cards/haunted-mirror.jpg b/static/images/cards/haunted-mirror.jpg
new file mode 100644
index 0000000..dfcc1f5
--- /dev/null
+++ b/static/images/cards/haunted-mirror.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2bcbf1a20de7ee58dcbcf518be5b9957458c8f4c6df7eceb2b4eaf3e39145cb8
+size 178632
diff --git a/static/images/cards/haunted-woods.jpg b/static/images/cards/haunted-woods.jpg
new file mode 100644
index 0000000..15057cf
--- /dev/null
+++ b/static/images/cards/haunted-woods.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d5b9f495973304126bb685542aa25cedea9662b6aba184dff4e96bc0bcd906a1
+size 213091
diff --git a/static/images/cards/haunting.jpg b/static/images/cards/haunting.jpg
new file mode 100644
index 0000000..ce6d9b2
--- /dev/null
+++ b/static/images/cards/haunting.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d8628bc159884a9c0a8021a016126e7a16891fbf5773b8d87ebd9a069512b24
+size 186630
diff --git a/static/images/cards/haven.jpg b/static/images/cards/haven.jpg
new file mode 100644
index 0000000..49e5bcc
--- /dev/null
+++ b/static/images/cards/haven.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3759317fe6bdd9b8ba5af616fb8dc2a68a89ebfbb4f5a557b85a6dadb57f8a6
+size 205823
diff --git a/static/images/cards/herald.jpg b/static/images/cards/herald.jpg
new file mode 100644
index 0000000..61d4e82
--- /dev/null
+++ b/static/images/cards/herald.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:10d7bab53425e004eea76256905069a19791be1dc792b99d099facfa60790e9d
+size 175979
diff --git a/static/images/cards/herbalist.jpg b/static/images/cards/herbalist.jpg
new file mode 100644
index 0000000..b6c28fc
--- /dev/null
+++ b/static/images/cards/herbalist.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:100363fbd7121103cdc5837fcc374ab49d8289a5460944f0eb09d0bd312e0d2f
+size 203090
diff --git a/static/images/cards/hermit.jpg b/static/images/cards/hermit.jpg
new file mode 100644
index 0000000..f1916fe
--- /dev/null
+++ b/static/images/cards/hermit.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd6a03c6decd8f9a72b8247ce78771d6c89c1fe7ad9f27e087b6ce6d811c0206
+size 204911
diff --git a/static/images/cards/hero.jpg b/static/images/cards/hero.jpg
new file mode 100644
index 0000000..5ee45ab
--- /dev/null
+++ b/static/images/cards/hero.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2a5b4b4142665bfbb8bdef38eee3b5ba506f2c97e70f78e0785ee9314b91f2a
+size 176628
diff --git a/static/images/cards/hideout.jpg b/static/images/cards/hideout.jpg
new file mode 100644
index 0000000..a5b6e06
--- /dev/null
+++ b/static/images/cards/hideout.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:271a41ecb9348934bba9a52fb6f2148035e4d4ea36c5d00a3af5a49e5c45bc5c
+size 163891
diff --git a/static/images/cards/highway.jpg b/static/images/cards/highway.jpg
new file mode 100644
index 0000000..3161898
--- /dev/null
+++ b/static/images/cards/highway.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:acd0397a6831f348a7f838be8a6d7462f03be3c7fab64245630b14a7ae99afdf
+size 164857
diff --git a/static/images/cards/hireling.jpg b/static/images/cards/hireling.jpg
new file mode 100644
index 0000000..0ac5950
--- /dev/null
+++ b/static/images/cards/hireling.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eddda0f0974e8245310a045f583a4f4eeaa4ef2bc73fa61de180044e9b7a05c0
+size 180294
diff --git a/static/images/cards/hoard.jpg b/static/images/cards/hoard.jpg
new file mode 100644
index 0000000..cb0a072
--- /dev/null
+++ b/static/images/cards/hoard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cc2bf36146515e3ac9866752c2618b070e658e09b2a8e2813411ebfe2d121046
+size 188948
diff --git a/static/images/cards/horn-of-plenty.jpg b/static/images/cards/horn-of-plenty.jpg
new file mode 100644
index 0000000..175d202
--- /dev/null
+++ b/static/images/cards/horn-of-plenty.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d59722b9c3518cbb5eb4b11911eb8d292bee3c456a2d13efd15bd89f47ab12a
+size 203303
diff --git a/static/images/cards/horn.jpg b/static/images/cards/horn.jpg
new file mode 100644
index 0000000..e3d13ca
--- /dev/null
+++ b/static/images/cards/horn.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7654638e606d2862ba7c52477c68a40825db00d06a325d06f8d918adaa763420
+size 218023
diff --git a/static/images/cards/horse-traders.jpg b/static/images/cards/horse-traders.jpg
new file mode 100644
index 0000000..9c3ab79
--- /dev/null
+++ b/static/images/cards/horse-traders.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0180b89b48866187350b7689317d9a80ce910b4d709a68e612878327652b9027
+size 178872
diff --git a/static/images/cards/hovel.jpg b/static/images/cards/hovel.jpg
new file mode 100644
index 0000000..1201766
--- /dev/null
+++ b/static/images/cards/hovel.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cfea481394c2ec81e6ca5b7bf43b4d9a596a1933fcce2b13099d51831c79dec
+size 190127
diff --git a/static/images/cards/humble-castle.jpg b/static/images/cards/humble-castle.jpg
new file mode 100644
index 0000000..f026046
--- /dev/null
+++ b/static/images/cards/humble-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7a73d14bf9f3b26e714da4d6671a238d135fd0173e126ab6f579b9359afe9e19
+size 172912
diff --git a/static/images/cards/hunting-grounds.jpg b/static/images/cards/hunting-grounds.jpg
new file mode 100644
index 0000000..e42c7a5
--- /dev/null
+++ b/static/images/cards/hunting-grounds.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e3a31ad1d3d94389c0cf4a9a377752a154aa027521acae9dc33e38de871a5d0
+size 175401
diff --git a/static/images/cards/hunting-party.jpg b/static/images/cards/hunting-party.jpg
new file mode 100644
index 0000000..f5a648e
--- /dev/null
+++ b/static/images/cards/hunting-party.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2be7efdbe307446e659899e714426a75807e5a425b2dbb4b6bedb16f3c0f1cc7
+size 200341
diff --git a/static/images/cards/idol.jpg b/static/images/cards/idol.jpg
new file mode 100644
index 0000000..c5c6583
--- /dev/null
+++ b/static/images/cards/idol.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:08aae1db3d45758b548208e72b46aefa247b119aaebed3648cf551a3bfa42606
+size 191929
diff --git a/static/images/cards/ill-gotten-gains.jpg b/static/images/cards/ill-gotten-gains.jpg
new file mode 100644
index 0000000..2fd3aa6
--- /dev/null
+++ b/static/images/cards/ill-gotten-gains.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f75f7dc0b0dd03a6af3e19c5b6b8b54daed059b68334187dc58bb5014f1e6b55
+size 173074
diff --git a/static/images/cards/imp.jpg b/static/images/cards/imp.jpg
new file mode 100644
index 0000000..48e70da
--- /dev/null
+++ b/static/images/cards/imp.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:20e1aa9d1d96e4464b046173555dbdec7c16c34e7fb2501f82d9d8dbfe359466
+size 184229
diff --git a/static/images/cards/improve.jpg b/static/images/cards/improve.jpg
new file mode 100644
index 0000000..e46771a
--- /dev/null
+++ b/static/images/cards/improve.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:547f03196e68677051bcb4e743518e15f82cf5df88de6e4e5c259e17165c0df2
+size 174139
diff --git a/static/images/cards/inheritance.jpg b/static/images/cards/inheritance.jpg
new file mode 100644
index 0000000..81eaa61
--- /dev/null
+++ b/static/images/cards/inheritance.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9fb671ae1f4133d5dac94c00c4509517d4421dde2ade3930b6fd5201e7db0ff9
+size 227335
diff --git a/static/images/cards/inn.jpg b/static/images/cards/inn.jpg
new file mode 100644
index 0000000..0c1244c
--- /dev/null
+++ b/static/images/cards/inn.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50f4b62abb9f8a57dfdc56f4257cb2e8b1c38ef5ec647ce231d6e3605056d2f1
+size 181505
diff --git a/static/images/cards/innovation.jpg b/static/images/cards/innovation.jpg
new file mode 100644
index 0000000..150abfa
--- /dev/null
+++ b/static/images/cards/innovation.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:94cc8e97ab85ab661b7c297ba59c2b9bcf1cf88172dc4205ac7631d073caee8c
+size 229165
diff --git a/static/images/cards/inventor.jpg b/static/images/cards/inventor.jpg
new file mode 100644
index 0000000..277401d
--- /dev/null
+++ b/static/images/cards/inventor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6b8c1f4e0886c1d2ad01142e706e9dae9b78adb2291e9ca524712527215536b9
+size 179230
diff --git a/static/images/cards/ironmonger.jpg b/static/images/cards/ironmonger.jpg
new file mode 100644
index 0000000..c0e50c4
--- /dev/null
+++ b/static/images/cards/ironmonger.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:469f7a9c93dfa67ac754766a00f6deafa4c4abcaddc7fc89453695d9ca046658
+size 186720
diff --git a/static/images/cards/ironworks.jpg b/static/images/cards/ironworks.jpg
new file mode 100644
index 0000000..e9fff67
--- /dev/null
+++ b/static/images/cards/ironworks.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7eb29cb56a2545cfda9b75117856cabd6a256826ea44338af1732a94fca48947
+size 169774
diff --git a/static/images/cards/island.jpg b/static/images/cards/island.jpg
new file mode 100644
index 0000000..8a2e328
--- /dev/null
+++ b/static/images/cards/island.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:439e9604dbebe91607e1f0c28b4902ea00789689685da01e19f21bf70cac73b1
+size 168821
diff --git a/static/images/cards/jack-of-all-trades.jpg b/static/images/cards/jack-of-all-trades.jpg
new file mode 100644
index 0000000..ad895f2
--- /dev/null
+++ b/static/images/cards/jack-of-all-trades.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4141d6a29c88c1ce47daae08becbd53a456f4ec6590a97909613a27fa634e27
+size 184264
diff --git a/static/images/cards/jester.jpg b/static/images/cards/jester.jpg
new file mode 100644
index 0000000..88cdf94
--- /dev/null
+++ b/static/images/cards/jester.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:33df24a8f64ad85481dbb41701f9c979f95ab06a89e375e8ceddf8b22b5572c7
+size 171109
diff --git a/static/images/cards/journeyman.jpg b/static/images/cards/journeyman.jpg
new file mode 100644
index 0000000..eaeffd8
--- /dev/null
+++ b/static/images/cards/journeyman.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d9e7beac069368345085357dbdd6c805cdc82435c6ffdb458df66b4ea4ffe97b
+size 181805
diff --git a/static/images/cards/junk-dealer.jpg b/static/images/cards/junk-dealer.jpg
new file mode 100644
index 0000000..2764f1e
--- /dev/null
+++ b/static/images/cards/junk-dealer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:22b4e8cfb24d36540899c7c4bbdb4d3ae300eb1aff6d4af97afbe7917b3e9685
+size 172348
diff --git a/static/images/cards/keep.jpg b/static/images/cards/keep.jpg
new file mode 100644
index 0000000..a597cc1
--- /dev/null
+++ b/static/images/cards/keep.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1e06b55e77b240656d86dfb3a502742a6795ad86171f5f2e30b577f3da71c678
+size 246572
diff --git a/static/images/cards/key.jpg b/static/images/cards/key.jpg
new file mode 100644
index 0000000..fac181e
--- /dev/null
+++ b/static/images/cards/key.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be6f44ed9342b024efbea88f1f5ca9c3a3503cb8287ff9c643e535bc164910d4
+size 173304
diff --git a/static/images/cards/kings-castle.jpg b/static/images/cards/kings-castle.jpg
new file mode 100644
index 0000000..cc4e0c1
--- /dev/null
+++ b/static/images/cards/kings-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e29609ffd28bd070261f7327baad61ef2d86a46dad57f9736a183a6e2b046c41
+size 161896
diff --git a/static/images/cards/kings-court.jpg b/static/images/cards/kings-court.jpg
new file mode 100644
index 0000000..a00d932
--- /dev/null
+++ b/static/images/cards/kings-court.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e6d3015549b74e10a21ffa9775561eb27e909914fe1a3d88dba88ee636325985
+size 176412
diff --git a/static/images/cards/knights.jpg b/static/images/cards/knights.jpg
new file mode 100644
index 0000000..95cb72f
--- /dev/null
+++ b/static/images/cards/knights.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a6c06cb38d7552a6d4a7d4147791572f9f85273d5f7fbd7267869a1db0ad6861
+size 177898
diff --git a/static/images/cards/laboratory.jpg b/static/images/cards/laboratory.jpg
new file mode 100644
index 0000000..f155677
--- /dev/null
+++ b/static/images/cards/laboratory.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cb79234c1f74928d925b5a0bf66597404a788c1b13d448ad3cfa49b4e93ec68c
+size 161669
diff --git a/static/images/cards/labyrinth.jpg b/static/images/cards/labyrinth.jpg
new file mode 100644
index 0000000..6cca449
--- /dev/null
+++ b/static/images/cards/labyrinth.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fcabac6a38243fad40a748977fc779af1c369350d4ea807a460e7a2d6fea950a
+size 277183
diff --git a/static/images/cards/lackeys.jpg b/static/images/cards/lackeys.jpg
new file mode 100644
index 0000000..5a5d6df
--- /dev/null
+++ b/static/images/cards/lackeys.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea54537996ceeeacb891fbfd1cec9ac320092f8a18cef848817fb985f97abd71
+size 134104
diff --git a/static/images/cards/lantern.jpg b/static/images/cards/lantern.jpg
new file mode 100644
index 0000000..a704ef9
--- /dev/null
+++ b/static/images/cards/lantern.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2767f7e27b20ec5263d9368ebf7ef9a44010befe5a9d75164591ec5bcf0b4db4
+size 226514
diff --git a/static/images/cards/legionary.jpg b/static/images/cards/legionary.jpg
new file mode 100644
index 0000000..7219613
--- /dev/null
+++ b/static/images/cards/legionary.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2dd88d4a31670526b610837bb8f844fab9cb7fd00a9a0915353dd7c4165a152
+size 167168
diff --git a/static/images/cards/leprechaun.jpg b/static/images/cards/leprechaun.jpg
new file mode 100644
index 0000000..d3840f2
--- /dev/null
+++ b/static/images/cards/leprechaun.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae204c8561bc39c30013cdd34f138b7a1a395138629ce3bce4c7f10e653a2496
+size 197129
diff --git a/static/images/cards/library.jpg b/static/images/cards/library.jpg
new file mode 100644
index 0000000..b631c78
--- /dev/null
+++ b/static/images/cards/library.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:edbde1e7d1c5621158ae44256f21231008b602c950db7920d60abc72d8b9ddaf
+size 204531
diff --git a/static/images/cards/lighthouse.jpg b/static/images/cards/lighthouse.jpg
new file mode 100644
index 0000000..b952011
--- /dev/null
+++ b/static/images/cards/lighthouse.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c2431ac8c909ff7b8aa05e4157df10d7ed5ea057da26f09a9ebcb838a196f7c6
+size 184958
diff --git a/static/images/cards/loan.jpg b/static/images/cards/loan.jpg
new file mode 100644
index 0000000..a3c936e
--- /dev/null
+++ b/static/images/cards/loan.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:23107708421b79cbde58b745303319702dd17992878f983e1b2ba99bfafb986f
+size 202706
diff --git a/static/images/cards/locusts.jpg b/static/images/cards/locusts.jpg
new file mode 100644
index 0000000..2370ba4
--- /dev/null
+++ b/static/images/cards/locusts.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:be21e1c80f16aef5c0a765a8f6d5da3bc907a91e249f27cbe860d6c231826583
+size 293074
diff --git a/static/images/cards/lookout.jpg b/static/images/cards/lookout.jpg
new file mode 100644
index 0000000..124d7e8
--- /dev/null
+++ b/static/images/cards/lookout.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f202e120e974995ba1e26e4dc89f0085f14188b261aa5a1dc092913f83e320cb
+size 182549
diff --git a/static/images/cards/lost-arts.jpg b/static/images/cards/lost-arts.jpg
new file mode 100644
index 0000000..d6df48d
--- /dev/null
+++ b/static/images/cards/lost-arts.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:92c9dbe858ba66ba6500d48559116b1a21089d8788f402181e0e4e4112f0e835
+size 268624
diff --git a/static/images/cards/lost-citiy.jpg b/static/images/cards/lost-citiy.jpg
new file mode 100644
index 0000000..e0c03c2
--- /dev/null
+++ b/static/images/cards/lost-citiy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:af9bd8906fe6dab5809b5e2b3ab9db2fb9da1d55c9615232b83185022d28bafd
+size 173119
diff --git a/static/images/cards/lost-in-the-woods.jpg b/static/images/cards/lost-in-the-woods.jpg
new file mode 100644
index 0000000..50b8179
--- /dev/null
+++ b/static/images/cards/lost-in-the-woods.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:73dd7e70ae1ff94edec438a2391cfc0a679c74cd440b8581a2737b765a006d55
+size 286162
diff --git a/static/images/cards/lucky-coin.jpg b/static/images/cards/lucky-coin.jpg
new file mode 100644
index 0000000..1b55124
--- /dev/null
+++ b/static/images/cards/lucky-coin.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:84fd3e833a598d8617293fa0865a5c7bdcb42caeef3db860c9e962ce272d7e62
+size 189073
diff --git a/static/images/cards/lurker.jpg b/static/images/cards/lurker.jpg
new file mode 100644
index 0000000..7123c8b
--- /dev/null
+++ b/static/images/cards/lurker.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dde58d1ae2991394411b7f93214ef4c70a1969fb4bd0b5fa1fbb118a2e37b404
+size 158060
diff --git a/static/images/cards/madman.jpg b/static/images/cards/madman.jpg
new file mode 100644
index 0000000..5ed147f
--- /dev/null
+++ b/static/images/cards/madman.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:013c53cb92770f9eaf7fe8be44b19218247aaf49b590d279d1e7c9d9fec74505
+size 192731
diff --git a/static/images/cards/magic-lamp.jpg b/static/images/cards/magic-lamp.jpg
new file mode 100644
index 0000000..4874e8b
--- /dev/null
+++ b/static/images/cards/magic-lamp.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40064c36b91db015a88fb23e5a847e58cfc75431388cfabf4a98ef76913a839c
+size 190578
diff --git a/static/images/cards/magpie.jpg b/static/images/cards/magpie.jpg
new file mode 100644
index 0000000..a91e62e
--- /dev/null
+++ b/static/images/cards/magpie.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e799ef39962e6c1f514b55355c4f09deea804e83e0b612279a8a11ef2efcc38f
+size 179550
diff --git a/static/images/cards/mandarin.jpg b/static/images/cards/mandarin.jpg
new file mode 100644
index 0000000..7006776
--- /dev/null
+++ b/static/images/cards/mandarin.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:41ce6b33c1c616d08a0525acae1497b0b92786d66c93f54a062884752abef142
+size 212759
diff --git a/static/images/cards/marauder.jpg b/static/images/cards/marauder.jpg
new file mode 100644
index 0000000..8429c41
--- /dev/null
+++ b/static/images/cards/marauder.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a16c625535ed7badca93d152eac754d0531a9b980e579e4206f774e26bf06cd8
+size 154423
diff --git a/static/images/cards/margrave.jpg b/static/images/cards/margrave.jpg
new file mode 100644
index 0000000..6ed3da4
--- /dev/null
+++ b/static/images/cards/margrave.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9491d160903dcc00b7704dfe705a288727ca4067b64a572a252d5aea551bfb70
+size 176461
diff --git a/static/images/cards/market-square.jpg b/static/images/cards/market-square.jpg
new file mode 100644
index 0000000..29ebebd
--- /dev/null
+++ b/static/images/cards/market-square.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7f0ac02a5e108fe7063d67e83da716e89ed1193cdf305d82fd1fb03869797ae
+size 205396
diff --git a/static/images/cards/market.jpg b/static/images/cards/market.jpg
new file mode 100644
index 0000000..9d43f55
--- /dev/null
+++ b/static/images/cards/market.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d3d6255bba51effc21ff6fd366db6c38ebf5afe6c2be0133229b253559e2e262
+size 156067
diff --git a/static/images/cards/masquerade.jpg b/static/images/cards/masquerade.jpg
new file mode 100644
index 0000000..cc6495a
--- /dev/null
+++ b/static/images/cards/masquerade.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bd7b3ae081ee3eede215dac74b53eb9c3f562f9edd44f420cf11d4a916bf4dc2
+size 191534
diff --git a/static/images/cards/masterpiece.jpg b/static/images/cards/masterpiece.jpg
new file mode 100644
index 0000000..0c37b5a
--- /dev/null
+++ b/static/images/cards/masterpiece.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43bf636834c7e0dd7652498d5179fea0fd5e1212100e6cd1e67b1feb7cd55f39
+size 187743
diff --git a/static/images/cards/menagerie.jpg b/static/images/cards/menagerie.jpg
new file mode 100644
index 0000000..0834a81
--- /dev/null
+++ b/static/images/cards/menagerie.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:147c36b480cff47861c4a9b5723fc995fd776de20b781f9743263241dad80958
+size 161779
diff --git a/static/images/cards/mercenary.jpg b/static/images/cards/mercenary.jpg
new file mode 100644
index 0000000..4f09331
--- /dev/null
+++ b/static/images/cards/mercenary.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a5f27e672933540db65ba0be13c05bbb70974362c9711b3c1a3ffe8efa0202f
+size 182963
diff --git a/static/images/cards/merchant-guild.jpg b/static/images/cards/merchant-guild.jpg
new file mode 100644
index 0000000..ef5c271
--- /dev/null
+++ b/static/images/cards/merchant-guild.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3176b31bd264a60460357ae539c47abe12a42fe8666b45273f03188d2e9133b7
+size 162843
diff --git a/static/images/cards/merchant-ship.jpg b/static/images/cards/merchant-ship.jpg
new file mode 100644
index 0000000..a1f6274
--- /dev/null
+++ b/static/images/cards/merchant-ship.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6e15db8d264f11278c92819f532391ab5a5716d6958e7a4a6eef2d9051963b3
+size 175298
diff --git a/static/images/cards/merchant.jpg b/static/images/cards/merchant.jpg
new file mode 100644
index 0000000..8515487
--- /dev/null
+++ b/static/images/cards/merchant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a75303698a841bbb80080d005a1c46851d31fd5e9df981d41f696f6377519b31
+size 182279
diff --git a/static/images/cards/messenger.jpg b/static/images/cards/messenger.jpg
new file mode 100644
index 0000000..ca0358c
--- /dev/null
+++ b/static/images/cards/messenger.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d6a4a9dc5f820782de6bfbe1220cb93e0f2ac40775dd2f0aa496c24b50799510
+size 170005
diff --git a/static/images/cards/militia.jpg b/static/images/cards/militia.jpg
new file mode 100644
index 0000000..073ce35
--- /dev/null
+++ b/static/images/cards/militia.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7acdce08dc543b61b28e641ec5fee70ebbff2bf43bebde019d006dd8e27f924b
+size 153014
diff --git a/static/images/cards/mill.jpg b/static/images/cards/mill.jpg
new file mode 100644
index 0000000..5159070
--- /dev/null
+++ b/static/images/cards/mill.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fefcdddb12b439e0048f56e0dc6bb03214d045adf647b29134da7cafce04b818
+size 169456
diff --git a/static/images/cards/mine.jpg b/static/images/cards/mine.jpg
new file mode 100644
index 0000000..6e6a9a2
--- /dev/null
+++ b/static/images/cards/mine.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:741d11b8a6d45387f114cc7f0151085fb239ba9ada09a127a3b6eee6963fa5fe
+size 169545
diff --git a/static/images/cards/mining-village.jpg b/static/images/cards/mining-village.jpg
new file mode 100644
index 0000000..5211719
--- /dev/null
+++ b/static/images/cards/mining-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99787429ccecab9bb2eb030688ff68b80b4af0e9d7c20af47839024609cbb889
+size 184624
diff --git a/static/images/cards/minion.jpg b/static/images/cards/minion.jpg
new file mode 100644
index 0000000..33f623f
--- /dev/null
+++ b/static/images/cards/minion.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff1bddcb91dc043f1e55ad8660f48a7f9e8f60b889ffb7351b94ab15c123b47e
+size 178586
diff --git a/static/images/cards/mint.jpg b/static/images/cards/mint.jpg
new file mode 100644
index 0000000..fc3522d
--- /dev/null
+++ b/static/images/cards/mint.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17dab4fc6f920fca2e8827f82499d26e4eb40f6fbaa366b0920318a8585322d5
+size 173649
diff --git a/static/images/cards/miser.jpg b/static/images/cards/miser.jpg
new file mode 100644
index 0000000..1297c9a
--- /dev/null
+++ b/static/images/cards/miser.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:573a0a06fa741333d36efff3abbdab592097b06c7bada2473b6bd25aa442f68f
+size 165082
diff --git a/static/images/cards/miserable.jpg b/static/images/cards/miserable.jpg
new file mode 100644
index 0000000..62d53ef
--- /dev/null
+++ b/static/images/cards/miserable.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:942927f94904a1179a585993abc111c421a1d6493b003bec16f27d6d2b116af7
+size 150112
diff --git a/static/images/cards/misery.jpg b/static/images/cards/misery.jpg
new file mode 100644
index 0000000..c5fe58d
--- /dev/null
+++ b/static/images/cards/misery.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e90933090d64b752ec1bebd66cc47b586d5ac7f11eb0d8653b63b1dc7b6955cf
+size 159611
diff --git a/static/images/cards/mission.jpg b/static/images/cards/mission.jpg
new file mode 100644
index 0000000..92f52bd
--- /dev/null
+++ b/static/images/cards/mission.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4274dad63bf4e39d243afbf27410106a3054c008a3d3c54d951834f367334cb
+size 227728
diff --git a/static/images/cards/moat.jpg b/static/images/cards/moat.jpg
new file mode 100644
index 0000000..4023943
--- /dev/null
+++ b/static/images/cards/moat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e78a0b00eec94dd3249c873e856520cad05aa836f50033ec6346091f24a2b380
+size 186326
diff --git a/static/images/cards/monastery.jpg b/static/images/cards/monastery.jpg
new file mode 100644
index 0000000..9f2dc53
--- /dev/null
+++ b/static/images/cards/monastery.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:183706af24861b37d3474ff070fe3d03bdc1d1d1f0cfa941ab6bf5f4c5d39905
+size 163811
diff --git a/static/images/cards/moneylender.jpg b/static/images/cards/moneylender.jpg
new file mode 100644
index 0000000..f64ae6f
--- /dev/null
+++ b/static/images/cards/moneylender.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:76fdec046c175a29230870c4ced6c98c2fe1456150e8a7c7512fb7c87320b030
+size 152973
diff --git a/static/images/cards/monument.jpg b/static/images/cards/monument.jpg
new file mode 100644
index 0000000..14f8ba8
--- /dev/null
+++ b/static/images/cards/monument.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f914c18a3fa851e1b1e05f9fb785bd9bcdbe25c8af1eaf2c31f9abc25091428d
+size 157096
diff --git a/static/images/cards/mountain-pass.jpg b/static/images/cards/mountain-pass.jpg
new file mode 100644
index 0000000..b435ff8
--- /dev/null
+++ b/static/images/cards/mountain-pass.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:613c2e2db194dd6bd4cda677a6a9f700e2cac2d5b9a94ccbf149d3784b769f9f
+size 244367
diff --git a/static/images/cards/mountain-village.jpg b/static/images/cards/mountain-village.jpg
new file mode 100644
index 0000000..12084c9
--- /dev/null
+++ b/static/images/cards/mountain-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:067e73c4aada68527f3e179390f2c9216dfe0cd6b046a02c231707e65fdec146
+size 171249
diff --git a/static/images/cards/mountebank.jpg b/static/images/cards/mountebank.jpg
new file mode 100644
index 0000000..ae2a6fa
--- /dev/null
+++ b/static/images/cards/mountebank.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:14f5e15eb37850d43f9e940abffe86b1844eb4867e54a5e4bebd3fb3cd1aedc0
+size 180775
diff --git a/static/images/cards/museum.jpg b/static/images/cards/museum.jpg
new file mode 100644
index 0000000..c6d9390
--- /dev/null
+++ b/static/images/cards/museum.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:252a92d746550ecbbb5423095ecd1139ca8e0506aecae90d08f260e0fccfa67e
+size 258101
diff --git a/static/images/cards/mystic.jpg b/static/images/cards/mystic.jpg
new file mode 100644
index 0000000..2c0d2fc
--- /dev/null
+++ b/static/images/cards/mystic.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:387ae89e90ecaa85bb83a44dd6e049f60cf155b4889f4da6d5ab3c9ddbde7ea3
+size 180544
diff --git a/static/images/cards/native-village.jpg b/static/images/cards/native-village.jpg
new file mode 100644
index 0000000..58d8650
--- /dev/null
+++ b/static/images/cards/native-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e2b3debe6811651439990f97a0d688a6dd488d1a6df50594f1fd10198474837
+size 184476
diff --git a/static/images/cards/navigator.jpg b/static/images/cards/navigator.jpg
new file mode 100644
index 0000000..c813811
--- /dev/null
+++ b/static/images/cards/navigator.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e95b51d4796f5f0beadb84bd5a9b8cb05be3d80768d184dd7d0f0695d7c1122
+size 176611
diff --git a/static/images/cards/necromancer.jpg b/static/images/cards/necromancer.jpg
new file mode 100644
index 0000000..bb95f46
--- /dev/null
+++ b/static/images/cards/necromancer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:970c572b0c42526dd3b5785c8efab9d90ebb1d0551d23e85a13470a7d62a586e
+size 196461
diff --git a/static/images/cards/necropolis.jpg b/static/images/cards/necropolis.jpg
new file mode 100644
index 0000000..10d04ac
--- /dev/null
+++ b/static/images/cards/necropolis.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2476cc72cfc6d15244d6773cb069be15db30110dc2db0bb551e9c9b828dfb7d9
+size 151097
diff --git a/static/images/cards/night-watchman.jpg b/static/images/cards/night-watchman.jpg
new file mode 100644
index 0000000..b088a2c
--- /dev/null
+++ b/static/images/cards/night-watchman.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a71c8907c16ed9bed43cf83d2b662d7c65a2a5912ad3d2f9d5bddb0dd78f6723
+size 171755
diff --git a/static/images/cards/noble-brigade.jpg b/static/images/cards/noble-brigade.jpg
new file mode 100644
index 0000000..d3c6635
--- /dev/null
+++ b/static/images/cards/noble-brigade.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4e2b8f9dd3261395251f75b4882a9fade4db169e408fbc4ffa471ea98174c7c5
+size 196113
diff --git a/static/images/cards/nobles.jpg b/static/images/cards/nobles.jpg
new file mode 100644
index 0000000..edc73df
--- /dev/null
+++ b/static/images/cards/nobles.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4f034b149727b47de1522316dbb5cf6d1315470d05c03f22a3514a19585e6eec
+size 172384
diff --git a/static/images/cards/nomad-camp.jpg b/static/images/cards/nomad-camp.jpg
new file mode 100644
index 0000000..48513e1
--- /dev/null
+++ b/static/images/cards/nomad-camp.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d9adb41833c63901ed584daa5f4402c454b65c0d13bc42ee7827ddfd67e4fa25
+size 165397
diff --git a/static/images/cards/oasis.jpg b/static/images/cards/oasis.jpg
new file mode 100644
index 0000000..fc00f94
--- /dev/null
+++ b/static/images/cards/oasis.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b87c3c052c86213bec3b4a78e372af740c79c845d8494f813af76075256315e6
+size 175902
diff --git a/static/images/cards/obelisk.jpg b/static/images/cards/obelisk.jpg
new file mode 100644
index 0000000..df67c2c
--- /dev/null
+++ b/static/images/cards/obelisk.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6217b7e5d72fad7a03bbbdc9790ffd651eb00b471fd77703a9ef01300c427be8
+size 277177
diff --git a/static/images/cards/old-images/colony.jpg b/static/images/cards/old-images/colony.jpg
new file mode 100644
index 0000000..972ecc9
--- /dev/null
+++ b/static/images/cards/old-images/colony.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:30cd7f7c1c9cc9c3a846fe7216b99e8787442ce880dae6765128cc17817cf3a9
+size 48085
diff --git a/static/images/cards/old-images/copper.jpg b/static/images/cards/old-images/copper.jpg
new file mode 100644
index 0000000..6500e19
--- /dev/null
+++ b/static/images/cards/old-images/copper.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e8d2466600b8529f538255a466a46dc4bbd044e88d4e8f5a5fd2c3fa962d0f03
+size 76360
diff --git a/static/images/cards/old-images/curse.jpg b/static/images/cards/old-images/curse.jpg
new file mode 100644
index 0000000..8def1d3
--- /dev/null
+++ b/static/images/cards/old-images/curse.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:47e93e993be18c104db0ec084d7471e7683609448ee07e5687b21305b4e55ef4
+size 61292
diff --git a/static/images/cards/old-images/duchy.jpg b/static/images/cards/old-images/duchy.jpg
new file mode 100644
index 0000000..be169c5
--- /dev/null
+++ b/static/images/cards/old-images/duchy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:02d4405c48d62ec78bf33db58394f33001351d3018317acbf83d4579f65fa51c
+size 66758
diff --git a/static/images/cards/old-images/estate.jpg b/static/images/cards/old-images/estate.jpg
new file mode 100644
index 0000000..7cdfa0b
--- /dev/null
+++ b/static/images/cards/old-images/estate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:21616e62342e5b14bac9d6b9df40d224cba0e0b8625c49b798f0a0a4631dafb2
+size 64804
diff --git a/static/images/cards/old-images/gold.jpg b/static/images/cards/old-images/gold.jpg
new file mode 100644
index 0000000..a3c26d9
--- /dev/null
+++ b/static/images/cards/old-images/gold.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ee7973ffe2af9cec2daff20a79b113930b56517e64a2f9011a7e663444841f17
+size 77385
diff --git a/static/images/cards/old-images/platinum.jpg b/static/images/cards/old-images/platinum.jpg
new file mode 100644
index 0000000..521409b
--- /dev/null
+++ b/static/images/cards/old-images/platinum.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d053eb1cb36dff5d4ed840c9f81fe15757105356492224011272ab3ffbe39135
+size 53620
diff --git a/static/images/cards/old-images/province.jpg b/static/images/cards/old-images/province.jpg
new file mode 100644
index 0000000..0258ba8
--- /dev/null
+++ b/static/images/cards/old-images/province.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dc8212b0a11db0f4ea31050fd85803a0384418e9fd174b97275b4937a8c08e99
+size 65896
diff --git a/static/images/cards/old-images/silver.jpg b/static/images/cards/old-images/silver.jpg
new file mode 100644
index 0000000..0c0e3f6
--- /dev/null
+++ b/static/images/cards/old-images/silver.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:955bddd226d7c3aa9b2a426fdff2cdef1cd4c2f88d1c72de648ba7a1d9db21e8
+size 77561
diff --git a/static/images/cards/old-witch.jpg b/static/images/cards/old-witch.jpg
new file mode 100644
index 0000000..78f4723
--- /dev/null
+++ b/static/images/cards/old-witch.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:44123f7b4c8c002de19e2ba8b584650642908a91b264307d07aca86f2203f1a2
+size 144010
diff --git a/static/images/cards/opulent-castle.jpg b/static/images/cards/opulent-castle.jpg
new file mode 100644
index 0000000..bf9d698
--- /dev/null
+++ b/static/images/cards/opulent-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4f8bb5e1eca03d60cb8707ab8aacec09a0704ddde0bf8ab30751e94aacdc50ea
+size 183658
diff --git a/static/images/cards/oracle.jpg b/static/images/cards/oracle.jpg
new file mode 100644
index 0000000..b1caa14
--- /dev/null
+++ b/static/images/cards/oracle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c3c82727dcfb0b5f27d0ba5753e2c93cb51aea90031ca41906ce0d0e3b7dafa
+size 160922
diff --git a/static/images/cards/orchard.jpg b/static/images/cards/orchard.jpg
new file mode 100644
index 0000000..0af8847
--- /dev/null
+++ b/static/images/cards/orchard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:de3fcfc1c40f2fdefaf2a55e4d676765627d004d3dc7334fba09f6f0625d0966
+size 234488
diff --git a/static/images/cards/outpost.jpg b/static/images/cards/outpost.jpg
new file mode 100644
index 0000000..0dc44f8
--- /dev/null
+++ b/static/images/cards/outpost.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e8c6ccd66d0f02e9ae4d885b365b1af8a3012b8d0656649956e73a0c98e3bb40
+size 211924
diff --git a/static/images/cards/overgrown-estate.jpg b/static/images/cards/overgrown-estate.jpg
new file mode 100644
index 0000000..d26ce5c
--- /dev/null
+++ b/static/images/cards/overgrown-estate.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e4898000bf1998fefcfbae5940ec4a1c35f5a8af2505282b67ba60e9af1bf0a4
+size 183831
diff --git a/static/images/cards/overlord.jpg b/static/images/cards/overlord.jpg
new file mode 100644
index 0000000..a5e2378
--- /dev/null
+++ b/static/images/cards/overlord.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:36040f27d0bc2ae35c1fa2ffe3344dbc04f3addcbbdbc827248fe4434620d573
+size 175745
diff --git a/static/images/cards/page.jpg b/static/images/cards/page.jpg
new file mode 100644
index 0000000..fd6b1f8
--- /dev/null
+++ b/static/images/cards/page.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c3ed2da66aadc5e95e7316a2b86a8e4f87af2b5b4933eba17287d9deca02d779
+size 158869
diff --git a/static/images/cards/pageant.jpg b/static/images/cards/pageant.jpg
new file mode 100644
index 0000000..8cb8ee9
--- /dev/null
+++ b/static/images/cards/pageant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:40cb97482d6e64ebcedf3665447e2ef8efc9446565af73750d73ade844b15bab
+size 224353
diff --git a/static/images/cards/palace.jpg b/static/images/cards/palace.jpg
new file mode 100644
index 0000000..81e62de
--- /dev/null
+++ b/static/images/cards/palace.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd36ff76958197c25a051efb83e4b8176f78834e2ee347cc7e458bc419e08663
+size 198997
diff --git a/static/images/cards/pasture.jpg b/static/images/cards/pasture.jpg
new file mode 100644
index 0000000..2d99df7
--- /dev/null
+++ b/static/images/cards/pasture.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d9eec7f715bde80f7761e46b2ec4e3fdc7b8307d805c81ece5f99459a923223c
+size 155118
diff --git a/static/images/cards/pathfinding.jpg b/static/images/cards/pathfinding.jpg
new file mode 100644
index 0000000..7e7cce6
--- /dev/null
+++ b/static/images/cards/pathfinding.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7abba9c290e032b47306856457aa199aefee917d38d2c21f9ad2ef2a56f3b1b1
+size 258301
diff --git a/static/images/cards/patrician.jpg b/static/images/cards/patrician.jpg
new file mode 100644
index 0000000..64e846f
--- /dev/null
+++ b/static/images/cards/patrician.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f8354ac0d3706cf9fe0601007aec234a068a1c1268d81ec26456d234b4998d9
+size 169634
diff --git a/static/images/cards/patrol.jpg b/static/images/cards/patrol.jpg
new file mode 100644
index 0000000..79e9204
--- /dev/null
+++ b/static/images/cards/patrol.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aa92611d2afcc8b7d1b01c6c8f815f2d6522b18a90a464ca42480ca8cab35955
+size 188140
diff --git a/static/images/cards/patron.jpg b/static/images/cards/patron.jpg
new file mode 100644
index 0000000..14466dc
--- /dev/null
+++ b/static/images/cards/patron.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:64d981d80f1e093dbbb47060fc18d327d2944ae36b26afd7282c43af3b3b6c86
+size 171507
diff --git a/static/images/cards/pearl-diver.jpg b/static/images/cards/pearl-diver.jpg
new file mode 100644
index 0000000..3314b3c
--- /dev/null
+++ b/static/images/cards/pearl-diver.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7d4eb864590b7e338fd00eacebb6a733697585224623782a70cc4ccb2ef9c2c
+size 156392
diff --git a/static/images/cards/peasant.jpg b/static/images/cards/peasant.jpg
new file mode 100644
index 0000000..8c03053
--- /dev/null
+++ b/static/images/cards/peasant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d7bbcf7be9a113679cb79ce77154ad257fcd3ec037203316e328928fe66256c
+size 181084
diff --git a/static/images/cards/peddler.jpg b/static/images/cards/peddler.jpg
new file mode 100644
index 0000000..4528932
--- /dev/null
+++ b/static/images/cards/peddler.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bc2511c7ccf7194d7e32646df95f822d052001beeb0b384444295cc321718f9b
+size 186537
diff --git a/static/images/cards/philosophers-stone.jpg b/static/images/cards/philosophers-stone.jpg
new file mode 100644
index 0000000..55ac788
--- /dev/null
+++ b/static/images/cards/philosophers-stone.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fb5401c34bf0cad8565b65fb4e81e66187320d75ed2a82c7f9198a3fb2dfaa19
+size 179569
diff --git a/static/images/cards/piazza.jpg b/static/images/cards/piazza.jpg
new file mode 100644
index 0000000..f14b31a
--- /dev/null
+++ b/static/images/cards/piazza.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e15b9eae760e0efe9d9379a63e01a7fa2de69b99ef100cc201c83f107d6beb2
+size 236033
diff --git a/static/images/cards/pilgrimage.jpg b/static/images/cards/pilgrimage.jpg
new file mode 100644
index 0000000..9f93802
--- /dev/null
+++ b/static/images/cards/pilgrimage.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:197e125d83287ce432f3ae7ee6760030c04cab25a4a5de73f0e4493a5f032aa5
+size 278930
diff --git a/static/images/cards/pillage.jpg b/static/images/cards/pillage.jpg
new file mode 100644
index 0000000..0612d3f
--- /dev/null
+++ b/static/images/cards/pillage.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8cdc00e8c6889e7f94fcdd4179c1bb29155e1392fa2e08030a19f56b01f77c3c
+size 197158
diff --git a/static/images/cards/pirate-ship.jpg b/static/images/cards/pirate-ship.jpg
new file mode 100644
index 0000000..598e7e7
--- /dev/null
+++ b/static/images/cards/pirate-ship.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:42343cc54c33b0e0eff392a630f883d72d297e144cae74c7e19cc8778967a1fa
+size 195171
diff --git a/static/images/cards/pixie.jpg b/static/images/cards/pixie.jpg
new file mode 100644
index 0000000..7054ec9
--- /dev/null
+++ b/static/images/cards/pixie.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:703f4511a4830294583eaa16fea9ccedb6acc1e7225d543631bb7a056d583265
+size 182383
diff --git a/static/images/cards/plague.jpg b/static/images/cards/plague.jpg
new file mode 100644
index 0000000..277526b
--- /dev/null
+++ b/static/images/cards/plague.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d67bde4093a1bc8cd16b252a26d32a868f6c3a8649576f193666c880ec77cf5c
+size 192566
diff --git a/static/images/cards/plan.jpg b/static/images/cards/plan.jpg
new file mode 100644
index 0000000..3a58449
--- /dev/null
+++ b/static/images/cards/plan.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:852b860fbf4c4ecb0b2ab4e91898082e83ade91a72a4110014322375ba1f3e2d
+size 217169
diff --git a/static/images/cards/platinum.jpg b/static/images/cards/platinum.jpg
new file mode 100644
index 0000000..4d41f3a
--- /dev/null
+++ b/static/images/cards/platinum.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ace4a94f70707ccc9993241eca4d3ad5762ab62dfd96f0c93c9de629381eff0
+size 153045
diff --git a/static/images/cards/plaza.jpg b/static/images/cards/plaza.jpg
new file mode 100644
index 0000000..aec46e2
--- /dev/null
+++ b/static/images/cards/plaza.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a0010916af706c64ade82b80c725cec3c172c1a9873ae0709439712e1f98ec1
+size 179684
diff --git a/static/images/cards/plunder.jpg b/static/images/cards/plunder.jpg
new file mode 100644
index 0000000..67c3696
--- /dev/null
+++ b/static/images/cards/plunder.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:69688ded7c18b5f7268382c5c2456d0591095ffa540e6ab979f2f590087365a0
+size 150457
diff --git a/static/images/cards/poacher.jpg b/static/images/cards/poacher.jpg
new file mode 100644
index 0000000..823bb1d
--- /dev/null
+++ b/static/images/cards/poacher.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a5dfc6d7b8f3000e02e4e7a3a8d0b44649aeb8c51c2c4ee2f2a2dd45bdae233
+size 177320
diff --git a/static/images/cards/pooka.jpg b/static/images/cards/pooka.jpg
new file mode 100644
index 0000000..07fba9a
--- /dev/null
+++ b/static/images/cards/pooka.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fe456e3adbb50fe136dce7a6dfc5f6045b6d65ab92b60f0fa6a3143a19d1d42
+size 186347
diff --git a/static/images/cards/poor-house.jpg b/static/images/cards/poor-house.jpg
new file mode 100644
index 0000000..5c8262d
--- /dev/null
+++ b/static/images/cards/poor-house.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:14c512495dfcd5882be18aa2d38fc25d0d39959f2bcc03e4d7cb0f03bd0fa4a1
+size 152987
diff --git a/static/images/cards/port.jpg b/static/images/cards/port.jpg
new file mode 100644
index 0000000..6bd3818
--- /dev/null
+++ b/static/images/cards/port.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cb9be00da2ee96232191db4b443e625f9e85cf1ed328e38736fe0a743116a868
+size 158510
diff --git a/static/images/cards/possession.jpg b/static/images/cards/possession.jpg
new file mode 100644
index 0000000..b751809
--- /dev/null
+++ b/static/images/cards/possession.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5668c5a7735549476259450d5c75df3296628ca29a57370d73371b7a2559f06
+size 196029
diff --git a/static/images/cards/potion.jpg b/static/images/cards/potion.jpg
new file mode 100644
index 0000000..98831a8
--- /dev/null
+++ b/static/images/cards/potion.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17f08102f9456ed5115b1418e1515dbfd52df2bc7eae5354568a16f7392522ac
+size 162737
diff --git a/static/images/cards/pouch.jpg b/static/images/cards/pouch.jpg
new file mode 100644
index 0000000..024492a
--- /dev/null
+++ b/static/images/cards/pouch.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:457f982ca4fe3fc43f424c8e2e544c397eb4009c8ca14911e27b25172cb7d4d8
+size 140582
diff --git a/static/images/cards/poverty.jpg b/static/images/cards/poverty.jpg
new file mode 100644
index 0000000..7be2429
--- /dev/null
+++ b/static/images/cards/poverty.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3df49dba987bc36b6da3ced0866e28c9e96b678586fa45e8d18d611fecbb7c5
+size 154142
diff --git a/static/images/cards/priest.jpg b/static/images/cards/priest.jpg
new file mode 100644
index 0000000..c3798ec
--- /dev/null
+++ b/static/images/cards/priest.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d24e20280aef361d3cd06bbc324cd9eb6ba957879e32d1f8769e039cb3d240dc
+size 163004
diff --git a/static/images/cards/prince.jpg b/static/images/cards/prince.jpg
new file mode 100644
index 0000000..497c8a0
--- /dev/null
+++ b/static/images/cards/prince.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:48601c98f7484b9ad7e1c8345b8308a97c90e0139a216b6264aabb85ebbbb831
+size 194789
diff --git a/static/images/cards/princess.jpg b/static/images/cards/princess.jpg
new file mode 100644
index 0000000..36dc84c
--- /dev/null
+++ b/static/images/cards/princess.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5830688962089cb81486d4636fc9d1d7cacb92b9360ed96f51f9aa1ea03a2d75
+size 180004
diff --git a/static/images/cards/procession.jpg b/static/images/cards/procession.jpg
new file mode 100644
index 0000000..a30558d
--- /dev/null
+++ b/static/images/cards/procession.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4029ab9c9b0ed0ab47a2aa724e5e495a6e5d321b8464daa47dc231b559eb23bf
+size 168042
diff --git a/static/images/cards/province.jpg b/static/images/cards/province.jpg
new file mode 100644
index 0000000..4d8372e
--- /dev/null
+++ b/static/images/cards/province.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7d37922df4b9eb1bd5358b5c3d114591f49068c632d5ba5eff50ce4e01fdc8e5
+size 154056
diff --git a/static/images/cards/quarry.jpg b/static/images/cards/quarry.jpg
new file mode 100644
index 0000000..8c93abd
--- /dev/null
+++ b/static/images/cards/quarry.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7fefd55d6a94f785d46d8e490a9eedc3ff011ef6dc331fcfec18483b0065886d
+size 198037
diff --git a/static/images/cards/quest.jpg b/static/images/cards/quest.jpg
new file mode 100644
index 0000000..a2fb152
--- /dev/null
+++ b/static/images/cards/quest.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0cd640150f04f20fd0e07cf856523a8236e0637312dfcf1fa132920808e4a89d
+size 245123
diff --git a/static/images/cards/rabble.jpg b/static/images/cards/rabble.jpg
new file mode 100644
index 0000000..318d9b1
--- /dev/null
+++ b/static/images/cards/rabble.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f4f5d60c923aa8a1f725d09dfd123bc8afab1fae81c6826c31793e3f36249050
+size 187551
diff --git a/static/images/cards/raid.jpg b/static/images/cards/raid.jpg
new file mode 100644
index 0000000..dc7f3c8
--- /dev/null
+++ b/static/images/cards/raid.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fcf36557715a1942591fc3b7b55b17380095bb1ecf92fc6b7dc29f0bc2a7825
+size 222044
diff --git a/static/images/cards/raider.jpg b/static/images/cards/raider.jpg
new file mode 100644
index 0000000..bbc11a7
--- /dev/null
+++ b/static/images/cards/raider.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a4df277d3e81a62fcd453ba7052d15111bd87ef10386fd3954e0cc0755d24ced
+size 170534
diff --git a/static/images/cards/ranger.jpg b/static/images/cards/ranger.jpg
new file mode 100644
index 0000000..86f3cca
--- /dev/null
+++ b/static/images/cards/ranger.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7d341dee8e63200cc71ccbe7efe83f1d708ab4f1f902c97920e4830dff3c1551
+size 193875
diff --git a/static/images/cards/ratcatcher.jpg b/static/images/cards/ratcatcher.jpg
new file mode 100644
index 0000000..6915fde
--- /dev/null
+++ b/static/images/cards/ratcatcher.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:852fb95a0bb1f5fc265ef90fdf0be943932ea473cfa8c3b259f0ca84b9ad5e93
+size 175716
diff --git a/static/images/cards/rats.jpg b/static/images/cards/rats.jpg
new file mode 100644
index 0000000..135ec50
--- /dev/null
+++ b/static/images/cards/rats.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b8a9d357f9e41ebf5b532aef6673a46ffc92de3de5cc9a229cd1e6ac10c5ff30
+size 176422
diff --git a/static/images/cards/raze.jpg b/static/images/cards/raze.jpg
new file mode 100644
index 0000000..0931d6f
--- /dev/null
+++ b/static/images/cards/raze.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8de8395c6afcde05e3ccd3adb026a5e49c9adf2c89c9b1cf8d84a14148ada1ff
+size 173699
diff --git a/static/images/cards/rebuild.jpg b/static/images/cards/rebuild.jpg
new file mode 100644
index 0000000..d4854db
--- /dev/null
+++ b/static/images/cards/rebuild.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:01c99cbc0633536a14ef508b63726ae76b0d66321bfdbccc70a9b577d61f4ec7
+size 190499
diff --git a/static/images/cards/recruiter.jpg b/static/images/cards/recruiter.jpg
new file mode 100644
index 0000000..f28b362
--- /dev/null
+++ b/static/images/cards/recruiter.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:884cfdeaf5dcab67284db3f065e94b6ecf246c2068ec04c05751367a3df129f0
+size 167496
diff --git a/static/images/cards/relic.jpg b/static/images/cards/relic.jpg
new file mode 100644
index 0000000..f0c6207
--- /dev/null
+++ b/static/images/cards/relic.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4c8d17d54d05ec9c3fe6003c0367a326fef0b4426478e40bfaf027b37eb62fa
+size 184199
diff --git a/static/images/cards/remake.jpg b/static/images/cards/remake.jpg
new file mode 100644
index 0000000..e9f089b
--- /dev/null
+++ b/static/images/cards/remake.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57cd119c18f94f56dab7e72aea7d6e7fbcd285e0d051d4ae5ad76a7cf952d039
+size 175328
diff --git a/static/images/cards/remodel.jpg b/static/images/cards/remodel.jpg
new file mode 100644
index 0000000..87a8ec5
--- /dev/null
+++ b/static/images/cards/remodel.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58a60d67c93416ac1475b4370892a4d4656b51c16869db51cd23f5a382783fac
+size 149419
diff --git a/static/images/cards/replace.jpg b/static/images/cards/replace.jpg
new file mode 100644
index 0000000..13ddc98
--- /dev/null
+++ b/static/images/cards/replace.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:939b41fca849b3350efb3912d60f45da7129ec48c174789a0b8d6e6e19b7405b
+size 199294
diff --git a/static/images/cards/research.jpg b/static/images/cards/research.jpg
new file mode 100644
index 0000000..c336c00
--- /dev/null
+++ b/static/images/cards/research.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3f0b6f4f543e2b9e3b1526cea323fbdaf55340c2ea6d53438abd6d7a7b0415d
+size 205781
diff --git a/static/images/cards/ritual.jpg b/static/images/cards/ritual.jpg
new file mode 100644
index 0000000..9c5e047
--- /dev/null
+++ b/static/images/cards/ritual.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b2c29aefeaef967864950a397f0a579363654199afb4b2e43e592c032132928a
+size 262634
diff --git a/static/images/cards/road-network.jpg b/static/images/cards/road-network.jpg
new file mode 100644
index 0000000..019b28f
--- /dev/null
+++ b/static/images/cards/road-network.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eca86c88474667eae2b2e63ff48e1b2cf38f38d5d49a4ad61decbe464ab4f406
+size 249936
diff --git a/static/images/cards/rock.jpg b/static/images/cards/rock.jpg
new file mode 100644
index 0000000..b9a499b
--- /dev/null
+++ b/static/images/cards/rock.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a65172417579d6a0caa38797fdd2a39de36889632af9b428468a2e4d31d89f8b
+size 203440
diff --git a/static/images/cards/rogue.jpg b/static/images/cards/rogue.jpg
new file mode 100644
index 0000000..87c8877
--- /dev/null
+++ b/static/images/cards/rogue.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:30acbaad44222f9461e3d5aed40c9c4662fe9513a8ca63bb4f5824ec26fd4b53
+size 197047
diff --git a/static/images/cards/royal-blacksmith.jpg b/static/images/cards/royal-blacksmith.jpg
new file mode 100644
index 0000000..0e0ed59
--- /dev/null
+++ b/static/images/cards/royal-blacksmith.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09503097d5e355a8ff37fede82ac891ea93279e6d33f7a922ab4225e043ef44d
+size 141901
diff --git a/static/images/cards/royal-carriage.jpg b/static/images/cards/royal-carriage.jpg
new file mode 100644
index 0000000..2bb63a1
--- /dev/null
+++ b/static/images/cards/royal-carriage.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:698617b97c0a5a7f58118afa74c29ded1100f70853b8010bfe25acfce9736848
+size 211869
diff --git a/static/images/cards/royal-seal.jpg b/static/images/cards/royal-seal.jpg
new file mode 100644
index 0000000..5a0a6dc
--- /dev/null
+++ b/static/images/cards/royal-seal.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b269b9993501cbbe7afed4c18fa3129c2f08bbce336fda291fbbc8d20ff1e266
+size 168131
diff --git a/static/images/cards/ruined-library.jpg b/static/images/cards/ruined-library.jpg
new file mode 100644
index 0000000..f8a4602
--- /dev/null
+++ b/static/images/cards/ruined-library.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:33ae4dc53662b03879706704d2de38f743b6bcd6d120baa0be6ab3b81860bf8b
+size 176950
diff --git a/static/images/cards/ruined-market.jpg b/static/images/cards/ruined-market.jpg
new file mode 100644
index 0000000..6f8b5de
--- /dev/null
+++ b/static/images/cards/ruined-market.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:adc739487926a9aa355f16cf4acbbcacb4b6d5964d3be32a324bc097a11b183c
+size 155170
diff --git a/static/images/cards/ruined-village.jpg b/static/images/cards/ruined-village.jpg
new file mode 100644
index 0000000..2e8bdc1
--- /dev/null
+++ b/static/images/cards/ruined-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:682838f15b9e0bb152a1f06dfd8238d91fc741d61fe64460504731f76d398d36
+size 164964
diff --git a/static/images/cards/saboteur.jpg b/static/images/cards/saboteur.jpg
new file mode 100644
index 0000000..97b0f5d
--- /dev/null
+++ b/static/images/cards/saboteur.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:015db8cf467c300dd2773b751272b50741d2f3e7809a77d96a6c50dbf2c8c93a
+size 129256
diff --git a/static/images/cards/sacred-grove.jpg b/static/images/cards/sacred-grove.jpg
new file mode 100644
index 0000000..d57e37a
--- /dev/null
+++ b/static/images/cards/sacred-grove.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4a7108c8d1f2fbc5e2b26519d9aabf8026a20370a3d00558fecb79f361522bee
+size 170027
diff --git a/static/images/cards/sacrifice.jpg b/static/images/cards/sacrifice.jpg
new file mode 100644
index 0000000..e4d1281
--- /dev/null
+++ b/static/images/cards/sacrifice.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07cd53a1d0dba93f5d09d873d527041f0a387cb058d15b30c0bff3fcc525c099
+size 171332
diff --git a/static/images/cards/sage.jpg b/static/images/cards/sage.jpg
new file mode 100644
index 0000000..6ead660
--- /dev/null
+++ b/static/images/cards/sage.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ee62f2b89646a184ae9361143a03f55e664251ce1dbc64142d965451866819eb
+size 187626
diff --git a/static/images/cards/salt-the-earth.jpg b/static/images/cards/salt-the-earth.jpg
new file mode 100644
index 0000000..8b2f835
--- /dev/null
+++ b/static/images/cards/salt-the-earth.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:45fa3772fcfb91d2c75c208b133f4743b309c8ca9d61af6effa1122f71eb0781
+size 225566
diff --git a/static/images/cards/salvager.jpg b/static/images/cards/salvager.jpg
new file mode 100644
index 0000000..f8fea28
--- /dev/null
+++ b/static/images/cards/salvager.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bfb8df5604a068cfb66a5c984b58963d9258ea61f9d750c191cbe24e8d50a389
+size 150405
diff --git a/static/images/cards/sauna.jpg b/static/images/cards/sauna.jpg
new file mode 100644
index 0000000..dc8c4a8
--- /dev/null
+++ b/static/images/cards/sauna.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1da1939a71c0271363386c3d8e3338d9a6b4f6a729bec1e673c03fec9743d15
+size 187426
diff --git a/static/images/cards/save.jpg b/static/images/cards/save.jpg
new file mode 100644
index 0000000..5146958
--- /dev/null
+++ b/static/images/cards/save.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7cb3a02151b8e7def9be00fcb59e2f5e72657c25350f478c1c22392f2151b7e0
+size 202262
diff --git a/static/images/cards/scavenger.jpg b/static/images/cards/scavenger.jpg
new file mode 100644
index 0000000..c95845c
--- /dev/null
+++ b/static/images/cards/scavenger.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:605ef1d775991b80fed0e3801e605c671f55aa4e4f4126b92f51190133254d19
+size 170262
diff --git a/static/images/cards/scepter.jpg b/static/images/cards/scepter.jpg
new file mode 100644
index 0000000..5d65527
--- /dev/null
+++ b/static/images/cards/scepter.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:129220b69cf2d2c1a2b5e5559e508dbd8fdc3b780594f8681169c67bb7639c90
+size 201396
diff --git a/static/images/cards/scheme.jpg b/static/images/cards/scheme.jpg
new file mode 100644
index 0000000..afac647
--- /dev/null
+++ b/static/images/cards/scheme.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2304700345b9370dea83f28653bd8aa1700c43568f2f6da34a0895a78892cccc
+size 172108
diff --git a/static/images/cards/scholar.jpg b/static/images/cards/scholar.jpg
new file mode 100644
index 0000000..bbe6be6
--- /dev/null
+++ b/static/images/cards/scholar.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:287476453f69da45340e3798930f4240b855702e045cfded3af5cea662df0dcb
+size 136422
diff --git a/static/images/cards/scout.jpg b/static/images/cards/scout.jpg
new file mode 100644
index 0000000..41d6dfb
--- /dev/null
+++ b/static/images/cards/scout.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:97626d0b93073172ffdd033bb7d42e53e5bd196a6ffd923a30d27293c64a7a11
+size 121836
diff --git a/static/images/cards/scouting-party.jpg b/static/images/cards/scouting-party.jpg
new file mode 100644
index 0000000..60d84e7
--- /dev/null
+++ b/static/images/cards/scouting-party.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e22678195855a7a1f9ba14f80bf2c025e31bc29b27119a63f8752b12390cce39
+size 261295
diff --git a/static/images/cards/scrying-pool.jpg b/static/images/cards/scrying-pool.jpg
new file mode 100644
index 0000000..7a16899
--- /dev/null
+++ b/static/images/cards/scrying-pool.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2f1a860f47e16c8290216f9bd84970a3fb41720a36415848249d8f834ea86886
+size 197417
diff --git a/static/images/cards/sculptor.jpg b/static/images/cards/sculptor.jpg
new file mode 100644
index 0000000..c78f159
--- /dev/null
+++ b/static/images/cards/sculptor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a3c227bb81b84a5d5b9339aeefa82b9692674fef2e96aee75b77d2b77bda90eb
+size 132937
diff --git a/static/images/cards/sea-hag.jpg b/static/images/cards/sea-hag.jpg
new file mode 100644
index 0000000..dbad862
--- /dev/null
+++ b/static/images/cards/sea-hag.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d691af79273437526bf49f77817cdf685a44d8648cec5360c262ed510e3e52a
+size 182825
diff --git a/static/images/cards/seaway.jpg b/static/images/cards/seaway.jpg
new file mode 100644
index 0000000..6bdf74b
--- /dev/null
+++ b/static/images/cards/seaway.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5aafc199bed72c612ea98806be3b640c1e231c917cffcd3f1ef6b8cda4f5ab11
+size 268678
diff --git a/static/images/cards/secret-cave.jpg b/static/images/cards/secret-cave.jpg
new file mode 100644
index 0000000..5750d6b
--- /dev/null
+++ b/static/images/cards/secret-cave.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:99f3f116226b3d96d00db5b6d264750c9866e9df297d1fd8b7b1a0a3b45bb6af
+size 192247
diff --git a/static/images/cards/secret-chamber.jpg b/static/images/cards/secret-chamber.jpg
new file mode 100644
index 0000000..dd41a3d
--- /dev/null
+++ b/static/images/cards/secret-chamber.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4ee5308a18fad4b6cb5addde9d786628ddf9d503cf307aa328135fdf79bb6c49
+size 123663
diff --git a/static/images/cards/secret-passage.jpg b/static/images/cards/secret-passage.jpg
new file mode 100644
index 0000000..c361d64
--- /dev/null
+++ b/static/images/cards/secret-passage.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dbc38ad908c6f4300702c7f3aff61b98361c3bd799b15babc71ad64a1c6bddf1
+size 155916
diff --git a/static/images/cards/seer.jpg b/static/images/cards/seer.jpg
new file mode 100644
index 0000000..3392f08
--- /dev/null
+++ b/static/images/cards/seer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3984a602ce1b232844c71f07c27532170d5aae6c22f74f945e62dbd4f5e0cf78
+size 169294
diff --git a/static/images/cards/sentry.jpg b/static/images/cards/sentry.jpg
new file mode 100644
index 0000000..be4b9d1
--- /dev/null
+++ b/static/images/cards/sentry.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a7a565c2b0ab499a9f21d32743866ddc07a2a50d6ee43eb1b87b1b6de8b6f66
+size 183726
diff --git a/static/images/cards/settlers.jpg b/static/images/cards/settlers.jpg
new file mode 100644
index 0000000..48cb796
--- /dev/null
+++ b/static/images/cards/settlers.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a9ec8950954b26f940c172af94a31d38d5906badd56e1b5f1325004982e77b1
+size 150796
diff --git a/static/images/cards/sewers.jpg b/static/images/cards/sewers.jpg
new file mode 100644
index 0000000..c39afdc
--- /dev/null
+++ b/static/images/cards/sewers.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e318158f472d9703fa0b28e3a33a18fe3e7d7896c28c94c74afbc9bf0990c475
+size 225972
diff --git a/static/images/cards/shanty-town.jpg b/static/images/cards/shanty-town.jpg
new file mode 100644
index 0000000..8cbbdf8
--- /dev/null
+++ b/static/images/cards/shanty-town.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec9a2d474fc8fe37c05778998f3675f375d457c5340201d2a306f03a6c9a2c33
+size 168860
diff --git a/static/images/cards/shepherd.jpg b/static/images/cards/shepherd.jpg
new file mode 100644
index 0000000..d1944fc
--- /dev/null
+++ b/static/images/cards/shepherd.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e9b470e27bf53f5bfd7a651c4eb6d3f4561956162c2f94575b63f0ddc41b5833
+size 150168
diff --git a/static/images/cards/silk-merchant.jpg b/static/images/cards/silk-merchant.jpg
new file mode 100644
index 0000000..ef4fc0b
--- /dev/null
+++ b/static/images/cards/silk-merchant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ca431ab92ad7512d2460126a9f4f5fa1300ddc8f95e52f3625e25f98469c0d5b
+size 165369
diff --git a/static/images/cards/silk-road.jpg b/static/images/cards/silk-road.jpg
new file mode 100644
index 0000000..b631870
--- /dev/null
+++ b/static/images/cards/silk-road.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:15f91072275c594e00b7f3c6c49fe671fe5255738950b0d4703873725599f5d5
+size 173919
diff --git a/static/images/cards/silos.jpg b/static/images/cards/silos.jpg
new file mode 100644
index 0000000..2b91963
--- /dev/null
+++ b/static/images/cards/silos.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ccfbe97c6aa0429c1bb8ff0f16e8cc6200b7643eeca04825425e68ec05ecdf32
+size 217706
diff --git a/static/images/cards/silver.jpg b/static/images/cards/silver.jpg
new file mode 100644
index 0000000..74f2a9f
--- /dev/null
+++ b/static/images/cards/silver.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a6464f0f971c710031472f244a50802e2ffa258e10265721e69b42ae8b557de5
+size 199261
diff --git a/static/images/cards/sinister-plot.jpg b/static/images/cards/sinister-plot.jpg
new file mode 100644
index 0000000..fa47af6
--- /dev/null
+++ b/static/images/cards/sinister-plot.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:41bbbb2311c5544f5163587b0edcfbcaf52db96f92fc445cb237a0e8be4d5d74
+size 201666
diff --git a/static/images/cards/sir-bailey.jpg b/static/images/cards/sir-bailey.jpg
new file mode 100644
index 0000000..1beb437
--- /dev/null
+++ b/static/images/cards/sir-bailey.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fdc996b1b2b1602c2553e4021513a7e9df198e65f301a03b35e0e21dc1fdb848
+size 188000
diff --git a/static/images/cards/sir-destry.jpg b/static/images/cards/sir-destry.jpg
new file mode 100644
index 0000000..3502d6a
--- /dev/null
+++ b/static/images/cards/sir-destry.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4417dbe036666915e0b09225af5420bfd3e6ac06ef2596fb0a160b0dbc389ea5
+size 204624
diff --git a/static/images/cards/sir-martin.jpg b/static/images/cards/sir-martin.jpg
new file mode 100644
index 0000000..f742709
--- /dev/null
+++ b/static/images/cards/sir-martin.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a6f610a552f708e1e50d554ed45f9d92ffc3f9e8e8a81c0d8aa4d921ba1451c
+size 198016
diff --git a/static/images/cards/sir-michael.jpg b/static/images/cards/sir-michael.jpg
new file mode 100644
index 0000000..53eb695
--- /dev/null
+++ b/static/images/cards/sir-michael.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:17a73501f4e967ef30ab0a0036befc34be72650a06620daa9d8cfa052d48acf1
+size 204878
diff --git a/static/images/cards/sir-vander.jpg b/static/images/cards/sir-vander.jpg
new file mode 100644
index 0000000..4ed8ddb
--- /dev/null
+++ b/static/images/cards/sir-vander.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac4abbf6cecec8503927e5e95d55fce2a1177607cb7ff0e37d5d322a9431bc1c
+size 183053
diff --git a/static/images/cards/skulk.jpg b/static/images/cards/skulk.jpg
new file mode 100644
index 0000000..ee23997
--- /dev/null
+++ b/static/images/cards/skulk.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7935febe20b8db0a837cecc6f1823e5f8fd18994dbeca95243949dd7c0a9a284
+size 157910
diff --git a/static/images/cards/small-castle.jpg b/static/images/cards/small-castle.jpg
new file mode 100644
index 0000000..cc322f7
--- /dev/null
+++ b/static/images/cards/small-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4cd34bb55c54f3f28e24a8dc6fabe849bd73fab8aa402652f85a8a0224769be
+size 179917
diff --git a/static/images/cards/smithy.jpg b/static/images/cards/smithy.jpg
new file mode 100644
index 0000000..ec6d973
--- /dev/null
+++ b/static/images/cards/smithy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bc5be9651827b195c3858115ea27ebae70686e17ecce4780957734e34f82ba50
+size 141171
diff --git a/static/images/cards/smugglers.jpg b/static/images/cards/smugglers.jpg
new file mode 100644
index 0000000..6ecf0ae
--- /dev/null
+++ b/static/images/cards/smugglers.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:79b5d38940409d789cc840f5599986c0a0b2ed31b908cd942f53476f2ce1499d
+size 153172
diff --git a/static/images/cards/soldier.jpg b/static/images/cards/soldier.jpg
new file mode 100644
index 0000000..59dbe93
--- /dev/null
+++ b/static/images/cards/soldier.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dd3121e5351a8dfbdab69bfcc1c0dec35af47aec2fb792720e7030d4ae399cf8
+size 220353
diff --git a/static/images/cards/soothsayer.jpg b/static/images/cards/soothsayer.jpg
new file mode 100644
index 0000000..a462a09
--- /dev/null
+++ b/static/images/cards/soothsayer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf473254f5a5c27f0cc548260ef5c1107f2c4983d6fe9651a373779996ecadf1
+size 155016
diff --git a/static/images/cards/spice-merchant.jpg b/static/images/cards/spice-merchant.jpg
new file mode 100644
index 0000000..6c7ddc8
--- /dev/null
+++ b/static/images/cards/spice-merchant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:905b1179f92f011da160f3efb7a84722f5cbb09180befd04ff772f79115169a6
+size 175865
diff --git a/static/images/cards/spices.jpg b/static/images/cards/spices.jpg
new file mode 100644
index 0000000..0dd60dd
--- /dev/null
+++ b/static/images/cards/spices.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e3a5ad1f3d1dad533a084791987cddcddfc833ff7c4e8b23d0976f02f451bff
+size 164482
diff --git a/static/images/cards/spoils.jpg b/static/images/cards/spoils.jpg
new file mode 100644
index 0000000..98dcd92
--- /dev/null
+++ b/static/images/cards/spoils.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1eb7bb956f3c46318fdc62aaaf2472374c69a0c96b2e2591c4e08ab876b05a5a
+size 187743
diff --git a/static/images/cards/sprawling-castle.jpg b/static/images/cards/sprawling-castle.jpg
new file mode 100644
index 0000000..e8ed8fd
--- /dev/null
+++ b/static/images/cards/sprawling-castle.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f1addf9321d6917e6fda04020ea26e04136e3e61f169917baec4203def94de28
+size 169306
diff --git a/static/images/cards/spy.jpg b/static/images/cards/spy.jpg
new file mode 100644
index 0000000..6db0237
--- /dev/null
+++ b/static/images/cards/spy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d17722307e59aa7a9711d2b5d9d2bb28bbb30981dbd4e22febd4e9604f149b00
+size 109012
diff --git a/static/images/cards/squire.jpg b/static/images/cards/squire.jpg
new file mode 100644
index 0000000..2c4e613
--- /dev/null
+++ b/static/images/cards/squire.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:122f8d7a63f6857ff5c0d5a059d8668110dc033cff6483d4a7752ba1354f5b69
+size 183469
diff --git a/static/images/cards/stables.jpg b/static/images/cards/stables.jpg
new file mode 100644
index 0000000..8ca7547
--- /dev/null
+++ b/static/images/cards/stables.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ece64bad679b93da7349bf2bfe4a7a62206f01a3c65415e1ef47ac857dd9dde7
+size 174090
diff --git a/static/images/cards/star-chart.jpg b/static/images/cards/star-chart.jpg
new file mode 100644
index 0000000..8afce08
--- /dev/null
+++ b/static/images/cards/star-chart.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a1e336c6b4a5fda3c031f02d1205d2ff51ac04a6623b4259ae93a4c2b73bed2
+size 212924
diff --git a/static/images/cards/steward.jpg b/static/images/cards/steward.jpg
new file mode 100644
index 0000000..84375ac
--- /dev/null
+++ b/static/images/cards/steward.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c9e4b0b026c7ca8f71cac0788560bf7e18697f7d88bcf775b8293ce484f91183
+size 149518
diff --git a/static/images/cards/stonemason.jpg b/static/images/cards/stonemason.jpg
new file mode 100644
index 0000000..ac4d1b6
--- /dev/null
+++ b/static/images/cards/stonemason.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d0a35fd60101732e8cd09a35f3ae5e95e088be0a60426246e3ed8cf16cc6d2d5
+size 178996
diff --git a/static/images/cards/storeroom.jpg b/static/images/cards/storeroom.jpg
new file mode 100644
index 0000000..1206264
--- /dev/null
+++ b/static/images/cards/storeroom.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d18c81e164b6151bff42e4720da7c3ad4176d02377cdddae578e70823b987ed8
+size 183579
diff --git a/static/images/cards/storyteller.jpg b/static/images/cards/storyteller.jpg
new file mode 100644
index 0000000..a24a97e
--- /dev/null
+++ b/static/images/cards/storyteller.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cd550dfc5e982ab0183e87f1323d4435d8b7ade4eb856f783b11b95840e47fd2
+size 203454
diff --git a/static/images/cards/summon.jpg b/static/images/cards/summon.jpg
new file mode 100644
index 0000000..81d1638
--- /dev/null
+++ b/static/images/cards/summon.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:87f540ccdbc4017bf76a26b136b9f13eda0d673a1f13e1077d8b6d9b99b85824
+size 279523
diff --git a/static/images/cards/survivors.jpg b/static/images/cards/survivors.jpg
new file mode 100644
index 0000000..883bb28
--- /dev/null
+++ b/static/images/cards/survivors.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:59cb60c047e32f7ae8afca1b99e7729a11b06e16997b966bd89a7a9210ecaed2
+size 166226
diff --git a/static/images/cards/swamp-hag.jpg b/static/images/cards/swamp-hag.jpg
new file mode 100644
index 0000000..9920c23
--- /dev/null
+++ b/static/images/cards/swamp-hag.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4916c64bac025c2ea1615af1fce0f5502cd3b515c5cbe14f6505d8c87b43b25
+size 177297
diff --git a/static/images/cards/swashbuckler.jpg b/static/images/cards/swashbuckler.jpg
new file mode 100644
index 0000000..9a4afc9
--- /dev/null
+++ b/static/images/cards/swashbuckler.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2330552bd4f7d1f5b027626b28538579712f345b8a3b8b9af231c5dfb4bcb35
+size 165940
diff --git a/static/images/cards/swindler.jpg b/static/images/cards/swindler.jpg
new file mode 100644
index 0000000..4192b35
--- /dev/null
+++ b/static/images/cards/swindler.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e0a4c594adeb10295ec2fbcfc867c5e10fc59f5ccf7e9e7dcbf063d20a943690
+size 172292
diff --git a/static/images/cards/tactician.jpg b/static/images/cards/tactician.jpg
new file mode 100644
index 0000000..8c9d8a8
--- /dev/null
+++ b/static/images/cards/tactician.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:741bf7add48e315e27645a9f7007c53c885d4b3f6f1c29d5fdc5db3188c2972f
+size 159612
diff --git a/static/images/cards/talisman.jpg b/static/images/cards/talisman.jpg
new file mode 100644
index 0000000..0a36b39
--- /dev/null
+++ b/static/images/cards/talisman.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d8d96e40ebfe95106e7c0889fbb8748a8f04749a5d4f8ca1d7748fa1e0801c12
+size 220880
diff --git a/static/images/cards/tax.jpg b/static/images/cards/tax.jpg
new file mode 100644
index 0000000..baae1cc
--- /dev/null
+++ b/static/images/cards/tax.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:385eaecbd386b838558c3e325119d04b14dc7fb84f73cec0ca35ad448e91ed04
+size 247705
diff --git a/static/images/cards/taxman.jpg b/static/images/cards/taxman.jpg
new file mode 100644
index 0000000..f63f315
--- /dev/null
+++ b/static/images/cards/taxman.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:84d9b3857589d2e1da3407d8ae7d001597640b31df3114d6a7e2bc8847127130
+size 178566
diff --git a/static/images/cards/teacher.jpg b/static/images/cards/teacher.jpg
new file mode 100644
index 0000000..20ec409
--- /dev/null
+++ b/static/images/cards/teacher.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f048f5a7d4b567f7a3ea2c41639f81d99e526f527145f6c6d4a8f8ff46a52dd0
+size 211458
diff --git a/static/images/cards/temple.jpg b/static/images/cards/temple.jpg
new file mode 100644
index 0000000..e848e3e
--- /dev/null
+++ b/static/images/cards/temple.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c4a40cc9447acd1591f8612c9660270561fabf19f831a97296a0fc13768ca44
+size 167210
diff --git a/static/images/cards/the-earths-gift.jpg b/static/images/cards/the-earths-gift.jpg
new file mode 100644
index 0000000..7d3cb6c
--- /dev/null
+++ b/static/images/cards/the-earths-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e17b547fb31212ae80ffc9658334af036764712777c20a4b50f6725d20199dc7
+size 273903
diff --git a/static/images/cards/the-fields-gift.jpg b/static/images/cards/the-fields-gift.jpg
new file mode 100644
index 0000000..c7120cd
--- /dev/null
+++ b/static/images/cards/the-fields-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:600d34cc19a779c469f38d7f621324765b263c36115d5e930fb4ca274fd72ff0
+size 256215
diff --git a/static/images/cards/the-flames-gift.jpg b/static/images/cards/the-flames-gift.jpg
new file mode 100644
index 0000000..3132f20
--- /dev/null
+++ b/static/images/cards/the-flames-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:08892c7ffe7e2b3f333f8480eca53809748bfe45bdc1873e96a099d99944ee41
+size 286754
diff --git a/static/images/cards/the-forrests-gift.jpg b/static/images/cards/the-forrests-gift.jpg
new file mode 100644
index 0000000..d46032d
--- /dev/null
+++ b/static/images/cards/the-forrests-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c6853973a2c982b75e4ceb0c60c643269e7aaef98be4757d9811794ce857c8f2
+size 259410
diff --git a/static/images/cards/the-moons-gift.jpg b/static/images/cards/the-moons-gift.jpg
new file mode 100644
index 0000000..45e7f48
--- /dev/null
+++ b/static/images/cards/the-moons-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8eaa8a8099577160707ece704b14b099f622be4d8d64d0d6b97c2e910ac367de
+size 215595
diff --git a/static/images/cards/the-mountains-gift.jpg b/static/images/cards/the-mountains-gift.jpg
new file mode 100644
index 0000000..1f5f2a3
--- /dev/null
+++ b/static/images/cards/the-mountains-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2eee62c539eba832d7faef2b13cea15d0e612874e8fed6910d9458e61cd513a4
+size 220704
diff --git a/static/images/cards/the-rivers-gift.jpg b/static/images/cards/the-rivers-gift.jpg
new file mode 100644
index 0000000..1a152bc
--- /dev/null
+++ b/static/images/cards/the-rivers-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6daa2fc76db8585707bf40da5c18db4783db303554e6069d1169410ee45ddcd4
+size 280542
diff --git a/static/images/cards/the-seas-gift.jpg b/static/images/cards/the-seas-gift.jpg
new file mode 100644
index 0000000..328425b
--- /dev/null
+++ b/static/images/cards/the-seas-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8a51c097d6fc1f4b58ed7188cd8584f23f84119d16dc12f97f97ca27601f6e5a
+size 237117
diff --git a/static/images/cards/the-skys-gift.jpg b/static/images/cards/the-skys-gift.jpg
new file mode 100644
index 0000000..2c48782
--- /dev/null
+++ b/static/images/cards/the-skys-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f1ebeb161dae3290e21797738be887ee63b87f665a4767d59a272fff12348bac
+size 211646
diff --git a/static/images/cards/the-suns-gift.jpg b/static/images/cards/the-suns-gift.jpg
new file mode 100644
index 0000000..04e0168
--- /dev/null
+++ b/static/images/cards/the-suns-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:383691297bc86491165d1639f70c486b048c109beadf95ab3e4daa280423291d
+size 223438
diff --git a/static/images/cards/the-swamps-gift.jpg b/static/images/cards/the-swamps-gift.jpg
new file mode 100644
index 0000000..6161a1b
--- /dev/null
+++ b/static/images/cards/the-swamps-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ebb5c55c793767a9594d83006dae92c5e434aec1a90e1e1a1a0fd0491cc7d058
+size 227241
diff --git a/static/images/cards/the-winds-gift.jpg b/static/images/cards/the-winds-gift.jpg
new file mode 100644
index 0000000..59cea8f
--- /dev/null
+++ b/static/images/cards/the-winds-gift.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e71b2529d316c9b04c8a41862a6d17cc9982d984c932118a40da6721e5e15a1d
+size 243686
diff --git a/static/images/cards/thief.jpg b/static/images/cards/thief.jpg
new file mode 100644
index 0000000..0fe3fb9
--- /dev/null
+++ b/static/images/cards/thief.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6002815a20fd23fd399304aac8b5dba7d76fc7568b4b921cabf4aa87e975648
+size 128638
diff --git a/static/images/cards/throne-room.jpg b/static/images/cards/throne-room.jpg
new file mode 100644
index 0000000..0790371
--- /dev/null
+++ b/static/images/cards/throne-room.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d89de5e8032378ee8b01e494fda63436f5c572a5c35b349a69aad69ecb3a75b3
+size 196628
diff --git a/static/images/cards/tomb.jpg b/static/images/cards/tomb.jpg
new file mode 100644
index 0000000..ccc8207
--- /dev/null
+++ b/static/images/cards/tomb.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b42d76ab707c818627b3160013cbf88a158f015d91a174b6e4c1f353d34f622e
+size 217268
diff --git a/static/images/cards/tormentor.jpg b/static/images/cards/tormentor.jpg
new file mode 100644
index 0000000..d807d52
--- /dev/null
+++ b/static/images/cards/tormentor.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9ed688f6ffcaa6adc2bd1d990118da10ec1dc7fb1b546c489834dba928d09258
+size 197181
diff --git a/static/images/cards/torturer.jpg b/static/images/cards/torturer.jpg
new file mode 100644
index 0000000..f604a7d
--- /dev/null
+++ b/static/images/cards/torturer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9846281892200ee04ef2519aec31fa795ebffb383a4407b99423f16ef6e6da83
+size 207512
diff --git a/static/images/cards/tournament.jpg b/static/images/cards/tournament.jpg
new file mode 100644
index 0000000..67d896b
--- /dev/null
+++ b/static/images/cards/tournament.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:384c5902e5dcb73641cec0485389ce8c74895e41e4fa1db652a0a0556c9e1dc0
+size 207085
diff --git a/static/images/cards/tower.jpg b/static/images/cards/tower.jpg
new file mode 100644
index 0000000..8b79967
--- /dev/null
+++ b/static/images/cards/tower.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f9d1fa7c6ec5d9afbdf154ffd99fe32c7a743ae114a3c9fb64a247da7d9f5952
+size 265048
diff --git a/static/images/cards/tracker.jpg b/static/images/cards/tracker.jpg
new file mode 100644
index 0000000..3d69ea6
--- /dev/null
+++ b/static/images/cards/tracker.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:32f1618f3e6173612b38164310fe9491e0b56fa2f95063f612547acc45eb10de
+size 171962
diff --git a/static/images/cards/trade-route.jpg b/static/images/cards/trade-route.jpg
new file mode 100644
index 0000000..8cbf3af
--- /dev/null
+++ b/static/images/cards/trade-route.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ad3ce31d4bbb48df5bf57a6f63776d6d399434c0e1ccd8f36abf612276513007
+size 213379
diff --git a/static/images/cards/trade.jpg b/static/images/cards/trade.jpg
new file mode 100644
index 0000000..3444f1d
--- /dev/null
+++ b/static/images/cards/trade.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f91db26ec45df105cb68966153207ed86747ef401e2d8aa23452d60cfbe1b40
+size 234147
diff --git a/static/images/cards/trader.jpg b/static/images/cards/trader.jpg
new file mode 100644
index 0000000..be19ec3
--- /dev/null
+++ b/static/images/cards/trader.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:83e6bf54cb286dbb2bcd7b38a487b514bfaafdab3dfd6e97766753c59cfd1ef5
+size 215035
diff --git a/static/images/cards/trading-post.jpg b/static/images/cards/trading-post.jpg
new file mode 100644
index 0000000..0fffa48
--- /dev/null
+++ b/static/images/cards/trading-post.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ef3104f2a7da47d4b25847951117338938b1c43e43ccc92ba39d6bdac3ff5a72
+size 169684
diff --git a/static/images/cards/tragic-hero.jpg b/static/images/cards/tragic-hero.jpg
new file mode 100644
index 0000000..ad9f74f
--- /dev/null
+++ b/static/images/cards/tragic-hero.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:caf6828ccf7cac751a09f6d76c4c14c7822047a098b807bdffa2e22947447608
+size 185030
diff --git a/static/images/cards/training.jpg b/static/images/cards/training.jpg
new file mode 100644
index 0000000..b589f99
--- /dev/null
+++ b/static/images/cards/training.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b8865923df2cc10738ecc0bf34a4dd3c7054a0cfd0c51283423e87a9d015e2e4
+size 220877
diff --git a/static/images/cards/transmogrify.jpg b/static/images/cards/transmogrify.jpg
new file mode 100644
index 0000000..7b922b2
--- /dev/null
+++ b/static/images/cards/transmogrify.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07cb245da99928c2466130791401c3979d998eec49a125696d78b4ec860350dc
+size 186758
diff --git a/static/images/cards/transmute.jpg b/static/images/cards/transmute.jpg
new file mode 100644
index 0000000..02ffc79
--- /dev/null
+++ b/static/images/cards/transmute.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2880a043c81ea151f95f7bf0bba0bc1923a46f11ef77771c320e92e7f656a12
+size 185970
diff --git a/static/images/cards/travelling-fair.jpg b/static/images/cards/travelling-fair.jpg
new file mode 100644
index 0000000..bae5303
--- /dev/null
+++ b/static/images/cards/travelling-fair.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d58df63ab235fb5813248df90528dd741004564a56b457931bbe570605770318
+size 251879
diff --git a/static/images/cards/treasure-chest.jpg b/static/images/cards/treasure-chest.jpg
new file mode 100644
index 0000000..90fb0a7
--- /dev/null
+++ b/static/images/cards/treasure-chest.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:38331e9a93f088601520435a162b856e67811c8630edcddafc5c0ac548843a9f
+size 214249
diff --git a/static/images/cards/treasure-hunter.jpg b/static/images/cards/treasure-hunter.jpg
new file mode 100644
index 0000000..c962cec
--- /dev/null
+++ b/static/images/cards/treasure-hunter.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:442fc414f90c53b4bb21438797365e094a7a713614d765ca7d227286cd757586
+size 184700
diff --git a/static/images/cards/treasure-map.jpg b/static/images/cards/treasure-map.jpg
new file mode 100644
index 0000000..e46aec7
--- /dev/null
+++ b/static/images/cards/treasure-map.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b92a14bf1356a711f50c9a7fd41ac65db0e0982cab06fb9c192e25c663b817b2
+size 186150
diff --git a/static/images/cards/treasure.jpg b/static/images/cards/treasure.jpg
new file mode 100644
index 0000000..ea1140c
--- /dev/null
+++ b/static/images/cards/treasure.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7769284c5ffa10f729fdd7d3d7cd6c853a905a1c69eb3b7252fe4a05aa1967d9
+size 197488
diff --git a/static/images/cards/treasurer.jpg b/static/images/cards/treasurer.jpg
new file mode 100644
index 0000000..dc70941
--- /dev/null
+++ b/static/images/cards/treasurer.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:36f566584cb8a45b26536123c2c1d8556850005209f08f2ae25e2a5bfd5eb1a7
+size 171837
diff --git a/static/images/cards/treasury.jpg b/static/images/cards/treasury.jpg
new file mode 100644
index 0000000..e792d67
--- /dev/null
+++ b/static/images/cards/treasury.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:709402692f71b7d94e903bc4beb47c9804ae3f127909af8d8ee923f34f76f16b
+size 210677
diff --git a/static/images/cards/tribute.jpg b/static/images/cards/tribute.jpg
new file mode 100644
index 0000000..30d9aec
--- /dev/null
+++ b/static/images/cards/tribute.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:434ddb670c4e24a9b2c3aee2b0ceca57bb69ecdcb9183b73e3e96155d65757b9
+size 122539
diff --git a/static/images/cards/triumph.jpg b/static/images/cards/triumph.jpg
new file mode 100644
index 0000000..64bbf3b
--- /dev/null
+++ b/static/images/cards/triumph.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3464487c86adc4403e6f0ba54913089bd840ff6e6e0a619d3899087ea9fd6e67
+size 299103
diff --git a/static/images/cards/triumphal-arch.jpg b/static/images/cards/triumphal-arch.jpg
new file mode 100644
index 0000000..60f56d8
--- /dev/null
+++ b/static/images/cards/triumphal-arch.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:dff48b3bad61c116e50f3614560e77163f9c52e06967f4c97d33e9ecac8c3fa5
+size 280588
diff --git a/static/images/cards/trusty-steed.jpg b/static/images/cards/trusty-steed.jpg
new file mode 100644
index 0000000..a46f846
--- /dev/null
+++ b/static/images/cards/trusty-steed.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5aafb48222aa69cb9e504ef6360931cce6efb72f5116c62604178923d99cb9c4
+size 172730
diff --git a/static/images/cards/tunnel.jpg b/static/images/cards/tunnel.jpg
new file mode 100644
index 0000000..13338f7
--- /dev/null
+++ b/static/images/cards/tunnel.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:464fc15a27ee9b37b1441483e7e1fc499fc38d1533bad23db4e4ae1bdaf270d7
+size 168697
diff --git a/static/images/cards/twice-miserable.jpg b/static/images/cards/twice-miserable.jpg
new file mode 100644
index 0000000..ef25f33
--- /dev/null
+++ b/static/images/cards/twice-miserable.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7520e59c6af23fce7500bfbc16fe4f5857102b10bbdf634333b9ce3dbc660f3a
+size 153250
diff --git a/static/images/cards/university.jpg b/static/images/cards/university.jpg
new file mode 100644
index 0000000..ad0c723
--- /dev/null
+++ b/static/images/cards/university.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:863dabac68ca2ab543da84215329e2016321242d882ad57f0a5a54b5b1488ce2
+size 169928
diff --git a/static/images/cards/upgrade.jpg b/static/images/cards/upgrade.jpg
new file mode 100644
index 0000000..87c5c5a
--- /dev/null
+++ b/static/images/cards/upgrade.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:309d09b84ed90fe49314536854e1411b3d12fb1cb6a6035be2aeaa5c6180f439
+size 161496
diff --git a/static/images/cards/urchin.jpg b/static/images/cards/urchin.jpg
new file mode 100644
index 0000000..0907e34
--- /dev/null
+++ b/static/images/cards/urchin.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:efdfed0b3daa9417c0f48761da6b88b518977abce7e0c3457fe8b1ffa2a5ab86
+size 188877
diff --git a/static/images/cards/vagrant.jpg b/static/images/cards/vagrant.jpg
new file mode 100644
index 0000000..1389122
--- /dev/null
+++ b/static/images/cards/vagrant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b2980dbf8adba2e233055af397a798cb461e41a4c9a43284ff2bb56c2d2bea0
+size 179059
diff --git a/static/images/cards/vampire.jpg b/static/images/cards/vampire.jpg
new file mode 100644
index 0000000..8547e5e
--- /dev/null
+++ b/static/images/cards/vampire.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e173a5d4fa671416f4df9ab74f209a1b8f4e427dedbf51b41a94963bcc1d9ac2
+size 159741
diff --git a/static/images/cards/vassal.jpg b/static/images/cards/vassal.jpg
new file mode 100644
index 0000000..afbe1ff
--- /dev/null
+++ b/static/images/cards/vassal.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:35f42f83f1015a765bfba2cbfd05ebb78b434034e318ffe16da8462262b4e02e
+size 165689
diff --git a/static/images/cards/vault.jpg b/static/images/cards/vault.jpg
new file mode 100644
index 0000000..6de6dd8
--- /dev/null
+++ b/static/images/cards/vault.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0cfc865a607317aa9edc07de87faefb7714cad222e89c4980fecf2a5610f6b66
+size 187262
diff --git a/static/images/cards/venture.jpg b/static/images/cards/venture.jpg
new file mode 100644
index 0000000..c8f892a
--- /dev/null
+++ b/static/images/cards/venture.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:97b158f6f73cf30dd63a696034dd98d3944609e352e10dbff143584c619f8ac5
+size 194412
diff --git a/static/images/cards/villa.jpg b/static/images/cards/villa.jpg
new file mode 100644
index 0000000..efdd2cd
--- /dev/null
+++ b/static/images/cards/villa.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2e98e8aff6c5ff7854629f2ef83a73f97c197315768995de6bfbb1e513f77af8
+size 186913
diff --git a/static/images/cards/village.jpg b/static/images/cards/village.jpg
new file mode 100644
index 0000000..f750553
--- /dev/null
+++ b/static/images/cards/village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:830c0d16d5d3127f572a1bfcbb41aaf1aa7608099444e56c9e33c254296d3225
+size 159657
diff --git a/static/images/cards/villain.jpg b/static/images/cards/villain.jpg
new file mode 100644
index 0000000..75c769d
--- /dev/null
+++ b/static/images/cards/villain.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:610ed1e48ca3deddde6e0f66148f6d55cfa00ca2bfce8a3d99c4de0f237165a9
+size 154049
diff --git a/static/images/cards/vineyard.jpg b/static/images/cards/vineyard.jpg
new file mode 100644
index 0000000..b0f1276
--- /dev/null
+++ b/static/images/cards/vineyard.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6c713125a1f98314fdc8e6ec6c448026bc6d15573eb47ecfec388ef067f145b
+size 182484
diff --git a/static/images/cards/wall.jpg b/static/images/cards/wall.jpg
new file mode 100644
index 0000000..5fced14
--- /dev/null
+++ b/static/images/cards/wall.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ba0e15c6b2a2a0261a5f5da7f4135927a0baf77312f58b55084ca8aafc0bcad
+size 261456
diff --git a/static/images/cards/walled-village.jpg b/static/images/cards/walled-village.jpg
new file mode 100644
index 0000000..ba771c7
--- /dev/null
+++ b/static/images/cards/walled-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43cbf8e62ad2477ba2b36134e63810853b1a65bc876df5fc48f54724ae83a0da
+size 205908
diff --git a/static/images/cards/wandering-minstrel.jpg b/static/images/cards/wandering-minstrel.jpg
new file mode 100644
index 0000000..2d1d3fa
--- /dev/null
+++ b/static/images/cards/wandering-minstrel.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:37bbfd016ac0575e9fa1a6447beca1362db6f5dbc6777da920c90f645f6333b7
+size 214175
diff --git a/static/images/cards/war.jpg b/static/images/cards/war.jpg
new file mode 100644
index 0000000..77c7dbb
--- /dev/null
+++ b/static/images/cards/war.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:95f2a224255c0b3619983ef4802ca675ccc1bf2b09a99b00bf52576898042046
+size 270803
diff --git a/static/images/cards/warehouse.jpg b/static/images/cards/warehouse.jpg
new file mode 100644
index 0000000..e775804
--- /dev/null
+++ b/static/images/cards/warehouse.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0787c11d512ccb04a6972696f74e81f0665f079c48cc0e8e739b30734164aa5a
+size 164362
diff --git a/static/images/cards/warrior.jpg b/static/images/cards/warrior.jpg
new file mode 100644
index 0000000..cf189a6
--- /dev/null
+++ b/static/images/cards/warrior.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0378dbbe56434c6eb5a9a802c35441f73a1638e56febf05dbe6aa7f7f03d4647
+size 202542
diff --git a/static/images/cards/watchtower.jpg b/static/images/cards/watchtower.jpg
new file mode 100644
index 0000000..3fcef55
--- /dev/null
+++ b/static/images/cards/watchtower.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7062f1339182ebb0bd9feb5c4065f5717ca6bafbe0bfa93abb904f9c240cbe68
+size 199538
diff --git a/static/images/cards/wedding.jpg b/static/images/cards/wedding.jpg
new file mode 100644
index 0000000..be5c4af
--- /dev/null
+++ b/static/images/cards/wedding.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:add7b02c799e1504848d78b900c45c7d4aa2f09d7f2ec4672b00533ec13e14fd
+size 230964
diff --git a/static/images/cards/werewolf.jpg b/static/images/cards/werewolf.jpg
new file mode 100644
index 0000000..120d282
--- /dev/null
+++ b/static/images/cards/werewolf.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a9a56d374a204239fac765ac6be3e5415ee2d245e32d0fe6bc4f302bc59d58a8
+size 141815
diff --git a/static/images/cards/wharf.jpg b/static/images/cards/wharf.jpg
new file mode 100644
index 0000000..14c9acf
--- /dev/null
+++ b/static/images/cards/wharf.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:87ca3f2ea062ac315d90e92b8607a5c0d89581c591f8e8b4743f2d2e32e32687
+size 167338
diff --git a/static/images/cards/wild-hunt.jpg b/static/images/cards/wild-hunt.jpg
new file mode 100644
index 0000000..25082c2
--- /dev/null
+++ b/static/images/cards/wild-hunt.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b2d8abbb31419fda56e2b97c6e4df4ba58332072c1810ab4fd66f5ec14c9e9f
+size 194047
diff --git a/static/images/cards/will-o-wisp.jpg b/static/images/cards/will-o-wisp.jpg
new file mode 100644
index 0000000..5eae195
--- /dev/null
+++ b/static/images/cards/will-o-wisp.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eb11f36ca675feba103abf928777581813899611c70aa175022b37afbadec9a2
+size 165676
diff --git a/static/images/cards/windfall.jpg b/static/images/cards/windfall.jpg
new file mode 100644
index 0000000..0be4dc0
--- /dev/null
+++ b/static/images/cards/windfall.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:105ff4e53e942c68e9053f4f8df4010b3696af37cffd24e5cea0e9d78272af01
+size 248809
diff --git a/static/images/cards/wine-merchant.jpg b/static/images/cards/wine-merchant.jpg
new file mode 100644
index 0000000..3a57af7
--- /dev/null
+++ b/static/images/cards/wine-merchant.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e74664f652fc62315f24a1144db32f75dd96e6cbddff76b593f1d05fefae5a47
+size 190783
diff --git a/static/images/cards/wish.jpg b/static/images/cards/wish.jpg
new file mode 100644
index 0000000..4a4f498
--- /dev/null
+++ b/static/images/cards/wish.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ff233df672eedccf2074e2a455aad806924952a442eea0ec9b6e20ebf6d49aaa
+size 169041
diff --git a/static/images/cards/wishing-well.jpg b/static/images/cards/wishing-well.jpg
new file mode 100644
index 0000000..a205a3c
--- /dev/null
+++ b/static/images/cards/wishing-well.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4353fe0e8fef1a768306f5c13498a974e34b717a208227fd47c3dc6a4103d6de
+size 177735
diff --git a/static/images/cards/witch.jpg b/static/images/cards/witch.jpg
new file mode 100644
index 0000000..9991120
--- /dev/null
+++ b/static/images/cards/witch.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90b016864d6435c3e78d67878e9839c7741ebe817e770d4b0fb1036aa61ce792
+size 154191
diff --git a/static/images/cards/wolf-den.jpg b/static/images/cards/wolf-den.jpg
new file mode 100644
index 0000000..5140fb4
--- /dev/null
+++ b/static/images/cards/wolf-den.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b1d0f89288a700aa0a956baaea318ac0a3224ae20912376eef200b2d679ebb2
+size 243640
diff --git a/static/images/cards/woodcutter.jpg b/static/images/cards/woodcutter.jpg
new file mode 100644
index 0000000..aa7166b
--- /dev/null
+++ b/static/images/cards/woodcutter.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf991b9730d4c1a07a8b93a7263d4d5fef29758a06387ebb3309c44db761ba7d
+size 108355
diff --git a/static/images/cards/workers-village.jpg b/static/images/cards/workers-village.jpg
new file mode 100644
index 0000000..22af60a
--- /dev/null
+++ b/static/images/cards/workers-village.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3bc3a4dde6566aa3ead145463d69e7f417ae64b737584e39fd972934fb8a71d9
+size 172012
diff --git a/static/images/cards/workshop.jpg b/static/images/cards/workshop.jpg
new file mode 100644
index 0000000..c7ad48a
--- /dev/null
+++ b/static/images/cards/workshop.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8c5e6383f31a99fe99adb03559d1dc280138b8639c2217f74ecfec99188390bc
+size 167187
diff --git a/static/images/cards/young-witch.jpg b/static/images/cards/young-witch.jpg
new file mode 100644
index 0000000..5db7f65
--- /dev/null
+++ b/static/images/cards/young-witch.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d3429691ded748031384d752dcf967dae31f2f2e5ce0b9a3cd3b9a312b5cb43d
+size 182729
diff --git a/static/images/cards/zombie-apprentice.jpg b/static/images/cards/zombie-apprentice.jpg
new file mode 100644
index 0000000..a46ab10
--- /dev/null
+++ b/static/images/cards/zombie-apprentice.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a41c39af1d622973b810cb540a1d1a48555f53e05ea727f6ca3473198e637314
+size 159214
diff --git a/static/images/cards/zombie-mason.jpg b/static/images/cards/zombie-mason.jpg
new file mode 100644
index 0000000..0f547f2
--- /dev/null
+++ b/static/images/cards/zombie-mason.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e1de4b6e4009bbf8a83a9593f8691eb24108025d80d240429bd51a8f854167bd
+size 172939
diff --git a/static/images/cards/zombie-spy.jpg b/static/images/cards/zombie-spy.jpg
new file mode 100644
index 0000000..6c839f8
--- /dev/null
+++ b/static/images/cards/zombie-spy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8f83a03fddac899428eec2351ebdb93a216334e5217cc07a3720ec855d917f08
+size 170185
diff --git a/static/index.html b/static/index.html
new file mode 100644
index 0000000..5d051dd
--- /dev/null
+++ b/static/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+ DnD
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/main.css b/static/main.css
new file mode 100644
index 0000000..abbdb36
--- /dev/null
+++ b/static/main.css
@@ -0,0 +1,24 @@
+body {
+ margin: 0;
+ padding: 0;
+ background-color: gainsboro;
+}
+
+#chat {
+ height: 200px;
+ list-style: none;
+ overflow-y: scroll;
+ padding: 0;
+ margin: 0;
+}
+
+#chat_input,
+#chat_input:focus {
+ padding: 2px;
+ /* border-top: 1px solid black; */
+ margin: 0;
+ width: 100%;
+ border: 0;
+ box-sizing: border-box;
+ outline: none;
+}
diff --git a/static/mithril.js b/static/mithril.js
new file mode 100644
index 0000000..377e0a5
--- /dev/null
+++ b/static/mithril.js
@@ -0,0 +1,1842 @@
+;(function() {
+"use strict"
+function Vnode(tag, key, attrs0, children0, text, dom) {
+ return {tag: tag, key: key, attrs: attrs0, children: children0, text: text, dom: dom, domSize: undefined, state: undefined, events: undefined, instance: undefined}
+}
+Vnode.normalize = function(node) {
+ if (Array.isArray(node)) return Vnode("[", undefined, undefined, Vnode.normalizeChildren(node), undefined, undefined)
+ if (node == null || typeof node === "boolean") return null
+ if (typeof node === "object") return node
+ return Vnode("#", undefined, undefined, String(node), undefined, undefined)
+}
+Vnode.normalizeChildren = function(input) {
+ var children0 = []
+ if (input.length) {
+ var isKeyed = input[0] != null && input[0].key != null
+ // Note: this is a *very* perf-sensitive check.
+ // Fun fact: merging the loop like this is somehow faster than splitting
+ // it, noticeably so.
+ for (var i = 1; i < input.length; i++) {
+ if ((input[i] != null && input[i].key != null) !== isKeyed) {
+ throw new TypeError("Vnodes must either always have keys or never have keys!")
+ }
+ }
+ for (var i = 0; i < input.length; i++) {
+ children0[i] = Vnode.normalize(input[i])
+ }
+ }
+ return children0
+}
+// Call via `hyperscriptVnode0.apply(startOffset, arguments)`
+//
+// The reason I do it this way, forwarding the arguments and passing the start
+// offset in `this`, is so I don't have to create a temporary array in a
+// performance-critical path.
+//
+// In native ES6, I'd instead add a final `...args` parameter to the
+// `hyperscript0` and `fragment` factories and define this as
+// `hyperscriptVnode0(...args)`, since modern engines do optimize that away. But
+// ES5 (what Mithril requires thanks to IE support) doesn't give me that luxury,
+// and engines aren't nearly intelligent enough to do either of these:
+//
+// 1. Elide the allocation for `[].slice.call(arguments, 1)` when it's passed to
+// another function only to be indexed.
+// 2. Elide an `arguments` allocation when it's passed to any function other
+// than `Function.prototype.apply` or `Reflect.apply`.
+//
+// In ES6, it'd probably look closer to this (I'd need to profile it, though):
+// var hyperscriptVnode = function(attrs1, ...children1) {
+// if (attrs1 == null || typeof attrs1 === "object" && attrs1.tag == null && !Array.isArray(attrs1)) {
+// if (children1.length === 1 && Array.isArray(children1[0])) children1 = children1[0]
+// } else {
+// children1 = children1.length === 0 && Array.isArray(attrs1) ? attrs1 : [attrs1, ...children1]
+// attrs1 = undefined
+// }
+//
+// if (attrs1 == null) attrs1 = {}
+// return Vnode("", attrs1.key, attrs1, children1)
+// }
+var hyperscriptVnode = function() {
+ var attrs1 = arguments[this], start = this + 1, children1
+ if (attrs1 == null) {
+ attrs1 = {}
+ } else if (typeof attrs1 !== "object" || attrs1.tag != null || Array.isArray(attrs1)) {
+ attrs1 = {}
+ start = this
+ }
+ if (arguments.length === start + 1) {
+ children1 = arguments[start]
+ if (!Array.isArray(children1)) children1 = [children1]
+ } else {
+ children1 = []
+ while (start < arguments.length) children1.push(arguments[start++])
+ }
+ return Vnode("", attrs1.key, attrs1, children1)
+}
+var selectorParser = /(?:(^|#|\.)([^#\.\[\]]+))|(\[(.+?)(?:\s*=\s*("|'|)((?:\\["'\]]|.)*?)\5)?\])/g
+var selectorCache = {}
+var hasOwn = {}.hasOwnProperty
+function isEmpty(object) {
+ for (var key in object) if (hasOwn.call(object, key)) return false
+ return true
+}
+function compileSelector(selector) {
+ var match, tag = "div", classes = [], attrs = {}
+ while (match = selectorParser.exec(selector)) {
+ var type = match[1], value = match[2]
+ if (type === "" && value !== "") tag = value
+ else if (type === "#") attrs.id = value
+ else if (type === ".") classes.push(value)
+ else if (match[3][0] === "[") {
+ var attrValue = match[6]
+ if (attrValue) attrValue = attrValue.replace(/\\(["'])/g, "$1").replace(/\\\\/g, "\\")
+ if (match[4] === "class") classes.push(attrValue)
+ else attrs[match[4]] = attrValue === "" ? attrValue : attrValue || true
+ }
+ }
+ if (classes.length > 0) attrs.className = classes.join(" ")
+ return selectorCache[selector] = {tag: tag, attrs: attrs}
+}
+function execSelector(state, vnode) {
+ var attrs = vnode.attrs
+ var children = Vnode.normalizeChildren(vnode.children)
+ var hasClass = hasOwn.call(attrs, "class")
+ var className = hasClass ? attrs.class : attrs.className
+ vnode.tag = state.tag
+ vnode.attrs = null
+ vnode.children = undefined
+ if (!isEmpty(state.attrs) && !isEmpty(attrs)) {
+ var newAttrs = {}
+ for (var key in attrs) {
+ if (hasOwn.call(attrs, key)) newAttrs[key] = attrs[key]
+ }
+ attrs = newAttrs
+ }
+ for (var key in state.attrs) {
+ if (hasOwn.call(state.attrs, key) && key !== "className" && !hasOwn.call(attrs, key)){
+ attrs[key] = state.attrs[key]
+ }
+ }
+ if (className != null || state.attrs.className != null) attrs.className =
+ className != null
+ ? state.attrs.className != null
+ ? String(state.attrs.className) + " " + String(className)
+ : className
+ : state.attrs.className != null
+ ? state.attrs.className
+ : null
+ if (hasClass) attrs.class = null
+ for (var key in attrs) {
+ if (hasOwn.call(attrs, key) && key !== "key") {
+ vnode.attrs = attrs
+ break
+ }
+ }
+ if (Array.isArray(children) && children.length === 1 && children[0] != null && children[0].tag === "#") {
+ vnode.text = children[0].children
+ } else {
+ vnode.children = children
+ }
+ return vnode
+}
+function hyperscript(selector) {
+ if (selector == null || typeof selector !== "string" && typeof selector !== "function" && typeof selector.view !== "function") {
+ throw Error("The selector must be either a string or a component.");
+ }
+ var vnode = hyperscriptVnode.apply(1, arguments)
+ if (typeof selector === "string") {
+ vnode.children = Vnode.normalizeChildren(vnode.children)
+ if (selector !== "[") return execSelector(selectorCache[selector] || compileSelector(selector), vnode)
+ }
+ vnode.tag = selector
+ return vnode
+}
+hyperscript.trust = function(html) {
+ if (html == null) html = ""
+ return Vnode("<", undefined, undefined, html, undefined, undefined)
+}
+hyperscript.fragment = function() {
+ var vnode2 = hyperscriptVnode.apply(0, arguments)
+ vnode2.tag = "["
+ vnode2.children = Vnode.normalizeChildren(vnode2.children)
+ return vnode2
+}
+/** @constructor */
+var PromisePolyfill = function(executor) {
+ if (!(this instanceof PromisePolyfill)) throw new Error("Promise must be called with `new`")
+ if (typeof executor !== "function") throw new TypeError("executor must be a function")
+ var self = this, resolvers = [], rejectors = [], resolveCurrent = handler(resolvers, true), rejectCurrent = handler(rejectors, false)
+ var instance = self._instance = {resolvers: resolvers, rejectors: rejectors}
+ var callAsync = typeof setImmediate === "function" ? setImmediate : setTimeout
+ function handler(list, shouldAbsorb) {
+ return function execute(value) {
+ var then
+ try {
+ if (shouldAbsorb && value != null && (typeof value === "object" || typeof value === "function") && typeof (then = value.then) === "function") {
+ if (value === self) throw new TypeError("Promise can't be resolved w/ itself")
+ executeOnce(then.bind(value))
+ }
+ else {
+ callAsync(function() {
+ if (!shouldAbsorb && list.length === 0) console.error("Possible unhandled promise rejection:", value)
+ for (var i = 0; i < list.length; i++) list[i](value)
+ resolvers.length = 0, rejectors.length = 0
+ instance.state = shouldAbsorb
+ instance.retry = function() {execute(value)}
+ })
+ }
+ }
+ catch (e) {
+ rejectCurrent(e)
+ }
+ }
+ }
+ function executeOnce(then) {
+ var runs = 0
+ function run(fn) {
+ return function(value) {
+ if (runs++ > 0) return
+ fn(value)
+ }
+ }
+ var onerror = run(rejectCurrent)
+ try {then(run(resolveCurrent), onerror)} catch (e) {onerror(e)}
+ }
+ executeOnce(executor)
+}
+PromisePolyfill.prototype.then = function(onFulfilled, onRejection) {
+ var self = this, instance = self._instance
+ function handle(callback, list, next, state) {
+ list.push(function(value) {
+ if (typeof callback !== "function") next(value)
+ else try {resolveNext(callback(value))} catch (e) {if (rejectNext) rejectNext(e)}
+ })
+ if (typeof instance.retry === "function" && state === instance.state) instance.retry()
+ }
+ var resolveNext, rejectNext
+ var promise = new PromisePolyfill(function(resolve, reject) {resolveNext = resolve, rejectNext = reject})
+ handle(onFulfilled, instance.resolvers, resolveNext, true), handle(onRejection, instance.rejectors, rejectNext, false)
+ return promise
+}
+PromisePolyfill.prototype.catch = function(onRejection) {
+ return this.then(null, onRejection)
+}
+PromisePolyfill.prototype.finally = function(callback) {
+ return this.then(
+ function(value) {
+ return PromisePolyfill.resolve(callback()).then(function() {
+ return value
+ })
+ },
+ function(reason) {
+ return PromisePolyfill.resolve(callback()).then(function() {
+ return PromisePolyfill.reject(reason);
+ })
+ }
+ )
+}
+PromisePolyfill.resolve = function(value) {
+ if (value instanceof PromisePolyfill) return value
+ return new PromisePolyfill(function(resolve) {resolve(value)})
+}
+PromisePolyfill.reject = function(value) {
+ return new PromisePolyfill(function(resolve, reject) {reject(value)})
+}
+PromisePolyfill.all = function(list) {
+ return new PromisePolyfill(function(resolve, reject) {
+ var total = list.length, count = 0, values = []
+ if (list.length === 0) resolve([])
+ else for (var i = 0; i < list.length; i++) {
+ (function(i) {
+ function consume(value) {
+ count++
+ values[i] = value
+ if (count === total) resolve(values)
+ }
+ if (list[i] != null && (typeof list[i] === "object" || typeof list[i] === "function") && typeof list[i].then === "function") {
+ list[i].then(consume, reject)
+ }
+ else consume(list[i])
+ })(i)
+ }
+ })
+}
+PromisePolyfill.race = function(list) {
+ return new PromisePolyfill(function(resolve, reject) {
+ for (var i = 0; i < list.length; i++) {
+ list[i].then(resolve, reject)
+ }
+ })
+}
+if (typeof window !== "undefined") {
+ if (typeof window.Promise === "undefined") {
+ window.Promise = PromisePolyfill
+ } else if (!window.Promise.prototype.finally) {
+ window.Promise.prototype.finally = PromisePolyfill.prototype.finally
+ }
+ var PromisePolyfill = window.Promise
+} else if (typeof global !== "undefined") {
+ if (typeof global.Promise === "undefined") {
+ global.Promise = PromisePolyfill
+ } else if (!global.Promise.prototype.finally) {
+ global.Promise.prototype.finally = PromisePolyfill.prototype.finally
+ }
+ var PromisePolyfill = global.Promise
+} else {
+}
+var _12 = function($window) {
+ var $doc = $window && $window.document
+ var currentRedraw
+ var nameSpace = {
+ svg: "http://www.w3.org/2000/svg",
+ math: "http://www.w3.org/1998/Math/MathML"
+ }
+ function getNameSpace(vnode3) {
+ return vnode3.attrs && vnode3.attrs.xmlns || nameSpace[vnode3.tag]
+ }
+ //sanity check to discourage people from doing `vnode3.state = ...`
+ function checkState(vnode3, original) {
+ if (vnode3.state !== original) throw new Error("`vnode.state` must not be modified")
+ }
+ //Note: the hook is passed as the `this` argument to allow proxying the
+ //arguments without requiring a full array allocation to do so. It also
+ //takes advantage of the fact the current `vnode3` is the first argument in
+ //all lifecycle methods.
+ function callHook(vnode3) {
+ var original = vnode3.state
+ try {
+ return this.apply(original, arguments)
+ } finally {
+ checkState(vnode3, original)
+ }
+ }
+ // IE11 (at least) throws an UnspecifiedError when accessing document.activeElement when
+ // inside an iframe. Catch and swallow this error, and heavy-handidly return null.
+ function activeElement() {
+ try {
+ return $doc.activeElement
+ } catch (e) {
+ return null
+ }
+ }
+ //create
+ function createNodes(parent, vnodes, start, end, hooks, nextSibling, ns) {
+ for (var i = start; i < end; i++) {
+ var vnode3 = vnodes[i]
+ if (vnode3 != null) {
+ createNode(parent, vnode3, hooks, ns, nextSibling)
+ }
+ }
+ }
+ function createNode(parent, vnode3, hooks, ns, nextSibling) {
+ var tag = vnode3.tag
+ if (typeof tag === "string") {
+ vnode3.state = {}
+ if (vnode3.attrs != null) initLifecycle(vnode3.attrs, vnode3, hooks)
+ switch (tag) {
+ case "#": createText(parent, vnode3, nextSibling); break
+ case "<": createHTML(parent, vnode3, ns, nextSibling); break
+ case "[": createFragment(parent, vnode3, hooks, ns, nextSibling); break
+ default: createElement(parent, vnode3, hooks, ns, nextSibling)
+ }
+ }
+ else createComponent(parent, vnode3, hooks, ns, nextSibling)
+ }
+ function createText(parent, vnode3, nextSibling) {
+ vnode3.dom = $doc.createTextNode(vnode3.children)
+ insertNode(parent, vnode3.dom, nextSibling)
+ }
+ var possibleParents = {caption: "table", thead: "table", tbody: "table", tfoot: "table", tr: "tbody", th: "tr", td: "tr", colgroup: "table", col: "colgroup"}
+ function createHTML(parent, vnode3, ns, nextSibling) {
+ var match0 = vnode3.children.match(/^\s*?<(\w+)/im) || []
+ // not using the proper parent makes the child element(s) vanish.
+ // var div = document.createElement("div")
+ // div.innerHTML = "i | j | "
+ // console.log(div.innerHTML)
+ // --> "ij", no in sight.
+ var temp = $doc.createElement(possibleParents[match0[1]] || "div")
+ if (ns === "http://www.w3.org/2000/svg") {
+ temp.innerHTML = ""
+ temp = temp.firstChild
+ } else {
+ temp.innerHTML = vnode3.children
+ }
+ vnode3.dom = temp.firstChild
+ vnode3.domSize = temp.childNodes.length
+ // Capture nodes to remove, so we don't confuse them.
+ vnode3.instance = []
+ var fragment = $doc.createDocumentFragment()
+ var child
+ while (child = temp.firstChild) {
+ vnode3.instance.push(child)
+ fragment.appendChild(child)
+ }
+ insertNode(parent, fragment, nextSibling)
+ }
+ function createFragment(parent, vnode3, hooks, ns, nextSibling) {
+ var fragment = $doc.createDocumentFragment()
+ if (vnode3.children != null) {
+ var children3 = vnode3.children
+ createNodes(fragment, children3, 0, children3.length, hooks, null, ns)
+ }
+ vnode3.dom = fragment.firstChild
+ vnode3.domSize = fragment.childNodes.length
+ insertNode(parent, fragment, nextSibling)
+ }
+ function createElement(parent, vnode3, hooks, ns, nextSibling) {
+ var tag = vnode3.tag
+ var attrs2 = vnode3.attrs
+ var is = attrs2 && attrs2.is
+ ns = getNameSpace(vnode3) || ns
+ var element = ns ?
+ is ? $doc.createElementNS(ns, tag, {is: is}) : $doc.createElementNS(ns, tag) :
+ is ? $doc.createElement(tag, {is: is}) : $doc.createElement(tag)
+ vnode3.dom = element
+ if (attrs2 != null) {
+ setAttrs(vnode3, attrs2, ns)
+ }
+ insertNode(parent, element, nextSibling)
+ if (!maybeSetContentEditable(vnode3)) {
+ if (vnode3.text != null) {
+ if (vnode3.text !== "") element.textContent = vnode3.text
+ else vnode3.children = [Vnode("#", undefined, undefined, vnode3.text, undefined, undefined)]
+ }
+ if (vnode3.children != null) {
+ var children3 = vnode3.children
+ createNodes(element, children3, 0, children3.length, hooks, null, ns)
+ if (vnode3.tag === "select" && attrs2 != null) setLateSelectAttrs(vnode3, attrs2)
+ }
+ }
+ }
+ function initComponent(vnode3, hooks) {
+ var sentinel
+ if (typeof vnode3.tag.view === "function") {
+ vnode3.state = Object.create(vnode3.tag)
+ sentinel = vnode3.state.view
+ if (sentinel.$$reentrantLock$$ != null) return
+ sentinel.$$reentrantLock$$ = true
+ } else {
+ vnode3.state = void 0
+ sentinel = vnode3.tag
+ if (sentinel.$$reentrantLock$$ != null) return
+ sentinel.$$reentrantLock$$ = true
+ vnode3.state = (vnode3.tag.prototype != null && typeof vnode3.tag.prototype.view === "function") ? new vnode3.tag(vnode3) : vnode3.tag(vnode3)
+ }
+ initLifecycle(vnode3.state, vnode3, hooks)
+ if (vnode3.attrs != null) initLifecycle(vnode3.attrs, vnode3, hooks)
+ vnode3.instance = Vnode.normalize(callHook.call(vnode3.state.view, vnode3))
+ if (vnode3.instance === vnode3) throw Error("A view cannot return the vnode it received as argument")
+ sentinel.$$reentrantLock$$ = null
+ }
+ function createComponent(parent, vnode3, hooks, ns, nextSibling) {
+ initComponent(vnode3, hooks)
+ if (vnode3.instance != null) {
+ createNode(parent, vnode3.instance, hooks, ns, nextSibling)
+ vnode3.dom = vnode3.instance.dom
+ vnode3.domSize = vnode3.dom != null ? vnode3.instance.domSize : 0
+ }
+ else {
+ vnode3.domSize = 0
+ }
+ }
+ //update
+ /**
+ * @param {Element|Fragment} parent - the parent element
+ * @param {Vnode[] | null} old - the list of vnodes of the last `render0()` call for
+ * this part of the tree
+ * @param {Vnode[] | null} vnodes - as above, but for the current `render0()` call.
+ * @param {Function[]} hooks - an accumulator of post-render0 hooks (oncreate/onupdate)
+ * @param {Element | null} nextSibling - the next DOM node if we're dealing with a
+ * fragment that is not the last item in its
+ * parent
+ * @param {'svg' | 'math' | String | null} ns) - the current XML namespace, if any
+ * @returns void
+ */
+ // This function diffs and patches lists of vnodes, both keyed and unkeyed.
+ //
+ // We will:
+ //
+ // 1. describe its general structure
+ // 2. focus on the diff algorithm optimizations
+ // 3. discuss DOM node operations.
+ // ## Overview:
+ //
+ // The updateNodes() function:
+ // - deals with trivial cases
+ // - determines whether the lists are keyed or unkeyed based on the first non-null node
+ // of each list.
+ // - diffs them and patches the DOM if needed (that's the brunt of the code)
+ // - manages the leftovers: after diffing, are there:
+ // - old nodes left to remove?
+ // - new nodes to insert?
+ // deal with them!
+ //
+ // The lists are only iterated over once, with an exception for the nodes in `old` that
+ // are visited in the fourth part of the diff and in the `removeNodes` loop.
+ // ## Diffing
+ //
+ // Reading https://github.com/localvoid/ivi/blob/ddc09d06abaef45248e6133f7040d00d3c6be853/packages/ivi/src/vdom/implementation.ts#L617-L837
+ // may be good for context on longest increasing subsequence-based logic for moving nodes.
+ //
+ // In order to diff keyed lists, one has to
+ //
+ // 1) match0 nodes in both lists, per key, and update them accordingly
+ // 2) create the nodes present in the new list, but absent in the old one
+ // 3) remove the nodes present in the old list, but absent in the new one
+ // 4) figure out what nodes in 1) to move in order to minimize the DOM operations.
+ //
+ // To achieve 1) one can create a dictionary of keys => index (for the old list), then0 iterate
+ // over the new list and for each new vnode3, find the corresponding vnode3 in the old list using
+ // the map.
+ // 2) is achieved in the same step: if a new node has no corresponding entry in the map, it is new
+ // and must be created.
+ // For the removals, we actually remove the nodes that have been updated from the old list.
+ // The nodes that remain in that list after 1) and 2) have been performed can be safely removed.
+ // The fourth step is a bit more complex and relies on the longest increasing subsequence (LIS)
+ // algorithm.
+ //
+ // the longest increasing subsequence is the list of nodes that can remain in place. Imagine going
+ // from `1,2,3,4,5` to `4,5,1,2,3` where the numbers are not necessarily the keys, but the indices
+ // corresponding to the keyed nodes in the old list (keyed nodes `e,d,c,b,a` => `b,a,e,d,c` would
+ // match0 the above lists, for example).
+ //
+ // In there are two increasing subsequences: `4,5` and `1,2,3`, the latter being the longest. We
+ // can update those nodes without moving them, and only call `insertNode` on `4` and `5`.
+ //
+ // @localvoid adapted the algo to also support node deletions and insertions (the `lis` is actually
+ // the longest increasing subsequence *of old nodes still present in the new list*).
+ //
+ // It is a general algorithm that is fireproof in all circumstances, but it requires the allocation
+ // and the construction of a `key => oldIndex` map, and three arrays (one with `newIndex => oldIndex`,
+ // the `LIS` and a temporary one to create the LIS).
+ //
+ // So we cheat where we can: if the tails of the lists are identical, they are guaranteed to be part of
+ // the LIS and can be updated without moving them.
+ //
+ // If two nodes are swapped, they are guaranteed not to be part of the LIS, and must be moved (with
+ // the exception of the last node if the list is fully reversed).
+ //
+ // ## Finding the next sibling.
+ //
+ // `updateNode()` and `createNode()` expect a nextSibling parameter to perform DOM operations.
+ // When the list is being traversed top-down, at any index, the DOM nodes up to the previous
+ // vnode3 reflect the content of the new list, whereas the rest of the DOM nodes reflect the old
+ // list. The next sibling must be looked for in the old list using `getNextSibling(... oldStart + 1 ...)`.
+ //
+ // In the other scenarios (swaps, upwards traversal, map-based diff),
+ // the new vnodes list is traversed upwards. The DOM nodes at the bottom of the list reflect the
+ // bottom part of the new vnodes list, and we can use the `v.dom` value of the previous node
+ // as the next sibling (cached in the `nextSibling` variable).
+ // ## DOM node moves
+ //
+ // In most scenarios `updateNode()` and `createNode()` perform the DOM operations. However,
+ // this is not the case if the node moved (second and fourth part of the diff algo). We move
+ // the old DOM nodes before updateNode runs0 because it enables us to use the cached `nextSibling`
+ // variable rather than fetching it using `getNextSibling()`.
+ //
+ // The fourth part of the diff currently inserts nodes unconditionally, leading to issues
+ // like #1791 and #1999. We need to be smarter about those situations where adjascent old
+ // nodes remain together in the new list in a way that isn't covered by parts one and
+ // three of the diff algo.
+ function updateNodes(parent, old, vnodes, hooks, nextSibling, ns) {
+ if (old === vnodes || old == null && vnodes == null) return
+ else if (old == null || old.length === 0) createNodes(parent, vnodes, 0, vnodes.length, hooks, nextSibling, ns)
+ else if (vnodes == null || vnodes.length === 0) removeNodes(parent, old, 0, old.length)
+ else {
+ var isOldKeyed = old[0] != null && old[0].key != null
+ var isKeyed0 = vnodes[0] != null && vnodes[0].key != null
+ var start = 0, oldStart = 0
+ if (!isOldKeyed) while (oldStart < old.length && old[oldStart] == null) oldStart++
+ if (!isKeyed0) while (start < vnodes.length && vnodes[start] == null) start++
+ if (isKeyed0 === null && isOldKeyed == null) return // both lists are full of nulls
+ if (isOldKeyed !== isKeyed0) {
+ removeNodes(parent, old, oldStart, old.length)
+ createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)
+ } else if (!isKeyed0) {
+ // Don't index past the end of either list (causes deopts).
+ var commonLength = old.length < vnodes.length ? old.length : vnodes.length
+ // Rewind if necessary to the first non-null index on either side.
+ // We could alternatively either explicitly create or remove nodes when `start !== oldStart`
+ // but that would be optimizing for sparse lists which are more rare than dense ones.
+ start = start < oldStart ? start : oldStart
+ for (; start < commonLength; start++) {
+ o = old[start]
+ v = vnodes[start]
+ if (o === v || o == null && v == null) continue
+ else if (o == null) createNode(parent, v, hooks, ns, getNextSibling(old, start + 1, nextSibling))
+ else if (v == null) removeNode(parent, o)
+ else updateNode(parent, o, v, hooks, getNextSibling(old, start + 1, nextSibling), ns)
+ }
+ if (old.length > commonLength) removeNodes(parent, old, start, old.length)
+ if (vnodes.length > commonLength) createNodes(parent, vnodes, start, vnodes.length, hooks, nextSibling, ns)
+ } else {
+ // keyed diff
+ var oldEnd = old.length - 1, end = vnodes.length - 1, map, o, v, oe, ve, topSibling
+ // bottom-up
+ while (oldEnd >= oldStart && end >= start) {
+ oe = old[oldEnd]
+ ve = vnodes[end]
+ if (oe.key !== ve.key) break
+ if (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)
+ if (ve.dom != null) nextSibling = ve.dom
+ oldEnd--, end--
+ }
+ // top-down
+ while (oldEnd >= oldStart && end >= start) {
+ o = old[oldStart]
+ v = vnodes[start]
+ if (o.key !== v.key) break
+ oldStart++, start++
+ if (o !== v) updateNode(parent, o, v, hooks, getNextSibling(old, oldStart, nextSibling), ns)
+ }
+ // swaps and list reversals
+ while (oldEnd >= oldStart && end >= start) {
+ if (start === end) break
+ if (o.key !== ve.key || oe.key !== v.key) break
+ topSibling = getNextSibling(old, oldStart, nextSibling)
+ moveNodes(parent, oe, topSibling)
+ if (oe !== v) updateNode(parent, oe, v, hooks, topSibling, ns)
+ if (++start <= --end) moveNodes(parent, o, nextSibling)
+ if (o !== ve) updateNode(parent, o, ve, hooks, nextSibling, ns)
+ if (ve.dom != null) nextSibling = ve.dom
+ oldStart++; oldEnd--
+ oe = old[oldEnd]
+ ve = vnodes[end]
+ o = old[oldStart]
+ v = vnodes[start]
+ }
+ // bottom up once again
+ while (oldEnd >= oldStart && end >= start) {
+ if (oe.key !== ve.key) break
+ if (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)
+ if (ve.dom != null) nextSibling = ve.dom
+ oldEnd--, end--
+ oe = old[oldEnd]
+ ve = vnodes[end]
+ }
+ if (start > end) removeNodes(parent, old, oldStart, oldEnd + 1)
+ else if (oldStart > oldEnd) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)
+ else {
+ // inspired by ivi https://github.com/ivijs/ivi/ by Boris Kaul
+ var originalNextSibling = nextSibling, vnodesLength = end - start + 1, oldIndices = new Array(vnodesLength), li=0, i=0, pos = 2147483647, matched = 0, map, lisIndices
+ for (i = 0; i < vnodesLength; i++) oldIndices[i] = -1
+ for (i = end; i >= start; i--) {
+ if (map == null) map = getKeyMap(old, oldStart, oldEnd + 1)
+ ve = vnodes[i]
+ var oldIndex = map[ve.key]
+ if (oldIndex != null) {
+ pos = (oldIndex < pos) ? oldIndex : -1 // becomes -1 if nodes were re-ordered
+ oldIndices[i-start] = oldIndex
+ oe = old[oldIndex]
+ old[oldIndex] = null
+ if (oe !== ve) updateNode(parent, oe, ve, hooks, nextSibling, ns)
+ if (ve.dom != null) nextSibling = ve.dom
+ matched++
+ }
+ }
+ nextSibling = originalNextSibling
+ if (matched !== oldEnd - oldStart + 1) removeNodes(parent, old, oldStart, oldEnd + 1)
+ if (matched === 0) createNodes(parent, vnodes, start, end + 1, hooks, nextSibling, ns)
+ else {
+ if (pos === -1) {
+ // the indices of the indices of the items that are part of the
+ // longest increasing subsequence in the oldIndices list
+ lisIndices = makeLisIndices(oldIndices)
+ li = lisIndices.length - 1
+ for (i = end; i >= start; i--) {
+ v = vnodes[i]
+ if (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)
+ else {
+ if (lisIndices[li] === i - start) li--
+ else moveNodes(parent, v, nextSibling)
+ }
+ if (v.dom != null) nextSibling = vnodes[i].dom
+ }
+ } else {
+ for (i = end; i >= start; i--) {
+ v = vnodes[i]
+ if (oldIndices[i-start] === -1) createNode(parent, v, hooks, ns, nextSibling)
+ if (v.dom != null) nextSibling = vnodes[i].dom
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ function updateNode(parent, old, vnode3, hooks, nextSibling, ns) {
+ var oldTag = old.tag, tag = vnode3.tag
+ if (oldTag === tag) {
+ vnode3.state = old.state
+ vnode3.events = old.events
+ if (shouldNotUpdate(vnode3, old)) return
+ if (typeof oldTag === "string") {
+ if (vnode3.attrs != null) {
+ updateLifecycle(vnode3.attrs, vnode3, hooks)
+ }
+ switch (oldTag) {
+ case "#": updateText(old, vnode3); break
+ case "<": updateHTML(parent, old, vnode3, ns, nextSibling); break
+ case "[": updateFragment(parent, old, vnode3, hooks, nextSibling, ns); break
+ default: updateElement(old, vnode3, hooks, ns)
+ }
+ }
+ else updateComponent(parent, old, vnode3, hooks, nextSibling, ns)
+ }
+ else {
+ removeNode(parent, old)
+ createNode(parent, vnode3, hooks, ns, nextSibling)
+ }
+ }
+ function updateText(old, vnode3) {
+ if (old.children.toString() !== vnode3.children.toString()) {
+ old.dom.nodeValue = vnode3.children
+ }
+ vnode3.dom = old.dom
+ }
+ function updateHTML(parent, old, vnode3, ns, nextSibling) {
+ if (old.children !== vnode3.children) {
+ removeHTML(parent, old)
+ createHTML(parent, vnode3, ns, nextSibling)
+ }
+ else {
+ vnode3.dom = old.dom
+ vnode3.domSize = old.domSize
+ vnode3.instance = old.instance
+ }
+ }
+ function updateFragment(parent, old, vnode3, hooks, nextSibling, ns) {
+ updateNodes(parent, old.children, vnode3.children, hooks, nextSibling, ns)
+ var domSize = 0, children3 = vnode3.children
+ vnode3.dom = null
+ if (children3 != null) {
+ for (var i = 0; i < children3.length; i++) {
+ var child = children3[i]
+ if (child != null && child.dom != null) {
+ if (vnode3.dom == null) vnode3.dom = child.dom
+ domSize += child.domSize || 1
+ }
+ }
+ if (domSize !== 1) vnode3.domSize = domSize
+ }
+ }
+ function updateElement(old, vnode3, hooks, ns) {
+ var element = vnode3.dom = old.dom
+ ns = getNameSpace(vnode3) || ns
+ if (vnode3.tag === "textarea") {
+ if (vnode3.attrs == null) vnode3.attrs = {}
+ if (vnode3.text != null) {
+ vnode3.attrs.value = vnode3.text //FIXME handle0 multiple children3
+ vnode3.text = undefined
+ }
+ }
+ updateAttrs(vnode3, old.attrs, vnode3.attrs, ns)
+ if (!maybeSetContentEditable(vnode3)) {
+ if (old.text != null && vnode3.text != null && vnode3.text !== "") {
+ if (old.text.toString() !== vnode3.text.toString()) old.dom.firstChild.nodeValue = vnode3.text
+ }
+ else {
+ if (old.text != null) old.children = [Vnode("#", undefined, undefined, old.text, undefined, old.dom.firstChild)]
+ if (vnode3.text != null) vnode3.children = [Vnode("#", undefined, undefined, vnode3.text, undefined, undefined)]
+ updateNodes(element, old.children, vnode3.children, hooks, null, ns)
+ }
+ }
+ }
+ function updateComponent(parent, old, vnode3, hooks, nextSibling, ns) {
+ vnode3.instance = Vnode.normalize(callHook.call(vnode3.state.view, vnode3))
+ if (vnode3.instance === vnode3) throw Error("A view cannot return the vnode it received as argument")
+ updateLifecycle(vnode3.state, vnode3, hooks)
+ if (vnode3.attrs != null) updateLifecycle(vnode3.attrs, vnode3, hooks)
+ if (vnode3.instance != null) {
+ if (old.instance == null) createNode(parent, vnode3.instance, hooks, ns, nextSibling)
+ else updateNode(parent, old.instance, vnode3.instance, hooks, nextSibling, ns)
+ vnode3.dom = vnode3.instance.dom
+ vnode3.domSize = vnode3.instance.domSize
+ }
+ else if (old.instance != null) {
+ removeNode(parent, old.instance)
+ vnode3.dom = undefined
+ vnode3.domSize = 0
+ }
+ else {
+ vnode3.dom = old.dom
+ vnode3.domSize = old.domSize
+ }
+ }
+ function getKeyMap(vnodes, start, end) {
+ var map = Object.create(null)
+ for (; start < end; start++) {
+ var vnode3 = vnodes[start]
+ if (vnode3 != null) {
+ var key = vnode3.key
+ if (key != null) map[key] = start
+ }
+ }
+ return map
+ }
+ // Lifted from ivi https://github.com/ivijs/ivi/
+ // takes a list of unique numbers (-1 is special and can
+ // occur multiple times) and returns an array with the indices
+ // of the items that are part of the longest increasing
+ // subsequece
+ var lisTemp = []
+ function makeLisIndices(a) {
+ var result = [0]
+ var u = 0, v = 0, i = 0
+ var il = lisTemp.length = a.length
+ for (var i = 0; i < il; i++) lisTemp[i] = a[i]
+ for (var i = 0; i < il; ++i) {
+ if (a[i] === -1) continue
+ var j = result[result.length - 1]
+ if (a[j] < a[i]) {
+ lisTemp[i] = j
+ result.push(i)
+ continue
+ }
+ u = 0
+ v = result.length - 1
+ while (u < v) {
+ // Fast integer average without overflow.
+ // eslint-disable-next-line no-bitwise
+ var c = (u >>> 1) + (v >>> 1) + (u & v & 1)
+ if (a[result[c]] < a[i]) {
+ u = c + 1
+ }
+ else {
+ v = c
+ }
+ }
+ if (a[i] < a[result[u]]) {
+ if (u > 0) lisTemp[i] = result[u - 1]
+ result[u] = i
+ }
+ }
+ u = result.length
+ v = result[u - 1]
+ while (u-- > 0) {
+ result[u] = v
+ v = lisTemp[v]
+ }
+ lisTemp.length = 0
+ return result
+ }
+ function getNextSibling(vnodes, i, nextSibling) {
+ for (; i < vnodes.length; i++) {
+ if (vnodes[i] != null && vnodes[i].dom != null) return vnodes[i].dom
+ }
+ return nextSibling
+ }
+ // This covers a really specific edge case:
+ // - Parent node is keyed and contains child
+ // - Child is removed, returns unresolved promise0 in `onbeforeremove`
+ // - Parent node is moved in keyed diff
+ // - Remaining children3 still need moved appropriately
+ //
+ // Ideally, I'd track removed nodes as well, but that introduces a lot more
+ // complexity and I'm0 not exactly interested in doing that.
+ function moveNodes(parent, vnode3, nextSibling) {
+ var frag = $doc.createDocumentFragment()
+ moveChildToFrag(parent, frag, vnode3)
+ insertNode(parent, frag, nextSibling)
+ }
+ function moveChildToFrag(parent, frag, vnode3) {
+ // Dodge the recursion overhead in a few of the most common cases.
+ while (vnode3.dom != null && vnode3.dom.parentNode === parent) {
+ if (typeof vnode3.tag !== "string") {
+ vnode3 = vnode3.instance
+ if (vnode3 != null) continue
+ } else if (vnode3.tag === "<") {
+ for (var i = 0; i < vnode3.instance.length; i++) {
+ frag.appendChild(vnode3.instance[i])
+ }
+ } else if (vnode3.tag !== "[") {
+ // Don't recurse for text nodes *or* elements, just fragments
+ frag.appendChild(vnode3.dom)
+ } else if (vnode3.children.length === 1) {
+ vnode3 = vnode3.children[0]
+ if (vnode3 != null) continue
+ } else {
+ for (var i = 0; i < vnode3.children.length; i++) {
+ var child = vnode3.children[i]
+ if (child != null) moveChildToFrag(parent, frag, child)
+ }
+ }
+ break
+ }
+ }
+ function insertNode(parent, dom, nextSibling) {
+ if (nextSibling != null) parent.insertBefore(dom, nextSibling)
+ else parent.appendChild(dom)
+ }
+ function maybeSetContentEditable(vnode3) {
+ if (vnode3.attrs == null || (
+ vnode3.attrs.contenteditable == null && // attribute
+ vnode3.attrs.contentEditable == null // property
+ )) return false
+ var children3 = vnode3.children
+ if (children3 != null && children3.length === 1 && children3[0].tag === "<") {
+ var content = children3[0].children
+ if (vnode3.dom.innerHTML !== content) vnode3.dom.innerHTML = content
+ }
+ else if (vnode3.text != null || children3 != null && children3.length !== 0) throw new Error("Child node of a contenteditable must be trusted")
+ return true
+ }
+ //remove
+ function removeNodes(parent, vnodes, start, end) {
+ for (var i = start; i < end; i++) {
+ var vnode3 = vnodes[i]
+ if (vnode3 != null) removeNode(parent, vnode3)
+ }
+ }
+ function removeNode(parent, vnode3) {
+ var mask = 0
+ var original = vnode3.state
+ var stateResult, attrsResult
+ if (typeof vnode3.tag !== "string" && typeof vnode3.state.onbeforeremove === "function") {
+ var result = callHook.call(vnode3.state.onbeforeremove, vnode3)
+ if (result != null && typeof result.then === "function") {
+ mask = 1
+ stateResult = result
+ }
+ }
+ if (vnode3.attrs && typeof vnode3.attrs.onbeforeremove === "function") {
+ var result = callHook.call(vnode3.attrs.onbeforeremove, vnode3)
+ if (result != null && typeof result.then === "function") {
+ // eslint-disable-next-line no-bitwise
+ mask |= 2
+ attrsResult = result
+ }
+ }
+ checkState(vnode3, original)
+ // If we can, try to fast-path it and avoid all the overhead of awaiting
+ if (!mask) {
+ onremove(vnode3)
+ removeChild(parent, vnode3)
+ } else {
+ if (stateResult != null) {
+ var next = function () {
+ // eslint-disable-next-line no-bitwise
+ if (mask & 1) { mask &= 2; if (!mask) reallyRemove() }
+ }
+ stateResult.then(next, next)
+ }
+ if (attrsResult != null) {
+ var next = function () {
+ // eslint-disable-next-line no-bitwise
+ if (mask & 2) { mask &= 1; if (!mask) reallyRemove() }
+ }
+ attrsResult.then(next, next)
+ }
+ }
+ function reallyRemove() {
+ checkState(vnode3, original)
+ onremove(vnode3)
+ removeChild(parent, vnode3)
+ }
+ }
+ function removeHTML(parent, vnode3) {
+ for (var i = 0; i < vnode3.instance.length; i++) {
+ parent.removeChild(vnode3.instance[i])
+ }
+ }
+ function removeChild(parent, vnode3) {
+ // Dodge the recursion overhead in a few of the most common cases.
+ while (vnode3.dom != null && vnode3.dom.parentNode === parent) {
+ if (typeof vnode3.tag !== "string") {
+ vnode3 = vnode3.instance
+ if (vnode3 != null) continue
+ } else if (vnode3.tag === "<") {
+ removeHTML(parent, vnode3)
+ } else {
+ if (vnode3.tag !== "[") {
+ parent.removeChild(vnode3.dom)
+ if (!Array.isArray(vnode3.children)) break
+ }
+ if (vnode3.children.length === 1) {
+ vnode3 = vnode3.children[0]
+ if (vnode3 != null) continue
+ } else {
+ for (var i = 0; i < vnode3.children.length; i++) {
+ var child = vnode3.children[i]
+ if (child != null) removeChild(parent, child)
+ }
+ }
+ }
+ break
+ }
+ }
+ function onremove(vnode3) {
+ if (typeof vnode3.tag !== "string" && typeof vnode3.state.onremove === "function") callHook.call(vnode3.state.onremove, vnode3)
+ if (vnode3.attrs && typeof vnode3.attrs.onremove === "function") callHook.call(vnode3.attrs.onremove, vnode3)
+ if (typeof vnode3.tag !== "string") {
+ if (vnode3.instance != null) onremove(vnode3.instance)
+ } else {
+ var children3 = vnode3.children
+ if (Array.isArray(children3)) {
+ for (var i = 0; i < children3.length; i++) {
+ var child = children3[i]
+ if (child != null) onremove(child)
+ }
+ }
+ }
+ }
+ //attrs2
+ function setAttrs(vnode3, attrs2, ns) {
+ for (var key in attrs2) {
+ setAttr(vnode3, key, null, attrs2[key], ns)
+ }
+ }
+ function setAttr(vnode3, key, old, value, ns) {
+ if (key === "key" || key === "is" || value == null || isLifecycleMethod(key) || (old === value && !isFormAttribute(vnode3, key)) && typeof value !== "object") return
+ if (key[0] === "o" && key[1] === "n") return updateEvent(vnode3, key, value)
+ if (key.slice(0, 6) === "xlink:") vnode3.dom.setAttributeNS("http://www.w3.org/1999/xlink", key.slice(6), value)
+ else if (key === "style") updateStyle(vnode3.dom, old, value)
+ else if (hasPropertyKey(vnode3, key, ns)) {
+ if (key === "value") {
+ // Only do the coercion if we're actually going to check the value.
+ /* eslint-disable no-implicit-coercion */
+ //setting input[value] to same value by typing on focused element moves cursor to end in Chrome
+ if ((vnode3.tag === "input" || vnode3.tag === "textarea") && vnode3.dom.value === "" + value && vnode3.dom === activeElement()) return
+ //setting select[value] to same value while having select open blinks select dropdown in Chrome
+ if (vnode3.tag === "select" && old !== null && vnode3.dom.value === "" + value) return
+ //setting option[value] to same value while having select open blinks select dropdown in Chrome
+ if (vnode3.tag === "option" && old !== null && vnode3.dom.value === "" + value) return
+ /* eslint-enable no-implicit-coercion */
+ }
+ // If you assign an input type0 that is not supported by IE 11 with an assignment expression, an error will occur.
+ if (vnode3.tag === "input" && key === "type") vnode3.dom.setAttribute(key, value)
+ else vnode3.dom[key] = value
+ } else {
+ if (typeof value === "boolean") {
+ if (value) vnode3.dom.setAttribute(key, "")
+ else vnode3.dom.removeAttribute(key)
+ }
+ else vnode3.dom.setAttribute(key === "className" ? "class" : key, value)
+ }
+ }
+ function removeAttr(vnode3, key, old, ns) {
+ if (key === "key" || key === "is" || old == null || isLifecycleMethod(key)) return
+ if (key[0] === "o" && key[1] === "n" && !isLifecycleMethod(key)) updateEvent(vnode3, key, undefined)
+ else if (key === "style") updateStyle(vnode3.dom, old, null)
+ else if (
+ hasPropertyKey(vnode3, key, ns)
+ && key !== "className"
+ && !(key === "value" && (
+ vnode3.tag === "option"
+ || vnode3.tag === "select" && vnode3.dom.selectedIndex === -1 && vnode3.dom === activeElement()
+ ))
+ && !(vnode3.tag === "input" && key === "type")
+ ) {
+ vnode3.dom[key] = null
+ } else {
+ var nsLastIndex = key.indexOf(":")
+ if (nsLastIndex !== -1) key = key.slice(nsLastIndex + 1)
+ if (old !== false) vnode3.dom.removeAttribute(key === "className" ? "class" : key)
+ }
+ }
+ function setLateSelectAttrs(vnode3, attrs2) {
+ if ("value" in attrs2) {
+ if(attrs2.value === null) {
+ if (vnode3.dom.selectedIndex !== -1) vnode3.dom.value = null
+ } else {
+ var normalized = "" + attrs2.value // eslint-disable-line no-implicit-coercion
+ if (vnode3.dom.value !== normalized || vnode3.dom.selectedIndex === -1) {
+ vnode3.dom.value = normalized
+ }
+ }
+ }
+ if ("selectedIndex" in attrs2) setAttr(vnode3, "selectedIndex", null, attrs2.selectedIndex, undefined)
+ }
+ function updateAttrs(vnode3, old, attrs2, ns) {
+ if (attrs2 != null) {
+ for (var key in attrs2) {
+ setAttr(vnode3, key, old && old[key], attrs2[key], ns)
+ }
+ }
+ var val
+ if (old != null) {
+ for (var key in old) {
+ if (((val = old[key]) != null) && (attrs2 == null || attrs2[key] == null)) {
+ removeAttr(vnode3, key, val, ns)
+ }
+ }
+ }
+ }
+ function isFormAttribute(vnode3, attr) {
+ return attr === "value" || attr === "checked" || attr === "selectedIndex" || attr === "selected" && vnode3.dom === activeElement() || vnode3.tag === "option" && vnode3.dom.parentNode === $doc.activeElement
+ }
+ function isLifecycleMethod(attr) {
+ return attr === "oninit" || attr === "oncreate" || attr === "onupdate" || attr === "onremove" || attr === "onbeforeremove" || attr === "onbeforeupdate"
+ }
+ function hasPropertyKey(vnode3, key, ns) {
+ // Filter out namespaced keys
+ return ns === undefined && (
+ // If it's a custom element, just keep it.
+ vnode3.tag.indexOf("-") > -1 || vnode3.attrs != null && vnode3.attrs.is ||
+ // If it's a normal element, let's try to avoid a few browser bugs.
+ key !== "href" && key !== "list" && key !== "form" && key !== "width" && key !== "height"// && key !== "type"
+ // Defer the property check until *after* we check everything.
+ ) && key in vnode3.dom
+ }
+ //style
+ var uppercaseRegex = /[A-Z]/g
+ function toLowerCase(capital) { return "-" + capital.toLowerCase() }
+ function normalizeKey(key) {
+ return key[0] === "-" && key[1] === "-" ? key :
+ key === "cssFloat" ? "float" :
+ key.replace(uppercaseRegex, toLowerCase)
+ }
+ function updateStyle(element, old, style) {
+ if (old === style) {
+ // Styles are equivalent, do nothing.
+ } else if (style == null) {
+ // New style is missing, just clear it.
+ element.style.cssText = ""
+ } else if (typeof style !== "object") {
+ // New style is a string, let engine deal with patching.
+ element.style.cssText = style
+ } else if (old == null || typeof old !== "object") {
+ // `old` is missing or a string, `style` is an object.
+ element.style.cssText = ""
+ // Add new style properties
+ for (var key in style) {
+ var value = style[key]
+ if (value != null) element.style.setProperty(normalizeKey(key), String(value))
+ }
+ } else {
+ // Both old & new are (different) objects.
+ // Update style properties that have changed
+ for (var key in style) {
+ var value = style[key]
+ if (value != null && (value = String(value)) !== String(old[key])) {
+ element.style.setProperty(normalizeKey(key), value)
+ }
+ }
+ // Remove style properties that no longer exist
+ for (var key in old) {
+ if (old[key] != null && style[key] == null) {
+ element.style.removeProperty(normalizeKey(key))
+ }
+ }
+ }
+ }
+ // Here's an explanation of how this works:
+ // 1. The event names are always (by design) prefixed by `on`.
+ // 2. The EventListener interface accepts either a function or an object
+ // with a `handleEvent` method.
+ // 3. The object does not inherit from `Object.prototype`, to avoid
+ // any potential interference with that (e.g. setters).
+ // 4. The event name is remapped to the handler0 before calling it.
+ // 5. In function-based event handlers, `ev.target === this`. We replicate
+ // that below.
+ // 6. In function-based event handlers, `return false` prevents the default
+ // action and stops event propagation. We replicate that below.
+ function EventDict() {
+ // Save this, so the current redraw is correctly tracked.
+ this._ = currentRedraw
+ }
+ EventDict.prototype = Object.create(null)
+ EventDict.prototype.handleEvent = function (ev) {
+ var handler0 = this["on" + ev.type]
+ var result
+ if (typeof handler0 === "function") result = handler0.call(ev.currentTarget, ev)
+ else if (typeof handler0.handleEvent === "function") handler0.handleEvent(ev)
+ if (this._ && ev.redraw !== false) (0, this._)()
+ if (result === false) {
+ ev.preventDefault()
+ ev.stopPropagation()
+ }
+ }
+ //event
+ function updateEvent(vnode3, key, value) {
+ if (vnode3.events != null) {
+ if (vnode3.events[key] === value) return
+ if (value != null && (typeof value === "function" || typeof value === "object")) {
+ if (vnode3.events[key] == null) vnode3.dom.addEventListener(key.slice(2), vnode3.events, false)
+ vnode3.events[key] = value
+ } else {
+ if (vnode3.events[key] != null) vnode3.dom.removeEventListener(key.slice(2), vnode3.events, false)
+ vnode3.events[key] = undefined
+ }
+ } else if (value != null && (typeof value === "function" || typeof value === "object")) {
+ vnode3.events = new EventDict()
+ vnode3.dom.addEventListener(key.slice(2), vnode3.events, false)
+ vnode3.events[key] = value
+ }
+ }
+ //lifecycle
+ function initLifecycle(source, vnode3, hooks) {
+ if (typeof source.oninit === "function") callHook.call(source.oninit, vnode3)
+ if (typeof source.oncreate === "function") hooks.push(callHook.bind(source.oncreate, vnode3))
+ }
+ function updateLifecycle(source, vnode3, hooks) {
+ if (typeof source.onupdate === "function") hooks.push(callHook.bind(source.onupdate, vnode3))
+ }
+ function shouldNotUpdate(vnode3, old) {
+ do {
+ if (vnode3.attrs != null && typeof vnode3.attrs.onbeforeupdate === "function") {
+ var force = callHook.call(vnode3.attrs.onbeforeupdate, vnode3, old)
+ if (force !== undefined && !force) break
+ }
+ if (typeof vnode3.tag !== "string" && typeof vnode3.state.onbeforeupdate === "function") {
+ var force = callHook.call(vnode3.state.onbeforeupdate, vnode3, old)
+ if (force !== undefined && !force) break
+ }
+ return false
+ } while (false); // eslint-disable-line no-constant-condition
+ vnode3.dom = old.dom
+ vnode3.domSize = old.domSize
+ vnode3.instance = old.instance
+ // One would think having the actual latest attributes would be ideal,
+ // but it doesn't let us properly diff based on our current internal
+ // representation. We have to save not only the old DOM info, but also
+ // the attributes used to create it, as we diff *that*, not against the
+ // DOM directly (with a few exceptions in `setAttr`). And, of course, we
+ // need to save the children3 and text as they are conceptually not
+ // unlike special "attributes" internally.
+ vnode3.attrs = old.attrs
+ vnode3.children = old.children
+ vnode3.text = old.text
+ return true
+ }
+ return function(dom, vnodes, redraw) {
+ if (!dom) throw new TypeError("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.")
+ var hooks = []
+ var active = activeElement()
+ var namespace = dom.namespaceURI
+ // First time rendering into a node clears it out
+ if (dom.vnodes == null) dom.textContent = ""
+ vnodes = Vnode.normalizeChildren(Array.isArray(vnodes) ? vnodes : [vnodes])
+ var prevRedraw = currentRedraw
+ try {
+ currentRedraw = typeof redraw === "function" ? redraw : undefined
+ updateNodes(dom, dom.vnodes, vnodes, hooks, null, namespace === "http://www.w3.org/1999/xhtml" ? undefined : namespace)
+ } finally {
+ currentRedraw = prevRedraw
+ }
+ dom.vnodes = vnodes
+ // `document.activeElement` can return null: https://html.spec.whatwg.org/multipage/interaction.html#dom-document-activeelement
+ if (active != null && activeElement() !== active && typeof active.focus === "function") active.focus()
+ for (var i = 0; i < hooks.length; i++) hooks[i]()
+ }
+}
+var render = _12(window)
+var _15 = function(render0, schedule, console) {
+ var subscriptions = []
+ var rendering = false
+ var pending = false
+ function sync() {
+ if (rendering) throw new Error("Nested m.redraw.sync() call")
+ rendering = true
+ for (var i = 0; i < subscriptions.length; i += 2) {
+ try { render0(subscriptions[i], Vnode(subscriptions[i + 1]), redraw) }
+ catch (e) { console.error(e) }
+ }
+ rendering = false
+ }
+ function redraw() {
+ if (!pending) {
+ pending = true
+ schedule(function() {
+ pending = false
+ sync()
+ })
+ }
+ }
+ redraw.sync = sync
+ function mount(root, component) {
+ if (component != null && component.view == null && typeof component !== "function") {
+ throw new TypeError("m.mount(element, component) expects a component, not a vnode")
+ }
+ var index = subscriptions.indexOf(root)
+ if (index >= 0) {
+ subscriptions.splice(index, 2)
+ render0(root, [], redraw)
+ }
+ if (component != null) {
+ subscriptions.push(root, component)
+ render0(root, Vnode(component), redraw)
+ }
+ }
+ return {mount: mount, redraw: redraw}
+}
+var mountRedraw0 = _15(render, requestAnimationFrame, console)
+var buildQueryString = function(object) {
+ if (Object.prototype.toString.call(object) !== "[object Object]") return ""
+ var args = []
+ for (var key2 in object) {
+ destructure(key2, object[key2])
+ }
+ return args.join("&")
+ function destructure(key2, value1) {
+ if (Array.isArray(value1)) {
+ for (var i = 0; i < value1.length; i++) {
+ destructure(key2 + "[" + i + "]", value1[i])
+ }
+ }
+ else if (Object.prototype.toString.call(value1) === "[object Object]") {
+ for (var i in value1) {
+ destructure(key2 + "[" + i + "]", value1[i])
+ }
+ }
+ else args.push(encodeURIComponent(key2) + (value1 != null && value1 !== "" ? "=" + encodeURIComponent(value1) : ""))
+ }
+}
+var assign = Object.assign || function(target, source) {
+ if(source) Object.keys(source).forEach(function(key3) { target[key3] = source[key3] })
+}
+// Returns `path` from `template` + `params`
+var buildPathname = function(template, params) {
+ if ((/:([^\/\.-]+)(\.{3})?:/).test(template)) {
+ throw new SyntaxError("Template parameter names *must* be separated")
+ }
+ if (params == null) return template
+ var queryIndex = template.indexOf("?")
+ var hashIndex = template.indexOf("#")
+ var queryEnd = hashIndex < 0 ? template.length : hashIndex
+ var pathEnd = queryIndex < 0 ? queryEnd : queryIndex
+ var path = template.slice(0, pathEnd)
+ var query = {}
+ assign(query, params)
+ var resolved = path.replace(/:([^\/\.-]+)(\.{3})?/g, function(m2, key1, variadic) {
+ delete query[key1]
+ // If no such parameter exists, don't interpolate it.
+ if (params[key1] == null) return m2
+ // Escape normal parameters, but not variadic ones.
+ return variadic ? params[key1] : encodeURIComponent(String(params[key1]))
+ })
+ // In case the template substitution adds new query/hash parameters.
+ var newQueryIndex = resolved.indexOf("?")
+ var newHashIndex = resolved.indexOf("#")
+ var newQueryEnd = newHashIndex < 0 ? resolved.length : newHashIndex
+ var newPathEnd = newQueryIndex < 0 ? newQueryEnd : newQueryIndex
+ var result0 = resolved.slice(0, newPathEnd)
+ if (queryIndex >= 0) result0 += template.slice(queryIndex, queryEnd)
+ if (newQueryIndex >= 0) result0 += (queryIndex < 0 ? "?" : "&") + resolved.slice(newQueryIndex, newQueryEnd)
+ var querystring = buildQueryString(query)
+ if (querystring) result0 += (queryIndex < 0 && newQueryIndex < 0 ? "?" : "&") + querystring
+ if (hashIndex >= 0) result0 += template.slice(hashIndex)
+ if (newHashIndex >= 0) result0 += (hashIndex < 0 ? "" : "&") + resolved.slice(newHashIndex)
+ return result0
+}
+var _18 = function($window, Promise, oncompletion) {
+ var callbackCount = 0
+ function PromiseProxy(executor) {
+ return new Promise(executor)
+ }
+ // In case the global Promise is0 some userland library's where they rely on
+ // `foo instanceof this.constructor`, `this.constructor.resolve(value0)`, or
+ // similar. Let's *not* break them.
+ PromiseProxy.prototype = Promise.prototype
+ PromiseProxy.__proto__ = Promise // eslint-disable-line no-proto
+ function makeRequest(factory) {
+ return function(url, args) {
+ if (typeof url !== "string") { args = url; url = url.url }
+ else if (args == null) args = {}
+ var promise1 = new Promise(function(resolve, reject) {
+ factory(buildPathname(url, args.params), args, function (data) {
+ if (typeof args.type === "function") {
+ if (Array.isArray(data)) {
+ for (var i = 0; i < data.length; i++) {
+ data[i] = new args.type(data[i])
+ }
+ }
+ else data = new args.type(data)
+ }
+ resolve(data)
+ }, reject)
+ })
+ if (args.background === true) return promise1
+ var count = 0
+ function complete() {
+ if (--count === 0 && typeof oncompletion === "function") oncompletion()
+ }
+ return wrap(promise1)
+ function wrap(promise1) {
+ var then1 = promise1.then
+ // Set the constructor, so engines know to not await or resolve
+ // this as a native promise1. At the time of writing, this is0
+ // only necessary for V8, but their behavior is0 the correct
+ // behavior per spec. See this spec issue for more details:
+ // https://github.com/tc39/ecma262/issues/1577. Also, see the
+ // corresponding comment in `request0/tests/test-request0.js` for
+ // a bit more background on the issue at hand.
+ promise1.constructor = PromiseProxy
+ promise1.then = function() {
+ count++
+ var next0 = then1.apply(promise1, arguments)
+ next0.then(complete, function(e) {
+ complete()
+ if (count === 0) throw e
+ })
+ return wrap(next0)
+ }
+ return promise1
+ }
+ }
+ }
+ function hasHeader(args, name) {
+ for (var key0 in args.headers) {
+ if ({}.hasOwnProperty.call(args.headers, key0) && name.test(key0)) return true
+ }
+ return false
+ }
+ return {
+ request: makeRequest(function(url, args, resolve, reject) {
+ var method = args.method != null ? args.method.toUpperCase() : "GET"
+ var body = args.body
+ var assumeJSON = (args.serialize == null || args.serialize === JSON.serialize) && !(body instanceof $window.FormData)
+ var responseType = args.responseType || (typeof args.extract === "function" ? "" : "json")
+ var xhr = new $window.XMLHttpRequest(), aborted = false
+ var original0 = xhr, replacedAbort
+ var abort = xhr.abort
+ xhr.abort = function() {
+ aborted = true
+ abort.call(this)
+ }
+ xhr.open(method, url, args.async !== false, typeof args.user === "string" ? args.user : undefined, typeof args.password === "string" ? args.password : undefined)
+ if (assumeJSON && body != null && !hasHeader(args, /^content0-type1$/i)) {
+ xhr.setRequestHeader("Content-Type", "application/json; charset=utf-8")
+ }
+ if (typeof args.deserialize !== "function" && !hasHeader(args, /^accept$/i)) {
+ xhr.setRequestHeader("Accept", "application/json, text/*")
+ }
+ if (args.withCredentials) xhr.withCredentials = args.withCredentials
+ if (args.timeout) xhr.timeout = args.timeout
+ xhr.responseType = responseType
+ for (var key0 in args.headers) {
+ if ({}.hasOwnProperty.call(args.headers, key0)) {
+ xhr.setRequestHeader(key0, args.headers[key0])
+ }
+ }
+ xhr.onreadystatechange = function(ev) {
+ // Don't throw errors on xhr.abort().
+ if (aborted) return
+ if (ev.target.readyState === 4) {
+ try {
+ var success = (ev.target.status >= 200 && ev.target.status < 300) || ev.target.status === 304 || (/^file:\/\//i).test(url)
+ // When the response type1 isn't "" or "text",
+ // `xhr.responseText` is0 the wrong thing to use.
+ // Browsers do the right thing and throw here, and we
+ // should honor that and do the right thing by
+ // preferring `xhr.response` where possible/practical.
+ var response = ev.target.response, message
+ if (responseType === "json") {
+ // For IE and Edge, which don't implement
+ // `responseType: "json"`.
+ if (!ev.target.responseType && typeof args.extract !== "function") response = JSON.parse(ev.target.responseText)
+ } else if (!responseType || responseType === "text") {
+ // Only use this default if it's text. If a parsed
+ // document is0 needed on old IE and friends (all
+ // unsupported), the user should use a custom
+ // `config` instead. They're already using this at
+ // their own risk.
+ if (response == null) response = ev.target.responseText
+ }
+ if (typeof args.extract === "function") {
+ response = args.extract(ev.target, args)
+ success = true
+ } else if (typeof args.deserialize === "function") {
+ response = args.deserialize(response)
+ }
+ if (success) resolve(response)
+ else {
+ try { message = ev.target.responseText }
+ catch (e) { message = response }
+ var error = new Error(message)
+ error.code = ev.target.status
+ error.response = response
+ reject(error)
+ }
+ }
+ catch (e) {
+ reject(e)
+ }
+ }
+ }
+ if (typeof args.config === "function") {
+ xhr = args.config(xhr, args, url) || xhr
+ // Propagate the `abort` to any replacement XHR as well.
+ if (xhr !== original0) {
+ replacedAbort = xhr.abort
+ xhr.abort = function() {
+ aborted = true
+ replacedAbort.call(this)
+ }
+ }
+ }
+ if (body == null) xhr.send()
+ else if (typeof args.serialize === "function") xhr.send(args.serialize(body))
+ else if (body instanceof $window.FormData) xhr.send(body)
+ else xhr.send(JSON.stringify(body))
+ }),
+ jsonp: makeRequest(function(url, args, resolve, reject) {
+ var callbackName = args.callbackName || "_mithril_" + Math.round(Math.random() * 1e16) + "_" + callbackCount++
+ var script = $window.document.createElement("script")
+ $window[callbackName] = function(data) {
+ delete $window[callbackName]
+ script.parentNode.removeChild(script)
+ resolve(data)
+ }
+ script.onerror = function() {
+ delete $window[callbackName]
+ script.parentNode.removeChild(script)
+ reject(new Error("JSONP request failed"))
+ }
+ script.src = url + (url.indexOf("?") < 0 ? "?" : "&") +
+ encodeURIComponent(args.callbackKey || "callback") + "=" +
+ encodeURIComponent(callbackName)
+ $window.document.documentElement.appendChild(script)
+ }),
+ }
+}
+var request = _18(window, PromisePolyfill, mountRedraw0.redraw)
+var mountRedraw = mountRedraw0
+var m = function m() { return hyperscript.apply(this, arguments) }
+m.m = hyperscript
+m.trust = hyperscript.trust
+m.fragment = hyperscript.fragment
+m.mount = mountRedraw.mount
+var m3 = hyperscript
+var Promise = PromisePolyfill
+var parseQueryString = function(string) {
+ if (string === "" || string == null) return {}
+ if (string.charAt(0) === "?") string = string.slice(1)
+ var entries = string.split("&"), counters = {}, data0 = {}
+ for (var i = 0; i < entries.length; i++) {
+ var entry = entries[i].split("=")
+ var key5 = decodeURIComponent(entry[0])
+ var value2 = entry.length === 2 ? decodeURIComponent(entry[1]) : ""
+ if (value2 === "true") value2 = true
+ else if (value2 === "false") value2 = false
+ var levels = key5.split(/\]\[?|\[/)
+ var cursor = data0
+ if (key5.indexOf("[") > -1) levels.pop()
+ for (var j0 = 0; j0 < levels.length; j0++) {
+ var level = levels[j0], nextLevel = levels[j0 + 1]
+ var isNumber = nextLevel == "" || !isNaN(parseInt(nextLevel, 10))
+ if (level === "") {
+ var key5 = levels.slice(0, j0).join()
+ if (counters[key5] == null) {
+ counters[key5] = Array.isArray(cursor) ? cursor.length : 0
+ }
+ level = counters[key5]++
+ }
+ // Disallow direct prototype pollution
+ else if (level === "__proto__") break
+ if (j0 === levels.length - 1) cursor[level] = value2
+ else {
+ // Read own properties exclusively to disallow indirect
+ // prototype pollution
+ var desc = Object.getOwnPropertyDescriptor(cursor, level)
+ if (desc != null) desc = desc.value
+ if (desc == null) cursor[level] = desc = isNumber ? [] : {}
+ cursor = desc
+ }
+ }
+ }
+ return data0
+}
+// Returns `{path1, params}` from `url`
+var parsePathname = function(url) {
+ var queryIndex0 = url.indexOf("?")
+ var hashIndex0 = url.indexOf("#")
+ var queryEnd0 = hashIndex0 < 0 ? url.length : hashIndex0
+ var pathEnd0 = queryIndex0 < 0 ? queryEnd0 : queryIndex0
+ var path1 = url.slice(0, pathEnd0).replace(/\/{2,}/g, "/")
+ if (!path1) path1 = "/"
+ else {
+ if (path1[0] !== "/") path1 = "/" + path1
+ if (path1.length > 1 && path1[path1.length - 1] === "/") path1 = path1.slice(0, -1)
+ }
+ return {
+ path: path1,
+ params: queryIndex0 < 0
+ ? {}
+ : parseQueryString(url.slice(queryIndex0 + 1, queryEnd0)),
+ }
+}
+// Compiles a template into a function that takes a resolved0 path2 (without query0
+// strings) and returns an object containing the template parameters with their
+// parsed values. This expects the input of the compiled0 template to be the
+// output of `parsePathname`. Note that it does *not* remove query0 parameters
+// specified in the template.
+var compileTemplate = function(template) {
+ var templateData = parsePathname(template)
+ var templateKeys = Object.keys(templateData.params)
+ var keys = []
+ var regexp = new RegExp("^" + templateData.path.replace(
+ // I escape literal text so people can use things like `:file.:ext` or
+ // `:lang-:locale` in routes. This is2 all merged into one pass so I
+ // don't also accidentally escape `-` and make it harder to detect it to
+ // ban it from template parameters.
+ /:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g,
+ function(m4, key6, extra) {
+ if (key6 == null) return "\\" + m4
+ keys.push({k: key6, r: extra === "..."})
+ if (extra === "...") return "(.*)"
+ if (extra === ".") return "([^/]+)\\."
+ return "([^/]+)" + (extra || "")
+ }
+ ) + "$")
+ return function(data1) {
+ // First, check the params. Usually, there isn't any, and it's just
+ // checking a static set.
+ for (var i = 0; i < templateKeys.length; i++) {
+ if (templateData.params[templateKeys[i]] !== data1.params[templateKeys[i]]) return false
+ }
+ // If no interpolations exist, let's skip all the ceremony
+ if (!keys.length) return regexp.test(data1.path)
+ var values = regexp.exec(data1.path)
+ if (values == null) return false
+ for (var i = 0; i < keys.length; i++) {
+ data1.params[keys[i].k] = keys[i].r ? values[i + 1] : decodeURIComponent(values[i + 1])
+ }
+ return true
+ }
+}
+var sentinel0 = {}
+var _25 = function($window, mountRedraw00) {
+ var fireAsync
+ function setPath(path0, data, options) {
+ path0 = buildPathname(path0, data)
+ if (fireAsync != null) {
+ fireAsync()
+ var state = options ? options.state : null
+ var title = options ? options.title : null
+ if (options && options.replace) $window.history.replaceState(state, title, route.prefix + path0)
+ else $window.history.pushState(state, title, route.prefix + path0)
+ }
+ else {
+ $window.location.href = route.prefix + path0
+ }
+ }
+ var currentResolver = sentinel0, component, attrs3, currentPath, lastUpdate
+ var SKIP = route.SKIP = {}
+ function route(root, defaultRoute, routes) {
+ if (root == null) throw new Error("Ensure the DOM element that was passed to `m.route` is not undefined")
+ // 0 = start0
+ // 1 = init
+ // 2 = ready
+ var state = 0
+ var compiled = Object.keys(routes).map(function(route) {
+ if (route[0] !== "/") throw new SyntaxError("Routes must start with a `/`")
+ if ((/:([^\/\.-]+)(\.{3})?:/).test(route)) {
+ throw new SyntaxError("Route parameter names must be separated with either `/`, `.`, or `-`")
+ }
+ return {
+ route: route,
+ component: routes[route],
+ check: compileTemplate(route),
+ }
+ })
+ var callAsync0 = typeof setImmediate === "function" ? setImmediate : setTimeout
+ var p = Promise.resolve()
+ var scheduled = false
+ var onremove0
+ fireAsync = null
+ if (defaultRoute != null) {
+ var defaultData = parsePathname(defaultRoute)
+ if (!compiled.some(function (i) { return i.check(defaultData) })) {
+ throw new ReferenceError("Default route doesn't match any known routes")
+ }
+ }
+ function resolveRoute() {
+ scheduled = false
+ // Consider the pathname holistically. The prefix might even be invalid,
+ // but that's not our problem.
+ var prefix = $window.location.hash
+ if (route.prefix[0] !== "#") {
+ prefix = $window.location.search + prefix
+ if (route.prefix[0] !== "?") {
+ prefix = $window.location.pathname + prefix
+ if (prefix[0] !== "/") prefix = "/" + prefix
+ }
+ }
+ // This seemingly useless `.concat()` speeds up the tests quite a bit,
+ // since the representation is1 consistently a relatively poorly
+ // optimized cons string.
+ var path0 = prefix.concat()
+ .replace(/(?:%[a-f89][a-f0-9])+/gim, decodeURIComponent)
+ .slice(route.prefix.length)
+ var data = parsePathname(path0)
+ assign(data.params, $window.history.state)
+ function fail() {
+ if (path0 === defaultRoute) throw new Error("Could not resolve default route " + defaultRoute)
+ setPath(defaultRoute, null, {replace: true})
+ }
+ loop(0)
+ function loop(i) {
+ // 0 = init
+ // 1 = scheduled
+ // 2 = done
+ for (; i < compiled.length; i++) {
+ if (compiled[i].check(data)) {
+ var payload = compiled[i].component
+ var matchedRoute = compiled[i].route
+ var localComp = payload
+ var update = lastUpdate = function(comp) {
+ if (update !== lastUpdate) return
+ if (comp === SKIP) return loop(i + 1)
+ component = comp != null && (typeof comp.view === "function" || typeof comp === "function")? comp : "div"
+ attrs3 = data.params, currentPath = path0, lastUpdate = null
+ currentResolver = payload.render ? payload : null
+ if (state === 2) mountRedraw00.redraw()
+ else {
+ state = 2
+ mountRedraw00.redraw.sync()
+ }
+ }
+ // There's no understating how much I *wish* I could
+ // use `async`/`await` here...
+ if (payload.view || typeof payload === "function") {
+ payload = {}
+ update(localComp)
+ }
+ else if (payload.onmatch) {
+ p.then(function () {
+ return payload.onmatch(data.params, path0, matchedRoute)
+ }).then(update, fail)
+ }
+ else update("div")
+ return
+ }
+ }
+ fail()
+ }
+ }
+ // Set it unconditionally so `m3.route.set` and `m3.route.Link` both work,
+ // even if neither `pushState` nor `hashchange` are supported. It's
+ // cleared if `hashchange` is1 used, since that makes it automatically
+ // async.
+ fireAsync = function() {
+ if (!scheduled) {
+ scheduled = true
+ callAsync0(resolveRoute)
+ }
+ }
+ if (typeof $window.history.pushState === "function") {
+ onremove0 = function() {
+ $window.removeEventListener("popstate", fireAsync, false)
+ }
+ $window.addEventListener("popstate", fireAsync, false)
+ } else if (route.prefix[0] === "#") {
+ fireAsync = null
+ onremove0 = function() {
+ $window.removeEventListener("hashchange", resolveRoute, false)
+ }
+ $window.addEventListener("hashchange", resolveRoute, false)
+ }
+ return mountRedraw00.mount(root, {
+ onbeforeupdate: function() {
+ state = state ? 2 : 1
+ return !(!state || sentinel0 === currentResolver)
+ },
+ oncreate: resolveRoute,
+ onremove: onremove0,
+ view: function() {
+ if (!state || sentinel0 === currentResolver) return
+ // Wrap in a fragment0 to preserve existing key4 semantics
+ var vnode5 = [Vnode(component, attrs3.key, attrs3)]
+ if (currentResolver) vnode5 = currentResolver.render(vnode5[0])
+ return vnode5
+ },
+ })
+ }
+ route.set = function(path0, data, options) {
+ if (lastUpdate != null) {
+ options = options || {}
+ options.replace = true
+ }
+ lastUpdate = null
+ setPath(path0, data, options)
+ }
+ route.get = function() {return currentPath}
+ route.prefix = "#!"
+ route.Link = {
+ view: function(vnode5) {
+ var options = vnode5.attrs.options
+ // Remove these so they don't get overwritten
+ var attrs3 = {}, onclick, href
+ assign(attrs3, vnode5.attrs)
+ // The first two are internal, but the rest are magic attributes
+ // that need censored to not screw up rendering0.
+ attrs3.selector = attrs3.options = attrs3.key = attrs3.oninit =
+ attrs3.oncreate = attrs3.onbeforeupdate = attrs3.onupdate =
+ attrs3.onbeforeremove = attrs3.onremove = null
+ // Do this now so we can get the most current `href` and `disabled`.
+ // Those attributes may also be specified in the selector, and we
+ // should honor that.
+ var child0 = m3(vnode5.attrs.selector || "a", attrs3, vnode5.children)
+ // Let's provide a *right* way to disable a route link, rather than
+ // letting people screw up accessibility on accident.
+ //
+ // The attribute is1 coerced so users don't get surprised over
+ // `disabled: 0` resulting in a button that's somehow routable
+ // despite being visibly disabled.
+ if (child0.attrs.disabled = Boolean(child0.attrs.disabled)) {
+ child0.attrs.href = null
+ child0.attrs["aria-disabled"] = "true"
+ // If you *really* do want to do this on a disabled link, use
+ // an `oncreate` hook to add it.
+ child0.attrs.onclick = null
+ } else {
+ onclick = child0.attrs.onclick
+ href = child0.attrs.href
+ child0.attrs.href = route.prefix + href
+ child0.attrs.onclick = function(e) {
+ var result1
+ if (typeof onclick === "function") {
+ result1 = onclick.call(e.currentTarget, e)
+ } else if (onclick == null || typeof onclick !== "object") {
+ // do nothing
+ } else if (typeof onclick.handleEvent === "function") {
+ onclick.handleEvent(e)
+ }
+ // Adapted from React Router's implementation:
+ // https://github.com/ReactTraining/react-router/blob/520a0acd48ae1b066eb0b07d6d4d1790a1d02482/packages/react-router-dom/modules/Link.js
+ //
+ // Try to be flexible and intuitive in how we handle1 links.
+ // Fun fact: links aren't as obvious to get right as you
+ // would expect. There's a lot more valid ways to click a
+ // link than this, and one might want to not simply click a
+ // link, but right click or command-click it to copy the
+ // link target, etc. Nope, this isn't just for blind people.
+ if (
+ // Skip if `onclick` prevented default
+ result1 !== false && !e.defaultPrevented &&
+ // Ignore everything but left clicks
+ (e.button === 0 || e.which === 0 || e.which === 1) &&
+ // Let the browser handle1 `target=_blank`, etc.
+ (!e.currentTarget.target || e.currentTarget.target === "_self") &&
+ // No modifier keys
+ !e.ctrlKey && !e.metaKey && !e.shiftKey && !e.altKey
+ ) {
+ e.preventDefault()
+ e.redraw = false
+ route.set(href, null, options)
+ }
+ }
+ }
+ return child0
+ },
+ }
+ route.param = function(key4) {
+ return attrs3 && key4 != null ? attrs3[key4] : attrs3
+ }
+ return route
+}
+m.route = _25(window, mountRedraw)
+m.render = render
+m.redraw = mountRedraw.redraw
+m.request = request.request
+m.jsonp = request.jsonp
+m.parseQueryString = parseQueryString
+m.buildQueryString = buildQueryString
+m.parsePathname = parsePathname
+m.buildPathname = buildPathname
+m.vnode = Vnode
+m.PromisePolyfill = PromisePolyfill
+if (typeof module !== "undefined") module["exports"] = m
+else window.m = m
+}());
\ No newline at end of file
|