diff --git a/.eslintrc.js b/.eslintrc.js
index 8d021e69..6f42ee63 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -12,6 +12,8 @@ module.exports = {
         "plugin:prettier/recommended", // Enables eslint-plugin-prettier and eslint-config-prettier. This will display prettier errors as ESLint errors. Make sure this is always the last configuration in the extends array.
     ],
 
+    plugins: ["@typescript-eslint"],
+
     rules: {
         // Place to specify ESLint rules. Can be used to overwrite rules specified from the extended configs
         // e.g. "@typescript-eslint/explicit-function-return-type": "off",
diff --git a/README.md b/README.md
index be9e3eb5..ea6aae88 100644
--- a/README.md
+++ b/README.md
@@ -3,9 +3,8 @@
 An implementation of the Dungeonslayers 4 game system for [Foundry Virtual
 Tabletop](http://foundryvtt.com).
 
-This system provides character sheet support for Actors and Items and mechanical
-support for dice and rules necessary to
-play games of Dungeponslayers 4.
+This system provides sheet support for Actors and Items and mechanical support
+for dice and rules necessary to play games of Dungeonslayers 4.
 
 ## Installation
 
@@ -17,7 +16,7 @@ https://git.f3l.de/dungeonslayers/ds4/-/raw/latest/src/system.json?inline=false
 
 ## Development
 
-### Prerequisits
+### Prerequisites
 
 In order to build this system, recent versions of `node` and `npm` are required.
 We recommend using the latest lts version of `node`, which is `v14.15.4` at the
@@ -83,16 +82,18 @@ npm test
 ## Contributing
 
 Code and content contributions are accepted. Please feel free to submit issues
-to the issue tracker or submit merge requests for code changes. To create an issue send a mail to [git+dungeonslayers-ds4-155-issue-@git.f3l.de](mailto:git+dungeonslayers-ds4-155-issue-@git.f3l.de).
+to the issue tracker or submit merge requests for code changes. To create an
+issue, send a mail to [git+dungeonslayers-ds4-155-issue-@git.f3l.de](mailto:git+dungeonslayers-ds4-155-issue-@git.f3l.de).
 
 ## Licensing
 
-[Dungeonslayers](http://dungeonslayers.de/) (© Christian Kennig) is licensed under [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/de/deed.en).
+[Dungeonslayers](http://dungeonslayers.de/) (© Christian Kennig) is licensed
+under [CC BY-NC-SA 3.0](https://creativecommons.org/licenses/by-nc-sa/3.0/de/deed.en).
 
-The icons in [src/assets/icons/official](src/assets/icons/official) are slightly modifed
-versions of original Dungeonslayers icons, which have also been published under
-CC BY-NC-SA 3.0.  Hence the modified icons are also published under this
-license. A copy of this license can be found under
+The icons in [src/assets/icons/official](src/assets/icons/official) are slightly
+modified versions of original Dungeonslayers icons, which have also been
+published under CC BY-NC-SA 3.0. Hence the modified icons are also published
+under this license. A copy of this license can be found under
 [src/assets/icons/official/LICENSE](src/assets/icons/official/LICENSE).
 
 Similarly, the compendium packs found in [src/packs](src/packs) are based on
diff --git a/package-lock.json b/package-lock.json
index 77ef1fe0..e397102f 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,16 +1,16 @@
 {
-    "name": "test",
-    "version": "0.2.0",
+    "name": "dungeonslayers4",
+    "version": "0.2.1",
     "lockfileVersion": 1,
     "requires": true,
     "dependencies": {
         "@babel/code-frame": {
-            "version": "7.12.11",
-            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
-            "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
+            "version": "7.12.13",
+            "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
+            "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
             "dev": true,
             "requires": {
-                "@babel/highlight": "^7.10.4"
+                "@babel/highlight": "^7.12.13"
             }
         },
         "@babel/helper-validator-identifier": {
@@ -20,16 +20,25 @@
             "dev": true
         },
         "@babel/highlight": {
-            "version": "7.10.4",
-            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
-            "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
+            "version": "7.12.13",
+            "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz",
+            "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==",
             "dev": true,
             "requires": {
-                "@babel/helper-validator-identifier": "^7.10.4",
+                "@babel/helper-validator-identifier": "^7.12.11",
                 "chalk": "^2.0.0",
                 "js-tokens": "^4.0.0"
             },
             "dependencies": {
+                "ansi-styles": {
+                    "version": "3.2.1",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+                    "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^1.9.0"
+                    }
+                },
                 "chalk": {
                     "version": "2.4.2",
                     "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -40,6 +49,36 @@
                         "escape-string-regexp": "^1.0.5",
                         "supports-color": "^5.3.0"
                     }
+                },
+                "color-convert": {
+                    "version": "1.9.3",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+                    "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "1.1.3"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.3",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+                    "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+                    "dev": true
+                },
+                "has-flag": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+                    "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+                    "dev": true
+                },
+                "supports-color": {
+                    "version": "5.5.0",
+                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+                    "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+                    "dev": true,
+                    "requires": {
+                        "has-flag": "^3.0.0"
+                    }
                 }
             }
         },
@@ -61,26 +100,11 @@
                 "strip-json-comments": "^3.1.1"
             },
             "dependencies": {
-                "debug": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-                    "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
                 "ignore": {
                     "version": "4.0.6",
                     "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
                     "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
                     "dev": true
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
                 }
             }
         },
@@ -110,6 +134,383 @@
                 "fastq": "^1.6.0"
             }
         },
+        "@pixi/accessibility": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/accessibility/-/accessibility-5.3.4.tgz",
+            "integrity": "sha512-g8hQnnVSYJ+gLrdQyCsDDSu+VehhVL9Pcr2fkQSC9VBhxiMIN+Paky8kOxC2LL5nsKRIUGGaTa6iHtiopPQQMw==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/app": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/app/-/app-5.3.4.tgz",
+            "integrity": "sha512-XT/EFyGslFdvdHY9ZS7yDAdLOj0U1UHeLxFr1kwiawuwIt/WsxNeH4jq2IijvZuQ3L5ON7Y7zQf54JEPv5fK0Q==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4"
+            }
+        },
+        "@pixi/constants": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/constants/-/constants-5.3.4.tgz",
+            "integrity": "sha512-YsWjdMVMoJA8kG/0D4s9/DWWa2lPlexk0qNZOcV3tICaPG0IYfIhepfveMeMhIb0QrdSAsPbhYdcaxxgoaNF1A==",
+            "dev": true
+        },
+        "@pixi/core": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/core/-/core-5.3.4.tgz",
+            "integrity": "sha512-k6SRniy4pH7ZKAKC2HkbLSKPm+j7bF17fTO5+6xLSiVqLnfa7ChV51wNuoa30olVF3/d8ME2uraf7dsvXwomzw==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/runner": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/ticker": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/display": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/display/-/display-5.3.4.tgz",
+            "integrity": "sha512-RCi39Qi1L8mlIu1YvWvPI45WpKHRbpYlvSIT/414wmoaAoFZnaJ+qoVuqDCfzfNhWWirGAWpXniQjNRzkUZjcA==",
+            "dev": true,
+            "requires": {
+                "@pixi/math": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/extract": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/extract/-/extract-5.3.4.tgz",
+            "integrity": "sha512-HTGF5WKts4kF0v1rOU4YcLMUpb18FzcxKhaCwjXpqm3vANgjuGAUL9PxpmC4ecS03mkRa0+9vAXEUkJLQeNLPg==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/filter-alpha": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/filter-alpha/-/filter-alpha-5.3.4.tgz",
+            "integrity": "sha512-lgRCN8bDeHlMpRtQv/P5gCJ+9e3AufJVC2H0TdkCRmJqm1dB+rhKwxIeNINsjjz+kiuumOe88CxRbRd3CpEydg==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4"
+            }
+        },
+        "@pixi/filter-blur": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/filter-blur/-/filter-blur-5.3.4.tgz",
+            "integrity": "sha512-PYPHc8MEsZWfmVQkm0UKO70dmZpcWyu/Bs0xJa5apsmCm6zXNzXfMh02lsXu82HrNQ+9iJT/mAKrrDABGn9vtg==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/settings": "5.3.4"
+            }
+        },
+        "@pixi/filter-color-matrix": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/filter-color-matrix/-/filter-color-matrix-5.3.4.tgz",
+            "integrity": "sha512-9Iflvr1moc7ns5A/73lWVwLUbe+wb678NLA4X9SYXAJTiij4M1isDrULhk95TGUaWo4bbSBaov1vm8XbUZNG8w==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4"
+            }
+        },
+        "@pixi/filter-displacement": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/filter-displacement/-/filter-displacement-5.3.4.tgz",
+            "integrity": "sha512-CldemXpcKr1GRT1Ll33TTFWtU6KDl4sYTvAwWTAEu8OhKedobBB/mRCIK9p1h7iZYtaj5MRYQjewmFKRrqyXrQ==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/math": "5.3.4"
+            }
+        },
+        "@pixi/filter-fxaa": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/filter-fxaa/-/filter-fxaa-5.3.4.tgz",
+            "integrity": "sha512-GtIfaOsqQlsK+F1795V/JJIq5Uu15nasiCwGr+wVwHNGMBanAXt7AnSy8JHcgup3Eqx8FXRuM/AyD/4IYUquuA==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4"
+            }
+        },
+        "@pixi/filter-noise": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/filter-noise/-/filter-noise-5.3.4.tgz",
+            "integrity": "sha512-pNq4T4LC2naWz0pZXF3RT9aA7XdLL4TuBjJsYrrBaJZraupbOo6Mp8VwxVJs8GThmMl7/U13GalOzVSb/HjzDg==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4"
+            }
+        },
+        "@pixi/graphics": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/graphics/-/graphics-5.3.4.tgz",
+            "integrity": "sha512-W6cuFfzwgfx3zVFICu98cENgwjy+d2e6xNJ/yJI0q8QiwlZmpuSXHBCfZrtIWpp9VSJZe2KDIo1LUnLhCpp3Yg==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/sprite": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/interaction": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/interaction/-/interaction-5.3.4.tgz",
+            "integrity": "sha512-7/JN7AtCuYmmWczrQROKSI9Z42p6C6p7B2wDVqNYYgROSaeGbGsZ8H0sa6nYLnIj4F3CaGSRoRnAMPz+CO70bw==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/ticker": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/loaders": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/loaders/-/loaders-5.3.4.tgz",
+            "integrity": "sha512-/dFznZnsivzq/MW7n/PPhMeznWFMMDYrac958OlxzSwrEAgtq6ZVLZbz7pCf9uhiifMnqwBGefphOFubj3Qorw==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/utils": "5.3.4",
+                "resource-loader": "^3.0.1"
+            }
+        },
+        "@pixi/math": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/math/-/math-5.3.4.tgz",
+            "integrity": "sha512-UQ2jhdlCHIvAVf8EcHB3QuR5GhB49VdTccWmer96RZCeGkcZsPSUk1ldO1GZnIctcf0Iuvmq74G02dYbtC7JxQ==",
+            "dev": true
+        },
+        "@pixi/mesh": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/mesh/-/mesh-5.3.4.tgz",
+            "integrity": "sha512-y0Y52cwsqETc/35DMGVCzQmhPCrQ3ZhjWcW9JwQoHMy3PoNSN9QUqYjVjF2oEj5hxcJnGNo3GAXFZz2Uh/UReQ==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/mesh-extras": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/mesh-extras/-/mesh-extras-5.3.4.tgz",
+            "integrity": "sha512-mjc3RlgLGYUv2FUKrVv/Dfaj2KW5qhX9c6Ev+yJ4lg/sMblet5gtYuyKsmJMS/K6B8V8+oMlTfX9ozFCzq1oJQ==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/mesh": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/mixin-cache-as-bitmap": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/mixin-cache-as-bitmap/-/mixin-cache-as-bitmap-5.3.4.tgz",
+            "integrity": "sha512-8ZAmzDK1fHXIzYFHFH72LUMRZerY1Pt71XI3UgsWExABS1aREe20oPLuVByLP94W7X/kTXz+zK+nt51O5MGKsA==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/sprite": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/mixin-get-child-by-name": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/mixin-get-child-by-name/-/mixin-get-child-by-name-5.3.4.tgz",
+            "integrity": "sha512-PY1Qe6CKYu+UNSRAFIfRyhRfkrpsTMwh9sI6iXVVi712bM3JkZIwDfDF31TA4nYX8z7H49w+KCWY4PejZ8l2WA==",
+            "dev": true,
+            "requires": {
+                "@pixi/display": "5.3.4"
+            }
+        },
+        "@pixi/mixin-get-global-position": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/mixin-get-global-position/-/mixin-get-global-position-5.3.4.tgz",
+            "integrity": "sha512-yv+huwUAOfyXDEHbQp6W5/3RjQpwG6AhpgMY4b3XBMtvrp9R/5Wgw/YC/nea9kZ3Gb2u4Aqeco8U+tPIRNjeIA==",
+            "dev": true,
+            "requires": {
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4"
+            }
+        },
+        "@pixi/particles": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/particles/-/particles-5.3.4.tgz",
+            "integrity": "sha512-sX0BGGbS7yCwlam1mC5awW2BjU7QFmZv82E8ON/r9aAZS6InT25zOpMdvy0ImIIqBvF0Z1Qz1IT6pKEBxqMo9Q==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/polyfill": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/polyfill/-/polyfill-5.3.4.tgz",
+            "integrity": "sha512-bxk8bhrfQ9Y2rU/L0ss2gIeXwmMlOciw+B5yVUDVLqzjE4y8Fm2619L4qu9v51Z9a+8JbyVE5c1eT7HJgx0g0w==",
+            "dev": true,
+            "requires": {
+                "es6-promise-polyfill": "^1.2.0",
+                "object-assign": "^4.1.1"
+            }
+        },
+        "@pixi/prepare": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/prepare/-/prepare-5.3.4.tgz",
+            "integrity": "sha512-MVMvNTrNYQidWXd4LSkgv+eqTzHtSViADA+Tvnemy9QMuWqbTfxFn4UMhrBjQIfG9+hwdIFS14pfFKt/BLHNrw==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/graphics": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/text": "5.3.4",
+                "@pixi/ticker": "5.3.4"
+            }
+        },
+        "@pixi/runner": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/runner/-/runner-5.3.4.tgz",
+            "integrity": "sha512-iPWHVhv2js+NhDQNmePkHfic8SilBT7H/pzRjMqHqvafTdl8Y+4g+hdQDalZJNr3Ixl77QPAYlOKhegBujn2mQ==",
+            "dev": true
+        },
+        "@pixi/settings": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/settings/-/settings-5.3.4.tgz",
+            "integrity": "sha512-Jqj1NLtYODCqK8ZKVccUBAaBDkn7SQ6b7N15FwxbiSgfbvwpynSKr6WQTxqMq29h42MKsic6BJcQrlGEbDNz5w==",
+            "dev": true,
+            "requires": {
+                "ismobilejs": "^1.1.0"
+            }
+        },
+        "@pixi/sprite": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/sprite/-/sprite-5.3.4.tgz",
+            "integrity": "sha512-vO+GMJWnumnVzc2R7jGcLlUeIXIek+SDqVQyPDPJ5T8sWTgFhanHCrgpKfplZIu08X/zvIZQxPfd332R0waeog==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/sprite-animated": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/sprite-animated/-/sprite-animated-5.3.4.tgz",
+            "integrity": "sha512-HaTelbvm2xekw9b9GdYbupM2RZ/muRZvstkmSqMZhiIViZekzKPa5WQJwnqZzVBjCg735j09G8aF4H2NpNqF9g==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/sprite": "5.3.4",
+                "@pixi/ticker": "5.3.4"
+            }
+        },
+        "@pixi/sprite-tiling": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/sprite-tiling/-/sprite-tiling-5.3.4.tgz",
+            "integrity": "sha512-NMqpNuWEIic2n5EL/TrGmn1+bab4TwxcILnco4myvw9Sd/wLsaJx3XboegY7YCWCKhnl+Ax6cl8DMkk7OJkpJQ==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/sprite": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/spritesheet": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/spritesheet/-/spritesheet-5.3.4.tgz",
+            "integrity": "sha512-gfCqOMD2XJHw1bMXxXbuYPnBbCBUvbzMN7Pw2po7U5R6bsk7WEoG7Hp3HjAPyPQvg36v2Db6dcz0//ZNNqm+EQ==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/loaders": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/text": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/text/-/text-5.3.4.tgz",
+            "integrity": "sha512-kmdK1KLrWY8PHGIIXKVRQmik3gWquiYz6DB0jqabi3j0gVp6h+CVDje01N6Nl75ZCQ/PjaWafzQvURypfX73ng==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/sprite": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/text-bitmap": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/text-bitmap/-/text-bitmap-5.3.4.tgz",
+            "integrity": "sha512-uNJOYvy3sn0S5Bp6H113ZAmaQm68ojCXSuOBJzIMEV2cUuYLngW+7DqKOsHMMhNmcONs/OBq57SRrzDcr8WYdw==",
+            "dev": true,
+            "requires": {
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/loaders": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/mesh": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/text": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
+        "@pixi/ticker": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/ticker/-/ticker-5.3.4.tgz",
+            "integrity": "sha512-PmCAstgyI6vLPXKZVFlo4Zornry21BwFiTOp1dBUW3sIMky9Wx2fajjyVHIridCY6yaazt6Xu37khZf5qRgASw==",
+            "dev": true,
+            "requires": {
+                "@pixi/settings": "5.3.4"
+            }
+        },
+        "@pixi/utils": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/@pixi/utils/-/utils-5.3.4.tgz",
+            "integrity": "sha512-HjUWFfAmPPKX0BSq20GWY//Vm+gC9O+wcn9sXMqOItCuf0DDFwxoBrUVaHNNnEVhM1Djpz/+YijCijmGdZeddA==",
+            "dev": true,
+            "requires": {
+                "@pixi/constants": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "earcut": "^2.1.5",
+                "eventemitter3": "^3.1.0",
+                "url": "^0.11.0"
+            }
+        },
         "@types/fs-extra": {
             "version": "9.0.6",
             "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.6.tgz",
@@ -119,31 +520,37 @@
                 "@types/node": "*"
             }
         },
+        "@types/howler": {
+            "version": "2.2.1",
+            "resolved": "https://registry.npmjs.org/@types/howler/-/howler-2.2.1.tgz",
+            "integrity": "sha512-1MiSldngr+eAO4lDPtjzl4Nf2GmRh8VDHIpNBIkyd25L22JExVlI6w3fjSM7+FNc1e1WZAPNq7/flkw685byfg==",
+            "dev": true
+        },
         "@types/jasmine": {
-            "version": "3.6.2",
-            "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.2.tgz",
-            "integrity": "sha512-AzfesNFLvOs6Q1mHzIsVJXSeUnqVh4ZHG8ngygKJfbkcSLwzrBVm/LKa+mR8KrOfnWtUL47112gde1MC0IXqpQ==",
+            "version": "3.6.3",
+            "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.3.tgz",
+            "integrity": "sha512-5QKAG8WfC9XrOgYLXPrxv1G2IIUE6zDyzTWamhNWJO0LqPRUbZ0q0zGHDhDJ7MpFloUuyME/jpBIdPjq3/P3jA==",
             "dev": true
         },
         "@types/jquery": {
-            "version": "3.5.5",
-            "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.5.tgz",
-            "integrity": "sha512-6RXU9Xzpc6vxNrS6FPPapN1SxSHgQ336WC6Jj/N8q30OiaBZ00l1GBgeP7usjVZPivSkGUfL1z/WW6TX989M+w==",
+            "version": "3.5.1",
+            "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.1.tgz",
+            "integrity": "sha512-Tyctjh56U7eX2b9udu3wG853ASYP0uagChJcQJXLUXEU6C/JiW5qt5dl8ao01VRj1i5pgXPAf8f1mq4+FDLRQg==",
             "dev": true,
             "requires": {
                 "@types/sizzle": "*"
             }
         },
         "@types/json-schema": {
-            "version": "7.0.6",
-            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
-            "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
+            "version": "7.0.7",
+            "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
+            "integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
             "dev": true
         },
         "@types/node": {
-            "version": "14.14.20",
-            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz",
-            "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==",
+            "version": "14.14.25",
+            "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.25.tgz",
+            "integrity": "sha512-EPpXLOVqDvisVxtlbvzfyqSsFeQxltFbluZNRndIb8tr9KiBnYNLzrc1N3pyKUCww2RNrfHDViqDWWE1LCJQtQ==",
             "dev": true
         },
         "@types/parse-json": {
@@ -174,185 +581,86 @@
             }
         },
         "@typescript-eslint/eslint-plugin": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.0.tgz",
-            "integrity": "sha512-IJ5e2W7uFNfg4qh9eHkHRUCbgZ8VKtGwD07kannJvM5t/GU8P8+24NX8gi3Hf5jST5oWPY8kyV1s/WtfiZ4+Ww==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.14.2.tgz",
+            "integrity": "sha512-uMGfG7GFYK/nYutK/iqYJv6K/Xuog/vrRRZX9aEP4Zv1jsYXuvFUMDFLhUnc8WFv3D2R5QhNQL3VYKmvLS5zsQ==",
             "dev": true,
             "requires": {
-                "@typescript-eslint/experimental-utils": "4.14.0",
-                "@typescript-eslint/scope-manager": "4.14.0",
+                "@typescript-eslint/experimental-utils": "4.14.2",
+                "@typescript-eslint/scope-manager": "4.14.2",
                 "debug": "^4.1.1",
                 "functional-red-black-tree": "^1.0.1",
                 "lodash": "^4.17.15",
                 "regexpp": "^3.0.0",
                 "semver": "^7.3.2",
                 "tsutils": "^3.17.1"
-            },
-            "dependencies": {
-                "debug": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-                    "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "lru-cache": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-                    "dev": true,
-                    "requires": {
-                        "yallist": "^4.0.0"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
-                },
-                "semver": {
-                    "version": "7.3.4",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-                    "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-                    "dev": true,
-                    "requires": {
-                        "lru-cache": "^6.0.0"
-                    }
-                },
-                "yallist": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-                    "dev": true
-                }
             }
         },
         "@typescript-eslint/experimental-utils": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.0.tgz",
-            "integrity": "sha512-6i6eAoiPlXMKRbXzvoQD5Yn9L7k9ezzGRvzC/x1V3650rUk3c3AOjQyGYyF9BDxQQDK2ElmKOZRD0CbtdkMzQQ==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.14.2.tgz",
+            "integrity": "sha512-mV9pmET4C2y2WlyHmD+Iun8SAEqkLahHGBkGqDVslHkmoj3VnxnGP4ANlwuxxfq1BsKdl/MPieDbohCEQgKrwA==",
             "dev": true,
             "requires": {
                 "@types/json-schema": "^7.0.3",
-                "@typescript-eslint/scope-manager": "4.14.0",
-                "@typescript-eslint/types": "4.14.0",
-                "@typescript-eslint/typescript-estree": "4.14.0",
+                "@typescript-eslint/scope-manager": "4.14.2",
+                "@typescript-eslint/types": "4.14.2",
+                "@typescript-eslint/typescript-estree": "4.14.2",
                 "eslint-scope": "^5.0.0",
                 "eslint-utils": "^2.0.0"
             }
         },
         "@typescript-eslint/parser": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.0.tgz",
-            "integrity": "sha512-sUDeuCjBU+ZF3Lzw0hphTyScmDDJ5QVkyE21pRoBo8iDl7WBtVFS+WDN3blY1CH3SBt7EmYCw6wfmJjF0l/uYg==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.14.2.tgz",
+            "integrity": "sha512-ipqSP6EuUsMu3E10EZIApOJgWSpcNXeKZaFeNKQyzqxnQl8eQCbV+TSNsl+s2GViX2d18m1rq3CWgnpOxDPgHg==",
             "dev": true,
             "requires": {
-                "@typescript-eslint/scope-manager": "4.14.0",
-                "@typescript-eslint/types": "4.14.0",
-                "@typescript-eslint/typescript-estree": "4.14.0",
+                "@typescript-eslint/scope-manager": "4.14.2",
+                "@typescript-eslint/types": "4.14.2",
+                "@typescript-eslint/typescript-estree": "4.14.2",
                 "debug": "^4.1.1"
-            },
-            "dependencies": {
-                "debug": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-                    "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
-                }
             }
         },
         "@typescript-eslint/scope-manager": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.0.tgz",
-            "integrity": "sha512-/J+LlRMdbPh4RdL4hfP1eCwHN5bAhFAGOTsvE6SxsrM/47XQiPSgF5MDgLyp/i9kbZV9Lx80DW0OpPkzL+uf8Q==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.14.2.tgz",
+            "integrity": "sha512-cuV9wMrzKm6yIuV48aTPfIeqErt5xceTheAgk70N1V4/2Ecj+fhl34iro/vIssJlb7XtzcaD07hWk7Jk0nKghg==",
             "dev": true,
             "requires": {
-                "@typescript-eslint/types": "4.14.0",
-                "@typescript-eslint/visitor-keys": "4.14.0"
+                "@typescript-eslint/types": "4.14.2",
+                "@typescript-eslint/visitor-keys": "4.14.2"
             }
         },
         "@typescript-eslint/types": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.0.tgz",
-            "integrity": "sha512-VsQE4VvpldHrTFuVPY1ZnHn/Txw6cZGjL48e+iBxTi2ksa9DmebKjAeFmTVAYoSkTk7gjA7UqJ7pIsyifTsI4A==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.14.2.tgz",
+            "integrity": "sha512-LltxawRW6wXy4Gck6ZKlBD05tCHQUj4KLn4iR69IyRiDHX3d3NCAhO+ix5OR2Q+q9bjCrHE/HKt+riZkd1At8Q==",
             "dev": true
         },
         "@typescript-eslint/typescript-estree": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.0.tgz",
-            "integrity": "sha512-wRjZ5qLao+bvS2F7pX4qi2oLcOONIB+ru8RGBieDptq/SudYwshveORwCVU4/yMAd4GK7Fsf8Uq1tjV838erag==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.14.2.tgz",
+            "integrity": "sha512-ESiFl8afXxt1dNj8ENEZT12p+jl9PqRur+Y19m0Z/SPikGL6rqq4e7Me60SU9a2M28uz48/8yct97VQYaGl0Vg==",
             "dev": true,
             "requires": {
-                "@typescript-eslint/types": "4.14.0",
-                "@typescript-eslint/visitor-keys": "4.14.0",
+                "@typescript-eslint/types": "4.14.2",
+                "@typescript-eslint/visitor-keys": "4.14.2",
                 "debug": "^4.1.1",
                 "globby": "^11.0.1",
                 "is-glob": "^4.0.1",
                 "lodash": "^4.17.15",
                 "semver": "^7.3.2",
                 "tsutils": "^3.17.1"
-            },
-            "dependencies": {
-                "debug": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-                    "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "lru-cache": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-                    "dev": true,
-                    "requires": {
-                        "yallist": "^4.0.0"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
-                },
-                "semver": {
-                    "version": "7.3.4",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-                    "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-                    "dev": true,
-                    "requires": {
-                        "lru-cache": "^6.0.0"
-                    }
-                },
-                "yallist": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-                    "dev": true
-                }
             }
         },
         "@typescript-eslint/visitor-keys": {
-            "version": "4.14.0",
-            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.0.tgz",
-            "integrity": "sha512-MeHHzUyRI50DuiPgV9+LxcM52FCJFYjJiWHtXlbyC27b80mfOwKeiKI+MHOTEpcpfmoPFm/vvQS88bYIx6PZTA==",
+            "version": "4.14.2",
+            "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.14.2.tgz",
+            "integrity": "sha512-KBB+xLBxnBdTENs/rUgeUKO0UkPBRs2vD09oMRRIkj5BEN8PX1ToXV532desXfpQnZsYTyLLviS7JrPhdL154w==",
             "dev": true,
             "requires": {
-                "@typescript-eslint/types": "4.14.0",
+                "@typescript-eslint/types": "4.14.2",
                 "eslint-visitor-keys": "^2.0.0"
             }
         },
@@ -382,6 +690,66 @@
                 "semver": "^5.3.0",
                 "uglify-js": "^2.8.22",
                 "when": "^3.7.8"
+            },
+            "dependencies": {
+                "camelcase": {
+                    "version": "1.2.1",
+                    "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+                    "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+                    "dev": true
+                },
+                "cliui": {
+                    "version": "2.1.0",
+                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+                    "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+                    "dev": true,
+                    "requires": {
+                        "center-align": "^0.1.1",
+                        "right-align": "^0.1.1",
+                        "wordwrap": "0.0.2"
+                    }
+                },
+                "semver": {
+                    "version": "5.7.1",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+                    "dev": true
+                },
+                "source-map": {
+                    "version": "0.5.7",
+                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+                    "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+                    "dev": true
+                },
+                "uglify-js": {
+                    "version": "2.8.29",
+                    "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
+                    "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+                    "dev": true,
+                    "requires": {
+                        "source-map": "~0.5.1",
+                        "uglify-to-browserify": "~1.0.0",
+                        "yargs": "~3.10.0"
+                    }
+                },
+                "wordwrap": {
+                    "version": "0.0.2",
+                    "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+                    "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+                    "dev": true
+                },
+                "yargs": {
+                    "version": "3.10.0",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+                    "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+                    "dev": true,
+                    "requires": {
+                        "camelcase": "^1.0.2",
+                        "cliui": "^2.1.0",
+                        "decamelize": "^1.0.0",
+                        "window-size": "0.1.0"
+                    }
+                }
             }
         },
         "acorn": {
@@ -455,13 +823,10 @@
             "dev": true
         },
         "ansi-colors": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
-            "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
-            "dev": true,
-            "requires": {
-                "ansi-wrap": "^0.1.0"
-            }
+            "version": "4.1.1",
+            "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+            "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+            "dev": true
         },
         "ansi-cyan": {
             "version": "0.1.1",
@@ -508,18 +873,18 @@
             }
         },
         "ansi-regex": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-            "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+            "version": "5.0.0",
+            "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+            "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
             "dev": true
         },
         "ansi-styles": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-            "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+            "version": "4.3.0",
