diff --git a/THIRD_PARTY.txt b/THIRD_PARTY.txt
index f33a660c..ddfc98f8 100644
--- a/THIRD_PARTY.txt
+++ b/THIRD_PARTY.txt
@@ -1635,6 +1635,16 @@ https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.1.1/css/vex-theme-top.min.css
https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.1.1/css/vex-theme-wireframe.min.css
https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.1.1/js/vex.combined.min.js
https://cdnjs.cloudflare.com/ajax/libs/vex-js/3.1.1/js/vex.min.js
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-bottom-right-corner.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-default.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-flat-attack.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-os.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-plain.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-top.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/css/vex-theme-wireframe.min.css
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/js/vex.combined.min.js
+https://cdnjs.cloudflare.com/ajax/libs/vex-js/4.1.0/js/vex.min.js
https://cdnjs.cloudflare.com/ajax/libs/video.js/5.20.5/video-js.min.css
https://cdnjs.cloudflare.com/ajax/libs/video.js/5.20.5/video.min.js
https://cdnjs.cloudflare.com/ajax/libs/video.js/6.13.0/video-js.min.css
diff --git a/modules/internal/targets.js b/modules/internal/targets.js
index 25c89130..c1efeb26 100644
--- a/modules/internal/targets.js
+++ b/modules/internal/targets.js
@@ -636,6 +636,8 @@ targets.setLastVersion = function (type, version) {
return '17.4.0';
} else if (type.startsWith('/vex-js/3.')) {
return '3.1.1';
+ } else if (type.startsWith('/vex-js/4.')) {
+ return '4.1.0';
} else if (type.startsWith('/videojs-seek-buttons/1.')) {
return '1.6.0';
} else if (type.startsWith('/videojs-seek-buttons/2.')) {
diff --git a/resources/vex-js/4.1.0/vex-theme-bottom-right-corner.min.css b/resources/vex-js/4.1.0/vex-theme-bottom-right-corner.min.css
new file mode 100644
index 00000000..bb610936
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-bottom-right-corner.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-slideup{0%{-webkit-transform:translateY(0);transform:translateY(0);opacity:0}1%{-webkit-transform:translateY(800px);transform:translateY(800px);opacity:0}2%{-webkit-transform:translateY(800px);transform:translateY(800px);opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes vex-slideup{0%{-webkit-transform:translateY(0);transform:translateY(0);opacity:0}1%{-webkit-transform:translateY(800px);transform:translateY(800px);opacity:0}2%{-webkit-transform:translateY(800px);transform:translateY(800px);opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes vex-slidedown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{-webkit-transform:translateY(800px);transform:translateY(800px)}}@keyframes vex-slidedown{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{-webkit-transform:translateY(800px);transform:translateY(800px)}}@-webkit-keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}@keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}.vex.vex-theme-bottom-right-corner{top:auto;bottom:0;right:0;overflow:visible}.vex.vex-theme-bottom-right-corner .vex-overlay{display:none}.vex.vex-theme-bottom-right-corner.vex-closing .vex-content{-webkit-animation:vex-slidedown .5s forwards;animation:vex-slidedown .5s forwards}.vex.vex-theme-bottom-right-corner .vex-content{-webkit-animation:vex-slideup .5s;animation:vex-slideup .5s}.vex.vex-theme-bottom-right-corner .vex-content{border-radius:5px 0 0 0;font-family:"Helvetica Neue",sans-serif;background:#f0f0f0;color:#444;padding:1em;max-width:100%;width:450px;font-size:1.1em;line-height:1.5em;position:fixed;bottom:0;right:0;left:auto}.vex.vex-theme-bottom-right-corner .vex-content h1,.vex.vex-theme-bottom-right-corner .vex-content h2,.vex.vex-theme-bottom-right-corner .vex-content h3,.vex.vex-theme-bottom-right-corner .vex-content h4,.vex.vex-theme-bottom-right-corner .vex-content h5,.vex.vex-theme-bottom-right-corner .vex-content h6,.vex.vex-theme-bottom-right-corner .vex-content li,.vex.vex-theme-bottom-right-corner .vex-content p,.vex.vex-theme-bottom-right-corner .vex-content ul{color:inherit}.vex.vex-theme-bottom-right-corner .vex-close{border-radius:5px;position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-bottom-right-corner .vex-close:before{border-radius:3px;position:absolute;content:"\00D7";font-size:26px;font-weight:400;line-height:31px;height:30px;width:30px;text-align:center;top:3px;right:3px;color:#bbb;background:0 0}.vex.vex-theme-bottom-right-corner .vex-close:active:before,.vex.vex-theme-bottom-right-corner .vex-close:hover:before{color:#777;background:#e0e0e0}.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input{margin-bottom:1em}.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input select,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea{border-radius:3px;background:#fff;width:100%;padding:.25em .67em;border:0;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em}.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #8dbdf1;outline:0}.vex.vex-theme-bottom-right-corner .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-bottom-right-corner .vex-dialog-button{border-radius:3px;border:0;float:right;margin:0 0 0 .5em;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em}.vex.vex-theme-bottom-right-corner .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-bottom-right-corner .vex-dialog-button:focus{-webkit-animation:vex-pulse 1.1s infinite;animation:vex-pulse 1.1s infinite;outline:0}@media (max-width:568px){.vex.vex-theme-bottom-right-corner .vex-dialog-button:focus{-webkit-animation:none;animation:none}}.vex.vex-theme-bottom-right-corner .vex-dialog-button.vex-dialog-button-primary{background:#3288e6;color:#fff}.vex.vex-theme-bottom-right-corner .vex-dialog-button.vex-dialog-button-secondary{background:#e0e0e0;color:#777}.vex-loading-spinner.vex-theme-bottom-right-corner{box-shadow:0 0 0 .5em #f0f0f0,0 0 1px .5em rgba(0,0,0,.3);border-radius:100%;background:#f0f0f0;border:.2em solid transparent;border-top-color:#bbb;top:-1.1em;bottom:auto}body.vex-open{overflow:initial}
+/*# sourceMappingURL=vex-theme-bottom-right-corner.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex-theme-default.min.css b/resources/vex-js/4.1.0/vex-theme-default.min.css
new file mode 100644
index 00000000..105fb6ee
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-default.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes vex-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes vex-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes vex-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}@-webkit-keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}@keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}.vex.vex-theme-default{padding-top:160px;padding-bottom:160px}.vex.vex-theme-default.vex-closing .vex-content{-webkit-animation:vex-flyout .5s forwards;animation:vex-flyout .5s forwards}.vex.vex-theme-default .vex-content{-webkit-animation:vex-flyin .5s;animation:vex-flyin .5s}.vex.vex-theme-default .vex-content{border-radius:5px;font-family:"Helvetica Neue",sans-serif;background:#f0f0f0;color:#444;padding:1em;position:relative;margin:0 auto;max-width:100%;width:450px;font-size:1.1em;line-height:1.5em}.vex.vex-theme-default .vex-content h1,.vex.vex-theme-default .vex-content h2,.vex.vex-theme-default .vex-content h3,.vex.vex-theme-default .vex-content h4,.vex.vex-theme-default .vex-content h5,.vex.vex-theme-default .vex-content h6,.vex.vex-theme-default .vex-content li,.vex.vex-theme-default .vex-content p,.vex.vex-theme-default .vex-content ul{color:inherit}.vex.vex-theme-default .vex-close{border-radius:5px;position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-default .vex-close:before{border-radius:3px;position:absolute;content:"\00D7";font-size:26px;font-weight:400;line-height:31px;height:30px;width:30px;text-align:center;top:3px;right:3px;color:#bbb;background:0 0}.vex.vex-theme-default .vex-close:active:before,.vex.vex-theme-default .vex-close:hover:before{color:#777;background:#e0e0e0}.vex.vex-theme-default .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-default .vex-dialog-form .vex-dialog-input{margin-bottom:1em}.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-default .vex-dialog-form .vex-dialog-input select,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea{border-radius:3px;background:#fff;width:100%;padding:.25em .67em;border:0;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em}.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #8dbdf1;outline:0}.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-default .vex-dialog-button{border-radius:3px;border:0;float:right;margin:0 0 0 .5em;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em}.vex.vex-theme-default .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-default .vex-dialog-button:focus{-webkit-animation:vex-pulse 1.1s infinite;animation:vex-pulse 1.1s infinite;outline:0}@media (max-width:568px){.vex.vex-theme-default .vex-dialog-button:focus{-webkit-animation:none;animation:none}}.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-primary{background:#3288e6;color:#fff}.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-secondary{background:#e0e0e0;color:#777}.vex-loading-spinner.vex-theme-default{box-shadow:0 0 0 .5em #f0f0f0,0 0 1px .5em rgba(0,0,0,.3);border-radius:100%;background:#f0f0f0;border:.2em solid transparent;border-top-color:#bbb;top:-1.1em;bottom:auto}
+/*# sourceMappingURL=vex-theme-default.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex-theme-flat-attack.min.css b/resources/vex-js/4.1.0/vex-theme-flat-attack.min.css
new file mode 100644
index 00000000..ffb44060
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-flat-attack.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-flipin-horizontal{0%{opacity:0;-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}100%{opacity:1;-webkit-transform:rotateY(0);transform:rotateY(0)}}@keyframes vex-flipin-horizontal{0%{opacity:0;-webkit-transform:rotateY(-90deg);transform:rotateY(-90deg)}100%{opacity:1;-webkit-transform:rotateY(0);transform:rotateY(0)}}@-webkit-keyframes vex-flipout-horizontal{0%{opacity:1;-webkit-transform:rotateY(0);transform:rotateY(0)}100%{opacity:0;-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}}@keyframes vex-flipout-horizontal{0%{opacity:1;-webkit-transform:rotateY(0);transform:rotateY(0)}100%{opacity:0;-webkit-transform:rotateY(90deg);transform:rotateY(90deg)}}.vex.vex-theme-flat-attack{-webkit-perspective:1300px;perspective:1300px;-webkit-perspective-origin:50% 150px;perspective-origin:50% 150px;padding-top:100px;padding-bottom:100px;font-size:1.5em}.vex.vex-theme-flat-attack.vex-closing .vex-content{-webkit-animation:vex-flipout-horizontal .5s forwards;animation:vex-flipout-horizontal .5s forwards}.vex.vex-theme-flat-attack .vex-content{-webkit-transform-style:preserve-3d;transform-style:preserve-3d;-webkit-animation:vex-flipin-horizontal .5s;animation:vex-flipin-horizontal .5s}.vex.vex-theme-flat-attack .vex-content{font-family:"Helvetica Neue",sans-serif;font-weight:200;background:#fff;color:#444;padding:2em 2em 3em 2em;line-height:1.5em;position:relative;margin:0 auto;max-width:100%;width:600px}.vex.vex-theme-flat-attack .vex-content h1,.vex.vex-theme-flat-attack .vex-content h2,.vex.vex-theme-flat-attack .vex-content h3,.vex.vex-theme-flat-attack .vex-content h4,.vex.vex-theme-flat-attack .vex-content h5,.vex.vex-theme-flat-attack .vex-content h6,.vex.vex-theme-flat-attack .vex-content li,.vex.vex-theme-flat-attack .vex-content p,.vex.vex-theme-flat-attack .vex-content ul{color:inherit}.vex.vex-theme-flat-attack .vex-close{position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-flat-attack .vex-close:before{font-family:"Helvetica Neue",sans-serif;font-weight:100;line-height:1px;padding-top:.5em;display:block;font-size:2em;text-indent:1px;overflow:hidden;height:1.25em;width:1.25em;text-align:center;top:0;right:0;color:#fff;background:#666}.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input{margin-bottom:.5em}.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input textarea{border-radius:3px;background:#f0f0f0;width:100%;padding:.25em .67em;border:0;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em}.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #666;outline:0}.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-buttons{padding-top:1em;margin-bottom:-3em;margin-left:-2em;margin-right:-2em}.vex.vex-theme-flat-attack .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-flat-attack .vex-dialog-button{border-radius:0;border:0;margin:0;float:right;padding:.5em 1em;font-size:1.13em;text-transform:uppercase;font-weight:200;letter-spacing:.1em;line-height:1em;font-family:inherit}.vex.vex-theme-flat-attack .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-flat-attack .vex-dialog-button:focus{outline:0}.vex.vex-theme-flat-attack .vex-dialog-button.vex-dialog-button-primary{background:#666;color:#fff}.vex.vex-theme-flat-attack .vex-dialog-button.vex-dialog-button-primary:focus{box-shadow:inset 0 3px rgba(0,0,0,.2)}.vex.vex-theme-flat-attack .vex-dialog-button.vex-dialog-button-secondary{background:#fff;color:#ccc}.vex.vex-theme-flat-attack .vex-dialog-button.vex-dialog-button-secondary:focus{box-shadow:inset 0 3px #aaa;background:#eee;color:#777}.vex.vex-theme-flat-attack .vex-dialog-button.vex-dialog-button-secondary:active,.vex.vex-theme-flat-attack .vex-dialog-button.vex-dialog-button-secondary:hover{color:#777}.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-close:before{background:#ff7ea7}.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #ff7ea7}.vex.vex-theme-flat-attack.vex-theme-flat-attack-pink .vex-dialog-form .vex-dialog-buttons .vex-dialog-button.vex-dialog-button-primary{background:#ff7ea7}.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-close:before{background:#ce4a55}.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #ce4a55}.vex.vex-theme-flat-attack.vex-theme-flat-attack-red .vex-dialog-form .vex-dialog-buttons .vex-dialog-button.vex-dialog-button-primary{background:#ce4a55}.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-close:before{background:#34b989}.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #34b989}.vex.vex-theme-flat-attack.vex-theme-flat-attack-green .vex-dialog-form .vex-dialog-buttons .vex-dialog-button.vex-dialog-button-primary{background:#34b989}.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-close:before{background:#477fa5}.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #477fa5}.vex.vex-theme-flat-attack.vex-theme-flat-attack-blue .vex-dialog-form .vex-dialog-buttons .vex-dialog-button.vex-dialog-button-primary{background:#477fa5}.vex-loading-spinner.vex-theme-flat-attack{height:4em;width:4em}
+/*# sourceMappingURL=vex-theme-flat-attack.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex-theme-os.min.css b/resources/vex-js/4.1.0/vex-theme-os.min.css
new file mode 100644
index 00000000..34abf6cc
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-os.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes vex-flyin{0%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes vex-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}@keyframes vex-flyout{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-40px);transform:translateY(-40px)}}@-webkit-keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}@keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}.vex.vex-theme-os{padding-top:160px;padding-bottom:160px}.vex.vex-theme-os.vex-closing .vex-content{-webkit-animation:vex-flyout .5s forwards;animation:vex-flyout .5s forwards}.vex.vex-theme-os .vex-content{-webkit-animation:vex-flyin .5s;animation:vex-flyin .5s}.vex.vex-theme-os .vex-content{border-radius:5px;box-shadow:inset 0 1px #a6a6a6,0 0 0 1px rgba(0,0,0,.08);font-family:"Helvetica Neue",sans-serif;border-top:20px solid #bbb;background:#f0f0f0;color:#444;padding:1em;position:relative;margin:0 auto;max-width:100%;width:450px;font-size:1.1em;line-height:1.5em}.vex.vex-theme-os .vex-content h1,.vex.vex-theme-os .vex-content h2,.vex.vex-theme-os .vex-content h3,.vex.vex-theme-os .vex-content h4,.vex.vex-theme-os .vex-content h5,.vex.vex-theme-os .vex-content h6,.vex.vex-theme-os .vex-content li,.vex.vex-theme-os .vex-content p,.vex.vex-theme-os .vex-content ul{color:inherit}.vex.vex-theme-os .vex-close{border-radius:0 5px 0 0;position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-os .vex-close:before{border-radius:3px;position:absolute;content:"\00D7";font-size:26px;font-weight:400;line-height:31px;height:30px;width:30px;text-align:center;top:3px;right:3px;color:#bbb;background:0 0}.vex.vex-theme-os .vex-close:active:before,.vex.vex-theme-os .vex-close:hover:before{color:#777;background:#e0e0e0}.vex.vex-theme-os .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-os .vex-dialog-form .vex-dialog-input{margin-bottom:1em}.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-os .vex-dialog-form .vex-dialog-input select,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input textarea{border-radius:3px;background:#fff;width:100%;padding:.25em .67em;border:0;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em}.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-os .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 1px #3288e6;outline:0}.vex.vex-theme-os .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-os .vex-dialog-button{border-radius:3px;border:0;float:right;margin:0 0 0 .5em;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em}.vex.vex-theme-os .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-os .vex-dialog-button:focus{-webkit-animation:vex-pulse 1.1s infinite;animation:vex-pulse 1.1s infinite;outline:0}@media (max-width:568px){.vex.vex-theme-os .vex-dialog-button:focus{-webkit-animation:none;animation:none}}.vex.vex-theme-os .vex-dialog-button.vex-dialog-button-primary{background:#3288e6;color:#fff}.vex.vex-theme-os .vex-dialog-button.vex-dialog-button-secondary{background:#e0e0e0;color:#777}.vex-loading-spinner.vex-theme-os{box-shadow:0 0 0 1px rgba(0,0,0,.2),0 0 .5em rgba(0,0,0,.2);border-radius:100%;background:rgba(255,255,255,.2);width:0;height:0;border:1.2em solid #bbb;border-top-color:#f0f0f0;border-bottom-color:#f0f0f0}
+/*# sourceMappingURL=vex-theme-os.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex-theme-plain.min.css b/resources/vex-js/4.1.0/vex-theme-plain.min.css
new file mode 100644
index 00000000..ec445cb1
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-plain.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}@keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}.vex.vex-theme-plain{padding-top:160px;padding-bottom:160px}.vex.vex-theme-plain .vex-content{font-family:"Helvetica Neue",sans-serif;background:#fff;color:#444;padding:1em;position:relative;margin:0 auto;max-width:100%;width:450px;font-size:1.1em;line-height:1.5em}.vex.vex-theme-plain .vex-content h1,.vex.vex-theme-plain .vex-content h2,.vex.vex-theme-plain .vex-content h3,.vex.vex-theme-plain .vex-content h4,.vex.vex-theme-plain .vex-content h5,.vex.vex-theme-plain .vex-content h6,.vex.vex-theme-plain .vex-content li,.vex.vex-theme-plain .vex-content p,.vex.vex-theme-plain .vex-content ul{color:inherit}.vex.vex-theme-plain .vex-close{position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-plain .vex-close:before{position:absolute;content:"\00D7";font-size:26px;font-weight:400;line-height:31px;height:30px;width:30px;text-align:center;top:3px;right:3px;color:#bbb;background:0 0}.vex.vex-theme-plain .vex-close:active:before,.vex.vex-theme-plain .vex-close:hover:before{color:#777;background:#e0e0e0}.vex.vex-theme-plain .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input{margin-bottom:1em}.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input select,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input textarea{background:#f0f0f0;width:100%;padding:.25em .67em;border:0;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em}.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-plain .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px rgba(0,0,0,.2);outline:0}.vex.vex-theme-plain .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-plain .vex-dialog-button{border-radius:0;border:0;float:right;margin:0 0 0 .5em;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em}.vex.vex-theme-plain .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-plain .vex-dialog-button:focus{-webkit-animation:vex-pulse 1.1s infinite;animation:vex-pulse 1.1s infinite;outline:0}@media (max-width:568px){.vex.vex-theme-plain .vex-dialog-button:focus{-webkit-animation:none;animation:none}}.vex.vex-theme-plain .vex-dialog-button.vex-dialog-button-primary{background:#3288e6;color:#fff}.vex.vex-theme-plain .vex-dialog-button.vex-dialog-button-secondary{background:#e0e0e0;color:#777}.vex-loading-spinner.vex-theme-plain{height:2.5em;width:2.5em}
+/*# sourceMappingURL=vex-theme-plain.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex-theme-top.min.css b/resources/vex-js/4.1.0/vex-theme-top.min.css
new file mode 100644
index 00000000..1e54bb96
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-top.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-dropin{0%{-webkit-transform:translateY(0);transform:translateY(0);opacity:0}1%{-webkit-transform:translateY(-800px);transform:translateY(-800px);opacity:0}2%{-webkit-transform:translateY(-800px);transform:translateY(-800px);opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes vex-dropin{0%{-webkit-transform:translateY(0);transform:translateY(0);opacity:0}1%{-webkit-transform:translateY(-800px);transform:translateY(-800px);opacity:0}2%{-webkit-transform:translateY(-800px);transform:translateY(-800px);opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@-webkit-keyframes vex-dropout{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{-webkit-transform:translateY(-800px);transform:translateY(-800px)}}@keyframes vex-dropout{0%{-webkit-transform:translateY(0);transform:translateY(0)}100%{-webkit-transform:translateY(-800px);transform:translateY(-800px)}}@-webkit-keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}@keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}.vex.vex-theme-top.vex-closing .vex-content{-webkit-animation:vex-dropout .5s forwards;animation:vex-dropout .5s forwards}.vex.vex-theme-top .vex-content{-webkit-animation:vex-dropin .5s;animation:vex-dropin .5s}.vex.vex-theme-top .vex-content{border-radius:0 0 5px 5px;font-family:"Helvetica Neue",sans-serif;background:#f0f0f0;color:#444;padding:1em;position:relative;margin:0 auto;max-width:100%;width:450px;font-size:1.1em;line-height:1.5em}.vex.vex-theme-top .vex-content h1,.vex.vex-theme-top .vex-content h2,.vex.vex-theme-top .vex-content h3,.vex.vex-theme-top .vex-content h4,.vex.vex-theme-top .vex-content h5,.vex.vex-theme-top .vex-content h6,.vex.vex-theme-top .vex-content li,.vex.vex-theme-top .vex-content p,.vex.vex-theme-top .vex-content ul{color:inherit}.vex.vex-theme-top .vex-close{border-radius:5px;position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-top .vex-close:before{border-radius:3px;position:absolute;content:"\00D7";font-size:26px;font-weight:400;line-height:31px;height:30px;width:30px;text-align:center;top:3px;right:3px;color:#bbb;background:0 0}.vex.vex-theme-top .vex-close:active:before,.vex.vex-theme-top .vex-close:hover:before{color:#777;background:#e0e0e0}.vex.vex-theme-top .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-top .vex-dialog-form .vex-dialog-input{margin-bottom:1em}.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-top .vex-dialog-form .vex-dialog-input select,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input textarea{border-radius:3px;background:#fff;width:100%;padding:.25em .67em;border:0;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em}.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-top .vex-dialog-form .vex-dialog-input textarea:focus{box-shadow:inset 0 0 0 2px #8dbdf1;outline:0}.vex.vex-theme-top .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-top .vex-dialog-button{border-radius:3px;border:0;float:right;margin:0 0 0 .5em;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em}.vex.vex-theme-top .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-top .vex-dialog-button:focus{-webkit-animation:vex-pulse 1.1s infinite;animation:vex-pulse 1.1s infinite;outline:0}@media (max-width:568px){.vex.vex-theme-top .vex-dialog-button:focus{-webkit-animation:none;animation:none}}.vex.vex-theme-top .vex-dialog-button.vex-dialog-button-primary{background:#3288e6;color:#fff}.vex.vex-theme-top .vex-dialog-button.vex-dialog-button-secondary{background:#e0e0e0;color:#777}.vex-loading-spinner.vex-theme-top{box-shadow:0 0 0 .5em #f0f0f0,0 0 1px .5em rgba(0,0,0,.3);border-radius:100%;background:#f0f0f0;border:.2em solid transparent;border-top-color:#bbb;top:-1.1em;bottom:auto}
+/*# sourceMappingURL=vex-theme-top.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex-theme-wireframe.min.css b/resources/vex-js/4.1.0/vex-theme-wireframe.min.css
new file mode 100644
index 00000000..d8608216
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex-theme-wireframe.min.css
@@ -0,0 +1,2 @@
+@-webkit-keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}@keyframes vex-pulse{0%{box-shadow:inset 0 0 0 300px transparent}70%{box-shadow:inset 0 0 0 300px rgba(255,255,255,.25)}100%{box-shadow:inset 0 0 0 300px transparent}}.vex.vex-theme-wireframe{padding-top:160px;padding-bottom:160px}.vex.vex-theme-wireframe .vex-overlay{background:rgba(255,255,255,.4)}.vex.vex-theme-wireframe .vex-content{font-family:"Helvetica Neue",sans-serif;background:#fff;color:#000;border:2px solid #000;padding:2em;position:relative;margin:0 auto;max-width:100%;width:400px;font-size:1.1em;line-height:1.5em}.vex.vex-theme-wireframe .vex-content h1,.vex.vex-theme-wireframe .vex-content h2,.vex.vex-theme-wireframe .vex-content h3,.vex.vex-theme-wireframe .vex-content h4,.vex.vex-theme-wireframe .vex-content h5,.vex.vex-theme-wireframe .vex-content h6,.vex.vex-theme-wireframe .vex-content li,.vex.vex-theme-wireframe .vex-content p,.vex.vex-theme-wireframe .vex-content ul{color:inherit}.vex.vex-theme-wireframe .vex-close{position:absolute;top:0;right:0;cursor:pointer}.vex.vex-theme-wireframe .vex-close:before{position:absolute;content:"\00D7";font-size:40px;font-weight:400;line-height:80px;height:80px;width:80px;text-align:center;top:3px;right:3px;color:#000}.vex.vex-theme-wireframe .vex-close:active:before,.vex.vex-theme-wireframe .vex-close:hover:before{color:#000}.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-message{margin-bottom:.5em}.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input{margin-bottom:1em}.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=date],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=datetime-local],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=datetime],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=email],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=month],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=number],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=password],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=search],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=tel],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=text],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=time],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=url],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=week],.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input select,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input textarea{background:#fff;width:100%;padding:.25em .67em;font-family:inherit;font-weight:inherit;font-size:inherit;min-height:2.5em;margin:0 0 .25em;border:2px solid #000}.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=date]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=datetime-local]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=datetime]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=email]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=month]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=number]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=password]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=search]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=tel]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=text]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=time]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=url]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input input[type=week]:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input select:focus,.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-input textarea:focus{border-style:dashed;outline:0}.vex.vex-theme-wireframe .vex-dialog-form .vex-dialog-buttons:after{content:"";display:table;clear:both}.vex.vex-theme-wireframe .vex-dialog-button{border-radius:0;border:0;float:right;margin:0 0 0 .5em;font-family:inherit;text-transform:uppercase;letter-spacing:.1em;font-size:.8em;line-height:1em;padding:.75em 2em}.vex.vex-theme-wireframe .vex-dialog-button.vex-last{margin-left:0}.vex.vex-theme-wireframe .vex-dialog-button:focus{-webkit-animation:vex-pulse 1.1s infinite;animation:vex-pulse 1.1s infinite;outline:0}@media (max-width:568px){.vex.vex-theme-wireframe .vex-dialog-button:focus{-webkit-animation:none;animation:none}}.vex.vex-theme-wireframe .vex-dialog-button.vex-dialog-button-primary{background:#000;color:#fff;border:2px solid transparent}.vex.vex-theme-wireframe .vex-dialog-button.vex-dialog-button-secondary{background:#fff;color:#000;border:2px solid #000}.vex-loading-spinner.vex-theme-wireframe{height:2.5em;width:2.5em}
+/*# sourceMappingURL=vex-theme-wireframe.min.css.map */
\ No newline at end of file
diff --git a/resources/vex-js/4.1.0/vex.combined.min.jsm b/resources/vex-js/4.1.0/vex.combined.min.jsm
new file mode 100644
index 00000000..f313ede4
--- /dev/null
+++ b/resources/vex-js/4.1.0/vex.combined.min.jsm
@@ -0,0 +1,3 @@
+/*! vex.combined.js: vex 4.1.0, vex-dialog 1.0.7 */
+
+!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).vex=e()}}(function(){return function e(t,n,o){function i(a,s){if(!n[a]){if(!t[a]){var l="function"==typeof require&&require;if(!s&&l)return l(a,!0);if(r)return r(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var u=n[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return i(n||e)},u,u.exports,e,t,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;a