diff --git a/app/assets/javascripts/admin/vue/blobUploader.js b/app/assets/javascripts/admin/vue/blobUploader.js
deleted file mode 100644
index 97796189a78cffbda3a95d74625eef192c273017..0000000000000000000000000000000000000000
--- a/app/assets/javascripts/admin/vue/blobUploader.js
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-Vue.component('button-counter', {
-    data: function () {
-      return {
-        count: 0
-      }
-    },
-    template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
-});
\ No newline at end of file
diff --git a/app/views/admin/communication/website/blocks/edit.html.erb b/app/views/admin/communication/website/blocks/edit.html.erb
index 1b9e549043a13b7d0c9201f775426019a87145d7..73e849a0026f5ad785f722e57b9c947fab0aa15a 100644
--- a/app/views/admin/communication/website/blocks/edit.html.erb
+++ b/app/views/admin/communication/website/blocks/edit.html.erb
@@ -43,7 +43,7 @@
       uploadFile(file, object, key) {
         var url = this.directUpload.url;
         var upload = new ActiveStorage.DirectUpload(file, url);
-        upload.create((error, blob) => {
+        upload.create(function (error, blob) {
           if (error) {
             console.log(error);
           } else {
@@ -53,10 +53,12 @@
               filename: blob.filename
             };
           }
-        });
+        }.bind(this));
       },
       getFileUrl(signed_id, filename) {
-        return this.directUpload.blobUrlTemplate.replace(':signed_id', signed_id).replace(':filename', filename);
+        return this.directUpload.blobUrlTemplate
+          .replace(':signed_id', signed_id)
+          .replace(':filename', filename);
       },
       getImageUrl(data) {
         return this.getFileUrl(data.signed_id, data.filename);
diff --git a/app/views/admin/communication/website/blocks/templates/partners/_edit.html.erb b/app/views/admin/communication/website/blocks/templates/partners/_edit.html.erb
index 4684bf18f4a749c3e8b06e04b689f18f0ed4c944..56cad7303e0984e96e81de9841141bdf65bee2b8 100644
--- a/app/views/admin/communication/website/blocks/templates/partners/_edit.html.erb
+++ b/app/views/admin/communication/website/blocks/templates/partners/_edit.html.erb
@@ -31,7 +31,7 @@
             </div>
             <div class="col-md-4 text-end">
               <a  class="<%= button_classes('mt-n1') %>"
-                  v-on:click="category.partners.push({name: '', url: '', logo: ''})">
+                  v-on:click="category.partners.push({name: '', url: '', logo: {}})">
                   Add partner
               </a>
             </div>
@@ -78,10 +78,10 @@
                               @change="onFileImageChange( $event, partner, 'logo' )"
                               :id="'category-' + categoryIndex + '-partner-url-' + partnerIndex">
 
-                      <div v-if="partner.logo">
+                      <div v-if="partner.logo.id">
                         <img :src="getImageUrl(partner.logo)" class="img-fluid d-block" />
                         <a  class="btn btn-sm btn-danger mt-1"
-                            v-on:click="partner.logo=''">
+                            v-on:click="partner.logo={}">
                             Remove
                             <i class="fas fa-times"></i>
                         </a>
diff --git a/app/views/admin/communication/website/blocks/templates/partners/_static.html.erb b/app/views/admin/communication/website/blocks/templates/partners/_static.html.erb
index 593e0f53624b25bba1214c81509c2004ef867252..34559a6b29d82832dd95874dec7272a3d39bbe79 100644
--- a/app/views/admin/communication/website/blocks/templates/partners/_static.html.erb
+++ b/app/views/admin/communication/website/blocks/templates/partners/_static.html.erb
@@ -8,12 +8,9 @@ element['partners'].each do |partner|
 %>
           - name: "<%= partner['name'] %>"
             url: "<%= partner['url'] %>"
-            <% if partner.has_key?('logo') %>
-            <% if partner['logo'].has_key?('id') %>
+            <% unless partner.dig('logo', 'id').blank? %>
             logo: "<%= partner['logo']['id'] %>"
             <% end %>
-            <% end %>
 <% end %>
-        
 <% end %>
 <% end %>
diff --git a/vendor/assets/javascripts/actiontext.js b/vendor/assets/javascripts/actiontext.js
deleted file mode 100644
index 792a2c1fc310fd79f41117dcd4d3c5b888837776..0000000000000000000000000000000000000000
--- a/vendor/assets/javascripts/actiontext.js
+++ /dev/null
@@ -1,880 +0,0 @@
-var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
-
-var activestorage = {exports: {}};
-
-(function (module, exports) {
-(function(global, factory) {
-  factory(exports) ;
-})(commonjsGlobal, (function(exports) {
-  var sparkMd5 = {
-    exports: {}
-  };
-  (function(module, exports) {
-    (function(factory) {
-      {
-        module.exports = factory();
-      }
-    })((function(undefined$1) {
-      var hex_chr = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ];
-      function md5cycle(x, k) {
-        var a = x[0], b = x[1], c = x[2], d = x[3];
-        a += (b & c | ~b & d) + k[0] - 680876936 | 0;
-        a = (a << 7 | a >>> 25) + b | 0;
-        d += (a & b | ~a & c) + k[1] - 389564586 | 0;
-        d = (d << 12 | d >>> 20) + a | 0;
-        c += (d & a | ~d & b) + k[2] + 606105819 | 0;
-        c = (c << 17 | c >>> 15) + d | 0;
-        b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
-        b = (b << 22 | b >>> 10) + c | 0;
-        a += (b & c | ~b & d) + k[4] - 176418897 | 0;
-        a = (a << 7 | a >>> 25) + b | 0;
-        d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
-        d = (d << 12 | d >>> 20) + a | 0;
-        c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
-        c = (c << 17 | c >>> 15) + d | 0;
-        b += (c & d | ~c & a) + k[7] - 45705983 | 0;
-        b = (b << 22 | b >>> 10) + c | 0;
-        a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
-        a = (a << 7 | a >>> 25) + b | 0;
-        d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
-        d = (d << 12 | d >>> 20) + a | 0;
-        c += (d & a | ~d & b) + k[10] - 42063 | 0;
-        c = (c << 17 | c >>> 15) + d | 0;
-        b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
-        b = (b << 22 | b >>> 10) + c | 0;
-        a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
-        a = (a << 7 | a >>> 25) + b | 0;
-        d += (a & b | ~a & c) + k[13] - 40341101 | 0;
-        d = (d << 12 | d >>> 20) + a | 0;
-        c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
-        c = (c << 17 | c >>> 15) + d | 0;
-        b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
-        b = (b << 22 | b >>> 10) + c | 0;
-        a += (b & d | c & ~d) + k[1] - 165796510 | 0;
-        a = (a << 5 | a >>> 27) + b | 0;
-        d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
-        d = (d << 9 | d >>> 23) + a | 0;
-        c += (d & b | a & ~b) + k[11] + 643717713 | 0;
-        c = (c << 14 | c >>> 18) + d | 0;
-        b += (c & a | d & ~a) + k[0] - 373897302 | 0;
-        b = (b << 20 | b >>> 12) + c | 0;
-        a += (b & d | c & ~d) + k[5] - 701558691 | 0;
-        a = (a << 5 | a >>> 27) + b | 0;
-        d += (a & c | b & ~c) + k[10] + 38016083 | 0;
-        d = (d << 9 | d >>> 23) + a | 0;
-        c += (d & b | a & ~b) + k[15] - 660478335 | 0;
-        c = (c << 14 | c >>> 18) + d | 0;
-        b += (c & a | d & ~a) + k[4] - 405537848 | 0;
-        b = (b << 20 | b >>> 12) + c | 0;
-        a += (b & d | c & ~d) + k[9] + 568446438 | 0;
-        a = (a << 5 | a >>> 27) + b | 0;
-        d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
-        d = (d << 9 | d >>> 23) + a | 0;
-        c += (d & b | a & ~b) + k[3] - 187363961 | 0;
-        c = (c << 14 | c >>> 18) + d | 0;
-        b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
-        b = (b << 20 | b >>> 12) + c | 0;
-        a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
-        a = (a << 5 | a >>> 27) + b | 0;
-        d += (a & c | b & ~c) + k[2] - 51403784 | 0;
-        d = (d << 9 | d >>> 23) + a | 0;
-        c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
-        c = (c << 14 | c >>> 18) + d | 0;
-        b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
-        b = (b << 20 | b >>> 12) + c | 0;
-        a += (b ^ c ^ d) + k[5] - 378558 | 0;
-        a = (a << 4 | a >>> 28) + b | 0;
-        d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
-        d = (d << 11 | d >>> 21) + a | 0;
-        c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
-        c = (c << 16 | c >>> 16) + d | 0;
-        b += (c ^ d ^ a) + k[14] - 35309556 | 0;
-        b = (b << 23 | b >>> 9) + c | 0;
-        a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
-        a = (a << 4 | a >>> 28) + b | 0;
-        d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
-        d = (d << 11 | d >>> 21) + a | 0;
-        c += (d ^ a ^ b) + k[7] - 155497632 | 0;
-        c = (c << 16 | c >>> 16) + d | 0;
-        b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
-        b = (b << 23 | b >>> 9) + c | 0;
-        a += (b ^ c ^ d) + k[13] + 681279174 | 0;
-        a = (a << 4 | a >>> 28) + b | 0;
-        d += (a ^ b ^ c) + k[0] - 358537222 | 0;
-        d = (d << 11 | d >>> 21) + a | 0;
-        c += (d ^ a ^ b) + k[3] - 722521979 | 0;
-        c = (c << 16 | c >>> 16) + d | 0;
-        b += (c ^ d ^ a) + k[6] + 76029189 | 0;
-        b = (b << 23 | b >>> 9) + c | 0;
-        a += (b ^ c ^ d) + k[9] - 640364487 | 0;
-        a = (a << 4 | a >>> 28) + b | 0;
-        d += (a ^ b ^ c) + k[12] - 421815835 | 0;
-        d = (d << 11 | d >>> 21) + a | 0;
-        c += (d ^ a ^ b) + k[15] + 530742520 | 0;
-        c = (c << 16 | c >>> 16) + d | 0;
-        b += (c ^ d ^ a) + k[2] - 995338651 | 0;
-        b = (b << 23 | b >>> 9) + c | 0;
-        a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
-        a = (a << 6 | a >>> 26) + b | 0;
-        d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
-        d = (d << 10 | d >>> 22) + a | 0;
-        c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
-        c = (c << 15 | c >>> 17) + d | 0;
-        b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
-        b = (b << 21 | b >>> 11) + c | 0;
-        a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
-        a = (a << 6 | a >>> 26) + b | 0;
-        d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
-        d = (d << 10 | d >>> 22) + a | 0;
-        c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
-        c = (c << 15 | c >>> 17) + d | 0;
-        b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
-        b = (b << 21 | b >>> 11) + c | 0;
-        a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
-        a = (a << 6 | a >>> 26) + b | 0;
-        d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
-        d = (d << 10 | d >>> 22) + a | 0;
-        c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
-        c = (c << 15 | c >>> 17) + d | 0;
-        b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
-        b = (b << 21 | b >>> 11) + c | 0;
-        a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
-        a = (a << 6 | a >>> 26) + b | 0;
-        d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
-        d = (d << 10 | d >>> 22) + a | 0;
-        c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
-        c = (c << 15 | c >>> 17) + d | 0;
-        b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
-        b = (b << 21 | b >>> 11) + c | 0;
-        x[0] = a + x[0] | 0;
-        x[1] = b + x[1] | 0;
-        x[2] = c + x[2] | 0;
-        x[3] = d + x[3] | 0;
-      }
-      function md5blk(s) {
-        var md5blks = [], i;
-        for (i = 0; i < 64; i += 4) {
-          md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
-        }
-        return md5blks;
-      }
-      function md5blk_array(a) {
-        var md5blks = [], i;
-        for (i = 0; i < 64; i += 4) {
-          md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
-        }
-        return md5blks;
-      }
-      function md51(s) {
-        var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;
-        for (i = 64; i <= n; i += 64) {
-          md5cycle(state, md5blk(s.substring(i - 64, i)));
-        }
-        s = s.substring(i - 64);
-        length = s.length;
-        tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
-        for (i = 0; i < length; i += 1) {
-          tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);
-        }
-        tail[i >> 2] |= 128 << (i % 4 << 3);
-        if (i > 55) {
-          md5cycle(state, tail);
-          for (i = 0; i < 16; i += 1) {
-            tail[i] = 0;
-          }
-        }
-        tmp = n * 8;
-        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
-        lo = parseInt(tmp[2], 16);
-        hi = parseInt(tmp[1], 16) || 0;
-        tail[14] = lo;
-        tail[15] = hi;
-        md5cycle(state, tail);
-        return state;
-      }
-      function md51_array(a) {
-        var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;
-        for (i = 64; i <= n; i += 64) {
-          md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
-        }
-        a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);
-        length = a.length;
-        tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
-        for (i = 0; i < length; i += 1) {
-          tail[i >> 2] |= a[i] << (i % 4 << 3);
-        }
-        tail[i >> 2] |= 128 << (i % 4 << 3);
-        if (i > 55) {
-          md5cycle(state, tail);
-          for (i = 0; i < 16; i += 1) {
-            tail[i] = 0;
-          }
-        }
-        tmp = n * 8;
-        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
-        lo = parseInt(tmp[2], 16);
-        hi = parseInt(tmp[1], 16) || 0;
-        tail[14] = lo;
-        tail[15] = hi;
-        md5cycle(state, tail);
-        return state;
-      }
-      function rhex(n) {
-        var s = "", j;
-        for (j = 0; j < 4; j += 1) {
-          s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];
-        }
-        return s;
-      }
-      function hex(x) {
-        var i;
-        for (i = 0; i < x.length; i += 1) {
-          x[i] = rhex(x[i]);
-        }
-        return x.join("");
-      }
-      if (hex(md51("hello")) !== "5d41402abc4b2a76b9719d911017c592") ;
-      if (typeof ArrayBuffer !== "undefined" && !ArrayBuffer.prototype.slice) {
-        (function() {
-          function clamp(val, length) {
-            val = val | 0 || 0;
-            if (val < 0) {
-              return Math.max(val + length, 0);
-            }
-            return Math.min(val, length);
-          }
-          ArrayBuffer.prototype.slice = function(from, to) {
-            var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;
-            if (to !== undefined$1) {
-              end = clamp(to, length);
-            }
-            if (begin > end) {
-              return new ArrayBuffer(0);
-            }
-            num = end - begin;
-            target = new ArrayBuffer(num);
-            targetArray = new Uint8Array(target);
-            sourceArray = new Uint8Array(this, begin, num);
-            targetArray.set(sourceArray);
-            return target;
-          };
-        })();
-      }
-      function toUtf8(str) {
-        if (/[\u0080-\uFFFF]/.test(str)) {
-          str = unescape(encodeURIComponent(str));
-        }
-        return str;
-      }
-      function utf8Str2ArrayBuffer(str, returnUInt8Array) {
-        var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;
-        for (i = 0; i < length; i += 1) {
-          arr[i] = str.charCodeAt(i);
-        }
-        return returnUInt8Array ? arr : buff;
-      }
-      function arrayBuffer2Utf8Str(buff) {
-        return String.fromCharCode.apply(null, new Uint8Array(buff));
-      }
-      function concatenateArrayBuffers(first, second, returnUInt8Array) {
-        var result = new Uint8Array(first.byteLength + second.byteLength);
-        result.set(new Uint8Array(first));
-        result.set(new Uint8Array(second), first.byteLength);
-        return returnUInt8Array ? result : result.buffer;
-      }
-      function hexToBinaryString(hex) {
-        var bytes = [], length = hex.length, x;
-        for (x = 0; x < length - 1; x += 2) {
-          bytes.push(parseInt(hex.substr(x, 2), 16));
-        }
-        return String.fromCharCode.apply(String, bytes);
-      }
-      function SparkMD5() {
-        this.reset();
-      }
-      SparkMD5.prototype.append = function(str) {
-        this.appendBinary(toUtf8(str));
-        return this;
-      };
-      SparkMD5.prototype.appendBinary = function(contents) {
-        this._buff += contents;
-        this._length += contents.length;
-        var length = this._buff.length, i;
-        for (i = 64; i <= length; i += 64) {
-          md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
-        }
-        this._buff = this._buff.substring(i - 64);
-        return this;
-      };
-      SparkMD5.prototype.end = function(raw) {
-        var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;
-        for (i = 0; i < length; i += 1) {
-          tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);
-        }
-        this._finish(tail, length);
-        ret = hex(this._hash);
-        if (raw) {
-          ret = hexToBinaryString(ret);
-        }
-        this.reset();
-        return ret;
-      };
-      SparkMD5.prototype.reset = function() {
-        this._buff = "";
-        this._length = 0;
-        this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];
-        return this;
-      };
-      SparkMD5.prototype.getState = function() {
-        return {
-          buff: this._buff,
-          length: this._length,
-          hash: this._hash.slice()
-        };
-      };
-      SparkMD5.prototype.setState = function(state) {
-        this._buff = state.buff;
-        this._length = state.length;
-        this._hash = state.hash;
-        return this;
-      };
-      SparkMD5.prototype.destroy = function() {
-        delete this._hash;
-        delete this._buff;
-        delete this._length;
-      };
-      SparkMD5.prototype._finish = function(tail, length) {
-        var i = length, tmp, lo, hi;
-        tail[i >> 2] |= 128 << (i % 4 << 3);
-        if (i > 55) {
-          md5cycle(this._hash, tail);
-          for (i = 0; i < 16; i += 1) {
-            tail[i] = 0;
-          }
-        }
-        tmp = this._length * 8;
-        tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
-        lo = parseInt(tmp[2], 16);
-        hi = parseInt(tmp[1], 16) || 0;
-        tail[14] = lo;
-        tail[15] = hi;
-        md5cycle(this._hash, tail);
-      };
-      SparkMD5.hash = function(str, raw) {
-        return SparkMD5.hashBinary(toUtf8(str), raw);
-      };
-      SparkMD5.hashBinary = function(content, raw) {
-        var hash = md51(content), ret = hex(hash);
-        return raw ? hexToBinaryString(ret) : ret;
-      };
-      SparkMD5.ArrayBuffer = function() {
-        this.reset();
-      };
-      SparkMD5.ArrayBuffer.prototype.append = function(arr) {
-        var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;
-        this._length += arr.byteLength;
-        for (i = 64; i <= length; i += 64) {
-          md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
-        }
-        this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
-        return this;
-      };
-      SparkMD5.ArrayBuffer.prototype.end = function(raw) {
-        var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;
-        for (i = 0; i < length; i += 1) {
-          tail[i >> 2] |= buff[i] << (i % 4 << 3);
-        }
-        this._finish(tail, length);
-        ret = hex(this._hash);
-        if (raw) {
-          ret = hexToBinaryString(ret);
-        }
-        this.reset();
-        return ret;
-      };
-      SparkMD5.ArrayBuffer.prototype.reset = function() {
-        this._buff = new Uint8Array(0);
-        this._length = 0;
-        this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];
-        return this;
-      };
-      SparkMD5.ArrayBuffer.prototype.getState = function() {
-        var state = SparkMD5.prototype.getState.call(this);
-        state.buff = arrayBuffer2Utf8Str(state.buff);
-        return state;
-      };
-      SparkMD5.ArrayBuffer.prototype.setState = function(state) {
-        state.buff = utf8Str2ArrayBuffer(state.buff, true);
-        return SparkMD5.prototype.setState.call(this, state);
-      };
-      SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
-      SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
-      SparkMD5.ArrayBuffer.hash = function(arr, raw) {
-        var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);
-        return raw ? hexToBinaryString(ret) : ret;
-      };
-      return SparkMD5;
-    }));
-  })(sparkMd5);
-  var SparkMD5 = sparkMd5.exports;
-  const fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
-  class FileChecksum {
-    static create(file, callback) {
-      const instance = new FileChecksum(file);
-      instance.create(callback);
-    }
-    constructor(file) {
-      this.file = file;
-      this.chunkSize = 2097152;
-      this.chunkCount = Math.ceil(this.file.size / this.chunkSize);
-      this.chunkIndex = 0;
-    }
-    create(callback) {
-      this.callback = callback;
-      this.md5Buffer = new SparkMD5.ArrayBuffer;
-      this.fileReader = new FileReader;
-      this.fileReader.addEventListener("load", (event => this.fileReaderDidLoad(event)));
-      this.fileReader.addEventListener("error", (event => this.fileReaderDidError(event)));
-      this.readNextChunk();
-    }
-    fileReaderDidLoad(event) {
-      this.md5Buffer.append(event.target.result);
-      if (!this.readNextChunk()) {
-        const binaryDigest = this.md5Buffer.end(true);
-        const base64digest = btoa(binaryDigest);
-        this.callback(null, base64digest);
-      }
-    }
-    fileReaderDidError(event) {
-      this.callback(`Error reading ${this.file.name}`);
-    }
-    readNextChunk() {
-      if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {
-        const start = this.chunkIndex * this.chunkSize;
-        const end = Math.min(start + this.chunkSize, this.file.size);
-        const bytes = fileSlice.call(this.file, start, end);
-        this.fileReader.readAsArrayBuffer(bytes);
-        this.chunkIndex++;
-        return true;
-      } else {
-        return false;
-      }
-    }
-  }
-  function getMetaValue(name) {
-    const element = findElement(document.head, `meta[name="${name}"]`);
-    if (element) {
-      return element.getAttribute("content");
-    }
-  }
-  function findElements(root, selector) {
-    if (typeof root == "string") {
-      selector = root;
-      root = document;
-    }
-    const elements = root.querySelectorAll(selector);
-    return toArray(elements);
-  }
-  function findElement(root, selector) {
-    if (typeof root == "string") {
-      selector = root;
-      root = document;
-    }
-    return root.querySelector(selector);
-  }
-  function dispatchEvent(element, type, eventInit = {}) {
-    const {disabled: disabled} = element;
-    const {bubbles: bubbles, cancelable: cancelable, detail: detail} = eventInit;
-    const event = document.createEvent("Event");
-    event.initEvent(type, bubbles || true, cancelable || true);
-    event.detail = detail || {};
-    try {
-      element.disabled = false;
-      element.dispatchEvent(event);
-    } finally {
-      element.disabled = disabled;
-    }
-    return event;
-  }
-  function toArray(value) {
-    if (Array.isArray(value)) {
-      return value;
-    } else if (Array.from) {
-      return Array.from(value);
-    } else {
-      return [].slice.call(value);
-    }
-  }
-  class BlobRecord {
-    constructor(file, checksum, url) {
-      this.file = file;
-      this.attributes = {
-        filename: file.name,
-        content_type: file.type || "application/octet-stream",
-        byte_size: file.size,
-        checksum: checksum
-      };
-      this.xhr = new XMLHttpRequest;
-      this.xhr.open("POST", url, true);
-      this.xhr.responseType = "json";
-      this.xhr.setRequestHeader("Content-Type", "application/json");
-      this.xhr.setRequestHeader("Accept", "application/json");
-      this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
-      const csrfToken = getMetaValue("csrf-token");
-      if (csrfToken != undefined) {
-        this.xhr.setRequestHeader("X-CSRF-Token", csrfToken);
-      }
-      this.xhr.addEventListener("load", (event => this.requestDidLoad(event)));
-      this.xhr.addEventListener("error", (event => this.requestDidError(event)));
-    }
-    get status() {
-      return this.xhr.status;
-    }
-    get response() {
-      const {responseType: responseType, response: response} = this.xhr;
-      if (responseType == "json") {
-        return response;
-      } else {
-        return JSON.parse(response);
-      }
-    }
-    create(callback) {
-      this.callback = callback;
-      this.xhr.send(JSON.stringify({
-        blob: this.attributes
-      }));
-    }
-    requestDidLoad(event) {
-      if (this.status >= 200 && this.status < 300) {
-        const {response: response} = this;
-        const {direct_upload: direct_upload} = response;
-        delete response.direct_upload;
-        this.attributes = response;
-        this.directUploadData = direct_upload;
-        this.callback(null, this.toJSON());
-      } else {
-        this.requestDidError(event);
-      }
-    }
-    requestDidError(event) {
-      this.callback(`Error creating Blob for "${this.file.name}". Status: ${this.status}`);
-    }
-    toJSON() {
-      const result = {};
-      for (const key in this.attributes) {
-        result[key] = this.attributes[key];
-      }
-      return result;
-    }
-  }
-  class BlobUpload {
-    constructor(blob) {
-      this.blob = blob;
-      this.file = blob.file;
-      const {url: url, headers: headers} = blob.directUploadData;
-      this.xhr = new XMLHttpRequest;
-      this.xhr.open("PUT", url, true);
-      this.xhr.responseType = "text";
-      for (const key in headers) {
-        this.xhr.setRequestHeader(key, headers[key]);
-      }
-      this.xhr.addEventListener("load", (event => this.requestDidLoad(event)));
-      this.xhr.addEventListener("error", (event => this.requestDidError(event)));
-    }
-    create(callback) {
-      this.callback = callback;
-      this.xhr.send(this.file.slice());
-    }
-    requestDidLoad(event) {
-      const {status: status, response: response} = this.xhr;
-      if (status >= 200 && status < 300) {
-        this.callback(null, response);
-      } else {
-        this.requestDidError(event);
-      }
-    }
-    requestDidError(event) {
-      this.callback(`Error storing "${this.file.name}". Status: ${this.xhr.status}`);
-    }
-  }
-  let id = 0;
-  class DirectUpload {
-    constructor(file, url, delegate) {
-      this.id = ++id;
-      this.file = file;
-      this.url = url;
-      this.delegate = delegate;
-    }
-    create(callback) {
-      FileChecksum.create(this.file, ((error, checksum) => {
-        if (error) {
-          callback(error);
-          return;
-        }
-        const blob = new BlobRecord(this.file, checksum, this.url);
-        notify(this.delegate, "directUploadWillCreateBlobWithXHR", blob.xhr);
-        blob.create((error => {
-          if (error) {
-            callback(error);
-          } else {
-            const upload = new BlobUpload(blob);
-            notify(this.delegate, "directUploadWillStoreFileWithXHR", upload.xhr);
-            upload.create((error => {
-              if (error) {
-                callback(error);
-              } else {
-                callback(null, blob.toJSON());
-              }
-            }));
-          }
-        }));
-      }));
-    }
-  }
-  function notify(object, methodName, ...messages) {
-    if (object && typeof object[methodName] == "function") {
-      return object[methodName](...messages);
-    }
-  }
-  class DirectUploadController {
-    constructor(input, file) {
-      this.input = input;
-      this.file = file;
-      this.directUpload = new DirectUpload(this.file, this.url, this);
-      this.dispatch("initialize");
-    }
-    start(callback) {
-      const hiddenInput = document.createElement("input");
-      hiddenInput.type = "hidden";
-      hiddenInput.name = this.input.name;
-      this.input.insertAdjacentElement("beforebegin", hiddenInput);
-      this.dispatch("start");
-      this.directUpload.create(((error, attributes) => {
-        if (error) {
-          hiddenInput.parentNode.removeChild(hiddenInput);
-          this.dispatchError(error);
-        } else {
-          hiddenInput.value = attributes.signed_id;
-        }
-        this.dispatch("end");
-        callback(error);
-      }));
-    }
-    uploadRequestDidProgress(event) {
-      const progress = event.loaded / event.total * 100;
-      if (progress) {
-        this.dispatch("progress", {
-          progress: progress
-        });
-      }
-    }
-    get url() {
-      return this.input.getAttribute("data-direct-upload-url");
-    }
-    dispatch(name, detail = {}) {
-      detail.file = this.file;
-      detail.id = this.directUpload.id;
-      return dispatchEvent(this.input, `direct-upload:${name}`, {
-        detail: detail
-      });
-    }
-    dispatchError(error) {
-      const event = this.dispatch("error", {
-        error: error
-      });
-      if (!event.defaultPrevented) {
-        alert(error);
-      }
-    }
-    directUploadWillCreateBlobWithXHR(xhr) {
-      this.dispatch("before-blob-request", {
-        xhr: xhr
-      });
-    }
-    directUploadWillStoreFileWithXHR(xhr) {
-      this.dispatch("before-storage-request", {
-        xhr: xhr
-      });
-      xhr.upload.addEventListener("progress", (event => this.uploadRequestDidProgress(event)));
-    }
-  }
-  const inputSelector = "input[type=file][data-direct-upload-url]:not([disabled])";
-  class DirectUploadsController {
-    constructor(form) {
-      this.form = form;
-      this.inputs = findElements(form, inputSelector).filter((input => input.files.length));
-    }
-    start(callback) {
-      const controllers = this.createDirectUploadControllers();
-      const startNextController = () => {
-        const controller = controllers.shift();
-        if (controller) {
-          controller.start((error => {
-            if (error) {
-              callback(error);
-              this.dispatch("end");
-            } else {
-              startNextController();
-            }
-          }));
-        } else {
-          callback();
-          this.dispatch("end");
-        }
-      };
-      this.dispatch("start");
-      startNextController();
-    }
-    createDirectUploadControllers() {
-      const controllers = [];
-      this.inputs.forEach((input => {
-        toArray(input.files).forEach((file => {
-          const controller = new DirectUploadController(input, file);
-          controllers.push(controller);
-        }));
-      }));
-      return controllers;
-    }
-    dispatch(name, detail = {}) {
-      return dispatchEvent(this.form, `direct-uploads:${name}`, {
-        detail: detail
-      });
-    }
-  }
-  const processingAttribute = "data-direct-uploads-processing";
-  const submitButtonsByForm = new WeakMap;
-  let started = false;
-  function start() {
-    if (!started) {
-      started = true;
-      document.addEventListener("click", didClick, true);
-      document.addEventListener("submit", didSubmitForm, true);
-      document.addEventListener("ajax:before", didSubmitRemoteElement);
-    }
-  }
-  function didClick(event) {
-    const {target: target} = event;
-    if ((target.tagName == "INPUT" || target.tagName == "BUTTON") && target.type == "submit" && target.form) {
-      submitButtonsByForm.set(target.form, target);
-    }
-  }
-  function didSubmitForm(event) {
-    handleFormSubmissionEvent(event);
-  }
-  function didSubmitRemoteElement(event) {
-    if (event.target.tagName == "FORM") {
-      handleFormSubmissionEvent(event);
-    }
-  }
-  function handleFormSubmissionEvent(event) {
-    const form = event.target;
-    if (form.hasAttribute(processingAttribute)) {
-      event.preventDefault();
-      return;
-    }
-    const controller = new DirectUploadsController(form);
-    const {inputs: inputs} = controller;
-    if (inputs.length) {
-      event.preventDefault();
-      form.setAttribute(processingAttribute, "");
-      inputs.forEach(disable);
-      controller.start((error => {
-        form.removeAttribute(processingAttribute);
-        if (error) {
-          inputs.forEach(enable);
-        } else {
-          submitForm(form);
-        }
-      }));
-    }
-  }
-  function submitForm(form) {
-    let button = submitButtonsByForm.get(form) || findElement(form, "input[type=submit], button[type=submit]");
-    if (button) {
-      const {disabled: disabled} = button;
-      button.disabled = false;
-      button.focus();
-      button.click();
-      button.disabled = disabled;
-    } else {
-      button = document.createElement("input");
-      button.type = "submit";
-      button.style.display = "none";
-      form.appendChild(button);
-      button.click();
-      form.removeChild(button);
-    }
-    submitButtonsByForm.delete(form);
-  }
-  function disable(input) {
-    input.disabled = true;
-  }
-  function enable(input) {
-    input.disabled = false;
-  }
-  function autostart() {
-    if (window.ActiveStorage) {
-      start();
-    }
-  }
-  setTimeout(autostart, 1);
-  exports.DirectUpload = DirectUpload;
-  exports.start = start;
-  Object.defineProperty(exports, "__esModule", {
-    value: true
-  });
-}));
-}(activestorage, activestorage.exports));
-
-class AttachmentUpload {
-  constructor(attachment, element) {
-    this.attachment = attachment;
-    this.element = element;
-    this.directUpload = new activestorage.exports.DirectUpload(attachment.file, this.directUploadUrl, this);
-  }
-
-  start() {
-    this.directUpload.create(this.directUploadDidComplete.bind(this));
-  }
-
-  directUploadWillStoreFileWithXHR(xhr) {
-    xhr.upload.addEventListener("progress", event => {
-      const progress = event.loaded / event.total * 100;
-      this.attachment.setUploadProgress(progress);
-    });
-  }
-
-  directUploadDidComplete(error, attributes) {
-    if (error) {
-      throw new Error(`Direct upload failed: ${error}`)
-    }
-
-    this.attachment.setAttributes({
-      sgid: attributes.attachable_sgid,
-      url: this.createBlobUrl(attributes.signed_id, attributes.filename)
-    });
-  }
-
-  createBlobUrl(signedId, filename) {
-    return this.blobUrlTemplate
-      .replace(":signed_id", signedId)
-      .replace(":filename", encodeURIComponent(filename))
-  }
-
-  get directUploadUrl() {
-    return this.element.dataset.directUploadUrl
-  }
-
-  get blobUrlTemplate() {
-    return this.element.dataset.blobUrlTemplate
-  }
-}
-
-addEventListener("trix-attachment-add", event => {
-  const { attachment, target } = event;
-
-  if (attachment.file) {
-    const upload = new AttachmentUpload(attachment, target);
-    upload.start();
-  }
-});