+            "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+            "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
             "dev": true,
             "requires": {
-                "color-convert": "^1.9.0"
+                "color-convert": "^2.0.1"
             }
         },
         "ansi-wrap": {
@@ -544,6 +909,99 @@
                 "normalize-path": "^2.1.1"
             },
             "dependencies": {
+                "braces": {
+                    "version": "2.3.2",
+                    "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+                    "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+                    "dev": true,
+                    "requires": {
+                        "arr-flatten": "^1.1.0",
+                        "array-unique": "^0.3.2",
+                        "extend-shallow": "^2.0.1",
+                        "fill-range": "^4.0.0",
+                        "isobject": "^3.0.1",
+                        "repeat-element": "^1.1.2",
+                        "snapdragon": "^0.8.1",
+                        "snapdragon-node": "^2.0.1",
+                        "split-string": "^3.0.2",
+                        "to-regex": "^3.0.1"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "fill-range": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+                    "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+                    "dev": true,
+                    "requires": {
+                        "extend-shallow": "^2.0.1",
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1",
+                        "to-regex-range": "^2.1.0"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "is-number": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+                    "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+                    "dev": true,
+                    "requires": {
+                        "kind-of": "^3.0.2"
+                    },
+                    "dependencies": {
+                        "kind-of": {
+                            "version": "3.2.2",
+                            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                            "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                            "dev": true,
+                            "requires": {
+                                "is-buffer": "^1.1.5"
+                            }
+                        }
+                    }
+                },
+                "micromatch": {
+                    "version": "3.1.10",
+                    "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+                    "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+                    "dev": true,
+                    "requires": {
+                        "arr-diff": "^4.0.0",
+                        "array-unique": "^0.3.2",
+                        "braces": "^2.3.1",
+                        "define-property": "^2.0.2",
+                        "extend-shallow": "^3.0.2",
+                        "extglob": "^2.0.4",
+                        "fragment-cache": "^0.2.1",
+                        "kind-of": "^6.0.2",
+                        "nanomatch": "^1.2.9",
+                        "object.pick": "^1.3.0",
+                        "regex-not": "^1.0.0",
+                        "snapdragon": "^0.8.1",
+                        "to-regex": "^3.0.2"
+                    }
+                },
                 "normalize-path": {
                     "version": "2.1.1",
                     "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
@@ -552,6 +1010,16 @@
                     "requires": {
                         "remove-trailing-separator": "^1.0.1"
                     }
+                },
+                "to-regex-range": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+                    "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+                    "dev": true,
+                    "requires": {
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1"
+                    }
                 }
             }
         },
@@ -583,19 +1051,6 @@
                 "readdir-glob": "^1.0.0",
                 "tar-stream": "^2.1.4",
                 "zip-stream": "^4.0.4"
-            },
-            "dependencies": {
-                "readable-stream": {
-                    "version": "3.6.0",
-                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-                    "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-                    "dev": true,
-                    "requires": {
-                        "inherits": "^2.0.3",
-                        "string_decoder": "^1.1.1",
-                        "util-deprecate": "^1.0.1"
-                    }
-                }
             }
         },
         "archiver-utils": {
@@ -614,6 +1069,23 @@
                 "lodash.union": "^4.6.0",
                 "normalize-path": "^3.0.0",
                 "readable-stream": "^2.0.0"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "archy": {
@@ -630,6 +1102,23 @@
             "requires": {
                 "delegates": "^1.0.0",
                 "readable-stream": "^2.0.6"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "arg": {
@@ -858,9 +1347,9 @@
             "dev": true
         },
         "aws4": {
-            "version": "1.10.1",
-            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
-            "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
+            "version": "1.11.0",
+            "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
+            "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==",
             "dev": true
         },
         "bach": {
@@ -973,27 +1462,14 @@
             }
         },
         "bl": {
-            "version": "4.0.3",
-            "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
-            "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+            "version": "4.0.4",
+            "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.4.tgz",
+            "integrity": "sha512-7tdr4EpSd7jJ6tuQ21vu2ke8w7pNEstzj1O8wwq6sNNzO3UDi5MA8Gny/gquCj7r2C6fHudg8tKRGyjRgmvNxQ==",
             "dev": true,
             "requires": {
                 "buffer": "^5.5.0",
                 "inherits": "^2.0.4",
                 "readable-stream": "^3.4.0"
-            },
-            "dependencies": {
-                "readable-stream": {
-                    "version": "3.6.0",
-                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-                    "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-                    "dev": true,
-                    "requires": {
-                        "inherits": "^2.0.3",
-                        "string_decoder": "^1.1.1",
-                        "util-deprecate": "^1.0.1"
-                    }
-                }
             }
         },
         "block-stream": {
@@ -1016,32 +1492,12 @@
             }
         },
         "braces": {
-            "version": "2.3.2",
-            "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
-            "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+            "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
             "dev": true,
             "requires": {
-                "arr-flatten": "^1.1.0",
-                "array-unique": "^0.3.2",
-                "extend-shallow": "^2.0.1",
-                "fill-range": "^4.0.0",
-                "isobject": "^3.0.1",
-                "repeat-element": "^1.1.2",
-                "snapdragon": "^0.8.1",
-                "snapdragon-node": "^2.0.1",
-                "split-string": "^3.0.2",
-                "to-regex": "^3.0.1"
-            },
-            "dependencies": {
-                "extend-shallow": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-                    "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-                    "dev": true,
-                    "requires": {
-                        "is-extendable": "^0.1.0"
-                    }
-                }
+                "fill-range": "^7.0.1"
             }
         },
         "buffer": {
@@ -1089,6 +1545,16 @@
                 "unset-value": "^1.0.0"
             }
         },
+        "call-bind": {
+            "version": "1.0.2",
+            "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+            "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+            "dev": true,
+            "requires": {
+                "function-bind": "^1.1.1",
+                "get-intrinsic": "^1.0.2"
+            }
+        },
         "callsites": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -1143,41 +1609,6 @@
             "requires": {
                 "ansi-styles": "^4.1.0",
                 "supports-color": "^7.1.0"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "supports-color": {
-                    "version": "7.2.0",
-                    "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-                    "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-                    "dev": true,
-                    "requires": {
-                        "has-flag": "^4.0.0"
-                    }
-                }
             }
         },
         "chokidar": {
@@ -1198,6 +1629,96 @@
                 "path-is-absolute": "^1.0.0",
                 "readdirp": "^2.2.1",
                 "upath": "^1.1.1"
+            },
+            "dependencies": {
+                "braces": {
+                    "version": "2.3.2",
+                    "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+                    "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+                    "dev": true,
+                    "requires": {
+                        "arr-flatten": "^1.1.0",
+                        "array-unique": "^0.3.2",
+                        "extend-shallow": "^2.0.1",
+                        "fill-range": "^4.0.0",
+                        "isobject": "^3.0.1",
+                        "repeat-element": "^1.1.2",
+                        "snapdragon": "^0.8.1",
+                        "snapdragon-node": "^2.0.1",
+                        "split-string": "^3.0.2",
+                        "to-regex": "^3.0.1"
+                    }
+                },
+                "extend-shallow": {
+                    "version": "2.0.1",
+                    "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                    "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                    "dev": true,
+                    "requires": {
+                        "is-extendable": "^0.1.0"
+                    }
+                },
+                "fill-range": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+                    "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+                    "dev": true,
+                    "requires": {
+                        "extend-shallow": "^2.0.1",
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1",
+                        "to-regex-range": "^2.1.0"
+                    }
+                },
+                "glob-parent": {
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+                    "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+                    "dev": true,
+                    "requires": {
+                        "is-glob": "^3.1.0",
+                        "path-dirname": "^1.0.0"
+                    },
+                    "dependencies": {
+                        "is-glob": {
+                            "version": "3.1.0",
+                            "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+                            "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+                            "dev": true,
+                            "requires": {
+                                "is-extglob": "^2.1.0"
+                            }
+                        }
+                    }
+                },
+                "is-number": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+                    "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+                    "dev": true,
+                    "requires": {
+                        "kind-of": "^3.0.2"
+                    }
+                },
+                "kind-of": {
+                    "version": "3.2.2",
+                    "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                    "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                    "dev": true,
+                    "requires": {
+                        "is-buffer": "^1.1.5"
+                    }
+                },
+                "to-regex-range": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+                    "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+                    "dev": true,
+                    "requires": {
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1"
+                    }
+                }
             }
         },
         "ci-info": {
@@ -1254,48 +1775,6 @@
                 "string-width": "^4.2.0"
             },
             "dependencies": {
-                "ansi-regex": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-                    "dev": true
-                },
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "emoji-regex": {
-                    "version": "8.0.0",
-                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-                    "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-                    "dev": true
-                },
-                "is-fullwidth-code-point": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-                    "dev": true
-                },
                 "slice-ansi": {
                     "version": "3.0.0",
                     "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
@@ -1306,26 +1785,6 @@
                         "astral-regex": "^2.0.0",
                         "is-fullwidth-code-point": "^3.0.0"
                     }
-                },
-                "string-width": {
-                    "version": "4.2.0",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-                    "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-                    "dev": true,
-                    "requires": {
-                        "emoji-regex": "^8.0.0",
-                        "is-fullwidth-code-point": "^3.0.0",
-                        "strip-ansi": "^6.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-regex": "^5.0.0"
-                    }
                 }
             }
         },
@@ -1338,6 +1797,43 @@
                 "string-width": "^1.0.1",
                 "strip-ansi": "^3.0.1",
                 "wrap-ansi": "^2.0.0"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+                    "dev": true
+                },
+                "is-fullwidth-code-point": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+                    "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+                    "dev": true,
+                    "requires": {
+                        "number-is-nan": "^1.0.0"
+                    }
+                },
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                    "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                    "dev": true,
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+                    "dev": true,
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                }
             }
         },
         "clone": {
@@ -1367,6 +1863,23 @@
                 "inherits": "^2.0.1",
                 "process-nextick-args": "^2.0.0",
                 "readable-stream": "^2.3.5"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "code-point-at": {
@@ -1397,18 +1910,18 @@
             }
         },
         "color-convert": {
-            "version": "1.9.3",
-            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-            "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+            "version": "2.0.1",
+            "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+            "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
             "dev": true,
             "requires": {
-                "color-name": "1.1.3"
+                "color-name": "~1.1.4"
             }
         },
         "color-name": {
-            "version": "1.1.3",
-            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-            "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+            "version": "1.1.4",
+            "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+            "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
             "dev": true
         },
         "color-support": {
@@ -1454,19 +1967,6 @@
                 "crc32-stream": "^4.0.1",
                 "normalize-path": "^3.0.0",
                 "readable-stream": "^3.6.0"
-            },
-            "dependencies": {
-                "readable-stream": {
-                    "version": "3.6.0",
-                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-                    "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-                    "dev": true,
-                    "requires": {
-                        "inherits": "^2.0.3",
-                        "string_decoder": "^1.1.1",
-                        "util-deprecate": "^1.0.1"
-                    }
-                }
             }
         },
         "concat-map": {
@@ -1485,6 +1985,23 @@
                 "inherits": "^2.0.3",
                 "readable-stream": "^2.2.2",
                 "typedarray": "^0.0.6"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "console-control-strings": {
@@ -1503,12 +2020,12 @@
             }
         },
         "copy-anything": {
-            "version": "2.0.1",
-            "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.1.tgz",
-            "integrity": "sha512-lA57e7viQHOdPQcrytv5jFeudZZOXuyk47lZym279FiDQ8jeZomXiGuVf6ffMKkJ+3TIai3J1J3yi6M+/4U35g==",
+            "version": "2.0.3",
+            "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz",
+            "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==",
             "dev": true,
             "requires": {
-                "is-what": "^3.7.1"
+                "is-what": "^3.12.0"
             }
         },
         "copy-descriptor": {
@@ -1547,9 +2064,9 @@
             },
             "dependencies": {
                 "parse-json": {
-                    "version": "5.1.0",
-                    "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.1.0.tgz",
-                    "integrity": "sha512-+mi/lmVVNKFNVyLXV31ERiy2CY5E1/F6QtJFEzoChPRwwngMNXRDQ9GJ5WdE2Z2P4AujsOi0/+2qHID68KwfIQ==",
+                    "version": "5.2.0",
+                    "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+                    "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
                     "dev": true,
                     "requires": {
                         "@babel/code-frame": "^7.0.0",
@@ -1557,12 +2074,6 @@
                         "json-parse-even-better-errors": "^2.3.0",
                         "lines-and-columns": "^1.1.6"
                     }
-                },
-                "path-type": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-                    "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-                    "dev": true
                 }
             }
         },
@@ -1577,26 +2088,13 @@
             }
         },
         "crc32-stream": {
-            "version": "4.0.1",
-            "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.1.tgz",
-            "integrity": "sha512-FN5V+weeO/8JaXsamelVYO1PHyeCsuL3HcG4cqsj0ceARcocxalaShCsohZMSAF+db7UYFwBy1rARK/0oFItUw==",
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.2.tgz",
+            "integrity": "sha512-DxFZ/Hk473b/muq1VJ///PMNLj0ZMnzye9thBpmjpJKCc5eMgB95aK8zCGrGfQ90cWo561Te6HK9D+j4KPdM6w==",
             "dev": true,
             "requires": {
                 "crc-32": "^1.2.0",
                 "readable-stream": "^3.4.0"
-            },
-            "dependencies": {
-                "readable-stream": {
-                    "version": "3.6.0",
-                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-                    "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-                    "dev": true,
-                    "requires": {
-                        "inherits": "^2.0.3",
-                        "string_decoder": "^1.1.1",
-                        "util-deprecate": "^1.0.1"
-                    }
-                }
             }
         },
         "create-require": {
@@ -1606,13 +2104,14 @@
             "dev": true
         },
         "cross-spawn": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
-            "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+            "version": "7.0.3",
+            "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+            "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
             "dev": true,
             "requires": {
-                "lru-cache": "^4.0.1",
-                "which": "^1.2.9"
+                "path-key": "^3.1.0",
+                "shebang-command": "^2.0.0",
+                "which": "^2.0.1"
             }
         },
         "currently-unhandled": {
@@ -1644,12 +2143,12 @@
             }
         },
         "debug": {
-            "version": "2.6.9",
-            "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-            "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+            "version": "4.3.1",
+            "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+            "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
             "dev": true,
             "requires": {
-                "ms": "2.0.0"
+                "ms": "2.1.2"
             }
         },
         "decamelize": {
@@ -1780,14 +2279,6 @@
             "dev": true,
             "requires": {
                 "path-type": "^4.0.0"
-            },
-            "dependencies": {
-                "path-type": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
-                    "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
-                    "dev": true
-                }
             }
         },
         "doctrine": {
@@ -1809,6 +2300,23 @@
                 "inherits": "^2.0.1",
                 "readable-stream": "^2.0.0",
                 "stream-shift": "^1.0.0"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "each-props": {
@@ -1821,6 +2329,12 @@
                 "object.defaults": "^1.1.0"
             }
         },
+        "earcut": {
+            "version": "2.2.2",
+            "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.2.tgz",
+            "integrity": "sha512-eZoZPPJcUHnfRZ0PjLvx2qBordSiO8ofC3vt+qACLM95u+4DovnbYNpQtJh0DNsWj8RnxrQytD4WA8gj5cRIaQ==",
+            "dev": true
+        },
         "ecc-jsbn": {
             "version": "0.1.2",
             "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
@@ -1832,9 +2346,9 @@
             }
         },
         "emoji-regex": {
-            "version": "7.0.3",
-            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-            "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+            "version": "8.0.0",
+            "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+            "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
             "dev": true
         },
         "end-of-stream": {
@@ -1853,14 +2367,6 @@
             "dev": true,
             "requires": {
                 "ansi-colors": "^4.1.1"
-            },
-            "dependencies": {
-                "ansi-colors": {
-                    "version": "4.1.1",
-                    "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-                    "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-                    "dev": true
-                }
             }
         },
         "errno": {
@@ -1882,37 +2388,6 @@
                 "is-arrayish": "^0.2.1"
             }
         },
-        "es-abstract": {
-            "version": "1.18.0-next.1",
-            "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
-            "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
-            "dev": true,
-            "requires": {
-                "es-to-primitive": "^1.2.1",
-                "function-bind": "^1.1.1",
-                "has": "^1.0.3",
-                "has-symbols": "^1.0.1",
-                "is-callable": "^1.2.2",
-                "is-negative-zero": "^2.0.0",
-                "is-regex": "^1.1.1",
-                "object-inspect": "^1.8.0",
-                "object-keys": "^1.1.1",
-                "object.assign": "^4.1.1",
-                "string.prototype.trimend": "^1.0.1",
-                "string.prototype.trimstart": "^1.0.1"
-            }
-        },
-        "es-to-primitive": {
-            "version": "1.2.1",
-            "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
-            "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
-            "dev": true,
-            "requires": {
-                "is-callable": "^1.1.4",
-                "is-date-object": "^1.0.1",
-                "is-symbol": "^1.0.2"
-            }
-        },
         "es5-ext": {
             "version": "0.10.53",
             "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
@@ -1935,6 +2410,12 @@
                 "es6-symbol": "^3.1.1"
             }
         },
+        "es6-promise-polyfill": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/es6-promise-polyfill/-/es6-promise-polyfill-1.2.0.tgz",
+            "integrity": "sha1-84kl8jyz4+jObNqP93T867sJDN4=",
+            "dev": true
+        },
         "es6-symbol": {
             "version": "3.1.3",
             "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
@@ -1970,9 +2451,9 @@
             "dev": true
         },
         "eslint": {
-            "version": "7.18.0",
-            "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz",
-            "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==",
+            "version": "7.19.0",
+            "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz",
+            "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==",
             "dev": true,
             "requires": {
                 "@babel/code-frame": "^7.0.0",
@@ -2014,101 +2495,18 @@
                 "v8-compile-cache": "^2.0.3"
             },
             "dependencies": {
-                "ansi-regex": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-                    "dev": true
-                },
-                "cross-spawn": {
-                    "version": "7.0.3",
-                    "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-                    "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-                    "dev": true,
-                    "requires": {
-                        "path-key": "^3.1.0",
-                        "shebang-command": "^2.0.0",
-                        "which": "^2.0.1"
-                    }
-                },
-                "debug": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-                    "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "glob-parent": {
-                    "version": "5.1.1",
-                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-                    "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-                    "dev": true,
-                    "requires": {
-                        "is-glob": "^4.0.1"
-                    }
-                },
                 "ignore": {
                     "version": "4.0.6",
                     "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
                     "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
                     "dev": true
-                },
-                "lru-cache": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-                    "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-                    "dev": true,
-                    "requires": {
-                        "yallist": "^4.0.0"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
-                },
-                "semver": {
-                    "version": "7.3.4",
-                    "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
-                    "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
-                    "dev": true,
-                    "requires": {
-                        "lru-cache": "^6.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-regex": "^5.0.0"
-                    }
-                },
-                "which": {
-                    "version": "2.0.2",
-                    "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-                    "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-                    "dev": true,
-                    "requires": {
-                        "isexe": "^2.0.0"
-                    }
-                },
-                "yallist": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-                    "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
-                    "dev": true
                 }
             }
         },
         "eslint-config-prettier": {
-            "version": "7.1.0",
-            "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.1.0.tgz",
-            "integrity": "sha512-9sm5/PxaFG7qNJvJzTROMM1Bk1ozXVTKI0buKOyb0Bsr1hrwi0H/TzxF/COtf1uxikIK8SwhX7K6zg78jAzbeA==",
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz",
+            "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==",
             "dev": true
         },
         "eslint-plugin-prettier": {
@@ -2179,9 +2577,9 @@
             "dev": true
         },
         "esquery": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
-            "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+            "version": "1.4.0",
+            "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+            "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
             "dev": true,
             "requires": {
                 "estraverse": "^5.1.0"
@@ -2224,6 +2622,12 @@
             "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
             "dev": true
         },
+        "eventemitter3": {
+            "version": "3.1.2",
+            "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz",
+            "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==",
+            "dev": true
+        },
         "execa": {
             "version": "4.1.0",
             "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
@@ -2239,28 +2643,6 @@
                 "onetime": "^5.1.0",
                 "signal-exit": "^3.0.2",
                 "strip-final-newline": "^2.0.0"
-            },
-            "dependencies": {
-                "cross-spawn": {
-                    "version": "7.0.3",
-                    "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
-                    "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
-                    "dev": true,
-                    "requires": {
-                        "path-key": "^3.1.0",
-                        "shebang-command": "^2.0.0",
-                        "which": "^2.0.1"
-                    }
-                },
-                "which": {
-                    "version": "2.0.2",
-                    "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-                    "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-                    "dev": true,
-                    "requires": {
-                        "isexe": "^2.0.0"
-                    }
-                }
             }
         },
         "exit-on-epipe": {
@@ -2284,6 +2666,15 @@
                 "to-regex": "^3.0.1"
             },
             "dependencies": {
+                "debug": {
+                    "version": "2.6.9",
+                    "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+                    "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+                    "dev": true,
+                    "requires": {
+                        "ms": "2.0.0"
+                    }
+                },
                 "define-property": {
                     "version": "0.2.5",
                     "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
@@ -2301,6 +2692,12 @@
                     "requires": {
                         "is-extendable": "^0.1.0"
                     }
+                },
+                "ms": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+                    "dev": true
                 }
             }
         },
@@ -2464,60 +2861,6 @@
                 "merge2": "^1.3.0",
                 "micromatch": "^4.0.2",
                 "picomatch": "^2.2.1"
-            },
-            "dependencies": {
-                "braces": {
-                    "version": "3.0.2",
-                    "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-                    "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-                    "dev": true,
-                    "requires": {
-                        "fill-range": "^7.0.1"
-                    }
-                },
-                "fill-range": {
-                    "version": "7.0.1",
-                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-                    "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-                    "dev": true,
-                    "requires": {
-                        "to-regex-range": "^5.0.1"
-                    }
-                },
-                "glob-parent": {
-                    "version": "5.1.1",
-                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-                    "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-                    "dev": true,
-                    "requires": {
-                        "is-glob": "^4.0.1"
-                    }
-                },
-                "is-number": {
-                    "version": "7.0.0",
-                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-                    "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-                    "dev": true
-                },
-                "micromatch": {
-                    "version": "4.0.2",
-                    "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-                    "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-                    "dev": true,
-                    "requires": {
-                        "braces": "^3.0.1",
-                        "picomatch": "^2.0.5"
-                    }
-                },
-                "to-regex-range": {
-                    "version": "5.0.1",
-                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-                    "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-                    "dev": true,
-                    "requires": {
-                        "is-number": "^7.0.0"
-                    }
-                }
             }
         },
         "fast-json-stable-stringify": {
@@ -2527,15 +2870,15 @@
             "dev": true
         },
         "fast-levenshtein": {
-            "version": "1.1.4",
-            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz",
-            "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=",
+            "version": "2.0.6",
+            "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+            "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
             "dev": true
         },
         "fastq": {
-            "version": "1.10.0",
-            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
-            "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
+            "version": "1.10.1",
+            "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz",
+            "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==",
             "dev": true,
             "requires": {
                 "reusify": "^1.0.4"
@@ -2567,26 +2910,12 @@
             "optional": true
         },
         "fill-range": {
-            "version": "4.0.0",
-            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
-            "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+            "version": "7.0.1",
+            "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+            "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
             "dev": true,
             "requires": {
-                "extend-shallow": "^2.0.1",
-                "is-number": "^3.0.0",
-                "repeat-string": "^1.6.1",
-                "to-regex-range": "^2.1.0"
-            },
-            "dependencies": {
-                "extend-shallow": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-                    "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
-                    "dev": true,
-                    "requires": {
-                        "is-extendable": "^0.1.0"
-                    }
-                }
+                "to-regex-range": "^5.0.1"
             }
         },
         "find-up": {
@@ -2618,6 +2947,111 @@
                 "is-glob": "^4.0.0",
                 "micromatch": "^3.0.4",
                 "resolve-dir": "^1.0.1"
+            },
+            "dependencies": {
+                "braces": {
+                    "version": "2.3.2",
+                    "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+                    "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+                    "dev": true,
+                    "requires": {
+                        "arr-flatten": "^1.1.0",
+                        "array-unique": "^0.3.2",
+                        "extend-shallow": "^2.0.1",
+                        "fill-range": "^4.0.0",
+                        "isobject": "^3.0.1",
+                        "repeat-element": "^1.1.2",
+                        "snapdragon": "^0.8.1",
+                        "snapdragon-node": "^2.0.1",
+                        "split-string": "^3.0.2",
+                        "to-regex": "^3.0.1"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "fill-range": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+                    "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+                    "dev": true,
+                    "requires": {
+                        "extend-shallow": "^2.0.1",
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1",
+                        "to-regex-range": "^2.1.0"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "is-number": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+                    "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+                    "dev": true,
+                    "requires": {
+                        "kind-of": "^3.0.2"
+                    },
+                    "dependencies": {
+                        "kind-of": {
+                            "version": "3.2.2",
+                            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                            "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                            "dev": true,
+                            "requires": {
+                                "is-buffer": "^1.1.5"
+                            }
+                        }
+                    }
+                },
+                "micromatch": {
+                    "version": "3.1.10",
+                    "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+                    "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+                    "dev": true,
+                    "requires": {
+                        "arr-diff": "^4.0.0",
+                        "array-unique": "^0.3.2",
+                        "braces": "^2.3.1",
+                        "define-property": "^2.0.2",
+                        "extend-shallow": "^3.0.2",
+                        "extglob": "^2.0.4",
+                        "fragment-cache": "^0.2.1",
+                        "kind-of": "^6.0.2",
+                        "nanomatch": "^1.2.9",
+                        "object.pick": "^1.3.0",
+                        "regex-not": "^1.0.0",
+                        "snapdragon": "^0.8.1",
+                        "to-regex": "^3.0.2"
+                    }
+                },
+                "to-regex-range": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+                    "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+                    "dev": true,
+                    "requires": {
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1"
+                    }
+                }
             }
         },
         "fined": {
@@ -2640,6 +3074,23 @@
             "dev": true,
             "requires": {
                 "readable-stream": "^2.0.2"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "flagged-respawn": {
@@ -2656,23 +3107,12 @@
             "requires": {
                 "flatted": "^3.1.0",
                 "rimraf": "^3.0.2"
-            },
-            "dependencies": {
-                "rimraf": {
-                    "version": "3.0.2",
-                    "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-                    "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-                    "dev": true,
-                    "requires": {
-                        "glob": "^7.1.3"
-                    }
-                }
             }
         },
         "flatted": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz",
-            "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==",
+            "version": "3.1.1",
+            "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz",
+            "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==",
             "dev": true
         },
         "flush-write-stream": {
@@ -2683,6 +3123,23 @@
             "requires": {
                 "inherits": "^2.0.3",
                 "readable-stream": "^2.3.6"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "for-in": {
@@ -2717,14 +3174,20 @@
                 "mime-types": "^2.1.12"
             }
         },
-        "foundry-pc-types": {
-            "version": "git+https://git.f3l.de/dungeonslayers/foundry-pc-types.git#3779bbbd30dbb04fa8f18615496882d6c66e1af4",
-            "from": "git+https://git.f3l.de/dungeonslayers/foundry-pc-types.git#f3l-fixes",
+        "foundry-vtt-types": {
+            "version": "github:League-of-Foundry-Developers/foundry-vtt-types#f1c321dcfe460595123765ababe5b8772d5df966",
+            "from": "github:League-of-Foundry-Developers/foundry-vtt-types#foundry-0.7.9",
             "dev": true,
             "requires": {
-                "@types/jquery": "^3.5.1",
+                "@types/howler": "2.2.1",
+                "@types/jquery": "3.5.1",
+                "@types/node": "^14.14.21",
                 "@types/socket.io-client": "^1.4.33",
-                "@types/tinymce": "^4.5.24"
+                "@types/tinymce": "^4.5.24",
+                "handlebars": "4.7.6",
+                "pixi.js": "5.3.4",
+                "typescript": "^4.1.3",
+                "utility-types": "^3.10.0"
             }
         },
         "fragment-cache": {
@@ -2743,15 +3206,15 @@
             "dev": true
         },
         "fs-extra": {
-            "version": "9.0.1",
-            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
-            "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+            "version": "9.1.0",
+            "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+            "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
             "dev": true,
             "requires": {
                 "at-least-node": "^1.0.0",
                 "graceful-fs": "^4.2.0",
                 "jsonfile": "^6.0.1",
-                "universalify": "^1.0.0"
+                "universalify": "^2.0.0"
             }
         },
         "fs-mkdirp-stream": {
@@ -2791,6 +3254,17 @@
                 "inherits": "~2.0.0",
                 "mkdirp": ">=0.5 0",
                 "rimraf": "2"
+            },
+            "dependencies": {
+                "rimraf": {
+                    "version": "2.7.1",
+                    "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+                    "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+                    "dev": true,
+                    "requires": {
+                        "glob": "^7.1.3"
+                    }
+                }
             }
         },
         "function-bind": {
@@ -2819,6 +3293,43 @@
                 "string-width": "^1.0.1",
                 "strip-ansi": "^3.0.1",
                 "wide-align": "^1.1.0"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+                    "dev": true
+                },
+                "is-fullwidth-code-point": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+                    "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+                    "dev": true,
+                    "requires": {
+                        "number-is-nan": "^1.0.0"
+                    }
+                },
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                    "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                    "dev": true,
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+                    "dev": true,
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                }
             }
         },
         "gaze": {
@@ -2836,6 +3347,17 @@
             "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
             "dev": true
         },
+        "get-intrinsic": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+            "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+            "dev": true,
+            "requires": {
+                "function-bind": "^1.1.1",
+                "has": "^1.0.3",
+                "has-symbols": "^1.0.1"
+            }
+        },
         "get-own-enumerable-property-symbols": {
             "version": "3.0.2",
             "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz",
@@ -2899,24 +3421,12 @@
             }
         },
         "glob-parent": {
-            "version": "3.1.0",
-            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
-            "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+            "version": "5.1.1",
+            "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+            "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
             "dev": true,
             "requires": {
-                "is-glob": "^3.1.0",
-                "path-dirname": "^1.0.0"
-            },
-            "dependencies": {
-                "is-glob": {
-                    "version": "3.1.0",
-                    "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
-                    "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
-                    "dev": true,
-                    "requires": {
-                        "is-extglob": "^2.1.0"
-                    }
-                }
+                "is-glob": "^4.0.1"
             }
         },
         "glob-stream": {
@@ -2935,6 +3445,42 @@
                 "remove-trailing-separator": "^1.0.1",
                 "to-absolute-glob": "^2.0.0",
                 "unique-stream": "^2.0.2"
+            },
+            "dependencies": {
+                "glob-parent": {
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+                    "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+                    "dev": true,
+                    "requires": {
+                        "is-glob": "^3.1.0",
+                        "path-dirname": "^1.0.0"
+                    }
+                },
+                "is-glob": {
+                    "version": "3.1.0",
+                    "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+                    "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+                    "dev": true,
+                    "requires": {
+                        "is-extglob": "^2.1.0"
+                    }
+                },
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "glob-watcher": {
@@ -2974,6 +3520,17 @@
                 "ini": "^1.3.4",
                 "is-windows": "^1.0.1",
                 "which": "^1.2.14"
+            },
+            "dependencies": {
+                "which": {
+                    "version": "1.3.1",
+                    "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+                    "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+                    "dev": true,
+                    "requires": {
+                        "isexe": "^2.0.0"
+                    }
+                }
             }
         },
         "globals": {
@@ -3020,9 +3577,9 @@
             }
         },
         "graceful-fs": {
-            "version": "4.2.4",
-            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
-            "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+            "version": "4.2.5",
+            "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz",
+            "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==",
             "dev": true
         },
         "gulp": {
@@ -3037,6 +3594,21 @@
                 "vinyl-fs": "^3.0.0"
             },
             "dependencies": {
+                "ansi-colors": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+                    "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-wrap": "^0.1.0"
+                    }
+                },
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+                    "dev": true
+                },
                 "gulp-cli": {
                     "version": "2.3.0",
                     "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz",
@@ -3061,29 +3633,56 @@
                         "semver-greatest-satisfied-range": "^1.1.0",
                         "v8flags": "^3.2.0",
                         "yargs": "^7.1.0"
-                    },
-                    "dependencies": {
-                        "yargs": {
-                            "version": "7.1.1",
-                            "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz",
-                            "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==",
-                            "dev": true,
-                            "requires": {
-                                "camelcase": "^3.0.0",
-                                "cliui": "^3.2.0",
-                                "decamelize": "^1.1.1",
-                                "get-caller-file": "^1.0.1",
-                                "os-locale": "^1.4.0",
-                                "read-pkg-up": "^1.0.1",
-                                "require-directory": "^2.1.1",
-                                "require-main-filename": "^1.0.1",
-                                "set-blocking": "^2.0.0",
-                                "string-width": "^1.0.2",
-                                "which-module": "^1.0.0",
-                                "y18n": "^3.2.1",
-                                "yargs-parser": "5.0.0-security.0"
-                            }
-                        }
+                    }
+                },
+                "is-fullwidth-code-point": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+                    "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+                    "dev": true,
+                    "requires": {
+                        "number-is-nan": "^1.0.0"
+                    }
+                },
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                    "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                    "dev": true,
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+                    "dev": true,
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                },
+                "yargs": {
+                    "version": "7.1.1",
+                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.1.tgz",
+                    "integrity": "sha512-huO4Fr1f9PmiJJdll5kwoS2e4GqzGSsMT3PPMpOwoVkOK8ckqAewMTZyA6LXVQWflleb/Z8oPBEvNsMft0XE+g==",
+                    "dev": true,
+                    "requires": {
+                        "camelcase": "^3.0.0",
+                        "cliui": "^3.2.0",
+                        "decamelize": "^1.1.1",
+                        "get-caller-file": "^1.0.1",
+                        "os-locale": "^1.4.0",
+                        "read-pkg-up": "^1.0.1",
+                        "require-directory": "^2.1.1",
+                        "require-main-filename": "^1.0.1",
+                        "set-blocking": "^2.0.0",
+                        "string-width": "^1.0.2",
+                        "which-module": "^1.0.0",
+                        "y18n": "^3.2.1",
+                        "yargs-parser": "5.0.0-security.0"
                     }
                 }
             }
@@ -3193,6 +3792,15 @@
                     "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
                     "dev": true
                 },
+                "ansi-styles": {
+                    "version": "3.2.1",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+                    "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^1.9.0"
+                    }
+                },
                 "chalk": {
                     "version": "2.4.2",
                     "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
@@ -3204,6 +3812,21 @@
                         "supports-color": "^5.3.0"
                     }
                 },
+                "color-convert": {
+                    "version": "1.9.3",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+                    "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "1.1.3"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.3",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+                    "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+                    "dev": true
+                },
                 "has-flag": {
                     "version": "3.0.0",
                     "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
@@ -3244,12 +3867,6 @@
                 "vinyl-fs": "^3.0.3"
             },
             "dependencies": {
-                "ansi-colors": {
-                    "version": "4.1.1",
-                    "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-                    "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-                    "dev": true
-                },
                 "source-map": {
                     "version": "0.7.3",
                     "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
@@ -3277,6 +3894,19 @@
                 "glogg": "^1.0.0"
             }
         },
+        "handlebars": {
+            "version": "4.7.6",
+            "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz",
+            "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==",
+            "dev": true,
+            "requires": {
+                "minimist": "^1.2.5",
+                "neo-async": "^2.6.0",
+                "source-map": "^0.6.1",
+                "uglify-js": "^3.1.4",
+                "wordwrap": "^1.0.0"
+            }
+        },
         "har-schema": {
             "version": "2.0.0",
             "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
@@ -3309,6 +3939,14 @@
             "dev": true,
             "requires": {
                 "ansi-regex": "^2.0.0"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+                    "dev": true
+                }
             }
         },
         "has-flag": {
@@ -3350,6 +3988,26 @@
                 "kind-of": "^4.0.0"
             },
             "dependencies": {
+                "is-number": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+                    "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+                    "dev": true,
+                    "requires": {
+                        "kind-of": "^3.0.2"
+                    },
+                    "dependencies": {
+                        "kind-of": {
+                            "version": "3.2.2",
+                            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                            "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                            "dev": true,
+                            "requires": {
+                                "is-buffer": "^1.1.5"
+                            }
+                        }
+                    }
+                },
                 "kind-of": {
                     "version": "4.0.0",
                     "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
@@ -3552,11 +4210,14 @@
             "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
             "dev": true
         },
-        "is-callable": {
-            "version": "1.2.2",
-            "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
-            "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
-            "dev": true
+        "is-core-module": {
+            "version": "2.2.0",
+            "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+            "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+            "dev": true,
+            "requires": {
+                "has": "^1.0.3"
+            }
         },
         "is-data-descriptor": {
             "version": "0.1.4",
@@ -3578,12 +4239,6 @@
                 }
             }
         },
-        "is-date-object": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
-            "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
-            "dev": true
-        },
         "is-descriptor": {
             "version": "0.1.6",
             "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
@@ -3622,13 +4277,10 @@
             "dev": true
         },
         "is-fullwidth-code-point": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-            "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-            "dev": true,
-            "requires": {
-                "number-is-nan": "^1.0.0"
-            }
+            "version": "3.0.0",
+            "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+            "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+            "dev": true
         },
         "is-glob": {
             "version": "4.0.1",
@@ -3645,31 +4297,11 @@
             "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=",
             "dev": true
         },
-        "is-negative-zero": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
-            "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
-            "dev": true
-        },
         "is-number": {
-            "version": "3.0.0",
-            "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
-            "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
-            "dev": true,
-            "requires": {
-                "kind-of": "^3.0.2"
-            },
-            "dependencies": {
-                "kind-of": {
-                    "version": "3.2.2",
-                    "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-                    "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-                    "dev": true,
-                    "requires": {
-                        "is-buffer": "^1.1.5"
-                    }
-                }
-            }
+            "version": "7.0.0",
+            "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+            "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+            "dev": true
         },
         "is-obj": {
             "version": "1.0.1",
@@ -3686,15 +4318,6 @@
                 "isobject": "^3.0.1"
             }
         },
-        "is-regex": {
-            "version": "1.1.1",
-            "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
-            "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
-            "dev": true,
-            "requires": {
-                "has-symbols": "^1.0.1"
-            }
-        },
         "is-regexp": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
@@ -3716,15 +4339,6 @@
             "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
             "dev": true
         },
-        "is-symbol": {
-            "version": "1.0.3",
-            "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
-            "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
-            "dev": true,
-            "requires": {
-                "has-symbols": "^1.0.1"
-            }
-        },
         "is-typedarray": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
@@ -3776,6 +4390,12 @@
             "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
             "dev": true
         },
+        "ismobilejs": {
+            "version": "1.1.1",
+            "resolved": "https://registry.npmjs.org/ismobilejs/-/ismobilejs-1.1.1.tgz",
+            "integrity": "sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==",
+            "dev": true
+        },
         "isobject": {
             "version": "3.0.1",
             "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
@@ -3789,9 +4409,9 @@
             "dev": true
         },
         "jasmine": {
-            "version": "3.6.3",
-            "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.6.3.tgz",
-            "integrity": "sha512-Th91zHsbsALWjDUIiU5d/W5zaYQsZFMPTdeNmi8GivZPmAaUAK8MblSG3yQI4VMGC/abF2us7ex60NH1AAIMTA==",
+            "version": "3.6.4",
+            "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.6.4.tgz",
+            "integrity": "sha512-hIeOou6y0BgCOKYgXYveQvlY+PTHgDPajFf+vLCYbMTQ+VjAP9+EQv0nuC9+gyCAAWISRFauB1XUb9kFuOKtcQ==",
             "dev": true,
             "requires": {
                 "glob": "^7.1.6",
@@ -3895,14 +4515,6 @@
             "requires": {
                 "graceful-fs": "^4.1.6",
                 "universalify": "^2.0.0"
-            },
-            "dependencies": {
-                "universalify": {
-                    "version": "2.0.0",
-                    "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
-                    "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
-                    "dev": true
-                }
             }
         },
         "jsprim": {
@@ -3952,6 +4564,23 @@
             "dev": true,
             "requires": {
                 "readable-stream": "^2.0.5"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "lcid": {
@@ -3987,15 +4616,6 @@
                 "native-request": "^1.0.5",
                 "source-map": "~0.6.0",
                 "tslib": "^1.10.0"
-            },
-            "dependencies": {
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true,
-                    "optional": true
-                }
             }
         },
         "levn": {
@@ -4031,9 +4651,9 @@
             "dev": true
         },
         "lint-staged": {
-            "version": "10.5.3",
-            "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.3.tgz",
-            "integrity": "sha512-TanwFfuqUBLufxCc3RUtFEkFraSPNR3WzWcGF39R3f2J7S9+iF9W0KTVLfSy09lYGmZS5NDCxjNvhGMSJyFCWg==",
+            "version": "10.5.4",
+            "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz",
+            "integrity": "sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==",
             "dev": true,
             "requires": {
                 "chalk": "^4.1.0",
@@ -4051,72 +4671,12 @@
                 "please-upgrade-node": "^3.2.0",
                 "string-argv": "0.3.1",
                 "stringify-object": "^3.3.0"
-            },
-            "dependencies": {
-                "braces": {
-                    "version": "3.0.2",
-                    "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-                    "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-                    "dev": true,
-                    "requires": {
-                        "fill-range": "^7.0.1"
-                    }
-                },
-                "debug": {
-                    "version": "4.3.1",
-                    "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
-                    "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
-                    "dev": true,
-                    "requires": {
-                        "ms": "2.1.2"
-                    }
-                },
-                "fill-range": {
-                    "version": "7.0.1",
-                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-                    "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-                    "dev": true,
-                    "requires": {
-                        "to-regex-range": "^5.0.1"
-                    }
-                },
-                "is-number": {
-                    "version": "7.0.0",
-                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-                    "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-                    "dev": true
-                },
-                "micromatch": {
-                    "version": "4.0.2",
-                    "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
-                    "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
-                    "dev": true,
-                    "requires": {
-                        "braces": "^3.0.1",
-                        "picomatch": "^2.0.5"
-                    }
-                },
-                "ms": {
-                    "version": "2.1.2",
-                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-                    "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-                    "dev": true
-                },
-                "to-regex-range": {
-                    "version": "5.0.1",
-                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-                    "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-                    "dev": true,
-                    "requires": {
-                        "is-number": "^7.0.0"
-                    }
-                }
             }
         },
         "listr2": {
-            "version": "3.2.3",
-            "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.2.3.tgz",
-            "integrity": "sha512-vUb80S2dSUi8YxXahO8/I/s29GqnOL8ozgHVLjfWQXa03BNEeS1TpBLjh2ruaqq5ufx46BRGvfymdBSuoXET5w==",
+            "version": "3.3.1",
+            "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.3.1.tgz",
+            "integrity": "sha512-8Zoxe7s/8nNr4bJ8bdAduHD8uJce+exmMmUWTXlq0WuUdffnH3muisHPHPFtW2vvOfohIsq7FGCaguUxN/h3Iw==",
             "dev": true,
             "requires": {
                 "chalk": "^4.1.0",
@@ -4126,7 +4686,8 @@
                 "log-update": "^4.0.0",
                 "p-map": "^4.0.0",
                 "rxjs": "^6.6.3",
-                "through": "^2.3.8"
+                "through": "^2.3.8",
+                "wrap-ansi": "^7.0.0"
             },
             "dependencies": {
                 "indent-string": {
@@ -4134,6 +4695,17 @@
                     "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
                     "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
                     "dev": true
+                },
+                "wrap-ansi": {
+                    "version": "7.0.0",
+                    "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+                    "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-styles": "^4.0.0",
+                        "string-width": "^4.1.0",
+                        "strip-ansi": "^6.0.0"
+                    }
                 }
             }
         },
@@ -4280,68 +4852,6 @@
                 "wrap-ansi": "^6.2.0"
             },
             "dependencies": {
-                "ansi-regex": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-                    "dev": true
-                },
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "emoji-regex": {
-                    "version": "8.0.0",
-                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-                    "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-                    "dev": true
-                },
-                "is-fullwidth-code-point": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-                    "dev": true
-                },
-                "string-width": {
-                    "version": "4.2.0",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-                    "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-                    "dev": true,
-                    "requires": {
-                        "emoji-regex": "^8.0.0",
-                        "is-fullwidth-code-point": "^3.0.0",
-                        "strip-ansi": "^6.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-regex": "^5.0.0"
-                    }
-                },
                 "wrap-ansi": {
                     "version": "6.2.0",
                     "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
@@ -4372,13 +4882,12 @@
             }
         },
         "lru-cache": {
-            "version": "4.1.5",
-            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-            "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+            "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
             "dev": true,
             "requires": {
-                "pseudomap": "^1.0.2",
-                "yallist": "^2.1.2"
+                "yallist": "^4.0.0"
             }
         },
         "make-dir": {
@@ -4398,6 +4907,13 @@
                     "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
                     "dev": true,
                     "optional": true
+                },
+                "semver": {
+                    "version": "5.7.1",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+                    "dev": true,
+                    "optional": true
                 }
             }
         },
@@ -4449,6 +4965,58 @@
                 "stack-trace": "0.0.10"
             },
             "dependencies": {
+                "braces": {
+                    "version": "2.3.2",
+                    "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+                    "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+                    "dev": true,
+                    "requires": {
+                        "arr-flatten": "^1.1.0",
+                        "array-unique": "^0.3.2",
+                        "extend-shallow": "^2.0.1",
+                        "fill-range": "^4.0.0",
+                        "isobject": "^3.0.1",
+                        "repeat-element": "^1.1.2",
+                        "snapdragon": "^0.8.1",
+                        "snapdragon-node": "^2.0.1",
+                        "split-string": "^3.0.2",
+                        "to-regex": "^3.0.1"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "fill-range": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+                    "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+                    "dev": true,
+                    "requires": {
+                        "extend-shallow": "^2.0.1",
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1",
+                        "to-regex-range": "^2.1.0"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
                 "findup-sync": {
                     "version": "2.0.0",
                     "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz",
@@ -4469,6 +5037,57 @@
                     "requires": {
                         "is-extglob": "^2.1.0"
                     }
+                },
+                "is-number": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+                    "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+                    "dev": true,
+                    "requires": {
+                        "kind-of": "^3.0.2"
+                    },
+                    "dependencies": {
+                        "kind-of": {
+                            "version": "3.2.2",
+                            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                            "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                            "dev": true,
+                            "requires": {
+                                "is-buffer": "^1.1.5"
+                            }
+                        }
+                    }
+                },
+                "micromatch": {
+                    "version": "3.1.10",
+                    "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+                    "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+                    "dev": true,
+                    "requires": {
+                        "arr-diff": "^4.0.0",
+                        "array-unique": "^0.3.2",
+                        "braces": "^2.3.1",
+                        "define-property": "^2.0.2",
+                        "extend-shallow": "^3.0.2",
+                        "extglob": "^2.0.4",
+                        "fragment-cache": "^0.2.1",
+                        "kind-of": "^6.0.2",
+                        "nanomatch": "^1.2.9",
+                        "object.pick": "^1.3.0",
+                        "regex-not": "^1.0.0",
+                        "snapdragon": "^0.8.1",
+                        "to-regex": "^3.0.2"
+                    }
+                },
+                "to-regex-range": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+                    "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+                    "dev": true,
+                    "requires": {
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1"
+                    }
                 }
             }
         },
@@ -4503,24 +5122,13 @@
             "dev": true
         },
         "micromatch": {
-            "version": "3.1.10",
-            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
-            "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+            "version": "4.0.2",
+            "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz",
+            "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==",
             "dev": true,
             "requires": {
-                "arr-diff": "^4.0.0",
-                "array-unique": "^0.3.2",
-                "braces": "^2.3.1",
-                "define-property": "^2.0.2",
-                "extend-shallow": "^3.0.2",
-                "extglob": "^2.0.4",
-                "fragment-cache": "^0.2.1",
-                "kind-of": "^6.0.2",
-                "nanomatch": "^1.2.9",
-                "object.pick": "^1.3.0",
-                "regex-not": "^1.0.0",
-                "snapdragon": "^0.8.1",
-                "to-regex": "^3.0.2"
+                "braces": "^3.0.1",
+                "picomatch": "^2.0.5"
             }
         },
         "mime": {
@@ -4531,18 +5139,18 @@
             "optional": true
         },
         "mime-db": {
-            "version": "1.44.0",
-            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
-            "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+            "version": "1.45.0",
+            "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz",
+            "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==",
             "dev": true
         },
         "mime-types": {
-            "version": "2.1.27",
-            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
-            "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+            "version": "2.1.28",
+            "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz",
+            "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==",
             "dev": true,
             "requires": {
-                "mime-db": "1.44.0"
+                "mime-db": "1.45.0"
             }
         },
         "mimic-fn": {
@@ -4551,6 +5159,12 @@
             "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
             "dev": true
         },
+        "mini-signals": {
+            "version": "1.2.0",
+            "resolved": "https://registry.npmjs.org/mini-signals/-/mini-signals-1.2.0.tgz",
+            "integrity": "sha1-RbCAE8X65RokqhqTXNMXye1yHXQ=",
+            "dev": true
+        },
         "minimatch": {
             "version": "3.0.4",
             "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -4597,9 +5211,9 @@
             }
         },
         "ms": {
-            "version": "2.0.0",
-            "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-            "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+            "version": "2.1.2",
+            "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+            "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
             "dev": true
         },
         "mute-stdout": {
@@ -4646,6 +5260,12 @@
             "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
             "dev": true
         },
+        "neo-async": {
+            "version": "2.6.2",
+            "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+            "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+            "dev": true
+        },
         "next-tick": {
             "version": "1.0.0",
             "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
@@ -4672,11 +5292,29 @@
                 "which": "1"
             },
             "dependencies": {
+                "rimraf": {
+                    "version": "2.7.1",
+                    "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+                    "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+                    "dev": true,
+                    "requires": {
+                        "glob": "^7.1.3"
+                    }
+                },
                 "semver": {
                     "version": "5.3.0",
                     "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
                     "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
                     "dev": true
+                },
+                "which": {
+                    "version": "1.3.1",
+                    "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+                    "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+                    "dev": true,
+                    "requires": {
+                        "isexe": "^2.0.0"
+                    }
                 }
             }
         },
@@ -4705,6 +5343,12 @@
                 "true-case-path": "^1.0.2"
             },
             "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+                    "dev": true
+                },
                 "ansi-styles": {
                     "version": "2.2.1",
                     "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
@@ -4724,11 +5368,55 @@
                         "supports-color": "^2.0.0"
                     }
                 },
+                "cross-spawn": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz",
+                    "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=",
+                    "dev": true,
+                    "requires": {
+                        "lru-cache": "^4.0.1",
+                        "which": "^1.2.9"
+                    }
+                },
+                "lru-cache": {
+                    "version": "4.1.5",
+                    "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+                    "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+                    "dev": true,
+                    "requires": {
+                        "pseudomap": "^1.0.2",
+                        "yallist": "^2.1.2"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+                    "dev": true,
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                },
                 "supports-color": {
                     "version": "2.0.0",
                     "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
                     "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
                     "dev": true
+                },
+                "which": {
+                    "version": "1.3.1",
+                    "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+                    "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+                    "dev": true,
+                    "requires": {
+                        "isexe": "^2.0.0"
+                    }
+                },
+                "yallist": {
+                    "version": "2.1.2",
+                    "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+                    "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+                    "dev": true
                 }
             }
         },
@@ -4751,6 +5439,14 @@
                 "resolve": "^1.10.0",
                 "semver": "2 || 3 || 4 || 5",
                 "validate-npm-package-license": "^3.0.1"
+            },
+            "dependencies": {
+                "semver": {
+                    "version": "5.7.1",
+                    "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+                    "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+                    "dev": true
+                }
             }
         },
         "normalize-path": {
@@ -4838,12 +5534,6 @@
                 }
             }
         },
-        "object-inspect": {
-            "version": "1.8.0",
-            "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
-            "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
-            "dev": true
-        },
         "object-keys": {
             "version": "1.1.1",
             "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@@ -4860,13 +5550,13 @@
             }
         },
         "object.assign": {
-            "version": "4.1.1",
-            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
-            "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+            "version": "4.1.2",
+            "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
+            "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
             "dev": true,
             "requires": {
+                "call-bind": "^1.0.0",
                 "define-properties": "^1.1.3",
-                "es-abstract": "^1.18.0-next.0",
                 "has-symbols": "^1.0.1",
                 "object-keys": "^1.1.1"
             }
@@ -4948,14 +5638,6 @@
                 "prelude-ls": "^1.2.1",
                 "type-check": "^0.4.0",
                 "word-wrap": "^1.2.3"
-            },
-            "dependencies": {
-                "fast-levenshtein": {
-                    "version": "2.0.6",
-                    "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
-                    "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
-                    "dev": true
-                }
             }
         },
         "ordered-read-streams": {
@@ -4965,6 +5647,23 @@
             "dev": true,
             "requires": {
                 "readable-stream": "^2.0.1"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "os-homedir": {
@@ -5072,6 +5771,12 @@
             "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=",
             "dev": true
         },
+        "parse-uri": {
+            "version": "1.0.3",
+            "resolved": "https://registry.npmjs.org/parse-uri/-/parse-uri-1.0.3.tgz",
+            "integrity": "sha512-upMnGxNcm+45So85HoguwZTVZI9u11i36DdxJfGF2HYWS2eh3TIx7+/tTi7qrEq15qzGkVhsKjesau+kCk48pA==",
+            "dev": true
+        },
         "pascalcase": {
             "version": "0.1.1",
             "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
@@ -5127,15 +5832,10 @@
             "dev": true
         },
         "path-type": {
-            "version": "1.1.0",
-            "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-            "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-            "dev": true,
-            "requires": {
-                "graceful-fs": "^4.1.2",
-                "pify": "^2.0.0",
-                "pinkie-promise": "^2.0.0"
-            }
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+            "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+            "dev": true
         },
         "performance-now": {
             "version": "2.1.0",
@@ -5170,6 +5870,48 @@
                 "pinkie": "^2.0.0"
             }
         },
+        "pixi.js": {
+            "version": "5.3.4",
+            "resolved": "https://registry.npmjs.org/pixi.js/-/pixi.js-5.3.4.tgz",
+            "integrity": "sha512-CrAaQQRw+iTA75IEu57CEk6stFs587iWE3HwQG0rZL2ESW2uJvdsF/ieeS/hFk35QmlEsPRqmH1sf7t7FGtsyw==",
+            "dev": true,
+            "requires": {
+                "@pixi/accessibility": "5.3.4",
+                "@pixi/app": "5.3.4",
+                "@pixi/constants": "5.3.4",
+                "@pixi/core": "5.3.4",
+                "@pixi/display": "5.3.4",
+                "@pixi/extract": "5.3.4",
+                "@pixi/filter-alpha": "5.3.4",
+                "@pixi/filter-blur": "5.3.4",
+                "@pixi/filter-color-matrix": "5.3.4",
+                "@pixi/filter-displacement": "5.3.4",
+                "@pixi/filter-fxaa": "5.3.4",
+                "@pixi/filter-noise": "5.3.4",
+                "@pixi/graphics": "5.3.4",
+                "@pixi/interaction": "5.3.4",
+                "@pixi/loaders": "5.3.4",
+                "@pixi/math": "5.3.4",
+                "@pixi/mesh": "5.3.4",
+                "@pixi/mesh-extras": "5.3.4",
+                "@pixi/mixin-cache-as-bitmap": "5.3.4",
+                "@pixi/mixin-get-child-by-name": "5.3.4",
+                "@pixi/mixin-get-global-position": "5.3.4",
+                "@pixi/particles": "5.3.4",
+                "@pixi/polyfill": "5.3.4",
+                "@pixi/prepare": "5.3.4",
+                "@pixi/runner": "5.3.4",
+                "@pixi/settings": "5.3.4",
+                "@pixi/sprite": "5.3.4",
+                "@pixi/sprite-animated": "5.3.4",
+                "@pixi/sprite-tiling": "5.3.4",
+                "@pixi/spritesheet": "5.3.4",
+                "@pixi/text": "5.3.4",
+                "@pixi/text-bitmap": "5.3.4",
+                "@pixi/ticker": "5.3.4",
+                "@pixi/utils": "5.3.4"
+            }
+        },
         "pkg-dir": {
             "version": "5.0.0",
             "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
@@ -5243,6 +5985,17 @@
                 "arr-diff": "^4.0.0",
                 "arr-union": "^3.1.0",
                 "extend-shallow": "^3.0.2"
+            },
+            "dependencies": {
+                "ansi-colors": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz",
+                    "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==",
+                    "dev": true,
+                    "requires": {
+                        "ansi-wrap": "^0.1.0"
+                    }
+                }
             }
         },
         "posix-character-classes": {
@@ -5348,6 +6101,12 @@
             "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
             "dev": true
         },
+        "querystring": {
+            "version": "0.2.0",
+            "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+            "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
+            "dev": true
+        },
         "read-pkg": {
             "version": "1.1.0",
             "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
@@ -5357,6 +6116,19 @@
                 "load-json-file": "^1.0.0",
                 "normalize-package-data": "^2.3.2",
                 "path-type": "^1.0.0"
+            },
+            "dependencies": {
+                "path-type": {
+                    "version": "1.1.0",
+                    "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+                    "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+                    "dev": true,
+                    "requires": {
+                        "graceful-fs": "^4.1.2",
+                        "pify": "^2.0.0",
+                        "pinkie-promise": "^2.0.0"
+                    }
+                }
             }
         },
         "read-pkg-up": {
@@ -5370,18 +6142,14 @@
             }
         },
         "readable-stream": {
-            "version": "2.3.7",
-            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
-            "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+            "version": "3.6.0",
+            "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+            "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
             "dev": true,
             "requires": {
-                "core-util-is": "~1.0.0",
-                "inherits": "~2.0.3",
-                "isarray": "~1.0.0",
-                "process-nextick-args": "~2.0.0",
-                "safe-buffer": "~5.1.1",
-                "string_decoder": "~1.1.1",
-                "util-deprecate": "~1.0.1"
+                "inherits": "^2.0.3",
+                "string_decoder": "^1.1.1",
+                "util-deprecate": "^1.0.1"
             }
         },
         "readdir-glob": {
@@ -5402,6 +6170,126 @@
                 "graceful-fs": "^4.1.11",
                 "micromatch": "^3.1.10",
                 "readable-stream": "^2.0.2"
+            },
+            "dependencies": {
+                "braces": {
+                    "version": "2.3.2",
+                    "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+                    "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+                    "dev": true,
+                    "requires": {
+                        "arr-flatten": "^1.1.0",
+                        "array-unique": "^0.3.2",
+                        "extend-shallow": "^2.0.1",
+                        "fill-range": "^4.0.0",
+                        "isobject": "^3.0.1",
+                        "repeat-element": "^1.1.2",
+                        "snapdragon": "^0.8.1",
+                        "snapdragon-node": "^2.0.1",
+                        "split-string": "^3.0.2",
+                        "to-regex": "^3.0.1"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "fill-range": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+                    "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+                    "dev": true,
+                    "requires": {
+                        "extend-shallow": "^2.0.1",
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1",
+                        "to-regex-range": "^2.1.0"
+                    },
+                    "dependencies": {
+                        "extend-shallow": {
+                            "version": "2.0.1",
+                            "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+                            "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+                            "dev": true,
+                            "requires": {
+                                "is-extendable": "^0.1.0"
+                            }
+                        }
+                    }
+                },
+                "is-number": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+                    "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+                    "dev": true,
+                    "requires": {
+                        "kind-of": "^3.0.2"
+                    },
+                    "dependencies": {
+                        "kind-of": {
+                            "version": "3.2.2",
+                            "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+                            "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+                            "dev": true,
+                            "requires": {
+                                "is-buffer": "^1.1.5"
+                            }
+                        }
+                    }
+                },
+                "micromatch": {
+                    "version": "3.1.10",
+                    "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+                    "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+                    "dev": true,
+                    "requires": {
+                        "arr-diff": "^4.0.0",
+                        "array-unique": "^0.3.2",
+                        "braces": "^2.3.1",
+                        "define-property": "^2.0.2",
+                        "extend-shallow": "^3.0.2",
+                        "extglob": "^2.0.4",
+                        "fragment-cache": "^0.2.1",
+                        "kind-of": "^6.0.2",
+                        "nanomatch": "^1.2.9",
+                        "object.pick": "^1.3.0",
+                        "regex-not": "^1.0.0",
+                        "snapdragon": "^0.8.1",
+                        "to-regex": "^3.0.2"
+                    }
+                },
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                },
+                "to-regex-range": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+                    "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+                    "dev": true,
+                    "requires": {
+                        "is-number": "^3.0.0",
+                        "repeat-string": "^1.6.1"
+                    }
+                }
             }
         },
         "rechoir": {
@@ -5557,11 +6445,12 @@
             "dev": true
         },
         "resolve": {
-            "version": "1.17.0",
-            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
-            "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
+            "version": "1.19.0",
+            "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
+            "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
             "dev": true,
             "requires": {
+                "is-core-module": "^2.1.0",
                 "path-parse": "^1.0.6"
             }
         },
@@ -5596,6 +6485,16 @@
             "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
             "dev": true
         },
+        "resource-loader": {
+            "version": "3.0.1",
+            "resolved": "https://registry.npmjs.org/resource-loader/-/resource-loader-3.0.1.tgz",
+            "integrity": "sha512-fBuCRbEHdLCI1eglzQhUv9Rrdcmqkydr1r6uHE2cYHvRBrcLXeSmbE/qI/urFt8rPr/IGxir3BUwM5kUK8XoyA==",
+            "dev": true,
+            "requires": {
+                "mini-signals": "^1.2.0",
+                "parse-uri": "^1.0.0"
+            }
+        },
         "restore-cursor": {
             "version": "3.1.0",
             "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
@@ -5628,9 +6527,9 @@
             }
         },
         "rimraf": {
-            "version": "2.7.1",
-            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-            "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+            "version": "3.0.2",
+            "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+            "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
             "dev": true,
             "requires": {
                 "glob": "^7.1.3"
@@ -5673,9 +6572,9 @@
             "dev": true
         },
         "sass": {
-            "version": "1.32.4",
-            "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.4.tgz",
-            "integrity": "sha512-N0BT0PI/t3+gD8jKa83zJJUb7ssfQnRRfqN+GIErokW6U4guBpfYl8qYB+OFLEho+QvnV5ZH1R9qhUC/Z2Ch9w==",
+            "version": "1.32.6",
+            "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.6.tgz",
+            "integrity": "sha512-1bcDHDcSqeFtMr0JXI3xc/CXX6c4p0wHHivJdru8W7waM7a1WjKMm4m/Z5sY7CbVw4Whi2Chpcw6DFfSWwGLzQ==",
             "dev": true,
             "requires": {
                 "chokidar": ">=2.0.0 <4.0.0"
@@ -5699,6 +6598,15 @@
                     "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
                     "dev": true
                 },
+                "ansi-styles": {
+                    "version": "3.2.1",
+                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+                    "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+                    "dev": true,
+                    "requires": {
+                        "color-convert": "^1.9.0"
+                    }
+                },
                 "camelcase": {
                     "version": "5.3.1",
                     "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
@@ -5716,6 +6624,27 @@
                         "wrap-ansi": "^5.1.0"
                     }
                 },
+                "color-convert": {
+                    "version": "1.9.3",
+                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+                    "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+                    "dev": true,
+                    "requires": {
+                        "color-name": "1.1.3"
+                    }
+                },
+                "color-name": {
+                    "version": "1.1.3",
+                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+                    "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
+                    "dev": true
+                },
+                "emoji-regex": {
+                    "version": "7.0.3",
+                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+                    "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+                    "dev": true
+                },
                 "find-up": {
                     "version": "3.0.0",
                     "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
@@ -5781,9 +6710,9 @@
                     }
                 },
                 "y18n": {
-                    "version": "4.0.0",
-                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
-                    "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+                    "version": "4.0.1",
+                    "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
+                    "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
                     "dev": true
                 },
                 "yargs": {
@@ -5838,10 +6767,13 @@
             }
         },
         "semver": {
-            "version": "5.7.1",
-            "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-            "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-            "dev": true
+            "version": "7.3.4",
+            "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz",
+            "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==",
+            "dev": true,
+            "requires": {
+                "lru-cache": "^6.0.0"
+            }
         },
         "semver-compare": {
             "version": "1.0.0",
@@ -5929,38 +6861,6 @@
                 "ansi-styles": "^4.0.0",
                 "astral-regex": "^2.0.0",
                 "is-fullwidth-code-point": "^3.0.0"
-            },
-            "dependencies": {
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "is-fullwidth-code-point": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-                    "dev": true
-                }
             }
         },
         "snapdragon": {
@@ -5979,6 +6879,15 @@
                 "use": "^3.1.0"
             },
             "dependencies": {
+                "debug": {
+                    "version": "2.6.9",
+                    "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+                    "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+                    "dev": true,
+                    "requires": {
+                        "ms": "2.0.0"
+                    }
+                },
                 "define-property": {
                     "version": "0.2.5",
                     "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
@@ -5996,6 +6905,18 @@
                     "requires": {
                         "is-extendable": "^0.1.0"
                     }
+                },
+                "ms": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+                    "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+                    "dev": true
+                },
+                "source-map": {
+                    "version": "0.5.7",
+                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+                    "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+                    "dev": true
                 }
             }
         },
@@ -6071,9 +6992,9 @@
             }
         },
         "source-map": {
-            "version": "0.5.7",
-            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-            "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+            "version": "0.6.1",
+            "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+            "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
             "dev": true
         },
         "source-map-resolve": {
@@ -6097,20 +7018,12 @@
             "requires": {
                 "buffer-from": "^1.0.0",
                 "source-map": "^0.6.0"
-            },
-            "dependencies": {
-                "source-map": {
-                    "version": "0.6.1",
-                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-                    "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-                    "dev": true
-                }
             }
         },
         "source-map-url": {
-            "version": "0.4.0",
-            "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
-            "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
+            "version": "0.4.1",
+            "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
+            "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
             "dev": true
         },
         "sparkles": {
@@ -6146,9 +7059,9 @@
             }
         },
         "spdx-license-ids": {
-            "version": "3.0.6",
-            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.6.tgz",
-            "integrity": "sha512-+orQK83kyMva3WyPf59k1+Y525csj5JejicWut55zeTWANuN17qSiSLUXWtzHeNWORSvT7GLDJ/E/XiIWoXBTw==",
+            "version": "3.0.7",
+            "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
+            "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
             "dev": true
         },
         "split-string": {
@@ -6217,6 +7130,23 @@
             "dev": true,
             "requires": {
                 "readable-stream": "^2.0.1"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "stream-exhaust": {
@@ -6238,76 +7168,14 @@
             "dev": true
         },
         "string-width": {
-            "version": "1.0.2",
-            "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-            "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+            "version": "4.2.0",
+            "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+            "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
             "dev": true,
             "requires": {
-                "code-point-at": "^1.0.0",
-                "is-fullwidth-code-point": "^1.0.0",
-                "strip-ansi": "^3.0.0"
-            }
-        },
-        "string.prototype.trimend": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
-            "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
-            "dev": true,
-            "requires": {
-                "define-properties": "^1.1.3",
-                "es-abstract": "^1.17.5"
-            },
-            "dependencies": {
-                "es-abstract": {
-                    "version": "1.17.7",
-                    "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-                    "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-                    "dev": true,
-                    "requires": {
-                        "es-to-primitive": "^1.2.1",
-                        "function-bind": "^1.1.1",
-                        "has": "^1.0.3",
-                        "has-symbols": "^1.0.1",
-                        "is-callable": "^1.2.2",
-                        "is-regex": "^1.1.1",
-                        "object-inspect": "^1.8.0",
-                        "object-keys": "^1.1.1",
-                        "object.assign": "^4.1.1",
-                        "string.prototype.trimend": "^1.0.1",
-                        "string.prototype.trimstart": "^1.0.1"
-                    }
-                }
-            }
-        },
-        "string.prototype.trimstart": {
-            "version": "1.0.1",
-            "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
-            "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
-            "dev": true,
-            "requires": {
-                "define-properties": "^1.1.3",
-                "es-abstract": "^1.17.5"
-            },
-            "dependencies": {
-                "es-abstract": {
-                    "version": "1.17.7",
-                    "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
-                    "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
-                    "dev": true,
-                    "requires": {
-                        "es-to-primitive": "^1.2.1",
-                        "function-bind": "^1.1.1",
-                        "has": "^1.0.3",
-                        "has-symbols": "^1.0.1",
-                        "is-callable": "^1.2.2",
-                        "is-regex": "^1.1.1",
-                        "object-inspect": "^1.8.0",
-                        "object-keys": "^1.1.1",
-                        "object.assign": "^4.1.1",
-                        "string.prototype.trimend": "^1.0.1",
-                        "string.prototype.trimstart": "^1.0.1"
-                    }
-                }
+                "emoji-regex": "^8.0.0",
+                "is-fullwidth-code-point": "^3.0.0",
+                "strip-ansi": "^6.0.0"
             }
         },
         "string_decoder": {
@@ -6331,12 +7199,12 @@
             }
         },
         "strip-ansi": {
-            "version": "3.0.1",
-            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-            "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+            "version": "6.0.0",
+            "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+            "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
             "dev": true,
             "requires": {
-                "ansi-regex": "^2.0.0"
+                "ansi-regex": "^5.0.0"
             }
         },
         "strip-bom": {
@@ -6389,20 +7257,12 @@
             "dev": true
         },
         "supports-color": {
-            "version": "5.5.0",
-            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-            "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+            "version": "7.2.0",
+            "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+            "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
             "dev": true,
             "requires": {
-                "has-flag": "^3.0.0"
-            },
-            "dependencies": {
-                "has-flag": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-                    "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-                    "dev": true
-                }
+                "has-flag": "^4.0.0"
             }
         },
         "sver-compat": {
@@ -6428,9 +7288,9 @@
             },
             "dependencies": {
                 "ajv": {
-                    "version": "7.0.3",
-                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz",
-                    "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==",
+                    "version": "7.0.4",
+                    "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz",
+                    "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==",
                     "dev": true,
                     "requires": {
                         "fast-deep-equal": "^3.1.1",
@@ -6439,49 +7299,11 @@
                         "uri-js": "^4.2.2"
                     }
                 },
-                "ansi-regex": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-                    "dev": true
-                },
-                "emoji-regex": {
-                    "version": "8.0.0",
-                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-                    "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-                    "dev": true
-                },
-                "is-fullwidth-code-point": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-                    "dev": true
-                },
                 "json-schema-traverse": {
                     "version": "1.0.0",
                     "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
                     "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
                     "dev": true
-                },
-                "string-width": {
-                    "version": "4.2.0",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-                    "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-                    "dev": true,
-                    "requires": {
-                        "emoji-regex": "^8.0.0",
-                        "is-fullwidth-code-point": "^3.0.0",
-                        "strip-ansi": "^6.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-regex": "^5.0.0"
-                    }
                 }
             }
         },
@@ -6507,19 +7329,6 @@
                 "fs-constants": "^1.0.0",
                 "inherits": "^2.0.3",
                 "readable-stream": "^3.1.1"
-            },
-            "dependencies": {
-                "readable-stream": {
-                    "version": "3.6.0",
-                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-                    "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-                    "dev": true,
-                    "requires": {
-                        "inherits": "^2.0.3",
-                        "string_decoder": "^1.1.1",
-                        "util-deprecate": "^1.0.1"
-                    }
-                }
             }
         },
         "text-table": {
@@ -6542,6 +7351,23 @@
             "requires": {
                 "readable-stream": "~2.3.6",
                 "xtend": "~4.0.1"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "through2-filter": {
@@ -6603,13 +7429,12 @@
             }
         },
         "to-regex-range": {
-            "version": "2.1.1",
-            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
-            "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+            "version": "5.0.1",
+            "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+            "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
             "dev": true,
             "requires": {
-                "is-number": "^3.0.0",
-                "repeat-string": "^1.6.1"
+                "is-number": "^7.0.0"
             }
         },
         "to-through": {
@@ -6667,9 +7492,9 @@
             "dev": true
         },
         "tsutils": {
-            "version": "3.19.1",
-            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.19.1.tgz",
-            "integrity": "sha512-GEdoBf5XI324lu7ycad7s6laADfnAqCw6wLGI+knxvw9vsIYBaJfYdmeCEG3FMMUiSm3OGgNb+m6utsWf5h9Vw==",
+            "version": "3.20.0",
+            "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.20.0.tgz",
+            "integrity": "sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg==",
             "dev": true,
             "requires": {
                 "tslib": "^1.8.1"
@@ -6724,46 +7549,11 @@
             "dev": true
         },
         "uglify-js": {
-            "version": "2.8.29",
-            "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
-            "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
+            "version": "3.12.7",
+            "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.12.7.tgz",
+            "integrity": "sha512-SIZhkoh+U/wjW+BHGhVwE9nt8tWJspncloBcFapkpGRwNPqcH8pzX36BXe3TPBjzHWPMUZotpCigak/udWNr1Q==",
             "dev": true,
-            "requires": {
-                "source-map": "~0.5.1",
-                "uglify-to-browserify": "~1.0.0",
-                "yargs": "~3.10.0"
-            },
-            "dependencies": {
-                "camelcase": {
-                    "version": "1.2.1",
-                    "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
-                    "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
-                    "dev": true
-                },
-                "cliui": {
-                    "version": "2.1.0",
-                    "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
-                    "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
-                    "dev": true,
-                    "requires": {
-                        "center-align": "^0.1.1",
-                        "right-align": "^0.1.1",
-                        "wordwrap": "0.0.2"
-                    }
-                },
-                "yargs": {
-                    "version": "3.10.0",
-                    "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-                    "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
-                    "dev": true,
-                    "requires": {
-                        "camelcase": "^1.0.2",
-                        "cliui": "^2.1.0",
-                        "decamelize": "^1.0.0",
-                        "window-size": "0.1.0"
-                    }
-                }
-            }
+            "optional": true
         },
         "uglify-to-browserify": {
             "version": "1.0.2",
@@ -6794,6 +7584,14 @@
                 "object.defaults": "^1.0.0",
                 "object.reduce": "^1.0.0",
                 "undertaker-registry": "^1.0.0"
+            },
+            "dependencies": {
+                "fast-levenshtein": {
+                    "version": "1.1.4",
+                    "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz",
+                    "integrity": "sha1-5qdUzI8V5YmHqpy9J69m/W9OWvk=",
+                    "dev": true
+                }
             }
         },
         "undertaker-registry": {
@@ -6825,9 +7623,9 @@
             }
         },
         "universalify": {
-            "version": "1.0.0",
-            "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
-            "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+            "version": "2.0.0",
+            "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+            "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
             "dev": true
         },
         "unset-value": {
@@ -6877,9 +7675,9 @@
             "dev": true
         },
         "uri-js": {
-            "version": "4.4.0",
-            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
-            "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
+            "version": "4.4.1",
+            "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+            "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
             "dev": true,
             "requires": {
                 "punycode": "^2.1.0"
@@ -6891,6 +7689,24 @@
             "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
             "dev": true
         },
+        "url": {
+            "version": "0.11.0",
+            "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+            "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+            "dev": true,
+            "requires": {
+                "punycode": "1.3.2",
+                "querystring": "0.2.0"
+            },
+            "dependencies": {
+                "punycode": {
+                    "version": "1.3.2",
+                    "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+                    "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
+                    "dev": true
+                }
+            }
+        },
         "use": {
             "version": "3.1.1",
             "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
@@ -6903,6 +7719,12 @@
             "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
             "dev": true
         },
+        "utility-types": {
+            "version": "3.10.0",
+            "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz",
+            "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==",
+            "dev": true
+        },
         "uuid": {
             "version": "3.4.0",
             "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
@@ -6988,6 +7810,23 @@
                 "value-or-function": "^3.0.0",
                 "vinyl": "^2.0.0",
                 "vinyl-sourcemap": "^1.1.0"
+            },
+            "dependencies": {
+                "readable-stream": {
+                    "version": "2.3.7",
+                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+                    "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+                    "dev": true,
+                    "requires": {
+                        "core-util-is": "~1.0.0",
+                        "inherits": "~2.0.3",
+                        "isarray": "~1.0.0",
+                        "process-nextick-args": "~2.0.0",
+                        "safe-buffer": "~5.1.1",
+                        "string_decoder": "~1.1.1",
+                        "util-deprecate": "~1.0.1"
+                    }
+                }
             }
         },
         "vinyl-sourcemap": {
@@ -7023,6 +7862,14 @@
             "dev": true,
             "requires": {
                 "source-map": "^0.5.1"
+            },
+            "dependencies": {
+                "source-map": {
+                    "version": "0.5.7",
+                    "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+                    "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+                    "dev": true
+                }
             }
         },
         "when": {
@@ -7032,9 +7879,9 @@
             "dev": true
         },
         "which": {
-            "version": "1.3.1",
-            "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-            "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+            "version": "2.0.2",
+            "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+            "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
             "dev": true,
             "requires": {
                 "isexe": "^2.0.0"
@@ -7059,6 +7906,39 @@
             "dev": true,
             "requires": {
                 "string-width": "^1.0.2 || 2"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "3.0.0",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+                    "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+                    "dev": true
+                },
+                "is-fullwidth-code-point": {
+                    "version": "2.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+                    "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+                    "dev": true
+                },
+                "string-width": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+                    "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+                    "dev": true,
+                    "requires": {
+                        "is-fullwidth-code-point": "^2.0.0",
+                        "strip-ansi": "^4.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "4.0.0",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+                    "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+                    "dev": true,
+                    "requires": {
+                        "ansi-regex": "^3.0.0"
+                    }
+                }
             }
         },
         "window-size": {
@@ -7074,9 +7954,9 @@
             "dev": true
         },
         "wordwrap": {
-            "version": "0.0.2",
-            "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
-            "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+            "version": "1.0.0",
+            "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+            "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
             "dev": true
         },
         "wrap-ansi": {
@@ -7087,6 +7967,43 @@
             "requires": {
                 "string-width": "^1.0.1",
                 "strip-ansi": "^3.0.1"
+            },
+            "dependencies": {
+                "ansi-regex": {
+                    "version": "2.1.1",
+                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+                    "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+                    "dev": true
+                },
+                "is-fullwidth-code-point": {
+                    "version": "1.0.0",
+                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+                    "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+                    "dev": true,
+                    "requires": {
+                        "number-is-nan": "^1.0.0"
+                    }
+                },
+                "string-width": {
+                    "version": "1.0.2",
+                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+                    "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+                    "dev": true,
+                    "requires": {
+                        "code-point-at": "^1.0.0",
+                        "is-fullwidth-code-point": "^1.0.0",
+                        "strip-ansi": "^3.0.0"
+                    }
+                },
+                "strip-ansi": {
+                    "version": "3.0.1",
+                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+                    "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+                    "dev": true,
+                    "requires": {
+                        "ansi-regex": "^2.0.0"
+                    }
+                }
             }
         },
         "wrappy": {
@@ -7108,15 +8025,15 @@
             "dev": true
         },
         "y18n": {
-            "version": "3.2.1",
-            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
-            "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+            "version": "3.2.2",
+            "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz",
+            "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==",
             "dev": true
         },
         "yallist": {
-            "version": "2.1.2",
-            "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-            "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+            "version": "4.0.0",
+            "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+            "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
             "dev": true
         },
         "yaml": {
@@ -7140,21 +8057,6 @@
                 "yargs-parser": "^20.2.2"
             },
             "dependencies": {
-                "ansi-regex": {
-                    "version": "5.0.0",
-                    "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-                    "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
-                    "dev": true
-                },
-                "ansi-styles": {
-                    "version": "4.3.0",
-                    "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-                    "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-                    "dev": true,
-                    "requires": {
-                        "color-convert": "^2.0.1"
-                    }
-                },
                 "cliui": {
                     "version": "7.0.4",
                     "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -7166,59 +8068,12 @@
                         "wrap-ansi": "^7.0.0"
                     }
                 },
-                "color-convert": {
-                    "version": "2.0.1",
-                    "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-                    "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-                    "dev": true,
-                    "requires": {
-                        "color-name": "~1.1.4"
-                    }
-                },
-                "color-name": {
-                    "version": "1.1.4",
-                    "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-                    "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-                    "dev": true
-                },
-                "emoji-regex": {
-                    "version": "8.0.0",
-                    "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
-                    "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
-                    "dev": true
-                },
                 "get-caller-file": {
                     "version": "2.0.5",
                     "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
                     "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
                     "dev": true
                 },
-                "is-fullwidth-code-point": {
-                    "version": "3.0.0",
-                    "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
-                    "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
-                    "dev": true
-                },
-                "string-width": {
-                    "version": "4.2.0",
-                    "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
-                    "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
-                    "dev": true,
-                    "requires": {
-                        "emoji-regex": "^8.0.0",
-                        "is-fullwidth-code-point": "^3.0.0",
-                        "strip-ansi": "^6.0.0"
-                    }
-                },
-                "strip-ansi": {
-                    "version": "6.0.0",
-                    "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-                    "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
-                    "dev": true,
-                    "requires": {
-                        "ansi-regex": "^5.0.0"
-                    }
-                },
                 "wrap-ansi": {
                     "version": "7.0.0",
                     "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -7275,19 +8130,6 @@
                 "archiver-utils": "^2.1.0",
                 "compress-commons": "^4.0.2",
                 "readable-stream": "^3.6.0"
-            },
-            "dependencies": {
-                "readable-stream": {
-                    "version": "3.6.0",
-                    "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
-                    "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
-                    "dev": true,
-                    "requires": {
-                        "inherits": "^2.0.3",
-                        "string_decoder": "^1.1.1",
-                        "util-deprecate": "^1.0.1"
-                    }
-                }
             }
         }
     }
diff --git a/package.json b/package.json
index 1ab23503..11d8f691 100644
--- a/package.json
+++ b/package.json
@@ -1,8 +1,8 @@
 {
     "private": true,
-    "name": "test",
+    "name": "dungeonslayers4",
     "description": "An implementation of the Dungeonslayers 4 game system for Foundry Virtual Tabletop.",
-    "version": "0.2.0",
+    "version": "0.2.1",
     "license": "MIT",
     "homepage": "https://git.f3l.de/dungeonslayers/ds4",
     "repository": {
@@ -35,7 +35,7 @@
         "build:watch": "gulp watch",
         "link": "gulp link",
         "clean": "gulp clean && gulp link --clean",
-        "update": "npm install --save-dev git+https://git.f3l.de/dungeonslayers/foundry-pc-types.git#f3l-fixes",
+        "update": "npm install --save-dev github:League-of-Foundry-Developers/foundry-vtt-types#foundry-0.7.9",
         "updateManifest": "gulp updateManifest",
         "lint": "eslint 'src/**/*.ts' --cache",
         "lint:fix": "eslint 'src/**/*.ts' --cache --fix",
@@ -45,28 +45,28 @@
     },
     "devDependencies": {
         "@types/fs-extra": "^9.0.6",
-        "@types/jasmine": "^3.6.2",
-        "@typescript-eslint/eslint-plugin": "^4.14.0",
-        "@typescript-eslint/parser": "^4.14.0",
+        "@types/jasmine": "^3.6.3",
+        "@typescript-eslint/eslint-plugin": "^4.14.2",
+        "@typescript-eslint/parser": "^4.14.2",
         "archiver": "^5.2.0",
         "chalk": "^4.1.0",
-        "eslint": "^7.18.0",
-        "eslint-config-prettier": "^7.1.0",
+        "eslint": "^7.19.0",
+        "eslint-config-prettier": "^7.2.0",
         "eslint-plugin-prettier": "^3.3.1",
-        "foundry-pc-types": "git+https://git.f3l.de/dungeonslayers/foundry-pc-types.git#f3l-fixes",
-        "fs-extra": "^9.0.1",
+        "foundry-vtt-types": "github:League-of-Foundry-Developers/foundry-vtt-types#foundry-0.7.9",
+        "fs-extra": "^9.1.0",
         "gulp": "^4.0.2",
         "gulp-git": "^2.10.1",
         "gulp-less": "^4.0.1",
         "gulp-sass": "^4.1.0",
         "gulp-typescript": "^6.0.0-alpha.1",
         "husky": "^4.3.8",
-        "jasmine": "^3.6.3",
+        "jasmine": "^3.6.4",
         "jasmine-xml-reporter": "^1.2.1",
         "json-stringify-pretty-compact": "^2.0.0",
-        "lint-staged": "^10.5.3",
+        "lint-staged": "^10.5.4",
         "prettier": "^2.2.1",
-        "sass": "^1.32.4",
+        "sass": "^1.32.6",
         "ts-node": "^9.1.1",
         "typescript": "^4.1.3",
         "yargs": "^16.2.0"
diff --git a/src/lang/de.json b/src/lang/de.json
index f81a5f29..391571ea 100644
--- a/src/lang/de.json
+++ b/src/lang/de.json
@@ -2,6 +2,9 @@
     "DS4.UserInteractionAddItem": "Neu",
     "DS4.UserInteractionEditItem": "Bearbeiten",
     "DS4.UserInteractionDeleteItem": "Löschen",
+    "DS4.UserInteractionAddEffect": "Neuer Effekt",
+    "DS4.UserInteractionEditEffect": "Effekt bearbeiten",
+    "DS4.UserInteractionDeleteEffect": "Effekt löschen",
     "DS4.NotOwned": "Nicht besessen",
     "DS4.HeadingBiography": "Biografie",
     "DS4.HeadingDetails": "Details",
@@ -12,11 +15,11 @@
     "DS4.HeadingSpells": "Zaubersprüche",
     "DS4.HeadingDescription": "Beschreibung",
     "DS4.HeadingSpecialCreatureAbilites": "Besondere Fähigkeiten",
-    "DS4.AttackType": "Angriffs Typ",
+    "DS4.AttackType": "Angriffstyp",
     "DS4.AttackTypeAbbr": "AT",
-    "DS4.WeaponBonus": "Waffen Bonus",
+    "DS4.WeaponBonus": "Waffenbonus",
     "DS4.WeaponBonusAbbr": "WB",
-    "DS4.OpponentDefense": "Gegner Abwehr",
+    "DS4.OpponentDefense": "Gegnerabwehr",
     "DS4.OpponentDefenseAbbr": "GA",
     "DS4.AttackTypeMelee": "Schlagen",
     "DS4.AttackTypeRanged": "Schießen",
@@ -61,9 +64,9 @@
     "DS4.ItemTypeSpecialCreatureAbilityPlural": "Besondere Kreaturenfähigkeiten",
     "DS4.ArmorType": "Panzerungstyp",
     "DS4.ArmorTypeAbbr": "PAT",
-    "DS4.ArmorMaterialType": "Material Typ",
+    "DS4.ArmorMaterialType": "Materialtyp",
     "DS4.ArmorMaterialTypeAbbr": "Mat.",
-    "DS4.ArmorValue": "Panzerungs Wert",
+    "DS4.ArmorValue": "Panzerungswert",
     "DS4.ArmorValueAbbr": "PA",
     "DS4.ArmorTypeBody": "Körper",
     "DS4.ArmorTypeBodyAbbr": "Körper",
@@ -125,7 +128,7 @@
     "DS4.CombatValuesTargetedSpellcasting": "Zielzaubern",
     "DS4.CharacterBaseInfoRace": "Volk",
     "DS4.CharacterBaseInfoClass": "Klasse",
-    "DS4.CharacterBaseInfoHeroClass": "Helden Klasse",
+    "DS4.CharacterBaseInfoHeroClass": "Heldenklasse",
     "DS4.CharacterBaseInfoCulture": "Kultur",
     "DS4.CharacterProgressionLevel": "Stufe",
     "DS4.CharacterProgressionExperiencePoints": "Erfahrungspunkte",
@@ -144,9 +147,9 @@
     "DS4.CharacterProfileBirthday": "Geburtstag",
     "DS4.CharacterProfileBirthplace": "Geburtsort",
     "DS4.CharacterProfileAge": "Alter",
-    "DS4.CharacterProfileHeight": "Größe",
+    "DS4.CharacterProfileHeight": "Größe [cm]",
     "DS4.CharacterProfileHairColor": "Haarfarbe",
-    "DS4.CharacterProfileWeight": "Gewicht",
+    "DS4.CharacterProfileWeight": "Gewicht [kg]",
     "DS4.CharacterProfileEyeColor": "Augenfarbe",
     "DS4.CharacterProfileSpecialCharacteristics": "Besondere Eigenschaften",
     "DS4.CharacterCurrencyGold": "Gold",
@@ -193,9 +196,10 @@
     "DS4.UnitCustom": "individuell",
     "DS4.UnitCustomAbbr": " ",
     "DS4.RollDialogDefaultTitle": "Proben-Optionen",
-    "DS4.RollDialogOkButton": "Ok",
+    "DS4.RollDialogOkButton": "OK",
     "DS4.RollDialogCancelButton": "Abbrechen",
-    "DS4.ErrorUnexpectedHtmlType": "Typfehler: Erwartet wurde {exType}, tatsächlich  erhalten wurde {realType}",
+    "DS4.ErrorUnexpectedHtmlType": "Typfehler: Erwartet wurde '{exType}', tatsächlich erhalten wurde '{realType}'.",
+    "DS4.ErrorCouldNotFindForm": "Konnte HTML Element '{htmlElement}' nicht finden.",
     "DS4.RollDialogTargetLabel": "Probenwert",
     "DS4.RollDialogModifierLabel": "SL-Modifikator",
     "DS4.RollDialogCoupLabel": "Immersieg bis",
diff --git a/src/lang/en.json b/src/lang/en.json
index ee1927ee..e1d15a54 100644
--- a/src/lang/en.json
+++ b/src/lang/en.json
@@ -2,6 +2,9 @@
     "DS4.UserInteractionAddItem": "Add item",
     "DS4.UserInteractionEditItem": "Edit item",
     "DS4.UserInteractionDeleteItem": "Delete item",
+    "DS4.UserInteractionAddEffect": "Add Effect",
+    "DS4.UserInteractionEditEffect": "Edit Effect",
+    "DS4.UserInteractionDeleteEffect": "Delete Effect",
     "DS4.NotOwned": "No owner",
     "DS4.HeadingBiography": "Biography",
     "DS4.HeadingDetails": "Details",
@@ -144,9 +147,9 @@
     "DS4.CharacterProfileBirthday": "Birthday",
     "DS4.CharacterProfileBirthplace": "Birthplace",
     "DS4.CharacterProfileAge": "Age",
-    "DS4.CharacterProfileHeight": "Height",
+    "DS4.CharacterProfileHeight": "Height [m]",
     "DS4.CharacterProfileHairColor": "Hair Color",
-    "DS4.CharacterProfileWeight": "Weight",
+    "DS4.CharacterProfileWeight": "Weight [kg]",
     "DS4.CharacterProfileEyeColor": "Eye Color",
     "DS4.CharacterProfileSpecialCharacteristics": "Special Characteristics",
     "DS4.CharacterCurrencyGold": "Gold",
@@ -195,7 +198,8 @@
     "DS4.RollDialogDefaultTitle": "Roll Options",
     "DS4.RollDialogOkButton": "Ok",
     "DS4.RollDialogCancelButton": "Cancel",
-    "DS4.ErrorUnexpectedHtmlType": "Type Error: Expected {exType}, got {realType}",
+    "DS4.ErrorUnexpectedHtmlType": "Type Error: Expected '{exType}' but got '{realType}'.",
+    "DS4.ErrorCouldNotFindForm": "Could not find html element '{htmlElement}'.",
     "DS4.RollDialogTargetLabel": "Check Target Number",
     "DS4.RollDialogModifierLabel": "Game Master Modifier",
     "DS4.RollDialogCoupLabel": "Coup to",
diff --git a/src/module/actor/actor-data.ts b/src/module/actor/actor-data.ts
index dba57d9f..9f12ef3e 100644
--- a/src/module/actor/actor-data.ts
+++ b/src/module/actor/actor-data.ts
@@ -1,20 +1,31 @@
 import { ModifiableData, ResourceData, UsableResource } from "../common/common-data";
+import { DS4 } from "../config";
+import { DS4ItemData } from "../item/item-data";
 
-export type DS4ActorDataType = DS4ActorDataCharacter | DS4ActorDataCreature;
+export type DS4ActorData = DS4CharacterData | DS4CreatureData;
 
-interface DS4ActorDataBase {
-    attributes: DS4ActorDataAttributes;
-    traits: DS4ActorDataTraits;
-    combatValues: DS4ActorDataCombatValues;
+type ActorType = keyof typeof DS4.i18n.actorTypes;
+
+interface DS4ActorDataHelper<T, U extends ActorType> extends Actor.Data<T, DS4ItemData> {
+    type: U;
 }
 
-interface DS4ActorDataAttributes {
+type DS4CharacterData = DS4ActorDataHelper<DS4CharacterDataData, "character">;
+type DS4CreatureData = DS4ActorDataHelper<DS4CreatureDataData, "creature">;
+
+interface DS4ActorDataDataBase {
+    attributes: DS4ActorDataDataAttributes;
+    traits: DS4ActorDataDataTraits;
+    combatValues: DS4ActorDataDataCombatValues;
+}
+
+interface DS4ActorDataDataAttributes {
     body: ModifiableData<number>;
     mobility: ModifiableData<number>;
     mind: ModifiableData<number>;
 }
 
-interface DS4ActorDataTraits {
+interface DS4ActorDataDataTraits {
     strength: ModifiableData<number>;
     constitution: ModifiableData<number>;
     agility: ModifiableData<number>;
@@ -23,7 +34,7 @@ interface DS4ActorDataTraits {
     aura: ModifiableData<number>;
 }
 
-interface DS4ActorDataCombatValues {
+interface DS4ActorDataDataCombatValues {
     hitPoints: ResourceData<number>;
     defense: ModifiableData<number>;
     initiative: ModifiableData<number>;
@@ -34,34 +45,32 @@ interface DS4ActorDataCombatValues {
     targetedSpellcasting: ModifiableData<number>;
 }
 
-interface DS4ActorDataCharacter extends DS4ActorDataBase {
-    baseInfo: DS4ActorDataCharacterBaseInfo;
-    progression: DS4ActorDataCharacterProgression;
-    language: DS4ActorDataCharacterLanguage;
-    profile: DS4ActorDataCharacterProfile;
-    currency: DS4ActorDataCharacterCurrency;
+interface DS4CharacterDataData extends DS4ActorDataDataBase {
+    baseInfo: DS4CharacterDataDataBaseInfo;
+    progression: DS4CharacterDataDataProgression;
+    language: DS4CharacterDataDataLanguage;
+    profile: DS4CharacterDataDataProfile;
+    currency: DS4CharacterDataDataCurrency;
 }
-
-interface DS4ActorDataCharacterBaseInfo {
+interface DS4CharacterDataDataBaseInfo {
     race: string;
     class: string;
     heroClass: string;
     culture: string;
 }
-
-interface DS4ActorDataCharacterProgression {
+interface DS4CharacterDataDataProgression {
     level: number;
     experiencePoints: number;
     talentPoints: UsableResource<number>;
     progressPoints: UsableResource<number>;
 }
 
-interface DS4ActorDataCharacterLanguage {
+interface DS4CharacterDataDataLanguage {
     languages: string;
     alphabets: string;
 }
 
-interface DS4ActorDataCharacterProfile {
+interface DS4CharacterDataDataProfile {
     biography: string;
     gender: string;
     birthday: string;
@@ -74,21 +83,21 @@ interface DS4ActorDataCharacterProfile {
     specialCharacteristics: string;
 }
 
-interface DS4ActorDataCharacterCurrency {
+interface DS4CharacterDataDataCurrency {
     gold: number;
     silver: number;
     copper: number;
 }
 
-interface DS4ActorDataCreature extends DS4ActorDataBase {
-    baseInfo: DS4ActorDataCreatureBaseInfo;
+interface DS4CreatureDataData extends DS4ActorDataDataBase {
+    baseInfo: DS4CreatureDataDataBaseInfo;
 }
 
 type CreatureType = "animal" | "construct" | "humanoid" | "magicalEntity" | "plantBeing" | "undead";
 
 type SizeCategory = "tiny" | "small" | "normal" | "large" | "huge" | "colossal";
 
-interface DS4ActorDataCreatureBaseInfo {
+interface DS4CreatureDataDataBaseInfo {
     loot: string;
     foeFactor: number;
     creatureType: CreatureType;
diff --git a/src/module/actor/actor.ts b/src/module/actor/actor.ts
index 889ec298..2dd4831c 100644
--- a/src/module/actor/actor.ts
+++ b/src/module/actor/actor.ts
@@ -1,15 +1,16 @@
 import { ModifiableData } from "../common/common-data";
 import { DS4 } from "../config";
 import { DS4Item } from "../item/item";
-import { DS4Armor, DS4EquippableItemDataType, DS4ItemDataType, DS4Shield, ItemType } from "../item/item-data";
-import { DS4ActorDataType } from "./actor-data";
+import { DS4ItemData, ItemType } from "../item/item-data";
+import { DS4ActorData } from "./actor-data";
 
-type DS4ActiveEffect = ActiveEffect<DS4ActorDataType, DS4ItemDataType, DS4Actor, DS4Item>;
-
-export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item> {
+/**
+ * The Actor class for DS4
+ */
+export class DS4Actor extends Actor<DS4ActorData, DS4Item> {
     /** @override */
     prepareData(): void {
-        this.data = duplicate(this._data);
+        this.data = duplicate(this._data) as DS4ActorData;
         if (!this.data.img) this.data.img = CONST.DEFAULT_TOKEN;
         if (!this.data.name) this.data.name = "New " + this.entity;
         this.prepareBaseData();
@@ -45,20 +46,23 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
      * @param predicate The predicate that ActiveEffectChanges need to satisfy in order to be applied
      */
     applyActiveEffectsFiltered(predicate: (change: ActiveEffectChange) => boolean): void {
-        const overrides = {};
+        const overrides: Record<string, unknown> = {};
 
         // Organize non-disabled effects by their application priority
-        const changes = this.effects.reduce((changes: Array<ActiveEffectChange & { effect: DS4ActiveEffect }>, e) => {
-            if (e.data.disabled) return changes;
+        const changes = this.effects.reduce(
+            (changes: Array<ActiveEffectChange & { effect: ActiveEffect<DS4Actor> }>, e) => {
+                if (e.data.disabled) return changes;
 
-            return changes.concat(
-                e.data.changes.filter(predicate).map((c) => {
-                    c = duplicate(c);
-                    c.priority = c.priority ?? c.mode * 10;
-                    return { ...c, effect: e };
-                }),
-            );
-        }, []);
+                return changes.concat(
+                    e.data.changes.filter(predicate).map((c) => {
+                        const duplicatedChange = duplicate(c) as ActiveEffect.Change;
+                        duplicatedChange.priority = duplicatedChange.priority ?? duplicatedChange.mode * 10;
+                        return { ...duplicatedChange, effect: e };
+                    }),
+                );
+            },
+            [],
+        );
         changes.sort((a, b) => a.priority - b.priority);
 
         // Apply all changes
@@ -68,7 +72,7 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
         }
 
         // Expand the set of final overrides
-        this["overrides"] = expandObject({ ...flattenObject(this["overrides"] ?? {}), ...overrides });
+        this.overrides = expandObject({ ...flattenObject(this.overrides ?? {}), ...overrides });
     }
 
     /** @override */
@@ -78,7 +82,7 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
 
     /** The list of properties that are derived from others, given in dot notation */
     get derivedDataProperties(): Array<string> {
-        return Object.keys(DS4.combatValues)
+        return Object.keys(DS4.i18n.combatValues)
             .map((combatValue) => `data.combatValues.${combatValue}.total`)
             .concat("data.combatValues.hitPoints.max");
     }
@@ -110,7 +114,7 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
 
     /**
      * Checks whether or not the given item type can be owned by the actor.
-     * @param itemType the item type to check
+     * @param itemType - The item type to check
      */
     canOwnItemType(itemType: ItemType): boolean {
         return this.ownableItemTypes.includes(itemType);
@@ -149,10 +153,13 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
      */
     private _calculateArmorValueOfEquippedItems(): number {
         return this.items
-            .filter((item) => ["armor", "shield"].includes(item.type))
-            .map((item) => item.data.data as DS4Armor | DS4Shield)
-            .filter((itemData) => itemData.equipped)
-            .map((itemData) => itemData.armorValue)
+            .map((item) => {
+                if (item.data.type === "armor" || item.data.type === "shield") {
+                    return item.data.data.equipped ? item.data.data.armorValue : 0;
+                } else {
+                    return 0;
+                }
+            })
             .reduce((a, b) => a + b, 0);
     }
 
@@ -161,7 +168,7 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
      * This only differs from the base implementation by also allowing negative values.
      * @override
      */
-    async modifyTokenAttribute(attribute: string, value: number, isDelta = false, isBar = true): Promise<DS4Actor> {
+    async modifyTokenAttribute(attribute: string, value: number, isDelta = false, isBar = true): Promise<this> {
         const current = getProperty(this.data.data, attribute);
 
         // Determine the updates to make to the actor data
@@ -180,59 +187,77 @@ export class DS4Actor extends Actor<DS4ActorDataType, DS4ItemDataType, DS4Item>
     }
 
     /** @override */
+    // TODO(types): Improve typing once it's fixed in upstream (arrays can be passed!)
     createEmbeddedEntity(
-        embeddedName: string,
-        createData: Record<string, unknown> | Array<Record<string, unknown>>,
+        embeddedName: "OwnedItem",
+        data: DeepPartial<DS4ItemData>,
         options?: Record<string, unknown>,
-    ): Promise<this> {
+    ): Promise<DS4ItemData>;
+    createEmbeddedEntity(
+        embeddedName: "ActiveEffect",
+        data: DeepPartial<DS4ItemData>,
+        options?: Record<string, unknown>,
+    ): Promise<ActiveEffect.Data>;
+    createEmbeddedEntity(
+        embeddedName: "OwnedItem" | "ActiveEffect",
+        data: DeepPartial<DS4ItemData> | DeepPartial<ActiveEffect.Data>,
+        options?: Record<string, unknown>,
+    ): Promise<DS4ItemData> | Promise<ActiveEffect.Data> {
         if (embeddedName === "OwnedItem") {
-            this._preCreateOwnedItem((createData as unknown) as ItemData<DS4ItemDataType>);
+            this._preCreateOwnedItem(data);
+            return super.createEmbeddedEntity(embeddedName, data, options);
         }
-        return super.createEmbeddedEntity(embeddedName, createData, options);
+        return super.createEmbeddedEntity(embeddedName, data, options);
     }
 
     /**
-     * If the item that is going to be created is equippable, set it to be non equipped and disable all ActiveEffects
+     * If the item that is going to be created is equipable, set it to be non equipped and disable all ActiveEffects
      * contained in the item
      * @param itemData The data of the item to be created
      */
-    private _preCreateOwnedItem(itemData: ItemData<DS4ItemDataType>): void {
-        if ("equipped" in itemData.data) {
-            itemData.effects = itemData.effects.map((effect) => ({ ...effect, disabled: true }));
-            const equippableUpdateData = itemData as ItemData<DS4EquippableItemDataType>;
-            equippableUpdateData.data.equipped = false;
+    protected _preCreateOwnedItem(itemData: DeepPartial<DS4ItemData>): void {
+        if (itemData.data && "equipped" in itemData.data) {
+            itemData.effects = itemData.effects?.map((effect) => ({ ...effect, disabled: true }));
+            itemData.data.equipped = false;
         }
     }
 
     /** @override */
+    // TODO(types): Improve typing once it's fixed in upstream
+    updateEmbeddedEntity(embeddedName: string, data: unknown[], options?: Entity.UpdateOptions): Promise<unknown[]>;
+    updateEmbeddedEntity(embeddedName: string, data: unknown, options?: Entity.UpdateOptions): Promise<unknown>;
     updateEmbeddedEntity(
         embeddedName: string,
-        updateData: Record<string, unknown> | Array<Record<string, unknown>>,
+        updateData: unknown | unknown[],
         options?: Record<string, unknown>,
-    ): Promise<this> {
+    ): Promise<unknown> {
         if (embeddedName === "OwnedItem") {
-            this._preUpdateOwnedItem(updateData as Partial<ItemData<DS4ItemDataType>>);
+            this._preUpdateOwnedItem(updateData as DeepPartial<DS4ItemData> | Array<DeepPartial<DS4ItemData>>);
         }
         return super.updateEmbeddedEntity(embeddedName, updateData, options);
     }
 
     /**
-     * If the equipped flag of an item changed, update all ActiveEffects originating from that item accordingly.
-     * @param updateData The change that is going to be applied to the owned item
+     * If the equipped flag of one or more items changed, update all ActiveEffects originating from those items
+     * accordingly.
+     * @param updateData The change that is going to be applied to the owned item(s)
      */
-    private _preUpdateOwnedItem(updateData: Partial<ItemData<DS4ItemDataType>>): void {
-        if ("equipped" in updateData.data) {
-            const equippableUpdateData = updateData as Partial<ItemData<DS4EquippableItemDataType>>;
-            const origin = `Actor.${this.id}.OwnedItem.${updateData._id}`;
-            const effects = this.effects
-                .filter((e) => e.data.origin === origin)
-                .map((e) => {
-                    const data = duplicate(e.data);
-                    data.disabled = !equippableUpdateData.data.equipped;
-                    return data;
-                });
-            if (effects.length > 0)
-                this.updateEmbeddedEntity("ActiveEffect", (effects as unknown) as Record<string, unknown>);
-        }
+    private _preUpdateOwnedItem(updateData: DeepPartial<DS4ItemData> | Array<DeepPartial<DS4ItemData>>): void {
+        const dataArray = updateData instanceof Array ? updateData : [updateData];
+        dataArray.forEach((data) => {
+            if (data.data && "equipped" in data.data) {
+                const equipped = data.data.equipped;
+                const origin = `Actor.${this.id}.OwnedItem.${data._id}`;
+                const effects = this.effects
+                    .filter((e) => e.data.origin === origin)
+                    .map((e) => {
+                        const effectData = duplicate(e.data);
+                        effectData.disabled = !(equipped ?? true);
+                        return effectData;
+                    });
+                if (effects.length > 0)
+                    this.updateEmbeddedEntity("ActiveEffect", (effects as unknown) as Record<string, unknown>);
+            }
+        });
     }
 }
diff --git a/src/module/actor/sheets/actor-sheet.ts b/src/module/actor/sheets/actor-sheet.ts
index 8565ca5c..66c381be 100644
--- a/src/module/actor/sheets/actor-sheet.ts
+++ b/src/module/actor/sheets/actor-sheet.ts
@@ -1,20 +1,38 @@
+import { DS4 } from "../../config";
 import { DS4Item } from "../../item/item";
-import { DS4ItemDataType, ItemType } from "../../item/item-data";
+import { DS4ItemData } from "../../item/item-data";
 import { DS4Actor } from "../actor";
-import { DS4ActorDataType } from "../actor-data";
 
 /**
- * Extend the basic ActorSheet with some very simple modifications
- * @extends {ActorSheet}
+ * The base Sheet class for all DS4 Actors
  */
-export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4ItemDataType> {
+export class DS4ActorSheet extends ActorSheet<ActorSheet.Data<DS4Actor>> {
+    // TODO(types): Improve mergeObject in upstream so that it isn't necessary to provide all parameters (see https://github.com/League-of-Foundry-Developers/foundry-vtt-types/issues/272)
     /** @override */
-    static get defaultOptions(): FormApplicationOptions {
-        return mergeObject(super.defaultOptions, {
+    static get defaultOptions(): BaseEntitySheet.Options {
+        const superDefaultOptions = super.defaultOptions;
+        return mergeObject(superDefaultOptions, {
             classes: ["ds4", "sheet", "actor"],
             width: 745,
             height: 600,
             scrollY: [".sheet-body"],
+            template: superDefaultOptions.template,
+            viewPermission: superDefaultOptions.viewPermission,
+            closeOnSubmit: superDefaultOptions.closeOnSubmit,
+            submitOnChange: superDefaultOptions.submitOnChange,
+            submitOnClose: superDefaultOptions.submitOnClose,
+            editable: superDefaultOptions.editable,
+            baseApplication: superDefaultOptions.baseApplication,
+            top: superDefaultOptions.top,
+            left: superDefaultOptions.left,
+            popOut: superDefaultOptions.popOut,
+            minimizable: superDefaultOptions.minimizable,
+            resizable: superDefaultOptions.resizable,
+            id: superDefaultOptions.id,
+            dragDrop: superDefaultOptions.dragDrop,
+            filters: superDefaultOptions.filters,
+            title: superDefaultOptions.title,
+            tabs: superDefaultOptions.tabs,
         });
     }
 
@@ -24,27 +42,23 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
         return `${path}/${this.actor.data.type}-sheet.hbs`;
     }
 
-    /* -------------------------------------------- */
-
     /**
      * This method returns the data for the template of the actor sheet.
      * It explicitly adds the items of the object sorted by type in the
      * object itemsByType.
-     * @returns the data fed to the template of the actor sheet
+     * @returns The data fed to the template of the actor sheet
      */
-    getData(): ActorSheetData<DS4ActorDataType, DS4Actor> {
+    async getData(): Promise<ActorSheet.Data<DS4Actor>> {
         const data = {
-            ...super.getData(),
+            ...(await super.getData()),
             // Add the localization config to the data:
-            config: CONFIG.DS4,
+            config: DS4,
             // Add the items explicitly sorted by type to the data:
             itemsByType: this.actor.itemTypes,
         };
         return data;
     }
 
-    /* -------------------------------------------- */
-
     /** @override */
     activateListeners(html: JQuery): void {
         super.activateListeners(html);
@@ -59,7 +73,7 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
         html.find(".item-edit").on("click", (ev) => {
             const li = $(ev.currentTarget).parents(".item");
             const item = this.actor.getOwnedItem(li.data("itemId"));
-            item.sheet.render(true);
+            item.sheet?.render(true);
         });
 
         // Delete Inventory Item
@@ -75,20 +89,16 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
         html.find(".rollable").click(this._onRoll.bind(this));
     }
 
-    /* -------------------------------------------- */
-
     /**
      * Handle creating a new Owned Item for the actor using initial data defined in the HTML dataset
-     * @param {JQuery.ClickEvent} event   The originating click event
-     * @private
+     * @param event - The originating click event
      */
-    private _onItemCreate(event: JQuery.ClickEvent): Promise<Item> {
+    protected _onItemCreate(event: JQuery.ClickEvent): Promise<DS4ItemData> {
         event.preventDefault();
         const header = event.currentTarget;
         // Get the type of item to create.
-        const type = header.dataset.type;
         // Grab any data associated with this control.
-        const data = duplicate(header.dataset);
+        const { type, ...data } = duplicate(header.dataset);
         // Initialize a default name.
         const name = `New ${type.capitalize()}`;
         // Prepare the item object.
@@ -97,8 +107,6 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
             type: type,
             data: data,
         };
-        // Remove the type from the dataset since it's in the itemData.type prop.
-        delete itemData.data.type;
 
         // Finally, create the item!
         return this.actor.createOwnedItem(itemData);
@@ -108,15 +116,14 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
      * Handle changes to properties of an Owned Item from within character sheet.
      * Can currently properly bind: see getValue().
      * Assumes the item property is given as the value of the HTML element property 'data-property'.
-     * @param {JQuery.ChangeEvent<HTMLFormElement>} ev    The originating change event
-     * @private
+     * @param ev - The originating change event
      */
-    private _onItemChange(ev: JQuery.ChangeEvent<HTMLFormElement>): void {
+    protected _onItemChange(ev: JQuery.ChangeEvent): void {
         ev.preventDefault();
         console.log("Current target:", $(ev.currentTarget).get(0)["name"]);
         const el: HTMLFormElement = $(ev.currentTarget).get(0);
         const id = $(ev.currentTarget).parents(".item").data("itemId");
-        const item = duplicate(this.actor.getOwnedItem(id)); // getOwnedItem is typed incorrectly, it actually returns a ItemData<DS4ItemDataType>, not an Item
+        const item = duplicate<DS4Item, "lenient">(this.actor.getOwnedItem(id));
         const property: string | undefined = $(ev.currentTarget).data("property");
 
         // Early return:
@@ -139,7 +146,7 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
      * - Checkbox: boolean
      * - Text input: string
      * - Number: number
-     * @param el the input element to collect the value of
+     * @param el - The input element to collect the value of
      */
     private getValue(el: HTMLFormElement): boolean | string | number {
         // One needs to differentiate between e.g. checkboxes (value="on") and select boxes etc.
@@ -190,10 +197,9 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
 
     /**
      * Handle clickable rolls.
-     * @param {JQuery.ClickEvent} event   The originating click event
-     * @private
+     * @param event - The originating click event
      */
-    private _onRoll(event: JQuery.ClickEvent): void {
+    protected _onRoll(event: JQuery.ClickEvent): void {
         event.preventDefault();
         const element = event.currentTarget;
         const dataset = element.dataset;
@@ -209,10 +215,13 @@ export class DS4ActorSheet extends ActorSheet<DS4ActorDataType, DS4Actor, DS4Ite
     }
 
     /** @override */
-    async _onDropItem(event: DragEvent, data: Parameters<typeof DS4Item.fromDropData>[0]): Promise<unknown> {
-        const item = await Item.fromDropData(data);
-        if (item && !this.actor.canOwnItemType(item.data.type as ItemType)) {
-            ui.notifications.warn(
+    protected async _onDropItem(
+        event: DragEvent,
+        data: { type: "Item" } & (DeepPartial<ActorSheet.OwnedItemData<DS4Actor>> | { pack: string } | { id: string }),
+    ): Promise<boolean | undefined | ActorSheet.OwnedItemData<DS4Actor>> {
+        const item = ((await Item.fromDropData(data)) as unknown) as DS4Item;
+        if (item && !this.actor.canOwnItemType(item.data.type)) {
+            ui.notifications?.warn(
                 game.i18n.format("DS4.WarningActorCannotOwnItem", {
                     actorName: this.actor.name,
                     actorType: this.actor.data.type,
diff --git a/src/module/actor/sheets/character-sheet.ts b/src/module/actor/sheets/character-sheet.ts
index a7f9d15e..2e077ce6 100644
--- a/src/module/actor/sheets/character-sheet.ts
+++ b/src/module/actor/sheets/character-sheet.ts
@@ -1,11 +1,34 @@
 import { DS4ActorSheet } from "./actor-sheet";
 
+/**
+ * The Sheet class for DS4 Character Actors
+ */
 export class DS4CharacterActorSheet extends DS4ActorSheet {
     /** @override */
-    static get defaultOptions(): FormApplicationOptions {
-        return mergeObject(super.defaultOptions, {
+    static get defaultOptions(): BaseEntitySheet.Options {
+        const superDefaultOptions = super.defaultOptions;
+        return mergeObject(superDefaultOptions, {
             classes: ["ds4", "sheet", "actor", "character"],
             tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "inventory" }],
+            template: superDefaultOptions.template,
+            viewPermission: superDefaultOptions.viewPermission,
+            closeOnSubmit: superDefaultOptions.closeOnSubmit,
+            submitOnChange: superDefaultOptions.submitOnChange,
+            submitOnClose: superDefaultOptions.submitOnClose,
+            editable: superDefaultOptions.editable,
+            baseApplication: superDefaultOptions.baseApplication,
+            top: superDefaultOptions.top,
+            left: superDefaultOptions.left,
+            popOut: superDefaultOptions.popOut,
+            minimizable: superDefaultOptions.minimizable,
+            resizable: superDefaultOptions.resizable,
+            id: superDefaultOptions.id,
+            dragDrop: superDefaultOptions.dragDrop,
+            filters: superDefaultOptions.filters,
+            title: superDefaultOptions.title,
+            width: superDefaultOptions.width,
+            height: superDefaultOptions.height,
+            scrollY: superDefaultOptions.scrollY,
         });
     }
 }
diff --git a/src/module/actor/sheets/creature-sheet.ts b/src/module/actor/sheets/creature-sheet.ts
index 8c86848f..91af61d2 100644
--- a/src/module/actor/sheets/creature-sheet.ts
+++ b/src/module/actor/sheets/creature-sheet.ts
@@ -1,11 +1,34 @@
 import { DS4ActorSheet } from "./actor-sheet";
 
+/**
+ * The Sheet class for DS4 Creature Actors
+ */
 export class DS4CreatureActorSheet extends DS4ActorSheet {
     /** @override */
-    static get defaultOptions(): FormApplicationOptions {
-        return mergeObject(super.defaultOptions, {
+    static get defaultOptions(): BaseEntitySheet.Options {
+        const superDefaultOptions = super.defaultOptions;
+        return mergeObject(superDefaultOptions, {
             classes: ["ds4", "sheet", "actor", "creature"],
             tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "inventory" }],
+            template: superDefaultOptions.template,
+            viewPermission: superDefaultOptions.viewPermission,
+            closeOnSubmit: superDefaultOptions.closeOnSubmit,
+            submitOnChange: superDefaultOptions.submitOnChange,
+            submitOnClose: superDefaultOptions.submitOnClose,
+            editable: superDefaultOptions.editable,
+            baseApplication: superDefaultOptions.baseApplication,
+            top: superDefaultOptions.top,
+            left: superDefaultOptions.left,
+            popOut: superDefaultOptions.popOut,
+            minimizable: superDefaultOptions.minimizable,
+            resizable: superDefaultOptions.resizable,
+            id: superDefaultOptions.id,
+            dragDrop: superDefaultOptions.dragDrop,
+            filters: superDefaultOptions.filters,
+            title: superDefaultOptions.title,
+            width: superDefaultOptions.width,
+            height: superDefaultOptions.height,
+            scrollY: superDefaultOptions.scrollY,
         });
     }
 }
diff --git a/src/module/common/utils.ts b/src/module/common/utils.ts
new file mode 100644
index 00000000..df5fe8f3
--- /dev/null
+++ b/src/module/common/utils.ts
@@ -0,0 +1,37 @@
+/**
+ * Partition an array into two, following a predicate.
+ * @param input     - The Array to split.
+ * @param predicate - The predicate by which to split.
+ * @returns A tuple of two arrays, the first one containing all elements from `input` that match the predicate, the second one containing those that do not.
+ */
+export function partition<T>(input: Array<T>, predicate: (v: T) => boolean): [T[], T[]] {
+    return input.reduce(
+        (p: [Array<T>, Array<T>], cur: T) => {
+            if (predicate(cur)) {
+                p[0].push(cur);
+            } else {
+                p[1].push(cur);
+            }
+            return p;
+        },
+        [[], []],
+    );
+}
+
+/**
+ * Zips two Arrays to an array of pairs of elements with corresponding indices. Excessive elements are dropped.
+ * @param a1 - First array to zip.
+ * @param a2 - Second array to zip.
+ *
+ * @typeParam T - Type of elements contained in `a1`.
+ * @typeParam U - Type of elements contained in `a2`.
+ *
+ * @returns The array of pairs that had the same index in their source array.
+ */
+export function zip<T, U>(a1: Array<T>, a2: Array<U>): Array<[T, U]> {
+    if (a1.length <= a2.length) {
+        return a1.map((e1, i) => [e1, a2[i]]);
+    } else {
+        return a2.map((e2, i) => [a1[i], e2]);
+    }
+}
diff --git a/src/module/config.ts b/src/module/config.ts
index cd927290..9233799e 100644
--- a/src/module/config.ts
+++ b/src/module/config.ts
@@ -9,205 +9,310 @@ export const DS4 = {
 =============================================================================================`,
 
     /**
-     * Define the set of acttack types that can be performed with weapon items
+     * A dictionary of dictionaries each mapping keys to localized strings
+     * resp. their localization keys.
+     * The localization is assumed to take place on each reload.
      */
-    attackTypes: {
-        melee: "DS4.AttackTypeMelee",
-        ranged: "DS4.AttackTypeRanged",
-        meleeRanged: "DS4.AttackTypeMeleeRanged",
+    i18n: {
+        /**
+         * Define the set of acttack types that can be performed with weapon items
+         */
+        attackTypes: {
+            melee: "DS4.AttackTypeMelee",
+            ranged: "DS4.AttackTypeRanged",
+            meleeRanged: "DS4.AttackTypeMeleeRanged",
+        },
+
+        /**
+         * Define the set of item availabilties
+         */
+        itemAvailabilities: {
+            unset: "DS4.ItemAvailabilityUnset",
+            hamlet: "DS4.ItemAvailabilityHamlet",
+            village: "DS4.ItemAvailabilityVilage",
+            city: "DS4.ItemAvailabilityCity",
+            elves: "DS4.ItemAvailabilityElves",
+            dwarves: "DS4.ItemAvailabilityDwarves",
+            nowhere: "DS4.ItemAvailabilityNowhere",
+        },
+
+        /**
+         * Define the set of item types
+         */
+        itemTypes: {
+            weapon: "DS4.ItemTypeWeapon",
+            armor: "DS4.ItemTypeArmor",
+            shield: "DS4.ItemTypeShield",
+            spell: "DS4.ItemTypeSpell",
+            trinket: "DS4.ItemTypeTrinket",
+            equipment: "DS4.ItemTypeEquipment",
+            talent: "DS4.ItemTypeTalent",
+            racialAbility: "DS4.ItemTypeRacialAbility",
+            language: "DS4.ItemTypeLanguage",
+            alphabet: "DS4.ItemTypeAlphabet",
+            specialCreatureAbility: "DS4.ItemTypeSpecialCreatureAbility",
+        },
+
+        /**
+         * Define the set of armor types, a character may only wear one item of each at any given time
+         */
+        armorTypes: {
+            body: "DS4.ArmorTypeBody",
+            helmet: "DS4.ArmorTypeHelmet",
+            vambrace: "DS4.ArmorTypeVambrace",
+            greaves: "DS4.ArmorTypeGreaves",
+            vambraceGreaves: "DS4.ArmorTypeVambraceGreaves",
+        },
+
+        /**
+         * Define abbreviations for the armor types
+         */
+        armorTypesAbbr: {
+            body: "DS4.ArmorTypeBodyAbbr",
+            helmet: "DS4.ArmorTypeHelmetAbbr",
+            vambrace: "DS4.ArmorTypeVambraceAbbr",
+            greaves: "DS4.ArmorTypeGreavesAbbr",
+            vambraceGreaves: "DS4.ArmorTypeVambraceGreavesAbbr",
+        },
+
+        /**
+         * Define the set of armor materials, used to determine if a character may wear the armor without additional penalties
+         */
+        armorMaterialTypes: {
+            cloth: "DS4.ArmorMaterialTypeCloth",
+            leather: "DS4.ArmorMaterialTypeLeather",
+            chain: "DS4.ArmorMaterialTypeChain",
+            plate: "DS4.ArmorMaterialTypePlate",
+        },
+
+        /**
+         * Define the abbreviations of armor materials
+         */
+        armorMaterialTypesAbbr: {
+            cloth: "DS4.ArmorMaterialTypeClothAbbr",
+            leather: "DS4.ArmorMaterialTypeLeatherAbbr",
+            chain: "DS4.ArmorMaterialTypeChainAbbr",
+            plate: "DS4.ArmorMaterialTypePlateAbbr",
+        },
+
+        spellTypes: {
+            spellcasting: "DS4.SpellTypeSpellcasting",
+            targetedSpellcasting: "DS4.SpellTypeTargetedSpellcasting",
+        },
+
+        spellCategories: {
+            healing: "DS4.SpellCategoryHealing",
+            fire: "DS4.SpellCategoryFire",
+            ice: "DS4.SpellCategoryIce",
+            light: "DS4.SpellCategoryLight",
+            darkness: "DS4.SpellCategoryDarkness",
+            mindAffecting: "DS4.SpellCategoryMindAffecting",
+            electricity: "DS4.SpellCategoryElectricity",
+            none: "DS4.SpellCategoryNone",
+            unset: "DS4.SpellCategoryUnset",
+        },
+
+        /**
+         * Define the set of actor types
+         */
+        actorTypes: {
+            character: "DS4.ActorTypeCharacter",
+            creature: "DS4.ActorTypeCreature",
+        },
+
+        /**
+         * Define the set of attributes an actor has
+         */
+        attributes: {
+            body: "DS4.AttributeBody",
+            mobility: "DS4.AttributeMobility",
+            mind: "DS4.AttributeMind",
+        },
+
+        /**
+         * Define the set of traits an actor has
+         */
+        traits: {
+            strength: "DS4.TraitStrength",
+            agility: "DS4.TraitAgility",
+            intellect: "DS4.TraitIntellect",
+            constitution: "DS4.TraitConstitution",
+            dexterity: "DS4.TraitDexterity",
+            aura: "DS4.TraitAura",
+        },
+
+        /**
+         * Define the set of combat values an actor has
+         */
+        combatValues: {
+            hitPoints: "DS4.CombatValuesHitPoints",
+            defense: "DS4.CombatValuesDefense",
+            initiative: "DS4.CombatValuesInitiative",
+            movement: "DS4.CombatValuesMovement",
+            meleeAttack: "DS4.CombatValuesMeleeAttack",
+            rangedAttack: "DS4.CombatValuesRangedAttack",
+            spellcasting: "DS4.CombatValuesSpellcasting",
+            targetedSpellcasting: "DS4.CombatValuesTargetedSpellcasting",
+        },
+
+        /**
+         * Define the base info of a character
+         */
+        characterBaseInfo: {
+            race: "DS4.CharacterBaseInfoRace",
+            class: "DS4.CharacterBaseInfoClass",
+            heroClass: "DS4.CharacterBaseInfoHeroClass",
+            culture: "DS4.CharacterBaseInfoCulture",
+        },
+
+        /**
+         * Define the progression info of a character
+         */
+        characterProgression: {
+            level: "DS4.CharacterProgressionLevel",
+            experiencePoints: "DS4.CharacterProgressionExperiencePoints",
+            talentPoints: "DS4.CharacterProgressionTalentPoints",
+            progressPoints: "DS4.CharacterProgressionProgressPoints",
+        },
+
+        /**
+         * Define the language info of a character
+         */
+        characterLanguage: {
+            languages: "DS4.CharacterLanguageLanguages",
+            alphabets: "DS4.CharacterLanguageAlphabets",
+        },
+
+        /**
+         * Define the profile info of a character
+         */
+        characterProfile: {
+            biography: "DS4.CharacterProfileBiography",
+            gender: "DS4.CharacterProfileGender",
+            birthday: "DS4.CharacterProfileBirthday",
+            birthplace: "DS4.CharacterProfileBirthplace",
+            age: "DS4.CharacterProfileAge",
+            height: "DS4.CharacterProfileHeight",
+            hairColor: "DS4.CharacterProfileHairColor",
+            weight: "DS4.CharacterProfileWeight",
+            eyeColor: "DS4.CharacterProfileEyeColor",
+            specialCharacteristics: "DS4.CharacterProfileSpecialCharacteristics",
+        },
+        /**
+         * Define currency elements of a character
+         */
+        characterCurrency: {
+            gold: "DS4.CharacterCurrencyGold",
+            silver: "DS4.CharacterCurrencySilver",
+            copper: "DS4.CharacterCurrencyCopper",
+        },
+
+        /**
+         * Define the different creature types a creature can be
+         */
+        creatureTypes: {
+            animal: "DS4.CreatureTypeAnimal",
+            construct: "DS4.CreatureTypeConstruct",
+            humanoid: "DS4.CreatureTypeHumanoid",
+            magicalEntity: "DS4.CreatureTypeMagicalEntity",
+            plantBeing: "DS4.CreatureTypePlantBeing",
+            undead: "DS4.CreatureTypeUndead",
+        },
+
+        /**
+         * Define the different size categories creatures fall into
+         */
+        creatureSizeCategories: {
+            tiny: "DS4.CreatureSizeCategoryTiny",
+            small: "DS4.CreatureSizeCategorySmall",
+            normal: "DS4.CreatureSizeCategoryNormal",
+            large: "DS4.CreatureSizeCategoryLarge",
+            huge: "DS4.CreatureSizeCategoryHuge",
+            colossal: "DS4.CreatureSizeCategoryColossal",
+        },
+
+        /**
+         * Define the base info of a creature
+         */
+        creatureBaseInfo: {
+            loot: "DS4.CreatureBaseInfoLoot",
+            foeFactor: "DS4.CreatureBaseInfoFoeFactor",
+            creatureType: "DS4.CreatureBaseInfoCreatureType",
+            sizeCategory: "DS4.CreatureBaseInfoSizeCategory",
+            experiencePoints: "DS4.CreatureBaseInfoExperiencePoints",
+            description: "DS4.CreatureBaseInfoDescription",
+        },
+
+        /**
+         * Define translations for available distance units
+         */
+        distanceUnits: {
+            meter: "DS4.UnitMeters",
+            kilometer: "DS4.UnitKilometers",
+            custom: "DS4.UnitCustom",
+        },
+        /**
+         * Define abbreviations for available distance units
+         */
+        distanceUnitsAbbr: {
+            meter: "DS4.UnitMetersAbbr",
+            kilometer: "DS4.UnitKilometersAbbr",
+            custom: "DS4.UnitCustomAbbr",
+        },
+
+        /**
+         * Define translations for available distance units
+         */
+        temporalUnits: {
+            rounds: "DS4.UnitRounds",
+            minutes: "DS4.UnitMinutes",
+            hours: "DS4.UnitHours",
+            days: "DS4.UnitDays",
+            custom: "DS4.UnitCustom",
+        },
+
+        /**
+         * Define abbreviations for available units
+         */
+        temporalUnitsAbbr: {
+            rounds: "DS4.UnitRoundsAbbr",
+            minutes: "DS4.UnitMinutesAbbr",
+            hours: "DS4.UnitHoursAbbr",
+            days: "DS4.UnitDaysAbbr",
+            custom: "DS4.UnitCustomAbbr",
+        },
+
+        /**
+         * Define localization strings for Chat Visibility
+         */
+        chatVisibilities: {
+            roll: "DS4.ChatVisibilityRoll",
+            gmroll: "DS4.ChatVisibilityGmRoll",
+            blindroll: "DS4.ChatVisibilityBlindRoll",
+            selfroll: "DS4.ChatVisibilitySelfRoll",
+        },
     },
 
     /**
-     * Define the file paths to icon images
+     * A dictionary of dictionaries mapping keys to icon file paths.
      */
-    attackTypesIcons: {
-        melee: "systems/ds4/assets/icons/official/combat-values/melee-attack.png",
-        meleeRanged: "systems/ds4/assets/icons/official/combat-values/melee-ranged-attack.png",
-        ranged: "systems/ds4/assets/icons/official/combat-values/ranged-attack.png",
-    },
+    icons: {
+        /**
+         * Define the file paths to icon images
+         */
+        attackTypes: {
+            melee: "systems/ds4/assets/icons/official/combat-values/melee-attack.png",
+            meleeRanged: "systems/ds4/assets/icons/official/combat-values/melee-ranged-attack.png",
+            ranged: "systems/ds4/assets/icons/official/combat-values/ranged-attack.png",
+        },
 
-    /**
-     * Define the file paths to icon images
-     */
-    spellTypesIcons: {
-        spellcasting: "systems/ds4/assets/icons/official/combat-values/spellcasting.png",
-        targetedSpellcasting: "systems/ds4/assets/icons/official/combat-values/targeted-spellcasting.png",
-    },
-
-    /**
-     * Define the set of item availabilties
-     */
-    itemAvailabilities: {
-        unset: "DS4.ItemAvailabilityUnset",
-        hamlet: "DS4.ItemAvailabilityHamlet",
-        village: "DS4.ItemAvailabilityVilage",
-        city: "DS4.ItemAvailabilityCity",
-        elves: "DS4.ItemAvailabilityElves",
-        dwarves: "DS4.ItemAvailabilityDwarves",
-        nowhere: "DS4.ItemAvailabilityNowhere",
-    },
-
-    /**
-     * Define the set of item types
-     */
-    itemTypes: {
-        weapon: "DS4.ItemTypeWeapon",
-        armor: "DS4.ItemTypeArmor",
-        shield: "DS4.ItemTypeShield",
-        spell: "DS4.ItemTypeSpell",
-        trinket: "DS4.ItemTypeTrinket",
-        equipment: "DS4.ItemTypeEquipment",
-        talent: "DS4.ItemTypeTalent",
-        racialAbility: "DS4.ItemTypeRacialAbility",
-        language: "DS4.ItemTypeLanguage",
-        alphabet: "DS4.ItemTypeAlphabet",
-        specialCreatureAbility: "DS4.ItemTypeSpecialCreatureAbility",
-    },
-
-    /**
-     * Define the set of armor types, a character may only wear one item of each at any given time
-     */
-    armorTypes: {
-        body: "DS4.ArmorTypeBody",
-        helmet: "DS4.ArmorTypeHelmet",
-        vambrace: "DS4.ArmorTypeVambrace",
-        greaves: "DS4.ArmorTypeGreaves",
-        vambraceGreaves: "DS4.ArmorTypeVambraceGreaves",
-    },
-
-    /**
-     * Define abbreviations for the armor types
-     */
-    armorTypesAbbr: {
-        body: "DS4.ArmorTypeBodyAbbr",
-        helmet: "DS4.ArmorTypeHelmetAbbr",
-        vambrace: "DS4.ArmorTypeVambraceAbbr",
-        greaves: "DS4.ArmorTypeGreavesAbbr",
-        vambraceGreaves: "DS4.ArmorTypeVambraceGreavesAbbr",
-    },
-
-    /**
-     * Define the set of armor materials, used to determine if a characer may wear the armor without additional penalties
-     */
-    armorMaterialTypes: {
-        cloth: "DS4.ArmorMaterialTypeCloth",
-        leather: "DS4.ArmorMaterialTypeLeather",
-        chain: "DS4.ArmorMaterialTypeChain",
-        plate: "DS4.ArmorMaterialTypePlate",
-    },
-
-    /**
-     * Define the abbreviations of armor materials
-     */
-    armorMaterialTypesAbbr: {
-        cloth: "DS4.ArmorMaterialTypeClothAbbr",
-        leather: "DS4.ArmorMaterialTypeLeatherAbbr",
-        chain: "DS4.ArmorMaterialTypeChainAbbr",
-        plate: "DS4.ArmorMaterialTypePlateAbbr",
-    },
-
-    spellTypes: {
-        spellcasting: "DS4.SpellTypeSpellcasting",
-        targetedSpellcasting: "DS4.SpellTypeTargetedSpellcasting",
-    },
-
-    spellCategories: {
-        healing: "DS4.SpellCategoryHealing",
-        fire: "DS4.SpellCategoryFire",
-        ice: "DS4.SpellCategoryIce",
-        light: "DS4.SpellCategoryLight",
-        darkness: "DS4.SpellCategoryDarkness",
-        mindAffecting: "DS4.SpellCategoryMindAffecting",
-        electricity: "DS4.SpellCategoryElectricity",
-        none: "DS4.SpellCategoryNone",
-        unset: "DS4.SpellCategoryUnset",
-    },
-
-    /**
-     * Define the set of actor types
-     */
-    actorTypes: {
-        character: "DS4.ActorTypeCharacter",
-        creature: "DS4.ActorTypeCreature",
-    },
-
-    /**
-     * Define the set of attributes an actor has
-     */
-    attributes: {
-        body: "DS4.AttributeBody",
-        mobility: "DS4.AttributeMobility",
-        mind: "DS4.AttributeMind",
-    },
-
-    /**
-     * Define the set of traits an actor has
-     */
-    traits: {
-        strength: "DS4.TraitStrength",
-        agility: "DS4.TraitAgility",
-        intellect: "DS4.TraitIntellect",
-        constitution: "DS4.TraitConstitution",
-        dexterity: "DS4.TraitDexterity",
-        aura: "DS4.TraitAura",
-    },
-
-    /**
-     * Define the set of combat values an actor has
-     */
-    combatValues: {
-        hitPoints: "DS4.CombatValuesHitPoints",
-        defense: "DS4.CombatValuesDefense",
-        initiative: "DS4.CombatValuesInitiative",
-        movement: "DS4.CombatValuesMovement",
-        meleeAttack: "DS4.CombatValuesMeleeAttack",
-        rangedAttack: "DS4.CombatValuesRangedAttack",
-        spellcasting: "DS4.CombatValuesSpellcasting",
-        targetedSpellcasting: "DS4.CombatValuesTargetedSpellcasting",
-    },
-
-    /**
-     * Define the base info of a character
-     */
-    characterBaseInfo: {
-        race: "DS4.CharacterBaseInfoRace",
-        class: "DS4.CharacterBaseInfoClass",
-        heroClass: "DS4.CharacterBaseInfoHeroClass",
-        culture: "DS4.CharacterBaseInfoCulture",
-    },
-
-    /**
-     * Define the progression info of a character
-     */
-    characterProgression: {
-        level: "DS4.CharacterProgressionLevel",
-        experiencePoints: "DS4.CharacterProgressionExperiencePoints",
-        talentPoints: "DS4.CharacterProgressionTalentPoints",
-        progressPoints: "DS4.CharacterProgressionProgressPoints",
-    },
-
-    /**
-     * Define the language info of a character
-     */
-    characterLanguage: {
-        languages: "DS4.CharacterLanguageLanguages",
-        alphabets: "DS4.CharacterLanguageAlphabets",
-    },
-
-    /**
-     * Define the profile info of a character
-     */
-    characterProfile: {
-        biography: "DS4.CharacterProfileBiography",
-        gender: "DS4.CharacterProfileGender",
-        birthday: "DS4.CharacterProfileBirthday",
-        birthplace: "DS4.CharacterProfileBirthplace",
-        age: "DS4.CharacterProfileAge",
-        height: "DS4.CharacterProfileHeight",
-        hairColor: "DS4.CharacterProfileHairColor",
-        weight: "DS4.CharacterProfileWeight",
-        eyeColor: "DS4.CharacterProfileEyeColor",
-        specialCharacteristics: "DS4.CharacterProfileSpecialCharacteristics",
+        /**
+         * Define the file paths to icon images
+         */
+        spellTypes: {
+            spellcasting: "systems/ds4/assets/icons/official/combat-values/spellcasting.png",
+            targetedSpellcasting: "systems/ds4/assets/icons/official/combat-values/targeted-spellcasting.png",
+        },
     },
 
     /**
@@ -225,98 +330,4 @@ export const DS4 = {
         eyeColor: "String",
         specialCharacteristics: "String",
     },
-
-    /**
-     * Define currency elements of a character
-     */
-    characterCurrency: {
-        gold: "DS4.CharacterCurrencyGold",
-        silver: "DS4.CharacterCurrencySilver",
-        copper: "DS4.CharacterCurrencyCopper",
-    },
-
-    /**
-     * Define the different creature types a creature can be
-     */
-    creatureTypes: {
-        animal: "DS4.CreatureTypeAnimal",
-        construct: "DS4.CreatureTypeConstruct",
-        humanoid: "DS4.CreatureTypeHumanoid",
-        magicalEntity: "DS4.CreatureTypeMagicalEntity",
-        plantBeing: "DS4.CreatureTypePlantBeing",
-        undead: "DS4.CreatureTypeUndead",
-    },
-
-    /**
-     * Define the different size categories creatures fall into
-     */
-    creatureSizeCategories: {
-        tiny: "DS4.CreatureSizeCategoryTiny",
-        small: "DS4.CreatureSizeCategorySmall",
-        normal: "DS4.CreatureSizeCategoryNormal",
-        large: "DS4.CreatureSizeCategoryLarge",
-        huge: "DS4.CreatureSizeCategoryHuge",
-        colossal: "DS4.CreatureSizeCategoryColossal",
-    },
-
-    /**
-     * Define the base info of a creature
-     */
-    creatureBaseInfo: {
-        loot: "DS4.CreatureBaseInfoLoot",
-        foeFactor: "DS4.CreatureBaseInfoFoeFactor",
-        creatureType: "DS4.CreatureBaseInfoCreatureType",
-        sizeCategory: "DS4.CreatureBaseInfoSizeCategory",
-        experiencePoints: "DS4.CreatureBaseInfoExperiencePoints",
-        description: "DS4.CreatureBaseInfoDescription",
-    },
-
-    /**
-     * Define translations for available distance units
-     */
-    distanceUnits: {
-        meter: "DS4.UnitMeters",
-        kilometer: "DS4.UnitKilometers",
-        custom: "DS4.UnitCustom",
-    },
-    /**
-     * Define abbreviations for available distance units
-     */
-    distanceUnitsAbbr: {
-        meter: "DS4.UnitMetersAbbr",
-        kilometer: "DS4.UnitKilometersAbbr",
-        custom: "DS4.UnitCustomAbbr",
-    },
-
-    /**
-     * Define translations for available distance units
-     */
-    temporalUnits: {
-        rounds: "DS4.UnitRounds",
-        minutes: "DS4.UnitMinutes",
-        hours: "DS4.UnitHours",
-        days: "DS4.UnitDays",
-        custom: "DS4.UnitCustom",
-    },
-
-    /**
-     * Define abbreviations for available units
-     */
-    temporalUnitsAbbr: {
-        rounds: "DS4.UnitRoundsAbbr",
-        minutes: "DS4.UnitMinutesAbbr",
-        hours: "DS4.UnitHoursAbbr",
-        days: "DS4.UnitDaysAbbr",
-        custom: "DS4.UnitCustomAbbr",
-    },
-
-    /**
-     * Define localization strings for Chat Visibility
-     */
-    chatVisibilities: {
-        roll: "DS4.ChatVisibilityRoll",
-        gmroll: "DS4.ChatVisibilityGmRoll",
-        blindroll: "DS4.ChatVisibilityBlindRoll",
-        selfroll: "DS4.ChatVisibilitySelfRoll",
-    },
 };
diff --git a/src/module/ds4.ts b/src/module/ds4.ts
index 81115a4c..0a500414 100644
--- a/src/module/ds4.ts
+++ b/src/module/ds4.ts
@@ -1,4 +1,3 @@
-// Import Modules
 import { DS4Actor } from "./actor/actor";
 import { DS4Item } from "./item/item";
 import { DS4ItemSheet } from "./item/item-sheet";
@@ -10,7 +9,7 @@ import { createCheckRoll } from "./rolls/check-factory";
 import { registerSystemSettings } from "./settings";
 import { migration } from "./migrations";
 
-Hooks.once("init", async function () {
+Hooks.once("init", async () => {
     console.log(`DS4 | Initializing the DS4 Game System\n${DS4.ASCII}`);
 
     game.ds4 = {
@@ -21,29 +20,19 @@ Hooks.once("init", async function () {
         migration,
     };
 
-    // Record configuration
     CONFIG.DS4 = DS4;
 
-    // Define custom Entity classes
-    CONFIG.Actor.entityClass = DS4Actor as typeof Actor;
-    CONFIG.Item.entityClass = DS4Item as typeof Item;
+    CONFIG.Actor.entityClass = DS4Actor;
+    CONFIG.Item.entityClass = DS4Item;
 
-    // Define localized type labels
-    CONFIG.Actor.typeLabels = DS4.actorTypes;
-    CONFIG.Item.typeLabels = DS4.itemTypes;
+    CONFIG.Actor.typeLabels = DS4.i18n.actorTypes;
+    CONFIG.Item.typeLabels = DS4.i18n.itemTypes;
 
-    // Configure Dice
-    CONFIG.Dice.types = [Die, DS4Check];
-    CONFIG.Dice.terms = {
-        c: Coin,
-        d: Die,
-        s: DS4Check,
-    };
+    CONFIG.Dice.types.push(DS4Check);
+    CONFIG.Dice.terms.s = DS4Check;
 
-    // Register system settings
     registerSystemSettings();
 
-    // Register sheet application classes
     Actors.unregisterSheet("core", ActorSheet);
     Actors.registerSheet("ds4", DS4CharacterActorSheet, { types: ["character"], makeDefault: true });
     Actors.registerSheet("ds4", DS4CreatureActorSheet, { types: ["creature"], makeDefault: true });
@@ -69,67 +58,59 @@ async function registerHandlebarsPartials() {
         "systems/ds4/templates/actor/partials/combat-values.hbs",
         "systems/ds4/templates/actor/partials/profile.hbs",
         "systems/ds4/templates/actor/partials/character-progression.hbs",
-        "systems/ds4/templates/actor/partials/special-creature-abilites-overview.hbs",
+        "systems/ds4/templates/actor/partials/special-creature-abilities-overview.hbs",
         "systems/ds4/templates/actor/partials/character-inventory.hbs",
         "systems/ds4/templates/actor/partials/creature-inventory.hbs",
     ];
     return loadTemplates(templatePaths);
 }
 
-/* -------------------------------------------- */
-/*  Foundry VTT Setup                           */
-/* -------------------------------------------- */
-
 /**
  * This function runs after game data has been requested and loaded from the servers, so entities exist
  */
-Hooks.once("setup", function () {
-    // Localize CONFIG objects once up-front
-    const toLocalize = [
-        "attackTypes",
-        "itemAvailabilities",
-        "itemTypes",
-        "armorTypes",
-        "armorTypesAbbr",
-        "armorMaterialTypes",
-        "armorMaterialTypesAbbr",
-        "armorMaterialTypes",
-        "spellTypes",
-        "spellCategories",
-        "attributes",
-        "traits",
-        "combatValues",
-        "characterBaseInfo",
-        "characterProgression",
-        "characterLanguage",
-        "characterProfile",
-        "characterCurrency",
-        "creatureTypes",
-        "creatureSizeCategories",
-        "creatureBaseInfo",
-        "temporalUnits",
-        "temporalUnitsAbbr",
-        "distanceUnits",
-        "distanceUnitsAbbr",
-        "chatVisibilities",
-    ];
-
-    // Exclude some from sorting where the default order matters
-    const noSort = ["attributes", "traits", "combatValues", "creatureSizeCategories"];
-
-    // Localize and sort CONFIG objects
-    for (const o of toLocalize) {
-        const localized = Object.entries(CONFIG.DS4[o]).map((e) => {
-            return [e[0], game.i18n.localize(e[1] as string)];
-        });
-        if (!noSort.includes(o)) localized.sort((a, b) => a[1].localeCompare(b[1]));
-        CONFIG.DS4[o] = localized.reduce((obj, e) => {
-            obj[e[0]] = e[1];
-            return obj;
-        }, {});
-    }
+Hooks.once("setup", () => {
+    localizeAndSortConfigObjects();
 });
 
-Hooks.once("ready", function () {
+Hooks.once("ready", () => {
     migration.migrate();
 });
+
+/**
+ * Select the text of input elements in given sheets via onfocus listener.
+ * The hook names are of the form "render"+sheet_superclassname and are called within
+ * the render() method of the foundry Application class.
+ * Note: The render hooks of all classes in the class hierarchy are called,
+ * so e.g. for a Dialog, both "renderDialog" and "renderApplication" are called
+ * (in this order).
+ */
+["renderApplication", "renderActorSheet", "renderItemSheet"].forEach((hookName: string) => {
+    Hooks.on(hookName, (app: Dialog, html: JQueryStatic) => {
+        $(html)
+            .find("input")
+            .on("focus", (ev: JQuery.FocusEvent<HTMLInputElement>) => {
+                ev.currentTarget.select();
+            });
+    });
+});
+
+/**
+ * Localizes all objects in {@link DS4.i18n} and sorts them unless they are explicitly excluded.
+ */
+function localizeAndSortConfigObjects() {
+    const noSort = ["attributes", "traits", "combatValues", "creatureSizeCategories"];
+
+    const localizeObject = <T extends { [s: string]: string }>(obj: T, sort = true): T => {
+        const localized = Object.entries(obj).map(([key, value]) => {
+            return [key, game.i18n.localize(value)];
+        });
+        if (sort) localized.sort((a, b) => a[1].localeCompare(b[1]));
+        return Object.fromEntries(localized);
+    };
+
+    DS4.i18n = Object.fromEntries(
+        Object.entries(DS4.i18n).map(([key, value]) => {
+            return [key, localizeObject(value, !noSort.includes(key))];
+        }),
+    ) as typeof DS4.i18n;
+}
diff --git a/src/module/item/item-data.ts b/src/module/item/item-data.ts
index 00d7a696..67873a95 100644
--- a/src/module/item/item-data.ts
+++ b/src/module/item/item-data.ts
@@ -1,37 +1,53 @@
 import { ModifiableData } from "../common/common-data";
 import { DS4 } from "../config";
 
-export type ItemType = keyof typeof DS4.itemTypes;
+export type ItemType = keyof typeof DS4.i18n.itemTypes;
 
-export type DS4ItemDataType =
-    | DS4Weapon
-    | DS4Armor
-    | DS4Shield
-    | DS4Spell
-    | DS4Trinket
-    | DS4Equipment
-    | DS4Talent
-    | DS4RacialAbility
-    | DS4Language
-    | DS4Alphabet
-    | DS4SpecialCreatureAbility;
+export type DS4ItemData =
+    | DS4WeaponData
+    | DS4ArmorData
+    | DS4ShieldData
+    | DS4SpellData
+    | DS4TrinketData
+    | DS4EquipmentData
+    | DS4TalentData
+    | DS4RacialAbilityData
+    | DS4LanguageData
+    | DS4AlphabetData
+    | DS4SpecialCreatureAbilityData;
 
-export type DS4EquippableItemDataType = DS4Weapon | DS4Armor | DS4Shield | DS4Trinket;
+interface DS4ItemDataHelper<T, U extends ItemType> extends Item.Data<T> {
+    type: U;
+}
 
-// types
+type DS4WeaponData = DS4ItemDataHelper<DS4WeaponDataData, "weapon">;
+type DS4ArmorData = DS4ItemDataHelper<DS4ArmorDataData, "armor">;
+type DS4ShieldData = DS4ItemDataHelper<DS4ShieldDataData, "shield">;
+type DS4SpellData = DS4ItemDataHelper<DS4SpellDataData, "spell">;
+type DS4TrinketData = DS4ItemDataHelper<DS4TrinketDataData, "trinket">;
+type DS4EquipmentData = DS4ItemDataHelper<DS4EquipmentDataData, "equipment">;
+type DS4TalentData = DS4ItemDataHelper<DS4TalentDataData, "talent">;
+type DS4RacialAbilityData = DS4ItemDataHelper<DS4RacialAbilityDataData, "racialAbility">;
+type DS4LanguageData = DS4ItemDataHelper<DS4LanguageDataData, "language">;
+type DS4AlphabetData = DS4ItemDataHelper<DS4AlphabetDataData, "alphabet">;
+type DS4SpecialCreatureAbilityData = DS4ItemDataHelper<DS4SpecialCreatureAbilityDataData, "specialCreatureAbility">;
 
-interface DS4Weapon extends DS4ItemBase, DS4ItemPhysical, DS4ItemEquipable {
+interface DS4WeaponDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical, DS4ItemDataDataEquipable {
     attackType: "melee" | "ranged" | "meleeRanged";
     weaponBonus: number;
     opponentDefense: number;
 }
 
-export interface DS4Armor extends DS4ItemBase, DS4ItemPhysical, DS4ItemEquipable, DS4ItemProtective {
+interface DS4ArmorDataData
+    extends DS4ItemDataDataBase,
+        DS4ItemDataDataPhysical,
+        DS4ItemDataDataEquipable,
+        DS4ItemDataDataProtective {
     armorMaterialType: "cloth" | "leather" | "chain" | "plate";
     armorType: "body" | "helmet" | "vambrace" | "greaves" | "vambraceGreaves";
 }
 
-export interface DS4Talent extends DS4ItemBase {
+interface DS4TalentDataData extends DS4ItemDataDataBase {
     rank: DS4TalentRank;
 }
 
@@ -39,7 +55,7 @@ interface DS4TalentRank extends ModifiableData<number> {
     max: number;
 }
 
-interface DS4Spell extends DS4ItemBase, DS4ItemEquipable {
+interface DS4SpellDataData extends DS4ItemDataDataBase, DS4ItemDataDataEquipable {
     spellType: "spellcasting" | "targetedSpellcasting";
     bonus: string;
     spellCategory:
@@ -59,37 +75,41 @@ interface DS4Spell extends DS4ItemBase, DS4ItemEquipable {
     scrollPrice: number;
 }
 
-export interface DS4Shield extends DS4ItemBase, DS4ItemPhysical, DS4ItemEquipable, DS4ItemProtective {}
-interface DS4Trinket extends DS4ItemBase, DS4ItemPhysical, DS4ItemEquipable {}
-interface DS4Equipment extends DS4ItemBase, DS4ItemPhysical {}
-type DS4RacialAbility = DS4ItemBase;
-type DS4Language = DS4ItemBase;
-type DS4Alphabet = DS4ItemBase;
-interface DS4SpecialCreatureAbility extends DS4ItemBase {
+interface DS4ShieldDataData
+    extends DS4ItemDataDataBase,
+        DS4ItemDataDataPhysical,
+        DS4ItemDataDataEquipable,
+        DS4ItemDataDataProtective {}
+interface DS4TrinketDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical, DS4ItemDataDataEquipable {}
+interface DS4EquipmentDataData extends DS4ItemDataDataBase, DS4ItemDataDataPhysical {}
+type DS4RacialAbilityDataData = DS4ItemDataDataBase;
+type DS4LanguageDataData = DS4ItemDataDataBase;
+type DS4AlphabetDataData = DS4ItemDataDataBase;
+interface DS4SpecialCreatureAbilityDataData extends DS4ItemDataDataBase {
     experiencePoints: number;
 }
 
 // templates
 
-interface DS4ItemBase {
+interface DS4ItemDataDataBase {
     description: string;
 }
-interface DS4ItemPhysical {
+interface DS4ItemDataDataPhysical {
     quantity: number;
     price: number;
     availability: "hamlet" | "village" | "city" | "elves" | "dwarves" | "nowhere" | "unset";
     storageLocation: string;
 }
 
-export function isDS4ItemDataTypePhysical(input: DS4ItemDataType): boolean {
+export function isDS4ItemDataTypePhysical(input: DS4ItemData["data"]): boolean {
     return "quantity" in input && "price" in input && "availability" in input && "storageLocation" in input;
 }
 
-interface DS4ItemEquipable {
+interface DS4ItemDataDataEquipable {
     equipped: boolean;
 }
 
-interface DS4ItemProtective {
+interface DS4ItemDataDataProtective {
     armorValue: number;
 }
 
diff --git a/src/module/item/item-sheet.ts b/src/module/item/item-sheet.ts
index bd143f31..9a00a0a6 100644
--- a/src/module/item/item-sheet.ts
+++ b/src/module/item/item-sheet.ts
@@ -1,19 +1,36 @@
+import { DS4 } from "../config";
 import { DS4Item } from "./item";
-import { DS4ItemDataType, isDS4ItemDataTypePhysical } from "./item-data";
+import { isDS4ItemDataTypePhysical } from "./item-data";
 
 /**
- * Extend the basic ItemSheet with some very simple modifications
- * @extends {ItemSheet}
+ * The Sheet class for DS4 Items
  */
-export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
+export class DS4ItemSheet extends ItemSheet<ItemSheet.Data<DS4Item>> {
     /** @override */
-    static get defaultOptions(): FormApplicationOptions {
-        return mergeObject(super.defaultOptions, {
+    static get defaultOptions(): BaseEntitySheet.Options {
+        const superDefaultOptions = super.defaultOptions;
+        return mergeObject(superDefaultOptions, {
             width: 530,
             height: 400,
             classes: ["ds4", "sheet", "item"],
             tabs: [{ navSelector: ".sheet-tabs", contentSelector: ".sheet-body", initial: "description" }],
             scrollY: [".sheet-body"],
+            template: superDefaultOptions.template,
+            viewPermission: superDefaultOptions.viewPermission,
+            closeOnSubmit: superDefaultOptions.closeOnSubmit,
+            submitOnChange: superDefaultOptions.submitOnChange,
+            submitOnClose: superDefaultOptions.submitOnClose,
+            editable: superDefaultOptions.editable,
+            baseApplication: superDefaultOptions.baseApplication,
+            top: superDefaultOptions.top,
+            left: superDefaultOptions.left,
+            popOut: superDefaultOptions.popOut,
+            minimizable: superDefaultOptions.minimizable,
+            resizable: superDefaultOptions.resizable,
+            id: superDefaultOptions.id,
+            dragDrop: superDefaultOptions.dragDrop,
+            filters: superDefaultOptions.filters,
+            title: superDefaultOptions.title,
         });
     }
 
@@ -23,13 +40,11 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
         return `${path}/${this.item.data.type}-sheet.hbs`;
     }
 
-    /* -------------------------------------------- */
-
     /** @override */
-    getData(): ItemSheetData<DS4ItemDataType, DS4Item> {
+    async getData(): Promise<ItemSheet.Data<DS4Item>> {
         const data = {
-            ...super.getData(),
-            config: CONFIG.DS4,
+            ...(await super.getData()),
+            config: DS4,
             isOwned: this.item.isOwned,
             actor: this.item.actor,
             isPhysical: isDS4ItemDataTypePhysical(this.item.data.data),
@@ -37,10 +52,8 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
         return data;
     }
 
-    /* -------------------------------------------- */
-
     /** @override */
-    setPosition(options: ApplicationPosition = {}): ApplicationPosition {
+    setPosition(options: Partial<Application.Position> = {}): Application.Position {
         const position = super.setPosition(options);
         if ("find" in this.element) {
             const sheetBody = this.element.find(".sheet-body");
@@ -52,8 +65,6 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
         return position;
     }
 
-    /* -------------------------------------------- */
-
     /** @override */
     activateListeners(html: JQuery): void {
         super.activateListeners(html);
@@ -65,13 +76,13 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
 
     /**
      * Handle management of ActiveEffects.
-     * @param {Event} event   The originating click event
+     * @param event - he originating click event
      */
-    private async _onManageActiveEffect(event: JQuery.ClickEvent): Promise<unknown> {
+    protected async _onManageActiveEffect(event: JQuery.ClickEvent): Promise<unknown> {
         event.preventDefault();
 
         if (this.item.isOwned) {
-            return ui.notifications.warn(game.i18n.localize("DS4.WarningManageActiveEffectOnOwnedItem"));
+            return ui.notifications?.warn(game.i18n.localize("DS4.WarningManageActiveEffectOnOwnedItem"));
         }
         const a = event.currentTarget;
         const li = $(a).parents(".effect");
@@ -81,7 +92,7 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
                 return this._createActiveEffect();
             case "edit":
                 const effect = this.item.effects.get(li.data("effectId"));
-                return effect.sheet.render(true);
+                return effect?.sheet.render(true);
             case "delete": {
                 return this.item.deleteEmbeddedEntity("ActiveEffect", li.data("effectId"));
             }
@@ -91,7 +102,7 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
     /**
      * Create a new ActiveEffect for the item using default data.
      */
-    private async _createActiveEffect(): Promise<unknown> {
+    protected async _createActiveEffect(): Promise<ActiveEffect.Data> {
         const label = `New Effect`;
 
         const createData = {
@@ -101,7 +112,7 @@ export class DS4ItemSheet extends ItemSheet<DS4ItemDataType, DS4Item> {
             transfer: true,
         };
 
-        const effect = await ActiveEffect.create(createData, this.item);
+        const effect = ActiveEffect.create(createData, this.item);
         return effect.create({});
     }
 }
diff --git a/src/module/item/item.ts b/src/module/item/item.ts
index e9a1aa3e..34ce460f 100644
--- a/src/module/item/item.ts
+++ b/src/module/item/item.ts
@@ -1,28 +1,20 @@
-import { DS4Actor } from "../actor/actor";
-import { DS4ActorDataType } from "../actor/actor-data";
-import { DS4ItemDataType, DS4Talent } from "./item-data";
+import { DS4ItemData } from "./item-data";
 
 /**
- * Extend the basic Item with some very simple modifications.
- * @extends {Item}
+ * The Item class for DS4
  */
-export class DS4Item extends Item<DS4ItemDataType, DS4ActorDataType, DS4Actor> {
+export class DS4Item extends Item<DS4ItemData> {
     /**
-     * Augment the basic Item data model with additional dynamic data.
+     * @override
      */
     prepareData(): void {
         super.prepareData();
         this.prepareDerivedData();
-
-        // Get the Item's data
-        // const itemData = this.data;
-        // const actorData = this.actor ? this.actor.data : {};
-        // const data = itemData.data;
     }
 
     prepareDerivedData(): void {
-        if (this.type === "talent") {
-            const data = this.data.data as DS4Talent;
+        if (this.data.type === "talent") {
+            const data = this.data.data;
             data.rank.total = data.rank.base + data.rank.mod;
         }
     }
diff --git a/src/module/migrations.ts b/src/module/migrations.ts
index ec48294a..345ad263 100644
--- a/src/module/migrations.ts
+++ b/src/module/migrations.ts
@@ -1,7 +1,7 @@
 import { migrate as migrate001 } from "./migrations/001";
 
 async function migrate(): Promise<void> {
-    if (!game.user.isGM) {
+    if (!game.user?.isGM) {
         return;
     }
 
@@ -18,14 +18,14 @@ async function migrate(): Promise<void> {
 }
 
 async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion: number): Promise<void> {
-    if (!game.user.isGM) {
+    if (!game.user?.isGM) {
         return;
     }
 
     const migrationsToExecute = migrations.slice(oldMigrationVersion, targetMigrationVersion);
 
     if (migrationsToExecute.length > 0) {
-        ui.notifications.info(
+        ui.notifications?.info(
             game.i18n.format("DS4.InfoSystemUpdateStart", {
                 currentVersion: oldMigrationVersion,
                 targetVersion: targetMigrationVersion,
@@ -40,7 +40,7 @@ async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion
                 await migration();
                 game.settings.set("ds4", "systemMigrationVersion", currentMigrationVersion);
             } catch (err) {
-                ui.notifications.error(
+                ui.notifications?.error(
                     game.i18n.format("DS4.ErrorDuringMigration", {
                         currentVersion: oldMigrationVersion,
                         targetVersion: targetMigrationVersion,
@@ -54,7 +54,7 @@ async function migrateFromTo(oldMigrationVersion: number, targetMigrationVersion
             }
         }
 
-        ui.notifications.info(
+        ui.notifications?.info(
             game.i18n.format("DS4.InfoSystemUpdateCompleted", {
                 currentVersion: oldMigrationVersion,
                 targetVersion: targetMigrationVersion,
diff --git a/src/module/migrations/001.ts b/src/module/migrations/001.ts
index efc3637e..943aecc9 100644
--- a/src/module/migrations/001.ts
+++ b/src/module/migrations/001.ts
@@ -1,5 +1,5 @@
 export async function migrate(): Promise<void> {
-    for (const a of game.actors.entities) {
+    for (const a of game.actors?.entities ?? []) {
         const updateData = getActorUpdateData();
         console.log(`Migrating actor ${a.name}`);
         await a.update(updateData, { enforceTypes: false });
@@ -18,7 +18,7 @@ function getActorUpdateData(): Record<string, unknown> {
                 "rangedAttack",
                 "spellcasting",
                 "targetedSpellcasting",
-            ].reduce((acc, curr) => {
+            ].reduce((acc: Partial<Record<string, { "-=base": null }>>, curr) => {
                 acc[curr] = { "-=base": null };
                 return acc;
             }, {}),
diff --git a/src/module/rolls/check-factory.ts b/src/module/rolls/check-factory.ts
index c972120c..43d8efaa 100644
--- a/src/module/rolls/check-factory.ts
+++ b/src/module/rolls/check-factory.ts
@@ -4,13 +4,13 @@ import { DS4 } from "../config";
  * Provides default values for all arguments the `CheckFactory` expects.
  */
 class DefaultCheckOptions implements DS4CheckFactoryOptions {
-    maxCritSuccess = 1;
-    minCritFailure = 20;
-    useSlayingDice = false;
-    rollMode: DS4RollMode = "roll";
+    readonly maxCritSuccess = 1;
+    readonly minCritFailure = 20;
+    readonly useSlayingDice = false;
+    readonly rollMode: DS4RollMode = "roll";
 
     mergeWith(other: Partial<DS4CheckFactoryOptions>): DS4CheckFactoryOptions {
-        return { ...this, ...other } as DS4CheckFactoryOptions;
+        return { ...this, ...other };
     }
 }
 
@@ -28,13 +28,13 @@ class CheckFactory {
         private gmModifier: number,
         passedOptions: Partial<DS4CheckFactoryOptions> = {},
     ) {
-        this.checkOptions = new DefaultCheckOptions().mergeWith(passedOptions);
+        this.checkOptions = defaultCheckOptions.mergeWith(passedOptions);
     }
 
     private checkOptions: DS4CheckFactoryOptions;
 
     async execute(): Promise<ChatMessage | unknown> {
-        const rollCls: typeof Roll = CONFIG.Dice.rolls[0];
+        const rollCls = CONFIG.Dice.rolls[0];
 
         const formula = [
             "ds",
@@ -45,7 +45,6 @@ class CheckFactory {
         const roll = new rollCls(formula);
 
         const rollModeTemplate = this.checkOptions.rollMode;
-        console.log(rollModeTemplate);
         return roll.toMessage({}, { rollMode: rollModeTemplate, create: true });
     }
 
@@ -76,8 +75,8 @@ class CheckFactory {
 
 /**
  * Asks the user for all unknown/necessary information and passes them on to perform a roll.
- * @param targetValue {number} The Check Target Number ("CTN")
- * @param options {Partial<DS4CheckFactoryOptions>} Options changing the behaviour of the roll and message.
+ * @param targetValue - The Check Target Number ("CTN")
+ * @param options     - Options changing the behavior of the roll and message.
  */
 export async function createCheckRoll(
     targetValue: number,
@@ -86,6 +85,8 @@ export async function createCheckRoll(
     // Ask for additional required data;
     const gmModifierData = await askGmModifier(targetValue, options);
 
+    const newTargetValue = gmModifierData.checkTargetValue ?? targetValue;
+    const gmModifier = gmModifierData.gmModifier ?? 0;
     const newOptions: Partial<DS4CheckFactoryOptions> = {
         maxCritSuccess: gmModifierData.maxCritSuccess ?? options.maxCritSuccess ?? undefined,
         minCritFailure: gmModifierData.minCritFailure ?? options.minCritFailure ?? undefined,
@@ -94,7 +95,7 @@ export async function createCheckRoll(
     };
 
     // Create Factory
-    const cf = new CheckFactory(gmModifierData.checkTargetValue, gmModifierData.gmModifier, newOptions);
+    const cf = new CheckFactory(newTargetValue, gmModifier, newOptions);
 
     // Possibly additional processing
 
@@ -108,13 +109,13 @@ export async function createCheckRoll(
  * @notes
  * At the moment, this asks for more data than it will do after some iterations.
  *
- * @returns {Promise<IntermediateGmModifierData>} The data given by the user.
+ * @returns The data given by the user.
  */
 async function askGmModifier(
     targetValue: number,
     options: Partial<DS4CheckFactoryOptions> = {},
     { template, title }: { template?: string; title?: string } = {},
-): Promise<IntermediateGmModifierData> {
+): Promise<Partial<IntermediateGmModifierData>> {
     // Render model interface and return value
     const usedTemplate = template ?? "systems/ds4/templates/roll/roll-options.hbs";
     const usedTitle = title ?? game.i18n.localize("DS4.RollDialogDefaultTitle");
@@ -124,7 +125,7 @@ async function askGmModifier(
         checkTargetValue: targetValue,
         maxCritSuccess: options.maxCritSuccess ?? defaultCheckOptions.maxCritSuccess,
         minCritFailure: options.minCritFailure ?? defaultCheckOptions.minCritFailure,
-        rollModes: rollModes,
+        rollMode: options.rollMode,
         config: DS4,
     };
     const renderedHtml = await renderTemplate(usedTemplate, templateData);
@@ -133,14 +134,12 @@ async function askGmModifier(
         new Dialog(
             {
                 title: usedTitle,
-                close: () => {
-                    // Don't do anything
-                },
                 content: renderedHtml,
                 buttons: {
                     ok: {
+                        icon: '<i class="fas fa-check"></i>',
                         label: game.i18n.localize("DS4.RollDialogOkButton"),
-                        callback: (html: HTMLElement | JQuery) => {
+                        callback: (html) => {
                             if (!("jquery" in html)) {
                                 throw new Error(
                                     game.i18n.format("DS4.ErrorUnexpectedHtmlType", {
@@ -150,39 +149,40 @@ async function askGmModifier(
                                 );
                             } else {
                                 const innerForm = html[0].querySelector("form");
+                                if (!innerForm) {
+                                    throw new Error(
+                                        game.i18n.format("DS4.ErrorCouldNotFindHtmlElement", { htmlElement: "form" }),
+                                    );
+                                }
                                 resolve(innerForm);
                             }
                         },
                     },
                     cancel: {
+                        icon: '<i class="fas fa-times"></i>',
                         label: game.i18n.localize("DS4.RollDialogCancelButton"),
-                        callback: () => {
-                            // Don't do anything
-                        },
                     },
                 },
                 default: "ok",
             },
-            {},
+            { jQuery: true },
         ).render(true);
     });
     const dialogForm = await dialogPromise;
-    return parseDialogFormData(dialogForm, targetValue);
+    return parseDialogFormData(dialogForm);
 }
 
 /**
  * Extracts Dialog data from the returned DOM element.
- * @param formData {HTMLFormElement} The filed dialog
- * @param targetValue {number} The previously known target value (slated for removal once data automation is available)
+ * @param formData - The filed dialog
  */
-function parseDialogFormData(formData: HTMLFormElement, targetValue: number): IntermediateGmModifierData {
+function parseDialogFormData(formData: HTMLFormElement): Partial<IntermediateGmModifierData> {
     return {
-        checkTargetValue: parseInt(formData["ctv"]?.value) ?? targetValue,
-        gmModifier: parseInt(formData["gmmod"]?.value) ?? 0,
-        maxCritSuccess: parseInt(formData["maxcoup"]?.value) ?? defaultCheckOptions.maxCritSuccess,
-        minCritFailure: parseInt(formData["minfumble"]?.value) ?? defaultCheckOptions.minCritFailure,
-        useSlayingDice: false,
-        rollMode: formData["visibility"]?.value ?? defaultCheckOptions.rollMode,
+        checkTargetValue: parseInt(formData["ctv"]?.value),
+        gmModifier: parseInt(formData["gmmod"]?.value),
+        maxCritSuccess: parseInt(formData["maxcoup"]?.value),
+        minCritFailure: parseInt(formData["minfumble"]?.value),
+        rollMode: formData["visibility"]?.value,
     };
 }
 
diff --git a/src/module/rolls/check.ts b/src/module/rolls/check.ts
index 38773fb3..0ff4ef0b 100644
--- a/src/module/rolls/check.ts
+++ b/src/module/rolls/check.ts
@@ -56,8 +56,8 @@ export class DS4Check extends DiceTerm {
         }
     }
 
-    success = null;
-    failure = null;
+    success: boolean | null = null;
+    failure: boolean | null = null;
     targetValue = DS4Check.DEFAULT_TARGET_VALUE;
     minCritFailure = DS4Check.DEFAULT_MIN_CRIT_FAILURE;
     maxCritSuccess = DS4Check.DEFAULT_MAX_CRIT_SUCCESS;
@@ -93,16 +93,11 @@ export class DS4Check extends DiceTerm {
         }
     }
 
-    /** Term Modifiers */
-    noop(): this {
-        return this;
-    }
-
     // DS4 only allows recursive explosions
-    explode(modifier: string): this {
+    explode(modifier: string): void {
         const rgx = /[xX]/;
         const match = modifier.match(rgx);
-        if (!match) return this;
+        if (!match) return;
 
         this.results = (this.results as Array<RollResult>)
             .map((r) => {
@@ -110,7 +105,7 @@ export class DS4Check extends DiceTerm {
 
                 let checked = 0;
                 while (checked < intermediateResults.length) {
-                    const r = (intermediateResults as Array<RollResult>)[checked];
+                    const r = intermediateResults[checked];
                     checked++;
                     if (!r.active) continue;
 
@@ -135,7 +130,7 @@ export class DS4Check extends DiceTerm {
     static DENOMINATION = "s";
     static MODIFIERS = {
         x: "explode",
-        c: "noop", // Modifier is consumed in constructor for target value
-        v: "noop", // Modifier is consumed in constructor for target value
+        c: (): void => undefined, // Modifier is consumed in constructor for crit
+        v: (): void => undefined, // Modifier is consumed in constructor for target value
     };
 }
diff --git a/src/module/rolls/roll-data.ts b/src/module/rolls/roll-data.ts
index 78329e44..f4440156 100644
--- a/src/module/rolls/roll-data.ts
+++ b/src/module/rolls/roll-data.ts
@@ -12,7 +12,7 @@ export class DefaultRollOptions implements RollOptions {
     public slayingDiceRepetition = false;
 
     mergeWith(other: Partial<RollOptions>): RollOptions {
-        return { ...this, ...other } as RollOptions;
+        return { ...this, ...other };
     }
 }
 
diff --git a/src/module/rolls/roll-executor.ts b/src/module/rolls/roll-executor.ts
index c7e187b1..ea84bac8 100644
--- a/src/module/rolls/roll-executor.ts
+++ b/src/module/rolls/roll-executor.ts
@@ -4,14 +4,14 @@ import { calculateRollResult, isDiceSwapNecessary, isSlayingDiceRepetition, sepa
 
 /**
  * Performs a roll against a check target number, e.g. for usage in battle, but not for herbs.
- * @param {number} checkTargetValue the final CTN, including all static modifiers.
- * @param {Partial<RollOptions>} rollOptions optional, final option override that affect the checks outcome, e.g. different values for crits or whether slaying dice are used.
- * @param {Array<number>} dice optional, pass already thrown dice that are used instead of rolling new ones.
+ * @param checkTargetValue - the final CTN, including all static modifiers.
+ * @param rollOptions      - optional, final option override that affect the checks outcome, e.g. different values for crits or whether slaying dice are used.
+ * @param dice             - optional, pass already thrown dice that are used instead of rolling new ones.
  */
 export function ds4roll(
     checkTargetValue: number,
     rollOptions: Partial<RollOptions> = {},
-    dice: Array<number> = null,
+    dice: Array<number> = [],
 ): RollResult {
     if (checkTargetValue <= 20) {
         return rollCheckSingleDie(checkTargetValue, rollOptions, dice);
@@ -27,20 +27,20 @@ export function ds4roll(
  * This is not intended for direct usage. Use
  * {@link ds4roll | the function that is not bound to an amount of Dice} instead.
  *
- * @param {number} checkTargetValue - The target value to check against.
- * @param {RollOptions} rollOptions - Options that affect the checks outcome, e.g. different values for crits or whether slaying dice are used.
- * @param {Array<number>} dice optional, pass already thrown dice that are used instead of rolling new ones.
+ * @param checkTargetValue - The target value to check against.
+ * @param rollOptions      - Options that affect the checks outcome, e.g. different values for crits or whether slaying dice are used.
+ * @param dice             - optional, pass already thrown dice that are used instead of rolling new ones.
  *
- * @returns {RollResult} An object containing detailed information on the roll result.
+ * @returns An object containing detailed information on the roll result.
  */
 export function rollCheckSingleDie(
     checkTargetValue: number,
     rollOptions: Partial<RollOptions>,
-    dice: Array<number> = null,
+    dice: Array<number> = [],
 ): RollResult {
     const usedOptions = new DefaultRollOptions().mergeWith(rollOptions);
 
-    if (dice?.length != 1) {
+    if (dice.length != 1) {
         dice = [new DS4RollProvider().getNextRoll()];
     }
     const usedDice = dice;
@@ -66,22 +66,22 @@ export function rollCheckSingleDie(
  * This is not intended for direct usage. Use
  * {@link ds4roll | the function that is not bound to an amount of Dice} instead.
  *
- * @param {number} targetValue- - The target value to check against.
- * @param {RollOptions} rollOptions - Options that affect the checks outcome, e.g. different values for crits or whether slaying dice are used.
- * @param {Array<number>} dice - Optional array of dice values to consider instead of rolling new ones.
+ * @param targetValue - The target value to check against.
+ * @param rollOptions - Options that affect the checks outcome, e.g. different values for crits or whether slaying dice are used.
+ * @param dice        - Optional array of dice values to consider instead of rolling new ones.
  *
- * @returns {RollResult} An object containing detailed information on the roll result.
+ * @returns An object containing detailed information on the roll result.
  */
 export function rollCheckMultipleDice(
     targetValue: number,
     rollOptions: Partial<RollOptions>,
-    dice: Array<number> = null,
+    dice: Array<number> = [],
 ): RollResult {
     const usedOptions = new DefaultRollOptions().mergeWith(rollOptions);
     const remainderTargetValue = targetValue % 20;
     const numberOfDice = Math.ceil(targetValue / 20);
 
-    if (!dice || dice.length != numberOfDice) {
+    if (dice.length != numberOfDice) {
         dice = new DS4RollProvider().getNextRolls(numberOfDice);
     }
     const usedDice = dice;
diff --git a/src/module/rolls/roll-utils.ts b/src/module/rolls/roll-utils.ts
index a880a66d..a3b39b0b 100644
--- a/src/module/rolls/roll-utils.ts
+++ b/src/module/rolls/roll-utils.ts
@@ -1,3 +1,4 @@
+import { partition, zip } from "../common/utils";
 import { RollOptions } from "./roll-data";
 
 /**
@@ -8,9 +9,9 @@ import { RollOptions } from "./roll-data";
  * @private_remarks
  * This uses an internal implementation of a `partition` method. Don't let typescript fool you, it will tell you that a partition method is available for Arrays, but that one's imported globally from foundry's declarations and not available during the test stage!
  *
- * @param {Array<number>} dice - The dice values.
- * @param {RollOptions} usedOptions - Options that affect the check's behaviour.
- * @returns {[Array<number>, Array<number>]} A tuple containing two arrays of dice values, the first one containing all critical hits, the second one containing all others. Both arrays are sorted descendingby value.
+ * @param dice        - The dice values.
+ * @param usedOptions - Options that affect the check's behavior.
+ * @returns A tuple containing two arrays of dice values, the first one containing all critical hits, the second one containing all others. Both arrays are sorted descending by value.
  */
 export function separateCriticalHits(dice: Array<number>, usedOptions: RollOptions): CritsAndNonCrits {
     const [critSuccesses, otherRolls] = partition(dice, (v: number) => {
@@ -25,40 +26,19 @@ export function separateCriticalHits(dice: Array<number>, usedOptions: RollOptio
  */
 type CritsAndNonCrits = [Array<number>, Array<number>];
 
-/**
- * Partition an array into two, following a predicate.
- * @param {Array<T>} input The Array to split.
- * @param {(T) => boolean} predicate The predicate by which to split.
- * @returns A tuple of two arrays, the first one containing all elements from `input` that matched the predicate, the second one containing those that don't.
- */
-// TODO: Move to generic utils method?
-function partition<T>(input: Array<T>, predicate: (v: T) => boolean) {
-    return input.reduce(
-        (p: [Array<T>, Array<T>], cur: T) => {
-            if (predicate(cur)) {
-                p[0].push(cur);
-            } else {
-                p[1].push(cur);
-            }
-            return p;
-        },
-        [[], []],
-    );
-}
-
 /**
  * Calculates if a critical success should be moved to the last position in order to maximize the check's result.
  *
  * @example
  * With regular dice rolling rules and a check target number of 31, the two dice 1 and 19 can get to a check result of 30.
  * This method would be called as follows:
- * ```
+ * ```ts
  * isDiceSwapNecessary([[1], [19]], 11)
  * ```
  *
- * @param {[Array<number>, Array<number>]} critsAndNonCrits the dice values thrown. It is assumed that both critical successes and other rolls are sorted descending.
- * @param {number} remainingTargetValue the target value for the last dice, that is the only one that can be less than 20.
- * @returns {boolean} Bool indicating whether a critical success has to be used as the last dice.
+ * @param critsAndNonCrits     - The dice values thrown. It is assumed that both critical successes and other rolls are sorted descending.
+ * @param remainingTargetValue - The target value for the last dice, that is the only one that can be less than 20.
+ * @returns Bool indicating whether a critical success has to be used as the last dice.
  */
 export function isDiceSwapNecessary(
     [critSuccesses, otherRolls]: CritsAndNonCrits,
@@ -81,7 +61,7 @@ export function isDiceSwapNecessary(
  *
  * @internal
  *
- * @param {RollOptions} opts the roll options to check against
+ * @param opts - The roll options to check against
  */
 export function isSlayingDiceRepetition(opts: RollOptions): boolean {
     return opts.useSlayingDice && opts.slayingDiceRepetition;
@@ -92,9 +72,9 @@ export function isSlayingDiceRepetition(opts: RollOptions): boolean {
  *
  * @internal
  *
- * @param assignedRollResults The dice values in the order of usage.
- * @param remainderTargetValue Target value for the last dice (the only one differing from `20`).
- * @param rollOptions Config object containing options that change the way dice results are handled.
+ * @param assignedRollResults  - The dice values in the order of usage.
+ * @param remainderTargetValue - Target value for the last dice (the only one differing from `20`).
+ * @param rollOptions          - Config object containing options that change the way dice results are handled.
  *
  * @returns {number} The total check value.
  */
@@ -118,22 +98,3 @@ export function calculateRollResult(
         .map(([v]) => v)
         .reduce((a, b) => a + b);
 }
-
-// TODO: Move to generic utils method?
-/**
- * Zips two Arrays to an array of pairs of elements with corresponding indices. Excessive elements are dropped.
- * @param {Array<T>} a1 First array to zip.
- * @param {Array<U>} a2 Second array to zip.
- *
- * @typeParam T - Type of elements contained in `a1`.
- * @typeParam U - Type of elements contained in `a2`.
- *
- * @returns {Array<[T,U]>} The array of pairs that had the same index in their source array.
- */
-function zip<T, U>(a1: Array<T>, a2: Array<U>): Array<[T, U]> {
-    if (a1.length <= a2.length) {
-        return a1.map((e1, i) => [e1, a2[i]]);
-    } else {
-        return a2.map((e2, i) => [a1[i], e2]);
-    }
-}
diff --git a/src/system.json b/src/system.json
index badc3e57..369b033f 100644
--- a/src/system.json
+++ b/src/system.json
@@ -2,7 +2,7 @@
     "name": "ds4",
     "title": "Dungeonslayers 4",
     "description": "The Dungeonslayers 4 system for FoundryVTT. Dungeonslayers (© Christian Kennig) is licensed under CC BY-NC-SA 3.0 (https://creativecommons.org/licenses/by-nc-sa/3.0/de/deed.en).",
-    "version": "0.2.0",
+    "version": "0.2.1",
     "minimumCoreVersion": "0.7.9",
     "compatibleCoreVersion": "0.7.9",
     "templateVersion": 2,
@@ -43,7 +43,7 @@
     "primaryTokenAttribute": "combatValues.hitPoints",
     "url": "https://git.f3l.de/dungeonslayers/ds4",
     "manifest": "https://git.f3l.de/dungeonslayers/ds4/-/raw/latest/src/system.json?inline=false",
-    "download": "https://git.f3l.de/dungeonslayers/ds4/-/jobs/artifacts/0.2.0/download?job=build",
+    "download": "https://git.f3l.de/dungeonslayers/ds4/-/jobs/artifacts/0.2.1/download?job=build",
     "license": "MIT",
     "initiative": "@combatValues.initiative.total"
 }
diff --git a/src/templates/actor/character-sheet.hbs b/src/templates/actor/character-sheet.hbs
index 0fb538f9..0d252d9b 100644
--- a/src/templates/actor/character-sheet.hbs
+++ b/src/templates/actor/character-sheet.hbs
@@ -13,20 +13,20 @@
             <div class="flexrow basic-properties">
                 <div class="basic-property">
                     <label class="basic-property-label"
-                        for="data.baseInfo.race">{{config.characterBaseInfo.race}}</label>
+                        for="data.baseInfo.race">{{config.i18n.characterBaseInfo.race}}</label>
                     <input type="text" name="data.baseInfo.race" id="data.baseInfo.race" value="{{data.baseInfo.race}}"
                            data-dtype="String" />
                 </div>
                 <div class="basic-property">
                     <label class="basic-property-label"
-                        for="data.baseInfo.culture">{{config.characterBaseInfo.culture}}</label>
+                        for="data.baseInfo.culture">{{config.i18n.characterBaseInfo.culture}}</label>
                     <input id="data.baseInfo.culture" type="text" name="data.baseInfo.culture"
                            value="{{data.baseInfo.culture}}"
                            data-dtype="String" />
                 </div>
                 <div class="basic-property flex125">
                     <label class="basic-property-label"
-                           for="data.progression.progressPoints.used">{{config.characterProgression.progressPoints}}</label>
+                           for="data.progression.progressPoints.used">{{config.i18n.characterProgression.progressPoints}}</label>
                     <div class="flexrow">
                         <input id="data.progression.progressPoints.used" type="number"
                                name="data.progression.progressPoints.used"
@@ -43,7 +43,7 @@
                 </div>
                 <div class="basic-property flex125">
                     <label class="basic-property-label"
-                           for="data.progression.talentPoints.used">{{config.characterProgression.talentPoints}}</label>
+                           for="data.progression.talentPoints.used">{{config.i18n.characterProgression.talentPoints}}</label>
                     <div class="flexrow">
                         <input type="number" name="data.progression.talentPoints.used"
                                id="data.progression.talentPoints.used"
@@ -56,13 +56,13 @@
                 </div>
                 <div class="basic-property">
                     <label class="basic-property-label"
-                        for="data.baseInfo.class">{{config.characterBaseInfo.class}}</label>
+                        for="data.baseInfo.class">{{config.i18n.characterBaseInfo.class}}</label>
                     <input type="text" id="data.baseInfo.class" name="data.baseInfo.class"
                            value="{{data.baseInfo.class}}" data-dtype="String" />
                 </div>
                 <div class="basic-property">
                     <label class="basic-property-label"
-                           for="data.baseInfo.heroClass">{{config.characterBaseInfo.heroClass}}</label>
+                           for="data.baseInfo.heroClass">{{config.i18n.characterBaseInfo.heroClass}}</label>
                     <input type="text" id="data.baseInfo.heroClass" name="data.baseInfo.heroClass"
                            value="{{data.baseInfo.heroClass}}"
                            data-dtype="String" />
@@ -84,24 +84,28 @@
         <a class="item" data-tab="biography">{{localize 'DS4.HeadingBiography'}}</a>
     </nav>
 
-    {{!-- Sheet Body --}}
-    <section class="sheet-body">
-        {{!-- Items Tab --}}
-        {{> systems/ds4/templates/actor/partials/character-inventory.hbs}}
+    <!-- beautify ignore:start -->
+    <!-- prettier-ignore-start -->
+{{!-- Sheet Body (remove indentation to avoid annoying Handlebars auto-indent) --}}
+<section class="sheet-body">
+{{!-- Items Tab --}}
+{{> systems/ds4/templates/actor/partials/character-inventory.hbs}}
 
-        {{!-- Spells Tab --}}
-        {{> systems/ds4/templates/actor/partials/spells-overview.hbs}}
+{{!-- Spells Tab --}}
+{{> systems/ds4/templates/actor/partials/spells-overview.hbs}}
 
-        {{!-- Talents Tab --}}
-        {{> systems/ds4/templates/actor/partials/talents-abilities-overview.hbs}}
+{{!-- Talents Tab --}}
+{{> systems/ds4/templates/actor/partials/talents-abilities-overview.hbs}}
 
-        {{! Profile Tab --}}
-        {{> systems/ds4/templates/actor/partials/profile.hbs}}
+{{! Profile Tab --}}
+{{> systems/ds4/templates/actor/partials/profile.hbs}}
 
-        {{!-- Biography Tab --}}
-        <div class="tab biography" data-group="primary" data-tab="biography">
-            {{editor content=data.profile.biography target="data.profile.biography" button=true owner=owner
-            editable=editable}}
-        </div>
-    </section>
+{{!-- Biography Tab --}}
+<div class="tab biography" data-group="primary" data-tab="biography">
+{{editor content=data.profile.biography target="data.profile.biography" button=true owner=owner
+editable=editable}}
+</div>
+</section>
+    <!-- prettier-ignore-end -->
+    <!-- beautify ignore:end -->
 </form>
diff --git a/src/templates/actor/creature-sheet.hbs b/src/templates/actor/creature-sheet.hbs
index 7571eaba..c34a142d 100644
--- a/src/templates/actor/creature-sheet.hbs
+++ b/src/templates/actor/creature-sheet.hbs
@@ -6,10 +6,10 @@
             <h1 class="charname"><input name="name" type="text" value="{{actor.name}}" placeholder="Name" /></h1>
             <div class="flexrow basic-properties">
                 <div class="basic-property">
-                    <label>{{config.creatureBaseInfo.creatureType}}</label>
+                    <label>{{config.i18n.creatureBaseInfo.creatureType}}</label>
                     <select name="data.baseInfo.creatureType" data-type="String">
                         {{#select data.baseInfo.creatureType}}
-                        {{#each config.creatureTypes as |value key|}}
+                        {{#each config.i18n.creatureTypes as |value key|}}
                         <option value="{{key}}">{{value}}</option>
                         {{/each}}
                         {{/select}}
@@ -17,20 +17,20 @@
                 </div>
                 <div class="basic-property">
                     <label class="basic-property-label"
-                        for="data.baseInfo.loot">{{config.creatureBaseInfo.loot}}</label>
+                        for="data.baseInfo.loot">{{config.i18n.creatureBaseInfo.loot}}</label>
                     <input type="text" name="data.baseInfo.loot" value="{{data.baseInfo.loot}}" data-dtype="String" />
                 </div>
                 <div class="basic-property">
                     <label class="basic-property-label"
-                        for="data.baseInfo.foeFactor">{{config.creatureBaseInfo.foeFactor}}</label>
+                        for="data.baseInfo.foeFactor">{{config.i18n.creatureBaseInfo.foeFactor}}</label>
                     <input type="text" name="data.baseInfo.foeFactor" value="{{data.baseInfo.foeFactor}}"
                         data-dtype="Number" />
                 </div>
                 <div class="basic-property">
-                    <label>{{config.creatureBaseInfo.sizeCategory}}</label>
+                    <label>{{config.i18n.creatureBaseInfo.sizeCategory}}</label>
                     <select name="data.baseInfo.sizeCategory" data-type="String">
                         {{#select data.baseInfo.sizeCategory}}
-                        {{#each config.creatureSizeCategories as |value key|}}
+                        {{#each config.i18n.creatureSizeCategories as |value key|}}
                         <option value="{{key}}">{{value}}</option>
                         {{/each}}
                         {{/select}}
@@ -38,7 +38,7 @@
                 </div>
                 <div class="basic-property">
                     <label class="basic-property-label"
-                        for="data.baseInfo.experiencePoints">{{config.creatureBaseInfo.experiencePoints}}</label>
+                        for="data.baseInfo.experiencePoints">{{config.i18n.creatureBaseInfo.experiencePoints}}</label>
                     <input type="text" name="data.baseInfo.experiencePoints" value="{{data.baseInfo.experiencePoints}}"
                         data-dtype="Number" />
                 </div>
@@ -64,7 +64,7 @@
         {{> systems/ds4/templates/actor/partials/creature-inventory.hbs}}
 
         {{!-- Special Creature Abilities Tab --}}
-        {{> systems/ds4/templates/actor/partials/special-creature-abilites-overview.hbs}}
+        {{> systems/ds4/templates/actor/partials/special-creature-abilities-overview.hbs}}
 
         {{!-- Spells Tab --}}
         {{> systems/ds4/templates/actor/partials/spells-overview.hbs}}
diff --git a/src/templates/actor/partials/attributes-traits.hbs b/src/templates/actor/partials/attributes-traits.hbs
index 14fece65..9c12a6ae 100644
--- a/src/templates/actor/partials/attributes-traits.hbs
+++ b/src/templates/actor/partials/attributes-traits.hbs
@@ -42,11 +42,11 @@
 {{!-- ======================================================================== --}}
 
 <div class="attributes-traits grid grid-3col">
-    {{#each config.attributes as |attribute-label attribute-key|}}
+    {{#each config.i18n.attributes as |attribute-label attribute-key|}}
     {{> attribute attribute-label=attribute-label attribute-key=attribute-key attribute-data=(lookup ../data.attributes
     attribute-key)}}
     {{/each}}
-    {{#each config.traits as |trait-label trait-key|}}
+    {{#each config.i18n.traits as |trait-label trait-key|}}
     {{> trait trait-label=trait-label trait-key=trait-key trait-data=(lookup ../data.traits trait-key)}}
     {{/each}}
 </div>
diff --git a/src/templates/actor/partials/character-inventory.hbs b/src/templates/actor/partials/character-inventory.hbs
index 19a4009d..b27fff63 100644
--- a/src/templates/actor/partials/character-inventory.hbs
+++ b/src/templates/actor/partials/character-inventory.hbs
@@ -4,13 +4,13 @@
     <h4 class="items-list-title">{{localize 'DS4.CharacterCurrency'}}</h4>
     <ol class="items-list">
         <li class="item flexrow item-header">
-            <label for="data.currency.gold" class="flex05">{{config.characterCurrency.gold}}</label>
+            <label for="data.currency.gold" class="flex05">{{config.i18n.characterCurrency.gold}}</label>
             <input class="flex3 item-num-val item-change" type="number" min="0" step="1" name="data.currency.gold"
                 id="data.currency.gold" value="{{data.currency.gold}}" data-dtype="Number" />
-            <label for="data.currency.silver" class="flex05">{{config.characterCurrency.silver}}</label>
+            <label for="data.currency.silver" class="flex05">{{config.i18n.characterCurrency.silver}}</label>
             <input class="flex3 item-num-val item-change" type="number" min="0" step="1" name="data.currency.silver"
                 id="data.currency.silver" value="{{data.currency.silver}}" data-dtype="Number" />
-            <label for="data.currency.copper" class="flex05">{{config.characterCurrency.copper}}</label>
+            <label for="data.currency.copper" class="flex05">{{config.i18n.characterCurrency.copper}}</label>
             <input class="flex3 item-num-val item-change" type="number" min="0" step="1" name="data.currency.copper"
                 id="data.currency.copper" value="{{data.currency.copper}}" data-dtype="Number" />
         </li>
diff --git a/src/templates/actor/partials/character-progression.hbs b/src/templates/actor/partials/character-progression.hbs
index fd0a3932..e890a024 100644
--- a/src/templates/actor/partials/character-progression.hbs
+++ b/src/templates/actor/partials/character-progression.hbs
@@ -1,6 +1,6 @@
 <div class="progression flexrow">
     <div class="progression-entry">
-        <h2 class="progression-label"><label for="data.progression.level">{{config.characterProgression.level}}</label>
+        <h2 class="progression-label"><label for="data.progression.level">{{config.i18n.characterProgression.level}}</label>
         </h2>
         <label for="data.progression.level" class="hidden">Progression Level</label>
         <input class="progression-value" type="number" name="data.progression.level" id="data.progression.level" value="{{data.progression.level}}"
@@ -8,7 +8,7 @@
     </div>
     <div class="progression-entry">
         <h2 class="progression-label"><label
-                for="data.progression.experiencePoints">{{config.characterProgression.experiencePoints}}</label>
+                for="data.progression.experiencePoints">{{config.i18n.characterProgression.experiencePoints}}</label>
         </h2>
         <label for="data.progression.experiencePoints" class="hidden">Experience Points</label>
         <input class="progression-value" type="number" name="data.progression.experiencePoints" id="data.progression.experiencePoints"
diff --git a/src/templates/actor/partials/combat-values.hbs b/src/templates/actor/partials/combat-values.hbs
index d207245a..686a7a3a 100644
--- a/src/templates/actor/partials/combat-values.hbs
+++ b/src/templates/actor/partials/combat-values.hbs
@@ -23,7 +23,7 @@
 {{!-- ======================================================================== --}}
 
 <div class="combat-values flexrow flex-between">
-    {{#each config.combatValues as |combat-value-label combat-value-key|}}
+    {{#each config.i18n.combatValues as |combat-value-label combat-value-key|}}
     {{> combat-value combat-value-key=combat-value-key combat-value-data=(lookup ../data.combatValues
     combat-value-key)}}
     {{/each}}
diff --git a/src/templates/actor/partials/items-overview.hbs b/src/templates/actor/partials/items-overview.hbs
index 55b34411..681a9a7d 100644
--- a/src/templates/actor/partials/items-overview.hbs
+++ b/src/templates/actor/partials/items-overview.hbs
@@ -15,9 +15,8 @@
 {{#*inline "ifHasItemOfType"}}
 {{#if (and (ne itemsArray undefined) (gt itemsArray.length 0))}}
 {{> @partial-block}}
-{{else}}
-{{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
 {{/if}}
+{{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
 {{/inline}}
 
 
@@ -48,8 +47,8 @@
     {{> @partial-block }}
     {{!-- description --}}
     <div class="flex4">{{localize 'DS4.Description'}}</div>
-    {{!-- add button --}}
-    {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
+    {{!-- control buttons placeholder --}}
+    <div></div>
 </li>
 {{/inline}}
 
@@ -110,8 +109,8 @@
     {{#each itemsByType.weapon as |item id|}}
     {{#> itemListEntry item=item}}
     <div class="flex05 item-image">
-        <img src="{{lookup ../../config.attackTypesIcons  item.data.data.attackType}}"
-            title="{{lookup ../../config.attackTypes  item.data.data.attackType}}" width="24" height="24" />
+        <img src="{{lookup ../../config.icons.attackTypes  item.data.data.attackType}}"
+            title="{{lookup ../../config.i18n.attackTypes  item.data.data.attackType}}" width="24" height="24" />
     </div>
     <div class="flex05 item-num-val">{{ item.data.data.weaponBonus}}</div>
     <div class="flex05 item-num-val">{{ item.data.data.opponentDefense}}</div>
@@ -135,11 +134,11 @@
     {{/itemListHeader}}
     {{#each itemsByType.armor as |item id|}}
     {{#> itemListEntry item=item }}
-    <div title="{{lookup ../../config.armorMaterialTypes  item.data.data.armorMaterialType}}">
-        {{lookup ../../config.armorMaterialTypesAbbr item.data.data.armorMaterialType}}
+    <div title="{{lookup ../../config.i18n.armorMaterialTypes  item.data.data.armorMaterialType}}">
+        {{lookup ../../config.i18n.armorMaterialTypesAbbr item.data.data.armorMaterialType}}
     </div>
-    <div title="{{lookup ../../config.armorTypes  item.data.data.armorType}}">
-        {{lookup ../../config.armorTypesAbbr item.data.data.armorType}}
+    <div title="{{lookup ../../config.i18n.armorTypes  item.data.data.armorType}}">
+        {{lookup ../../config.i18n.armorTypesAbbr item.data.data.armorType}}
     </div>
     <div class="flex05 item-num-val">{{ item.data.data.armorValue}}</div>
     {{/itemListEntry}}
diff --git a/src/templates/actor/partials/overview-control-buttons.hbs b/src/templates/actor/partials/overview-control-buttons.hbs
index d10dbc3f..2c85899f 100644
--- a/src/templates/actor/partials/overview-control-buttons.hbs
+++ b/src/templates/actor/partials/overview-control-buttons.hbs
@@ -3,6 +3,6 @@
 !-- The current item is defined by the data-item-id HTML property of the parent li element.
 --}}
 <div class="item-controls">
-    <a class="item-control item-edit" title="Edit Item"><i class="fas fa-edit"></i></a>
-    <a class="item-control item-delete" title="Delete Item"><i class="fas fa-trash"></i></a>
+    <a class="item-control item-edit" title="{{localize 'DS4.UserInteractionEditItem'}}"><i class="fas fa-edit"></i></a>
+    <a class="item-control item-delete" title="{{localize 'DS4.UserInteractionDeleteItem'}}"><i class="fas fa-trash"></i></a>
 </div>
diff --git a/src/templates/actor/partials/profile.hbs b/src/templates/actor/partials/profile.hbs
index be95eeb5..06647b39 100644
--- a/src/templates/actor/partials/profile.hbs
+++ b/src/templates/actor/partials/profile.hbs
@@ -1,15 +1,21 @@
 <div class="tab profile" data-group="primary" data-tab="profile">
     <div class="grid grid-2col">
         {{#each data.profile as |profile-data-value profile-data-key|}}
-        {{#if (ne profile-data-key 'biography')}}
+        {{#if (and (ne profile-data-key 'biography') (ne profile-data-key 'specialCharacteristics'))}}
         <div class="profile-entry">
             <label for="data.profile.{{profile-data-key}}">
-                {{lookup ../config.characterProfile profile-data-key}}
+                {{lookup ../config.i18n.characterProfile profile-data-key}}
             </label>
             <input type="text" name="data.profile.{{profile-data-key}}" value="{{profile-data-value}}"
-                data-dtype="{{lookup ../config/characterProfileDTypes profile-data-key}}" />
+                data-dtype="{{lookup ../config.i18n.characterProfileDTypes profile-data-key}}" />
         </div>
         {{/if}}
         {{/each}}
+        <div>
+            <label for="data.profile.specialCharacteristics">
+                {{lookup config.i18n.characterProfile 'specialCharacteristics'}}
+            </label>
+            <textarea name="data.profile.specialCharacteristics" data-dtype="String" rows="4">{{data.profile.specialCharacteristics}}</textarea>
+        </div>
     </div>
 </div>
diff --git a/src/templates/actor/partials/special-creature-abilites-overview.hbs b/src/templates/actor/partials/special-creature-abilities-overview.hbs
similarity index 95%
rename from src/templates/actor/partials/special-creature-abilites-overview.hbs
rename to src/templates/actor/partials/special-creature-abilities-overview.hbs
index 28637149..078fa287 100644
--- a/src/templates/actor/partials/special-creature-abilites-overview.hbs
+++ b/src/templates/actor/partials/special-creature-abilities-overview.hbs
@@ -42,8 +42,8 @@
     <div class="flex1 item-name">{{localize 'DS4.ItemName'}}</div>
     {{!-- description --}}
     <div class="flex3">{{localize 'DS4.Description'}}</div>
-    {{!-- add button --}}
-    {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
+    {{!-- control buttons placeholder --}}
+    <div></div>
 </li>
 {{/inline}}
 
@@ -58,4 +58,5 @@
         {{> baseItemListEntry item=item}}
         {{/each}}
     </ol>
+    {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType='specialCreatureAbility' }}
 </div>
\ No newline at end of file
diff --git a/src/templates/actor/partials/spells-overview.hbs b/src/templates/actor/partials/spells-overview.hbs
index 8bcd33e3..d9d72357 100644
--- a/src/templates/actor/partials/spells-overview.hbs
+++ b/src/templates/actor/partials/spells-overview.hbs
@@ -13,7 +13,7 @@
 <div class="unit-data-pair item-num-val"
     title="{{localize localizationString}} [{{lookup unitNames unitDatum.unit}}]" >
     {{#if unitDatum.value }}
-    {{unitDatum.value}}{{lookup unitAbbrs unitDatum.unit}}
+    {{unitDatum.value}}&thinsp;{{lookup unitAbbrs unitDatum.unit}}
     {{else}}-{{/if}}
 </div>
 {{/inline}}
@@ -23,11 +23,11 @@
 !-- directly handing over the latter two.
 --}}
 {{#*inline "temporalUnit"}}
-{{> unit unitNames=config.temporalUnits unitAbbrs=config.temporalUnitsAbbr unitDatum=unitDatum localizationString=localizationString}}
+{{> unit unitNames=config.i18n.temporalUnits unitAbbrs=config.i18n.temporalUnitsAbbr unitDatum=unitDatum localizationString=localizationString}}
 {{/inline}}
 
 {{#*inline "distanceUnit"}}
-{{> unit unitNames=config.distanceUnits unitAbbrs=config.distanceUnitsAbbr unitDatum=unitDatum localizationString=localizationString}}
+{{> unit unitNames=config.i18n.distanceUnits unitAbbrs=config.i18n.distanceUnitsAbbr unitDatum=unitDatum localizationString=localizationString}}
 {{/inline}}
 
 
@@ -55,8 +55,8 @@
             <div class="item-num-val" title="{{localize 'DS4.SpellCooldownDuration'}}"><i class="fas fa-hourglass-half"></i></div>
             {{!-- description --}}
             {{!-- <div class="flex3">{{localize 'DS4.Description'}}</div> --}}
-            {{!-- add button --}}
-            {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType='spell' }}
+            {{!-- control buttons placeholder --}}
+            <div></div>
         </li>
         {{#each itemsByType.spell as |item id|}}
         <li class="item flexrow" data-item-id="{{item._id}}">
@@ -71,8 +71,8 @@
                 data-property="name" title="{{localize 'DS4.ItemName'}}" />
             {{!-- spell type --}}
             <div class="flex05 item-image">
-                <img src="{{lookup ../config.spellTypesIcons item.data.data.spellType}}"
-                    title="{{lookup ../config.spellTypes item.data.data.spellType}}" width="24" height="24" />
+                <img src="{{lookup ../config.icons.spellTypes item.data.data.spellType}}"
+                    title="{{lookup ../config.i18n.spellTypes item.data.data.spellType}}" width="24" height="24" />
             </div>
             {{!-- spell bonus --}}
             <input class="item-num-val item-change" type="text" data-dtype="String"
@@ -90,4 +90,6 @@
         </li>
         {{/each}}
     </ol>
+    {{!-- add button --}}
+    {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType='spell' }}
 </div>
\ No newline at end of file
diff --git a/src/templates/actor/partials/talents-abilities-overview.hbs b/src/templates/actor/partials/talents-abilities-overview.hbs
index e40b2aa7..19bac512 100644
--- a/src/templates/actor/partials/talents-abilities-overview.hbs
+++ b/src/templates/actor/partials/talents-abilities-overview.hbs
@@ -15,9 +15,8 @@
 {{#*inline "ifHasItemOfType"}}
 {{#if (and (ne itemsArray undefined) (gt itemsArray.length 0))}}
     {{> @partial-block}}
-{{else}}
-    {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
 {{/if}}
+{{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
 {{/inline}}
 
 
@@ -98,7 +97,7 @@
 {{/inline}}
 
 {{!--
-!-- Render a list header for a base item list entries from a given item.
+!-- Render a list header for a base item list entry from a given item.
 !-- The partial assumes a variable dataType to be given in the context.
 !--
 !-- @param dataType: the string item type for the list
@@ -111,8 +110,8 @@
     <div class="flex1 item-name">{{localize 'DS4.ItemName'}}</div>
     {{!-- description --}}
     <div class="flex3">{{localize 'DS4.Description'}}</div>
-    {{!-- add button --}}
-    {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType=dataType }}
+    {{!-- control buttons placeholder --}}
+    <div></div>
 </li>
 {{/inline}}
 
@@ -133,8 +132,8 @@
             <div class="flex3">{{localize 'DS4.TalentRank'}}</div>
             {{!-- description --}}
             <div class="flex4">{{localize 'DS4.Description'}}</div>
-            {{!-- add button --}}
-            {{> systems/ds4/templates/actor/partials/overview-add-button.hbs dataType='talent' }}
+            {{!-- control buttons placeholder --}}
+            <div></div>
         </li>
         {{#each itemsByType.talent as |item id|}}
         {{> talentListEntry item=item}}
diff --git a/src/templates/item/armor-sheet.hbs b/src/templates/item/armor-sheet.hbs
index 5fd59feb..6c8e9540 100644
--- a/src/templates/item/armor-sheet.hbs
+++ b/src/templates/item/armor-sheet.hbs
@@ -5,7 +5,7 @@
                     <label>{{localize "DS4.ArmorType"}}</label>
                     <select name="data.armorType" data-type="String">
                         {{#select data.armorType}}
-                        {{#each config.armorTypes as |value key|}}
+                        {{#each config.i18n.armorTypes as |value key|}}
                         <option value="{{key}}">{{value}}</option>
                         {{/each}}
                         {{/select}}
@@ -15,7 +15,7 @@
                     <label for="data.armorMaterialType">{{localize "DS4.ArmorMaterialType"}}</label>
                     <select name="data.armorMaterialType" data-type="String">
                         {{#select data.armorMaterialType}}
-                        {{#each config.armorMaterialTypes as |value key|}}
+                        {{#each config.i18n.armorMaterialTypes as |value key|}}
                         <option value="{{key}}">{{value}}</option>
                         {{/each}}
                         {{/select}}
diff --git a/src/templates/item/partials/details.hbs b/src/templates/item/partials/details.hbs
index 0408641a..69f7526a 100644
--- a/src/templates/item/partials/details.hbs
+++ b/src/templates/item/partials/details.hbs
@@ -11,7 +11,7 @@
             <label for="data.availability">{{localize "DS4.ItemAvailability"}}</label>
             <select name="data.availability" data-type="String">
                 {{#select data.availability}}
-                {{#each config.itemAvailabilities as |value key|}}
+                {{#each config.i18n.itemAvailabilities as |value key|}}
                 <option value="{{key}}">{{value}}</option>
                 {{/each}}
                 {{/select}}
diff --git a/src/templates/item/partials/effects.hbs b/src/templates/item/partials/effects.hbs
index b829bfac..a064313e 100644
--- a/src/templates/item/partials/effects.hbs
+++ b/src/templates/item/partials/effects.hbs
@@ -5,16 +5,18 @@
             <div class="effect-image"></div>
             <div class="effect-name">Name</div>
             <div class="effect-controls">
-                <a class="effect-control" data-action="create" title="Create Effect"><i class="fas fa-plus"></i> Add
-                    effect</a>
+                <a class="effect-control" data-action="create" title="{{localize 'DS4.UserInteractionAddEffect'}}">
+                    <i class="fas fa-plus"></i> {{localize 'DS4.UserInteractionAddEffect'}}</a>
             </div>
         </li>
         {{#each item.effects as |effect id|}}
         <li class="effect flexrow" data-effect-id="{{effect._id}}">
             <h4 class="effect-name">{{effect.label}}</h4>
             <div class="effect-controls">
-                <a class="effect-control" data-action="edit" title="Edit Effect"><i class="fas fa-edit"></i></a>
-                <a class="effect-control" data-action="delete" title="Delete Effect"><i class="fas fa-trash"></i></a>
+                <a class="effect-control" data-action="edit" title="{{localize 'DS4.UserInteractionEditEffect'}}">
+                    <i class="fas fa-edit"></i></a>
+                <a class="effect-control" data-action="delete" title="{{localize 'DS4.UserInteractionDeleteEffect'}}">
+                    <i class="fas fa-trash"></i></a>
             </div>
         </li>
         {{/each}}
diff --git a/src/templates/item/partials/sheet-header.hbs b/src/templates/item/partials/sheet-header.hbs
index cef12b2b..ff30f526 100644
--- a/src/templates/item/partials/sheet-header.hbs
+++ b/src/templates/item/partials/sheet-header.hbs
@@ -2,7 +2,7 @@
     <img class="profile-img" src="{{item.img}}" data-edit="img" title="{{item.name}}" />
     <div class="header-fields flexrow">
         <h1 class="charname"><input name="name" type="text" value="{{item.name}}" placeholder="Name" /></h1>
-        <h2 class="item-type">{{localize (lookup config.itemTypes item.type)}}</h2>
+        <h2 class="item-type">{{lookup config.i18n.itemTypes item.type}}</h2>
         {{> @partial-block}}
     </div>
 </header>
\ No newline at end of file
diff --git a/src/templates/item/spell-sheet.hbs b/src/templates/item/spell-sheet.hbs
index 4e180755..4fdd6dc1 100644
--- a/src/templates/item/spell-sheet.hbs
+++ b/src/templates/item/spell-sheet.hbs
@@ -12,9 +12,9 @@
         <select name="data.{{property}}.unit" data-type="String">
             {{#select (lookup (lookup data property) 'unit')}}
             {{#if (eq unitType 'temporal')}}
-                {{#each (lookup config 'temporalUnitsAbbr') as |value key|}}<option value="{{key}}">{{value}}</option>{{/each}}
+                {{#each (lookup config.i18n 'temporalUnitsAbbr') as |value key|}}<option value="{{key}}">{{value}}</option>{{/each}}
             {{else}}
-                {{#each (lookup config 'distanceUnitsAbbr') as |value key|}}<option value="{{key}}">{{value}}</option>{{/each}}
+                {{#each (lookup config.i18n 'distanceUnitsAbbr') as |value key|}}<option value="{{key}}">{{value}}</option>{{/each}}
             {{/if}}
             {{/select}}
         </select>
@@ -33,7 +33,7 @@
                 <label for="data.spellType">{{localize "DS4.SpellType"}}</label>
                 <select id="data.spellType" name="data.spellType" data-type="String">
                     {{#select data.spellType}}
-                    {{#each config.spellTypes as |value key|}}
+                    {{#each config.i18n.spellTypes as |value key|}}
                     <option value="{{key}}">{{value}}</option>
                     {{/each}}
                     {{/select}}
@@ -52,7 +52,7 @@
             <label for="data.spellCategory">{{localize "DS4.SpellCategory"}}</label>
             <select id="data.spellCategory" name="data.spellCategory" data-type="String">
                 {{#select data.spellCategory}}
-                {{#each config.spellCategories as |value key|}}
+                {{#each config.i18n.spellCategories as |value key|}}
                 <option value="{{key}}">{{value}}</option>
                 {{/each}}
                 {{/select}}
diff --git a/src/templates/item/weapon-sheet.hbs b/src/templates/item/weapon-sheet.hbs
index b92bf97f..65005984 100644
--- a/src/templates/item/weapon-sheet.hbs
+++ b/src/templates/item/weapon-sheet.hbs
@@ -5,7 +5,7 @@
                 <label>{{localize "DS4.AttackType"}}</label>
                 <select name="data.attackType" data-type="String">
                     {{#select data.attackType}}
-                    {{#each config.attackTypes as |value key|}}
+                    {{#each config.i18n.attackTypes as |value key|}}
                     <option value="{{key}}">{{value}}</option>
                     {{/each}}
                     {{/select}}
diff --git a/src/templates/roll/roll-options.hbs b/src/templates/roll/roll-options.hbs
index 8c3e7dc3..6db4e245 100644
--- a/src/templates/roll/roll-options.hbs
+++ b/src/templates/roll/roll-options.hbs
@@ -2,15 +2,17 @@
     <label for="ctv">{{localize "DS4.RollDialogTargetLabel"}}</label>
     <input id="ctv" data-type="Number" type="number" name="ctv" value="{{checkTargetValue}}" />
     <label for="gmmod">{{localize "DS4.RollDialogModifierLabel"}}</label>
-    <input id="gmmod" data-type="Number" type="number" name="gmmod" value="0" />
+    <input id="gmmod" data-type="Number" type="number" name="gmmod" value="0" autofocus />
     <label for="maxcoup">{{localize "DS4.RollDialogCoupLabel"}}</label>
     <input id="maxcoup" data-type="Number" type="number" name="maxcoup" value="{{maxCritSuccess}}" />
     <label for="minfumble">{{localize "DS4.RollDialogFumbleLabel"}}</label>
     <input id="minfumble" data-type="Number" type="number" name="minfumble" value="{{minCritFailure}}" />
     <label for="visibility">{{localize "DS4.RollDialogVisibilityLabel"}}</label>
     <select id="visibility" data-type="String">
-        {{#each rollModes as |rollMode|}}
-            <option value="{{rollMode}}">{{lookup ../config.chatVisibilities rollMode}}</option>
+        {{#select rollMode}}
+        {{#each config.i18n.chatVisibilities as |rollModeValue rollModeKey|}}
+        <option value="{{rollModeKey}}">{{rollModeValue}}</option>
         {{/each}}
+        {{/select}}
     </select>
-</form>
+</form>
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index f988dd5b..de75b335 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,8 +1,12 @@
 {
     "compilerOptions": {
-        "target": "ES2017",
-        "lib": ["DOM", "ES6", "ES2017"],
-        "types": ["foundry-pc-types"],
-        "esModuleInterop": true
-    }
+        "target": "ES2020",
+        "lib": ["DOM", "ES2020"],
+        "types": ["foundry-vtt-types"],
+        "esModuleInterop": true,
+        "moduleResolution": "node",
+        "forceConsistentCasingInFileNames": true,
+        "strict": true
+    },
+    "include": ["src"]
 }