diff --git a/__tests__/QrCodeDataService.test.ts b/__tests__/QrCodeDataService.test.ts
index 4eb55f0448b2266a8fcaea57768a42e162ecc94e..365183d897744b8a59035ee68166d465300ef160 100644
--- a/__tests__/QrCodeDataService.test.ts
+++ b/__tests__/QrCodeDataService.test.ts
@@ -5,10 +5,9 @@ import Utils, {
   base64ToArrayBuffer,
   arrayBufferToBase64,
 } from "../src/utils/common";
-import { MessageData } from "../src";
+import { MessageData, DocumentData } from "../src";
 
 const emailData: MessageData = {
-  statusId: "123",
   sender: {
     name: "Arty",
     email: "arty@mail.ru",
@@ -42,118 +41,230 @@ const emailData: MessageData = {
   senderPublicKeyUuid: "<uuid>",
 };
 
+const documentData: DocumentData = {
+  author: "Craig McCracken",
+  documentTitle: "The_Powerpuff_Girls",
+  creationDate: new Date().toDateString(),
+  lastModDate: new Date().toDateString(),
+  documentPages: 2,
+};
+
 /**
  * Algorithm spec
  * https://code.vereign.com/internal/product/-/issues/70#note_56356
  */
 describe("QrCodeDataService", () => {
-  it("performs the whole QR code data breakage/assembling routine", async () => {
-    /**
-     * Encode
-     */
-    const encodedEmailData = QrCodeDataService.encodeEmailData(emailData);
-    const compressedEmailData = Utils.compressData(encodedEmailData);
-    const {
-      data,
-      iv: sessionIv,
-      key: sessionKey,
-    } = await CryptoService.encryptAESGCM(
-      arrayBufferToBase64(compressedEmailData)
-    );
-
-    // 32 is a head bytes size. It's the minimum, and the bigger is better.
-    // Increase it as long as you can maintain good appearance of the QR code
-    const { head, tail } = QrCodeDataService.breakQrCodeData(data, 32);
-
-    const encodedSessionKey = QrCodeDataService.encodeKeyDataPair({
-      key: arrayBufferToBase64(sessionKey),
-      data: arrayBufferToBase64(sessionIv),
-    });
+  describe("Email", () => {
+    it("performs the whole QR code data breakage/assembling routine", async () => {
+      /**
+       * Encode
+       */
+      const encodedEmailData = QrCodeDataService.encodeEmailData(emailData);
+      const compressedEmailData = Utils.compressData(encodedEmailData);
+      const {
+        data,
+        iv: sessionIv,
+        key: sessionKey,
+      } = await CryptoService.encryptAESGCM(
+        arrayBufferToBase64(compressedEmailData)
+      );
+
+      // 32 is a head bytes size. It's the minimum, and the bigger is better.
+      // Increase it as long as you can maintain good appearance of the QR code
+      const { head, tail } = QrCodeDataService.breakQrCodeData(data, 32);
+
+      const encodedSessionKey = QrCodeDataService.encodeKeyDataPair({
+        key: arrayBufferToBase64(sessionKey),
+        data: arrayBufferToBase64(sessionIv),
+      });
+
+      // In client apps, RSA encryption happens using HSM service.
+      const { privateKeyPEM, publicKeyPEM } =
+        await CryptoService.generateRSAKeys();
+
+      const encryptedSessionKey = await CryptoService.encryptRSA(
+        publicKeyPEM,
+        base64ToArrayBuffer(encodedSessionKey)
+      );
+
+      const {
+        data: doubleEncryptedSessionKey,
+        iv: storageIv,
+        key: storageKey,
+      } = await CryptoService.encryptAESGCM(
+        arrayBufferToBase64(encryptedSessionKey)
+      );
+
+      // Put base64 of this into QR code data as `?q=` param
+      const encodedStorageKeyAndHead = QrCodeDataService.encodeKeyDataPair({
+        key: arrayBufferToBase64(storageKey),
+        data: arrayBufferToBase64(head),
+      });
+
+      const encodedDoubleEncryptedSessionKey =
+        QrCodeDataService.encodeKeyDataPair({
+          key: arrayBufferToBase64(doubleEncryptedSessionKey),
+          data: arrayBufferToBase64(storageIv),
+        });
 
-    // In client apps, RSA encryption happens using HSM service.
-    const {
-      privateKeyPEM,
-      publicKeyPEM,
-    } = await CryptoService.generateRSAKeys();
-
-    const encryptedSessionKey = await CryptoService.encryptRSA(
-      publicKeyPEM,
-      base64ToArrayBuffer(encodedSessionKey)
-    );
-
-    const {
-      data: doubleEncryptedSessionKey,
-      iv: storageIv,
-      key: storageKey,
-    } = await CryptoService.encryptAESGCM(
-      arrayBufferToBase64(encryptedSessionKey)
-    );
-
-    // Put base64 of this into QR code data as `?q=` param
-    const encodedStorageKeyAndHead = QrCodeDataService.encodeKeyDataPair({
-      key: arrayBufferToBase64(storageKey),
-      data: arrayBufferToBase64(head),
+      // Send this to putQRCodeData api
+      const backblazeData = {
+        sessionKey: encodedDoubleEncryptedSessionKey,
+        tail: arrayBufferToBase64(tail),
+      };
+
+      /**
+       * Decode
+       */
+
+      // Retrieve base64 of this from QR code URL
+      const decodedStorageKeyAndHead = QrCodeDataService.decodeKeyDataPair(
+        encodedStorageKeyAndHead
+      );
+
+      // decode this from backblaze data
+      const { key: doubleEncryptedSessionKeyDecoded, data: storageIvDecoded } =
+        QrCodeDataService.decodeKeyDataPair(backblazeData.sessionKey);
+
+      const doubleDecryptedSessionKey = await CryptoService.decryptAESGCM(
+        base64ToArrayBuffer(doubleEncryptedSessionKeyDecoded),
+        base64ToArrayBuffer(decodedStorageKeyAndHead.key),
+        base64ToArrayBuffer(storageIvDecoded)
+      );
+
+      // In client apps, RSA decryption happens using HSM service.
+      const decryptedSessionKey = await CryptoService.decryptRSA(
+        privateKeyPEM,
+        base64ToArrayBuffer(doubleDecryptedSessionKey)
+      );
+
+      const decodedSessionKey =
+        QrCodeDataService.decodeKeyDataPair(decryptedSessionKey);
+
+      const assembledData = QrCodeDataService.assembleQrCodeData(
+        base64ToArrayBuffer(decodedStorageKeyAndHead.data),
+        base64ToArrayBuffer(backblazeData.tail)
+      );
+
+      const decryptedEmailData = await CryptoService.decryptAESGCM(
+        assembledData,
+        base64ToArrayBuffer(decodedSessionKey.key),
+        base64ToArrayBuffer(decodedSessionKey.data)
+      );
+
+      const decompressedEmailData = Utils.decompressData(decryptedEmailData);
+      const decodedEmailData = QrCodeDataService.decodeEmailData(
+        decompressedEmailData
+      );
+      expect(decodedEmailData).toEqual(emailData);
     });
+  });
 
-    const encodedDoubleEncryptedSessionKey = QrCodeDataService.encodeKeyDataPair(
-      {
-        key: arrayBufferToBase64(doubleEncryptedSessionKey),
-        data: arrayBufferToBase64(storageIv),
-      }
-    );
-
-    // Send this to putQRCodeData api
-    const backblazeData = {
-      sessionKey: encodedDoubleEncryptedSessionKey,
-      tail: arrayBufferToBase64(tail),
-    };
-
-    /**
-     * Decode
-     */
-
-    // Retrieve base64 of this from QR code URL
-    const decodedStorageKeyAndHead = QrCodeDataService.decodeKeyDataPair(
-      encodedStorageKeyAndHead
-    );
-
-    // decode this from backblaze data
-    const {
-      key: doubleEncryptedSessionKeyDecoded,
-      data: storageIvDecoded,
-    } = QrCodeDataService.decodeKeyDataPair(backblazeData.sessionKey);
-
-    const doubleDecryptedSessionKey = await CryptoService.decryptAESGCM(
-      base64ToArrayBuffer(doubleEncryptedSessionKeyDecoded),
-      base64ToArrayBuffer(decodedStorageKeyAndHead.key),
-      base64ToArrayBuffer(storageIvDecoded)
-    );
-
-    // In client apps, RSA decryption happens using HSM service.
-    const decryptedSessionKey = await CryptoService.decryptRSA(
-      privateKeyPEM,
-      base64ToArrayBuffer(doubleDecryptedSessionKey)
-    );
-
-    const decodedSessionKey = QrCodeDataService.decodeKeyDataPair(
-      decryptedSessionKey
-    );
-
-    const assembledData = QrCodeDataService.assembleQrCodeData(
-      base64ToArrayBuffer(decodedStorageKeyAndHead.data),
-      base64ToArrayBuffer(backblazeData.tail)
-    );
-
-    const decryptedEmailData = await CryptoService.decryptAESGCM(
-      assembledData,
-      base64ToArrayBuffer(decodedSessionKey.key),
-      base64ToArrayBuffer(decodedSessionKey.data)
-    );
-
-    const decompressedEmailData = Utils.decompressData(decryptedEmailData);
-    const decodedEmailData = QrCodeDataService.decodeEmailData(
-      decompressedEmailData
-    );
-    expect(decodedEmailData).toEqual(emailData);
+  describe("Documents", () => {
+    it("performs the whole QR code data breakage/assembling routine ", async () => {
+      /**
+       * Encode
+       */
+      const encodedDocumentData =
+        QrCodeDataService.encodeDocumentData(documentData);
+      const compressedDocumentData = Utils.compressData(encodedDocumentData);
+      const {
+        data,
+        iv: sessionIv,
+        key: sessionKey,
+      } = await CryptoService.encryptAESGCM(
+        arrayBufferToBase64(compressedDocumentData)
+      );
+
+      const { head, tail } = QrCodeDataService.breakQrCodeData(data, 32);
+
+      const encodedSessionKey = QrCodeDataService.encodeKeyDataPair({
+        key: arrayBufferToBase64(sessionKey),
+        data: arrayBufferToBase64(sessionIv),
+      });
+
+      // In client apps, RSA encryption happens using HSM service.
+      const { privateKeyPEM, publicKeyPEM } =
+        await CryptoService.generateRSAKeys();
+
+      const encryptedSessionKey = await CryptoService.encryptRSA(
+        publicKeyPEM,
+        base64ToArrayBuffer(encodedSessionKey)
+      );
+
+      const {
+        data: doubleEncryptedSessionKey,
+        iv: storageIv,
+        key: storageKey,
+      } = await CryptoService.encryptAESGCM(
+        arrayBufferToBase64(encryptedSessionKey)
+      );
+
+      // Put base64 of this into QR code data as `?q=` param
+      const encodedStorageKeyAndHead = QrCodeDataService.encodeKeyDataPair({
+        key: arrayBufferToBase64(storageKey),
+        data: arrayBufferToBase64(head),
+      });
+
+      const encodedDoubleEncryptedSessionKey =
+        QrCodeDataService.encodeKeyDataPair({
+          key: arrayBufferToBase64(doubleEncryptedSessionKey),
+          data: arrayBufferToBase64(storageIv),
+        });
+
+      // Send this to putQRCodeData api
+      const backblazeData = {
+        sessionKey: encodedDoubleEncryptedSessionKey,
+        tail: arrayBufferToBase64(tail),
+      };
+
+      /**
+       * Decode Document
+       */
+
+      // Retrieve base64 of this from QR code URL
+      const decodedStorageKeyAndHead = QrCodeDataService.decodeKeyDataPair(
+        encodedStorageKeyAndHead
+      );
+
+      // decode this from backblaze data
+      const { key: doubleEncryptedSessionKeyDecoded, data: storageIvDecoded } =
+        QrCodeDataService.decodeKeyDataPair(backblazeData.sessionKey);
+
+      const doubleDecryptedSessionKey = await CryptoService.decryptAESGCM(
+        base64ToArrayBuffer(doubleEncryptedSessionKeyDecoded),
+        base64ToArrayBuffer(decodedStorageKeyAndHead.key),
+        base64ToArrayBuffer(storageIvDecoded)
+      );
+
+      // In client apps, RSA decryption happens using HSM service.
+      const decryptedSessionKey = await CryptoService.decryptRSA(
+        privateKeyPEM,
+        base64ToArrayBuffer(doubleDecryptedSessionKey)
+      );
+
+      const decodedSessionKey =
+        QrCodeDataService.decodeKeyDataPair(decryptedSessionKey);
+
+      const assembledData = QrCodeDataService.assembleQrCodeData(
+        base64ToArrayBuffer(decodedStorageKeyAndHead.data),
+        base64ToArrayBuffer(backblazeData.tail)
+      );
+
+      const decryptedDocumentData = await CryptoService.decryptAESGCM(
+        assembledData,
+        base64ToArrayBuffer(decodedSessionKey.key),
+        base64ToArrayBuffer(decodedSessionKey.data)
+      );
+
+      const decompressedDocumentData = Utils.decompressData(
+        decryptedDocumentData
+      );
+      const decodedDocumentData = QrCodeDataService.decodeDocumentData(
+        decompressedDocumentData
+      );
+
+      expect(decodedDocumentData).toEqual(documentData);
+    });
   });
 });
diff --git a/dist/generated/qrcode_data_pb.js b/dist/generated/qrcode_data_pb.js
index e903a4aea9805dde1a3e87e2cbbc287f411fef3c..ec425f7ca7b9225db5461cc16560dfe25467572d 100644
--- a/dist/generated/qrcode_data_pb.js
+++ b/dist/generated/qrcode_data_pb.js
@@ -760,9 +760,10 @@ $root.vereign = (function () {
                  * Properties of an IpfsContentData_V1.
                  * @memberof vereign.protobuf.qrcode_data
                  * @interface IIpfsContentData_V1
-                 * @property {string|null} [cid] IpfsContentData_V1 cid
-                 * @property {string|null} [key] IpfsContentData_V1 key
                  * @property {string|null} [head] IpfsContentData_V1 head
+                 * @property {string|null} [key] IpfsContentData_V1 key
+                 * @property {string|null} [cid] IpfsContentData_V1 cid
+                 * @property {string|null} [ipnsKeyId] IpfsContentData_V1 ipnsKeyId
                  */
                 /**
                  * Constructs a new IpfsContentData_V1.
@@ -779,12 +780,12 @@ $root.vereign = (function () {
                                 this[keys[i]] = properties[keys[i]];
                 }
                 /**
-                 * IpfsContentData_V1 cid.
-                 * @member {string} cid
+                 * IpfsContentData_V1 head.
+                 * @member {string} head
                  * @memberof vereign.protobuf.qrcode_data.IpfsContentData_V1
                  * @instance
                  */
-                IpfsContentData_V1.prototype.cid = "";
+                IpfsContentData_V1.prototype.head = "";
                 /**
                  * IpfsContentData_V1 key.
                  * @member {string} key
@@ -793,12 +794,19 @@ $root.vereign = (function () {
                  */
                 IpfsContentData_V1.prototype.key = "";
                 /**
-                 * IpfsContentData_V1 head.
-                 * @member {string} head
+                 * IpfsContentData_V1 cid.
+                 * @member {string} cid
                  * @memberof vereign.protobuf.qrcode_data.IpfsContentData_V1
                  * @instance
                  */
-                IpfsContentData_V1.prototype.head = "";
+                IpfsContentData_V1.prototype.cid = "";
+                /**
+                 * IpfsContentData_V1 ipnsKeyId.
+                 * @member {string} ipnsKeyId
+                 * @memberof vereign.protobuf.qrcode_data.IpfsContentData_V1
+                 * @instance
+                 */
+                IpfsContentData_V1.prototype.ipnsKeyId = "";
                 /**
                  * Creates a new IpfsContentData_V1 instance using the specified properties.
                  * @function create
@@ -822,12 +830,14 @@ $root.vereign = (function () {
                 IpfsContentData_V1.encode = function encode(message, writer) {
                     if (!writer)
                         writer = $Writer.create();
-                    if (message.cid != null && Object.hasOwnProperty.call(message, "cid"))
-                        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.cid);
+                    if (message.head != null && Object.hasOwnProperty.call(message, "head"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.head);
                     if (message.key != null && Object.hasOwnProperty.call(message, "key"))
                         writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.key);
-                    if (message.head != null && Object.hasOwnProperty.call(message, "head"))
-                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.head);
+                    if (message.cid != null && Object.hasOwnProperty.call(message, "cid"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.cid);
+                    if (message.ipnsKeyId != null && Object.hasOwnProperty.call(message, "ipnsKeyId"))
+                        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.ipnsKeyId);
                     return writer;
                 };
                 /**
@@ -861,13 +871,16 @@ $root.vereign = (function () {
                         var tag = reader.uint32();
                         switch (tag >>> 3) {
                             case 1:
-                                message.cid = reader.string();
+                                message.head = reader.string();
                                 break;
                             case 2:
                                 message.key = reader.string();
                                 break;
                             case 3:
-                                message.head = reader.string();
+                                message.cid = reader.string();
+                                break;
+                            case 4:
+                                message.ipnsKeyId = reader.string();
                                 break;
                             default:
                                 reader.skipType(tag & 7);
@@ -902,15 +915,18 @@ $root.vereign = (function () {
                 IpfsContentData_V1.verify = function verify(message) {
                     if (typeof message !== "object" || message === null)
                         return "object expected";
-                    if (message.cid != null && message.hasOwnProperty("cid"))
-                        if (!$util.isString(message.cid))
-                            return "cid: string expected";
-                    if (message.key != null && message.hasOwnProperty("key"))
-                        if (!$util.isString(message.key))
-                            return "key: string expected";
                     if (message.head != null && message.hasOwnProperty("head"))
                         if (!$util.isString(message.head))
                             return "head: string expected";
+                    if (message.key != null && message.hasOwnProperty("key"))
+                        if (!$util.isString(message.key))
+                            return "key: string expected";
+                    if (message.cid != null && message.hasOwnProperty("cid"))
+                        if (!$util.isString(message.cid))
+                            return "cid: string expected";
+                    if (message.ipnsKeyId != null && message.hasOwnProperty("ipnsKeyId"))
+                        if (!$util.isString(message.ipnsKeyId))
+                            return "ipnsKeyId: string expected";
                     return null;
                 };
                 /**
@@ -925,12 +941,14 @@ $root.vereign = (function () {
                     if (object instanceof $root.vereign.protobuf.qrcode_data.IpfsContentData_V1)
                         return object;
                     var message = new $root.vereign.protobuf.qrcode_data.IpfsContentData_V1();
-                    if (object.cid != null)
-                        message.cid = String(object.cid);
-                    if (object.key != null)
-                        message.key = String(object.key);
                     if (object.head != null)
                         message.head = String(object.head);
+                    if (object.key != null)
+                        message.key = String(object.key);
+                    if (object.cid != null)
+                        message.cid = String(object.cid);
+                    if (object.ipnsKeyId != null)
+                        message.ipnsKeyId = String(object.ipnsKeyId);
                     return message;
                 };
                 /**
@@ -947,16 +965,19 @@ $root.vereign = (function () {
                         options = {};
                     var object = {};
                     if (options.defaults) {
-                        object.cid = "";
-                        object.key = "";
                         object.head = "";
+                        object.key = "";
+                        object.cid = "";
+                        object.ipnsKeyId = "";
                     }
-                    if (message.cid != null && message.hasOwnProperty("cid"))
-                        object.cid = message.cid;
-                    if (message.key != null && message.hasOwnProperty("key"))
-                        object.key = message.key;
                     if (message.head != null && message.hasOwnProperty("head"))
                         object.head = message.head;
+                    if (message.key != null && message.hasOwnProperty("key"))
+                        object.key = message.key;
+                    if (message.cid != null && message.hasOwnProperty("cid"))
+                        object.cid = message.cid;
+                    if (message.ipnsKeyId != null && message.hasOwnProperty("ipnsKeyId"))
+                        object.ipnsKeyId = message.ipnsKeyId;
                     return object;
                 };
                 /**
@@ -2294,6 +2315,2256 @@ $root.vereign = (function () {
                 };
                 return WrapperData;
             })();
+            qrcode_data.CertIssuer = (function () {
+                /**
+                 * Properties of a CertIssuer.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ICertIssuer
+                 * @property {string|null} [countryName] CertIssuer countryName
+                 * @property {string|null} [organizationName] CertIssuer organizationName
+                 * @property {string|null} [commonName] CertIssuer commonName
+                 */
+                /**
+                 * Constructs a new CertIssuer.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a CertIssuer.
+                 * @implements ICertIssuer
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ICertIssuer=} [properties] Properties to set
+                 */
+                function CertIssuer(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * CertIssuer countryName.
+                 * @member {string} countryName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @instance
+                 */
+                CertIssuer.prototype.countryName = "";
+                /**
+                 * CertIssuer organizationName.
+                 * @member {string} organizationName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @instance
+                 */
+                CertIssuer.prototype.organizationName = "";
+                /**
+                 * CertIssuer commonName.
+                 * @member {string} commonName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @instance
+                 */
+                CertIssuer.prototype.commonName = "";
+                /**
+                 * Creates a new CertIssuer instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertIssuer=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.CertIssuer} CertIssuer instance
+                 */
+                CertIssuer.create = function create(properties) {
+                    return new CertIssuer(properties);
+                };
+                /**
+                 * Encodes the specified CertIssuer message. Does not implicitly {@link vereign.protobuf.qrcode_data.CertIssuer.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertIssuer} message CertIssuer message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                CertIssuer.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.countryName != null && Object.hasOwnProperty.call(message, "countryName"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.countryName);
+                    if (message.organizationName != null && Object.hasOwnProperty.call(message, "organizationName"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.organizationName);
+                    if (message.commonName != null && Object.hasOwnProperty.call(message, "commonName"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.commonName);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified CertIssuer message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.CertIssuer.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertIssuer} message CertIssuer message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                CertIssuer.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a CertIssuer message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.CertIssuer} CertIssuer
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                CertIssuer.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.CertIssuer();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.countryName = reader.string();
+                                break;
+                            case 2:
+                                message.organizationName = reader.string();
+                                break;
+                            case 3:
+                                message.commonName = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a CertIssuer message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.CertIssuer} CertIssuer
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                CertIssuer.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a CertIssuer message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                CertIssuer.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.countryName != null && message.hasOwnProperty("countryName"))
+                        if (!$util.isString(message.countryName))
+                            return "countryName: string expected";
+                    if (message.organizationName != null && message.hasOwnProperty("organizationName"))
+                        if (!$util.isString(message.organizationName))
+                            return "organizationName: string expected";
+                    if (message.commonName != null && message.hasOwnProperty("commonName"))
+                        if (!$util.isString(message.commonName))
+                            return "commonName: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a CertIssuer message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.CertIssuer} CertIssuer
+                 */
+                CertIssuer.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.CertIssuer)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.CertIssuer();
+                    if (object.countryName != null)
+                        message.countryName = String(object.countryName);
+                    if (object.organizationName != null)
+                        message.organizationName = String(object.organizationName);
+                    if (object.commonName != null)
+                        message.commonName = String(object.commonName);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a CertIssuer message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.CertIssuer} message CertIssuer
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                CertIssuer.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        object.countryName = "";
+                        object.organizationName = "";
+                        object.commonName = "";
+                    }
+                    if (message.countryName != null && message.hasOwnProperty("countryName"))
+                        object.countryName = message.countryName;
+                    if (message.organizationName != null && message.hasOwnProperty("organizationName"))
+                        object.organizationName = message.organizationName;
+                    if (message.commonName != null && message.hasOwnProperty("commonName"))
+                        object.commonName = message.commonName;
+                    return object;
+                };
+                /**
+                 * Converts this CertIssuer to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.CertIssuer
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                CertIssuer.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return CertIssuer;
+            })();
+            qrcode_data.CertIssedTo = (function () {
+                /**
+                 * Properties of a CertIssedTo.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ICertIssedTo
+                 * @property {string|null} [countryName] CertIssedTo countryName
+                 * @property {string|null} [organizationalUnitName] CertIssedTo organizationalUnitName
+                 * @property {string|null} [organizationName] CertIssedTo organizationName
+                 * @property {string|null} [commonName] CertIssedTo commonName
+                 */
+                /**
+                 * Constructs a new CertIssedTo.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a CertIssedTo.
+                 * @implements ICertIssedTo
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ICertIssedTo=} [properties] Properties to set
+                 */
+                function CertIssedTo(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * CertIssedTo countryName.
+                 * @member {string} countryName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @instance
+                 */
+                CertIssedTo.prototype.countryName = "";
+                /**
+                 * CertIssedTo organizationalUnitName.
+                 * @member {string} organizationalUnitName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @instance
+                 */
+                CertIssedTo.prototype.organizationalUnitName = "";
+                /**
+                 * CertIssedTo organizationName.
+                 * @member {string} organizationName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @instance
+                 */
+                CertIssedTo.prototype.organizationName = "";
+                /**
+                 * CertIssedTo commonName.
+                 * @member {string} commonName
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @instance
+                 */
+                CertIssedTo.prototype.commonName = "";
+                /**
+                 * Creates a new CertIssedTo instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertIssedTo=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.CertIssedTo} CertIssedTo instance
+                 */
+                CertIssedTo.create = function create(properties) {
+                    return new CertIssedTo(properties);
+                };
+                /**
+                 * Encodes the specified CertIssedTo message. Does not implicitly {@link vereign.protobuf.qrcode_data.CertIssedTo.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertIssedTo} message CertIssedTo message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                CertIssedTo.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.countryName != null && Object.hasOwnProperty.call(message, "countryName"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.countryName);
+                    if (message.organizationalUnitName != null && Object.hasOwnProperty.call(message, "organizationalUnitName"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.organizationalUnitName);
+                    if (message.organizationName != null && Object.hasOwnProperty.call(message, "organizationName"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.organizationName);
+                    if (message.commonName != null && Object.hasOwnProperty.call(message, "commonName"))
+                        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.commonName);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified CertIssedTo message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.CertIssedTo.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertIssedTo} message CertIssedTo message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                CertIssedTo.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a CertIssedTo message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.CertIssedTo} CertIssedTo
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                CertIssedTo.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.CertIssedTo();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.countryName = reader.string();
+                                break;
+                            case 2:
+                                message.organizationalUnitName = reader.string();
+                                break;
+                            case 3:
+                                message.organizationName = reader.string();
+                                break;
+                            case 4:
+                                message.commonName = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a CertIssedTo message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.CertIssedTo} CertIssedTo
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                CertIssedTo.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a CertIssedTo message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                CertIssedTo.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.countryName != null && message.hasOwnProperty("countryName"))
+                        if (!$util.isString(message.countryName))
+                            return "countryName: string expected";
+                    if (message.organizationalUnitName != null && message.hasOwnProperty("organizationalUnitName"))
+                        if (!$util.isString(message.organizationalUnitName))
+                            return "organizationalUnitName: string expected";
+                    if (message.organizationName != null && message.hasOwnProperty("organizationName"))
+                        if (!$util.isString(message.organizationName))
+                            return "organizationName: string expected";
+                    if (message.commonName != null && message.hasOwnProperty("commonName"))
+                        if (!$util.isString(message.commonName))
+                            return "commonName: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a CertIssedTo message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.CertIssedTo} CertIssedTo
+                 */
+                CertIssedTo.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.CertIssedTo)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.CertIssedTo();
+                    if (object.countryName != null)
+                        message.countryName = String(object.countryName);
+                    if (object.organizationalUnitName != null)
+                        message.organizationalUnitName = String(object.organizationalUnitName);
+                    if (object.organizationName != null)
+                        message.organizationName = String(object.organizationName);
+                    if (object.commonName != null)
+                        message.commonName = String(object.commonName);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a CertIssedTo message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.CertIssedTo} message CertIssedTo
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                CertIssedTo.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        object.countryName = "";
+                        object.organizationalUnitName = "";
+                        object.organizationName = "";
+                        object.commonName = "";
+                    }
+                    if (message.countryName != null && message.hasOwnProperty("countryName"))
+                        object.countryName = message.countryName;
+                    if (message.organizationalUnitName != null && message.hasOwnProperty("organizationalUnitName"))
+                        object.organizationalUnitName = message.organizationalUnitName;
+                    if (message.organizationName != null && message.hasOwnProperty("organizationName"))
+                        object.organizationName = message.organizationName;
+                    if (message.commonName != null && message.hasOwnProperty("commonName"))
+                        object.commonName = message.commonName;
+                    return object;
+                };
+                /**
+                 * Converts this CertIssedTo to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.CertIssedTo
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                CertIssedTo.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return CertIssedTo;
+            })();
+            qrcode_data.CertValidity = (function () {
+                /**
+                 * Properties of a CertValidity.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ICertValidity
+                 * @property {string|null} [notBefore] CertValidity notBefore
+                 * @property {string|null} [notAfter] CertValidity notAfter
+                 */
+                /**
+                 * Constructs a new CertValidity.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a CertValidity.
+                 * @implements ICertValidity
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ICertValidity=} [properties] Properties to set
+                 */
+                function CertValidity(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * CertValidity notBefore.
+                 * @member {string} notBefore
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @instance
+                 */
+                CertValidity.prototype.notBefore = "";
+                /**
+                 * CertValidity notAfter.
+                 * @member {string} notAfter
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @instance
+                 */
+                CertValidity.prototype.notAfter = "";
+                /**
+                 * Creates a new CertValidity instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertValidity=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.CertValidity} CertValidity instance
+                 */
+                CertValidity.create = function create(properties) {
+                    return new CertValidity(properties);
+                };
+                /**
+                 * Encodes the specified CertValidity message. Does not implicitly {@link vereign.protobuf.qrcode_data.CertValidity.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertValidity} message CertValidity message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                CertValidity.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.notBefore != null && Object.hasOwnProperty.call(message, "notBefore"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.notBefore);
+                    if (message.notAfter != null && Object.hasOwnProperty.call(message, "notAfter"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.notAfter);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified CertValidity message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.CertValidity.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICertValidity} message CertValidity message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                CertValidity.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a CertValidity message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.CertValidity} CertValidity
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                CertValidity.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.CertValidity();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.notBefore = reader.string();
+                                break;
+                            case 2:
+                                message.notAfter = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a CertValidity message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.CertValidity} CertValidity
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                CertValidity.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a CertValidity message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                CertValidity.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.notBefore != null && message.hasOwnProperty("notBefore"))
+                        if (!$util.isString(message.notBefore))
+                            return "notBefore: string expected";
+                    if (message.notAfter != null && message.hasOwnProperty("notAfter"))
+                        if (!$util.isString(message.notAfter))
+                            return "notAfter: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a CertValidity message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.CertValidity} CertValidity
+                 */
+                CertValidity.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.CertValidity)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.CertValidity();
+                    if (object.notBefore != null)
+                        message.notBefore = String(object.notBefore);
+                    if (object.notAfter != null)
+                        message.notAfter = String(object.notAfter);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a CertValidity message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.CertValidity} message CertValidity
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                CertValidity.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        object.notBefore = "";
+                        object.notAfter = "";
+                    }
+                    if (message.notBefore != null && message.hasOwnProperty("notBefore"))
+                        object.notBefore = message.notBefore;
+                    if (message.notAfter != null && message.hasOwnProperty("notAfter"))
+                        object.notAfter = message.notAfter;
+                    return object;
+                };
+                /**
+                 * Converts this CertValidity to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.CertValidity
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                CertValidity.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return CertValidity;
+            })();
+            qrcode_data.Cert_V1 = (function () {
+                /**
+                 * Properties of a Cert_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ICert_V1
+                 * @property {boolean|null} [clientCertificate] Cert_V1 clientCertificate
+                 * @property {vereign.protobuf.qrcode_data.ICertIssuer|null} [issuedBy] Cert_V1 issuedBy
+                 * @property {vereign.protobuf.qrcode_data.ICertIssedTo|null} [issuedTo] Cert_V1 issuedTo
+                 * @property {vereign.protobuf.qrcode_data.ICertValidity|null} [validityPeriod] Cert_V1 validityPeriod
+                 * @property {string|null} [pemCertificate] Cert_V1 pemCertificate
+                 */
+                /**
+                 * Constructs a new Cert_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a Cert_V1.
+                 * @implements ICert_V1
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ICert_V1=} [properties] Properties to set
+                 */
+                function Cert_V1(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * Cert_V1 clientCertificate.
+                 * @member {boolean} clientCertificate
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @instance
+                 */
+                Cert_V1.prototype.clientCertificate = false;
+                /**
+                 * Cert_V1 issuedBy.
+                 * @member {vereign.protobuf.qrcode_data.ICertIssuer|null|undefined} issuedBy
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @instance
+                 */
+                Cert_V1.prototype.issuedBy = null;
+                /**
+                 * Cert_V1 issuedTo.
+                 * @member {vereign.protobuf.qrcode_data.ICertIssedTo|null|undefined} issuedTo
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @instance
+                 */
+                Cert_V1.prototype.issuedTo = null;
+                /**
+                 * Cert_V1 validityPeriod.
+                 * @member {vereign.protobuf.qrcode_data.ICertValidity|null|undefined} validityPeriod
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @instance
+                 */
+                Cert_V1.prototype.validityPeriod = null;
+                /**
+                 * Cert_V1 pemCertificate.
+                 * @member {string} pemCertificate
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @instance
+                 */
+                Cert_V1.prototype.pemCertificate = "";
+                /**
+                 * Creates a new Cert_V1 instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICert_V1=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.Cert_V1} Cert_V1 instance
+                 */
+                Cert_V1.create = function create(properties) {
+                    return new Cert_V1(properties);
+                };
+                /**
+                 * Encodes the specified Cert_V1 message. Does not implicitly {@link vereign.protobuf.qrcode_data.Cert_V1.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICert_V1} message Cert_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                Cert_V1.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.clientCertificate != null && Object.hasOwnProperty.call(message, "clientCertificate"))
+                        writer.uint32(/* id 1, wireType 0 =*/ 8).bool(message.clientCertificate);
+                    if (message.issuedBy != null && Object.hasOwnProperty.call(message, "issuedBy"))
+                        $root.vereign.protobuf.qrcode_data.CertIssuer.encode(message.issuedBy, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();
+                    if (message.issuedTo != null && Object.hasOwnProperty.call(message, "issuedTo"))
+                        $root.vereign.protobuf.qrcode_data.CertIssedTo.encode(message.issuedTo, writer.uint32(/* id 3, wireType 2 =*/ 26).fork()).ldelim();
+                    if (message.validityPeriod != null && Object.hasOwnProperty.call(message, "validityPeriod"))
+                        $root.vereign.protobuf.qrcode_data.CertValidity.encode(message.validityPeriod, writer.uint32(/* id 4, wireType 2 =*/ 34).fork()).ldelim();
+                    if (message.pemCertificate != null && Object.hasOwnProperty.call(message, "pemCertificate"))
+                        writer.uint32(/* id 5, wireType 2 =*/ 42).string(message.pemCertificate);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified Cert_V1 message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.Cert_V1.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ICert_V1} message Cert_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                Cert_V1.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a Cert_V1 message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.Cert_V1} Cert_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                Cert_V1.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.Cert_V1();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.clientCertificate = reader.bool();
+                                break;
+                            case 2:
+                                message.issuedBy = $root.vereign.protobuf.qrcode_data.CertIssuer.decode(reader, reader.uint32());
+                                break;
+                            case 3:
+                                message.issuedTo = $root.vereign.protobuf.qrcode_data.CertIssedTo.decode(reader, reader.uint32());
+                                break;
+                            case 4:
+                                message.validityPeriod = $root.vereign.protobuf.qrcode_data.CertValidity.decode(reader, reader.uint32());
+                                break;
+                            case 5:
+                                message.pemCertificate = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a Cert_V1 message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.Cert_V1} Cert_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                Cert_V1.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a Cert_V1 message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                Cert_V1.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.clientCertificate != null && message.hasOwnProperty("clientCertificate"))
+                        if (typeof message.clientCertificate !== "boolean")
+                            return "clientCertificate: boolean expected";
+                    if (message.issuedBy != null && message.hasOwnProperty("issuedBy")) {
+                        var error = $root.vereign.protobuf.qrcode_data.CertIssuer.verify(message.issuedBy);
+                        if (error)
+                            return "issuedBy." + error;
+                    }
+                    if (message.issuedTo != null && message.hasOwnProperty("issuedTo")) {
+                        var error = $root.vereign.protobuf.qrcode_data.CertIssedTo.verify(message.issuedTo);
+                        if (error)
+                            return "issuedTo." + error;
+                    }
+                    if (message.validityPeriod != null && message.hasOwnProperty("validityPeriod")) {
+                        var error = $root.vereign.protobuf.qrcode_data.CertValidity.verify(message.validityPeriod);
+                        if (error)
+                            return "validityPeriod." + error;
+                    }
+                    if (message.pemCertificate != null && message.hasOwnProperty("pemCertificate"))
+                        if (!$util.isString(message.pemCertificate))
+                            return "pemCertificate: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a Cert_V1 message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.Cert_V1} Cert_V1
+                 */
+                Cert_V1.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.Cert_V1)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.Cert_V1();
+                    if (object.clientCertificate != null)
+                        message.clientCertificate = Boolean(object.clientCertificate);
+                    if (object.issuedBy != null) {
+                        if (typeof object.issuedBy !== "object")
+                            throw TypeError(".vereign.protobuf.qrcode_data.Cert_V1.issuedBy: object expected");
+                        message.issuedBy = $root.vereign.protobuf.qrcode_data.CertIssuer.fromObject(object.issuedBy);
+                    }
+                    if (object.issuedTo != null) {
+                        if (typeof object.issuedTo !== "object")
+                            throw TypeError(".vereign.protobuf.qrcode_data.Cert_V1.issuedTo: object expected");
+                        message.issuedTo = $root.vereign.protobuf.qrcode_data.CertIssedTo.fromObject(object.issuedTo);
+                    }
+                    if (object.validityPeriod != null) {
+                        if (typeof object.validityPeriod !== "object")
+                            throw TypeError(".vereign.protobuf.qrcode_data.Cert_V1.validityPeriod: object expected");
+                        message.validityPeriod = $root.vereign.protobuf.qrcode_data.CertValidity.fromObject(object.validityPeriod);
+                    }
+                    if (object.pemCertificate != null)
+                        message.pemCertificate = String(object.pemCertificate);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a Cert_V1 message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.Cert_V1} message Cert_V1
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                Cert_V1.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        object.clientCertificate = false;
+                        object.issuedBy = null;
+                        object.issuedTo = null;
+                        object.validityPeriod = null;
+                        object.pemCertificate = "";
+                    }
+                    if (message.clientCertificate != null && message.hasOwnProperty("clientCertificate"))
+                        object.clientCertificate = message.clientCertificate;
+                    if (message.issuedBy != null && message.hasOwnProperty("issuedBy"))
+                        object.issuedBy = $root.vereign.protobuf.qrcode_data.CertIssuer.toObject(message.issuedBy, options);
+                    if (message.issuedTo != null && message.hasOwnProperty("issuedTo"))
+                        object.issuedTo = $root.vereign.protobuf.qrcode_data.CertIssedTo.toObject(message.issuedTo, options);
+                    if (message.validityPeriod != null && message.hasOwnProperty("validityPeriod"))
+                        object.validityPeriod = $root.vereign.protobuf.qrcode_data.CertValidity.toObject(message.validityPeriod, options);
+                    if (message.pemCertificate != null && message.hasOwnProperty("pemCertificate"))
+                        object.pemCertificate = message.pemCertificate;
+                    return object;
+                };
+                /**
+                 * Converts this Cert_V1 to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.Cert_V1
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                Cert_V1.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return Cert_V1;
+            })();
+            qrcode_data.SignatureMeta_V1 = (function () {
+                /**
+                 * Properties of a SignatureMeta_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ISignatureMeta_V1
+                 * @property {Array.<vereign.protobuf.qrcode_data.ICert_V1>|null} [certs] SignatureMeta_V1 certs
+                 * @property {string|null} [reason] SignatureMeta_V1 reason
+                 * @property {string|null} [contactInfo] SignatureMeta_V1 contactInfo
+                 * @property {string|null} [location] SignatureMeta_V1 location
+                 * @property {string|null} [signDate] SignatureMeta_V1 signDate
+                 */
+                /**
+                 * Constructs a new SignatureMeta_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a SignatureMeta_V1.
+                 * @implements ISignatureMeta_V1
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ISignatureMeta_V1=} [properties] Properties to set
+                 */
+                function SignatureMeta_V1(properties) {
+                    this.certs = [];
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * SignatureMeta_V1 certs.
+                 * @member {Array.<vereign.protobuf.qrcode_data.ICert_V1>} certs
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @instance
+                 */
+                SignatureMeta_V1.prototype.certs = $util.emptyArray;
+                /**
+                 * SignatureMeta_V1 reason.
+                 * @member {string} reason
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @instance
+                 */
+                SignatureMeta_V1.prototype.reason = "";
+                /**
+                 * SignatureMeta_V1 contactInfo.
+                 * @member {string} contactInfo
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @instance
+                 */
+                SignatureMeta_V1.prototype.contactInfo = "";
+                /**
+                 * SignatureMeta_V1 location.
+                 * @member {string} location
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @instance
+                 */
+                SignatureMeta_V1.prototype.location = "";
+                /**
+                 * SignatureMeta_V1 signDate.
+                 * @member {string} signDate
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @instance
+                 */
+                SignatureMeta_V1.prototype.signDate = "";
+                /**
+                 * Creates a new SignatureMeta_V1 instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISignatureMeta_V1=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.SignatureMeta_V1} SignatureMeta_V1 instance
+                 */
+                SignatureMeta_V1.create = function create(properties) {
+                    return new SignatureMeta_V1(properties);
+                };
+                /**
+                 * Encodes the specified SignatureMeta_V1 message. Does not implicitly {@link vereign.protobuf.qrcode_data.SignatureMeta_V1.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISignatureMeta_V1} message SignatureMeta_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                SignatureMeta_V1.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.certs != null && message.certs.length)
+                        for (var i = 0; i < message.certs.length; ++i)
+                            $root.vereign.protobuf.qrcode_data.Cert_V1.encode(message.certs[i], writer.uint32(/* id 1, wireType 2 =*/ 10).fork()).ldelim();
+                    if (message.reason != null && Object.hasOwnProperty.call(message, "reason"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.reason);
+                    if (message.contactInfo != null && Object.hasOwnProperty.call(message, "contactInfo"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.contactInfo);
+                    if (message.location != null && Object.hasOwnProperty.call(message, "location"))
+                        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.location);
+                    if (message.signDate != null && Object.hasOwnProperty.call(message, "signDate"))
+                        writer.uint32(/* id 5, wireType 2 =*/ 42).string(message.signDate);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified SignatureMeta_V1 message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.SignatureMeta_V1.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISignatureMeta_V1} message SignatureMeta_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                SignatureMeta_V1.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a SignatureMeta_V1 message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.SignatureMeta_V1} SignatureMeta_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                SignatureMeta_V1.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.SignatureMeta_V1();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                if (!(message.certs && message.certs.length))
+                                    message.certs = [];
+                                message.certs.push($root.vereign.protobuf.qrcode_data.Cert_V1.decode(reader, reader.uint32()));
+                                break;
+                            case 2:
+                                message.reason = reader.string();
+                                break;
+                            case 3:
+                                message.contactInfo = reader.string();
+                                break;
+                            case 4:
+                                message.location = reader.string();
+                                break;
+                            case 5:
+                                message.signDate = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a SignatureMeta_V1 message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.SignatureMeta_V1} SignatureMeta_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                SignatureMeta_V1.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a SignatureMeta_V1 message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                SignatureMeta_V1.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.certs != null && message.hasOwnProperty("certs")) {
+                        if (!Array.isArray(message.certs))
+                            return "certs: array expected";
+                        for (var i = 0; i < message.certs.length; ++i) {
+                            var error = $root.vereign.protobuf.qrcode_data.Cert_V1.verify(message.certs[i]);
+                            if (error)
+                                return "certs." + error;
+                        }
+                    }
+                    if (message.reason != null && message.hasOwnProperty("reason"))
+                        if (!$util.isString(message.reason))
+                            return "reason: string expected";
+                    if (message.contactInfo != null && message.hasOwnProperty("contactInfo"))
+                        if (!$util.isString(message.contactInfo))
+                            return "contactInfo: string expected";
+                    if (message.location != null && message.hasOwnProperty("location"))
+                        if (!$util.isString(message.location))
+                            return "location: string expected";
+                    if (message.signDate != null && message.hasOwnProperty("signDate"))
+                        if (!$util.isString(message.signDate))
+                            return "signDate: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a SignatureMeta_V1 message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.SignatureMeta_V1} SignatureMeta_V1
+                 */
+                SignatureMeta_V1.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.SignatureMeta_V1)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.SignatureMeta_V1();
+                    if (object.certs) {
+                        if (!Array.isArray(object.certs))
+                            throw TypeError(".vereign.protobuf.qrcode_data.SignatureMeta_V1.certs: array expected");
+                        message.certs = [];
+                        for (var i = 0; i < object.certs.length; ++i) {
+                            if (typeof object.certs[i] !== "object")
+                                throw TypeError(".vereign.protobuf.qrcode_data.SignatureMeta_V1.certs: object expected");
+                            message.certs[i] = $root.vereign.protobuf.qrcode_data.Cert_V1.fromObject(object.certs[i]);
+                        }
+                    }
+                    if (object.reason != null)
+                        message.reason = String(object.reason);
+                    if (object.contactInfo != null)
+                        message.contactInfo = String(object.contactInfo);
+                    if (object.location != null)
+                        message.location = String(object.location);
+                    if (object.signDate != null)
+                        message.signDate = String(object.signDate);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a SignatureMeta_V1 message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.SignatureMeta_V1} message SignatureMeta_V1
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                SignatureMeta_V1.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.arrays || options.defaults)
+                        object.certs = [];
+                    if (options.defaults) {
+                        object.reason = "";
+                        object.contactInfo = "";
+                        object.location = "";
+                        object.signDate = "";
+                    }
+                    if (message.certs && message.certs.length) {
+                        object.certs = [];
+                        for (var j = 0; j < message.certs.length; ++j)
+                            object.certs[j] = $root.vereign.protobuf.qrcode_data.Cert_V1.toObject(message.certs[j], options);
+                    }
+                    if (message.reason != null && message.hasOwnProperty("reason"))
+                        object.reason = message.reason;
+                    if (message.contactInfo != null && message.hasOwnProperty("contactInfo"))
+                        object.contactInfo = message.contactInfo;
+                    if (message.location != null && message.hasOwnProperty("location"))
+                        object.location = message.location;
+                    if (message.signDate != null && message.hasOwnProperty("signDate"))
+                        object.signDate = message.signDate;
+                    return object;
+                };
+                /**
+                 * Converts this SignatureMeta_V1 to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.SignatureMeta_V1
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                SignatureMeta_V1.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return SignatureMeta_V1;
+            })();
+            qrcode_data.Signature_V1 = (function () {
+                /**
+                 * Properties of a Signature_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ISignature_V1
+                 * @property {boolean|null} [isExpired] Signature_V1 isExpired
+                 * @property {vereign.protobuf.qrcode_data.ISignatureMeta_V1|null} [meta] Signature_V1 meta
+                 */
+                /**
+                 * Constructs a new Signature_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a Signature_V1.
+                 * @implements ISignature_V1
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ISignature_V1=} [properties] Properties to set
+                 */
+                function Signature_V1(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * Signature_V1 isExpired.
+                 * @member {boolean} isExpired
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @instance
+                 */
+                Signature_V1.prototype.isExpired = false;
+                /**
+                 * Signature_V1 meta.
+                 * @member {vereign.protobuf.qrcode_data.ISignatureMeta_V1|null|undefined} meta
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @instance
+                 */
+                Signature_V1.prototype.meta = null;
+                /**
+                 * Creates a new Signature_V1 instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISignature_V1=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.Signature_V1} Signature_V1 instance
+                 */
+                Signature_V1.create = function create(properties) {
+                    return new Signature_V1(properties);
+                };
+                /**
+                 * Encodes the specified Signature_V1 message. Does not implicitly {@link vereign.protobuf.qrcode_data.Signature_V1.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISignature_V1} message Signature_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                Signature_V1.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.isExpired != null && Object.hasOwnProperty.call(message, "isExpired"))
+                        writer.uint32(/* id 1, wireType 0 =*/ 8).bool(message.isExpired);
+                    if (message.meta != null && Object.hasOwnProperty.call(message, "meta"))
+                        $root.vereign.protobuf.qrcode_data.SignatureMeta_V1.encode(message.meta, writer.uint32(/* id 2, wireType 2 =*/ 18).fork()).ldelim();
+                    return writer;
+                };
+                /**
+                 * Encodes the specified Signature_V1 message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.Signature_V1.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISignature_V1} message Signature_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                Signature_V1.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a Signature_V1 message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.Signature_V1} Signature_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                Signature_V1.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.Signature_V1();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.isExpired = reader.bool();
+                                break;
+                            case 2:
+                                message.meta = $root.vereign.protobuf.qrcode_data.SignatureMeta_V1.decode(reader, reader.uint32());
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a Signature_V1 message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.Signature_V1} Signature_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                Signature_V1.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a Signature_V1 message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                Signature_V1.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.isExpired != null && message.hasOwnProperty("isExpired"))
+                        if (typeof message.isExpired !== "boolean")
+                            return "isExpired: boolean expected";
+                    if (message.meta != null && message.hasOwnProperty("meta")) {
+                        var error = $root.vereign.protobuf.qrcode_data.SignatureMeta_V1.verify(message.meta);
+                        if (error)
+                            return "meta." + error;
+                    }
+                    return null;
+                };
+                /**
+                 * Creates a Signature_V1 message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.Signature_V1} Signature_V1
+                 */
+                Signature_V1.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.Signature_V1)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.Signature_V1();
+                    if (object.isExpired != null)
+                        message.isExpired = Boolean(object.isExpired);
+                    if (object.meta != null) {
+                        if (typeof object.meta !== "object")
+                            throw TypeError(".vereign.protobuf.qrcode_data.Signature_V1.meta: object expected");
+                        message.meta = $root.vereign.protobuf.qrcode_data.SignatureMeta_V1.fromObject(object.meta);
+                    }
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a Signature_V1 message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.Signature_V1} message Signature_V1
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                Signature_V1.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        object.isExpired = false;
+                        object.meta = null;
+                    }
+                    if (message.isExpired != null && message.hasOwnProperty("isExpired"))
+                        object.isExpired = message.isExpired;
+                    if (message.meta != null && message.hasOwnProperty("meta"))
+                        object.meta = $root.vereign.protobuf.qrcode_data.SignatureMeta_V1.toObject(message.meta, options);
+                    return object;
+                };
+                /**
+                 * Converts this Signature_V1 to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.Signature_V1
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                Signature_V1.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return Signature_V1;
+            })();
+            qrcode_data.DocumentData_V1 = (function () {
+                /**
+                 * Properties of a DocumentData_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface IDocumentData_V1
+                 * @property {string|null} [author] DocumentData_V1 author
+                 * @property {string|null} [documentTitle] DocumentData_V1 documentTitle
+                 * @property {string|null} [creationDate] DocumentData_V1 creationDate
+                 * @property {string|null} [lastModDate] DocumentData_V1 lastModDate
+                 * @property {number|null} [documentPages] DocumentData_V1 documentPages
+                 * @property {boolean|null} [expired] DocumentData_V1 expired
+                 * @property {Array.<vereign.protobuf.qrcode_data.ISignature_V1>|null} [signatures] DocumentData_V1 signatures
+                 * @property {vereign.protobuf.qrcode_data.IIpfsContentData_V1|null} [ipfs] DocumentData_V1 ipfs
+                 */
+                /**
+                 * Constructs a new DocumentData_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a DocumentData_V1.
+                 * @implements IDocumentData_V1
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.IDocumentData_V1=} [properties] Properties to set
+                 */
+                function DocumentData_V1(properties) {
+                    this.signatures = [];
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * DocumentData_V1 author.
+                 * @member {string} author
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.author = "";
+                /**
+                 * DocumentData_V1 documentTitle.
+                 * @member {string} documentTitle
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.documentTitle = "";
+                /**
+                 * DocumentData_V1 creationDate.
+                 * @member {string} creationDate
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.creationDate = "";
+                /**
+                 * DocumentData_V1 lastModDate.
+                 * @member {string} lastModDate
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.lastModDate = "";
+                /**
+                 * DocumentData_V1 documentPages.
+                 * @member {number} documentPages
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.documentPages = 0;
+                /**
+                 * DocumentData_V1 expired.
+                 * @member {boolean} expired
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.expired = false;
+                /**
+                 * DocumentData_V1 signatures.
+                 * @member {Array.<vereign.protobuf.qrcode_data.ISignature_V1>} signatures
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.signatures = $util.emptyArray;
+                /**
+                 * DocumentData_V1 ipfs.
+                 * @member {vereign.protobuf.qrcode_data.IIpfsContentData_V1|null|undefined} ipfs
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 */
+                DocumentData_V1.prototype.ipfs = null;
+                /**
+                 * Creates a new DocumentData_V1 instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.IDocumentData_V1=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.DocumentData_V1} DocumentData_V1 instance
+                 */
+                DocumentData_V1.create = function create(properties) {
+                    return new DocumentData_V1(properties);
+                };
+                /**
+                 * Encodes the specified DocumentData_V1 message. Does not implicitly {@link vereign.protobuf.qrcode_data.DocumentData_V1.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.IDocumentData_V1} message DocumentData_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                DocumentData_V1.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.author != null && Object.hasOwnProperty.call(message, "author"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).string(message.author);
+                    if (message.documentTitle != null && Object.hasOwnProperty.call(message, "documentTitle"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.documentTitle);
+                    if (message.creationDate != null && Object.hasOwnProperty.call(message, "creationDate"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.creationDate);
+                    if (message.lastModDate != null && Object.hasOwnProperty.call(message, "lastModDate"))
+                        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.lastModDate);
+                    if (message.documentPages != null && Object.hasOwnProperty.call(message, "documentPages"))
+                        writer.uint32(/* id 5, wireType 0 =*/ 40).int32(message.documentPages);
+                    if (message.expired != null && Object.hasOwnProperty.call(message, "expired"))
+                        writer.uint32(/* id 6, wireType 0 =*/ 48).bool(message.expired);
+                    if (message.signatures != null && message.signatures.length)
+                        for (var i = 0; i < message.signatures.length; ++i)
+                            $root.vereign.protobuf.qrcode_data.Signature_V1.encode(message.signatures[i], writer.uint32(/* id 7, wireType 2 =*/ 58).fork()).ldelim();
+                    if (message.ipfs != null && Object.hasOwnProperty.call(message, "ipfs"))
+                        $root.vereign.protobuf.qrcode_data.IpfsContentData_V1.encode(message.ipfs, writer.uint32(/* id 8, wireType 2 =*/ 66).fork()).ldelim();
+                    return writer;
+                };
+                /**
+                 * Encodes the specified DocumentData_V1 message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.DocumentData_V1.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.IDocumentData_V1} message DocumentData_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                DocumentData_V1.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a DocumentData_V1 message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.DocumentData_V1} DocumentData_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                DocumentData_V1.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.DocumentData_V1();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.author = reader.string();
+                                break;
+                            case 2:
+                                message.documentTitle = reader.string();
+                                break;
+                            case 3:
+                                message.creationDate = reader.string();
+                                break;
+                            case 4:
+                                message.lastModDate = reader.string();
+                                break;
+                            case 5:
+                                message.documentPages = reader.int32();
+                                break;
+                            case 6:
+                                message.expired = reader.bool();
+                                break;
+                            case 7:
+                                if (!(message.signatures && message.signatures.length))
+                                    message.signatures = [];
+                                message.signatures.push($root.vereign.protobuf.qrcode_data.Signature_V1.decode(reader, reader.uint32()));
+                                break;
+                            case 8:
+                                message.ipfs = $root.vereign.protobuf.qrcode_data.IpfsContentData_V1.decode(reader, reader.uint32());
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a DocumentData_V1 message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.DocumentData_V1} DocumentData_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                DocumentData_V1.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a DocumentData_V1 message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                DocumentData_V1.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.author != null && message.hasOwnProperty("author"))
+                        if (!$util.isString(message.author))
+                            return "author: string expected";
+                    if (message.documentTitle != null && message.hasOwnProperty("documentTitle"))
+                        if (!$util.isString(message.documentTitle))
+                            return "documentTitle: string expected";
+                    if (message.creationDate != null && message.hasOwnProperty("creationDate"))
+                        if (!$util.isString(message.creationDate))
+                            return "creationDate: string expected";
+                    if (message.lastModDate != null && message.hasOwnProperty("lastModDate"))
+                        if (!$util.isString(message.lastModDate))
+                            return "lastModDate: string expected";
+                    if (message.documentPages != null && message.hasOwnProperty("documentPages"))
+                        if (!$util.isInteger(message.documentPages))
+                            return "documentPages: integer expected";
+                    if (message.expired != null && message.hasOwnProperty("expired"))
+                        if (typeof message.expired !== "boolean")
+                            return "expired: boolean expected";
+                    if (message.signatures != null && message.hasOwnProperty("signatures")) {
+                        if (!Array.isArray(message.signatures))
+                            return "signatures: array expected";
+                        for (var i = 0; i < message.signatures.length; ++i) {
+                            var error = $root.vereign.protobuf.qrcode_data.Signature_V1.verify(message.signatures[i]);
+                            if (error)
+                                return "signatures." + error;
+                        }
+                    }
+                    if (message.ipfs != null && message.hasOwnProperty("ipfs")) {
+                        var error = $root.vereign.protobuf.qrcode_data.IpfsContentData_V1.verify(message.ipfs);
+                        if (error)
+                            return "ipfs." + error;
+                    }
+                    return null;
+                };
+                /**
+                 * Creates a DocumentData_V1 message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.DocumentData_V1} DocumentData_V1
+                 */
+                DocumentData_V1.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.DocumentData_V1)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.DocumentData_V1();
+                    if (object.author != null)
+                        message.author = String(object.author);
+                    if (object.documentTitle != null)
+                        message.documentTitle = String(object.documentTitle);
+                    if (object.creationDate != null)
+                        message.creationDate = String(object.creationDate);
+                    if (object.lastModDate != null)
+                        message.lastModDate = String(object.lastModDate);
+                    if (object.documentPages != null)
+                        message.documentPages = object.documentPages | 0;
+                    if (object.expired != null)
+                        message.expired = Boolean(object.expired);
+                    if (object.signatures) {
+                        if (!Array.isArray(object.signatures))
+                            throw TypeError(".vereign.protobuf.qrcode_data.DocumentData_V1.signatures: array expected");
+                        message.signatures = [];
+                        for (var i = 0; i < object.signatures.length; ++i) {
+                            if (typeof object.signatures[i] !== "object")
+                                throw TypeError(".vereign.protobuf.qrcode_data.DocumentData_V1.signatures: object expected");
+                            message.signatures[i] = $root.vereign.protobuf.qrcode_data.Signature_V1.fromObject(object.signatures[i]);
+                        }
+                    }
+                    if (object.ipfs != null) {
+                        if (typeof object.ipfs !== "object")
+                            throw TypeError(".vereign.protobuf.qrcode_data.DocumentData_V1.ipfs: object expected");
+                        message.ipfs = $root.vereign.protobuf.qrcode_data.IpfsContentData_V1.fromObject(object.ipfs);
+                    }
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a DocumentData_V1 message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.DocumentData_V1} message DocumentData_V1
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                DocumentData_V1.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.arrays || options.defaults)
+                        object.signatures = [];
+                    if (options.defaults) {
+                        object.author = "";
+                        object.documentTitle = "";
+                        object.creationDate = "";
+                        object.lastModDate = "";
+                        object.documentPages = 0;
+                        object.expired = false;
+                        object.ipfs = null;
+                    }
+                    if (message.author != null && message.hasOwnProperty("author"))
+                        object.author = message.author;
+                    if (message.documentTitle != null && message.hasOwnProperty("documentTitle"))
+                        object.documentTitle = message.documentTitle;
+                    if (message.creationDate != null && message.hasOwnProperty("creationDate"))
+                        object.creationDate = message.creationDate;
+                    if (message.lastModDate != null && message.hasOwnProperty("lastModDate"))
+                        object.lastModDate = message.lastModDate;
+                    if (message.documentPages != null && message.hasOwnProperty("documentPages"))
+                        object.documentPages = message.documentPages;
+                    if (message.expired != null && message.hasOwnProperty("expired"))
+                        object.expired = message.expired;
+                    if (message.signatures && message.signatures.length) {
+                        object.signatures = [];
+                        for (var j = 0; j < message.signatures.length; ++j)
+                            object.signatures[j] = $root.vereign.protobuf.qrcode_data.Signature_V1.toObject(message.signatures[j], options);
+                    }
+                    if (message.ipfs != null && message.hasOwnProperty("ipfs"))
+                        object.ipfs = $root.vereign.protobuf.qrcode_data.IpfsContentData_V1.toObject(message.ipfs, options);
+                    return object;
+                };
+                /**
+                 * Converts this DocumentData_V1 to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.DocumentData_V1
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                DocumentData_V1.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return DocumentData_V1;
+            })();
+            qrcode_data.SealDocumentHeadData_V1 = (function () {
+                /**
+                 * Properties of a SealDocumentHeadData_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ISealDocumentHeadData_V1
+                 * @property {Uint8Array|null} [key] SealDocumentHeadData_V1 key
+                 * @property {Uint8Array|null} [data] SealDocumentHeadData_V1 data
+                 * @property {string|null} [ipfsIndexCid] SealDocumentHeadData_V1 ipfsIndexCid
+                 */
+                /**
+                 * Constructs a new SealDocumentHeadData_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a SealDocumentHeadData_V1.
+                 * @implements ISealDocumentHeadData_V1
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ISealDocumentHeadData_V1=} [properties] Properties to set
+                 */
+                function SealDocumentHeadData_V1(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * SealDocumentHeadData_V1 key.
+                 * @member {Uint8Array} key
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @instance
+                 */
+                SealDocumentHeadData_V1.prototype.key = $util.newBuffer([]);
+                /**
+                 * SealDocumentHeadData_V1 data.
+                 * @member {Uint8Array} data
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @instance
+                 */
+                SealDocumentHeadData_V1.prototype.data = $util.newBuffer([]);
+                /**
+                 * SealDocumentHeadData_V1 ipfsIndexCid.
+                 * @member {string} ipfsIndexCid
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @instance
+                 */
+                SealDocumentHeadData_V1.prototype.ipfsIndexCid = "";
+                /**
+                 * Creates a new SealDocumentHeadData_V1 instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISealDocumentHeadData_V1=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.SealDocumentHeadData_V1} SealDocumentHeadData_V1 instance
+                 */
+                SealDocumentHeadData_V1.create = function create(properties) {
+                    return new SealDocumentHeadData_V1(properties);
+                };
+                /**
+                 * Encodes the specified SealDocumentHeadData_V1 message. Does not implicitly {@link vereign.protobuf.qrcode_data.SealDocumentHeadData_V1.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISealDocumentHeadData_V1} message SealDocumentHeadData_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                SealDocumentHeadData_V1.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.key != null && Object.hasOwnProperty.call(message, "key"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).bytes(message.key);
+                    if (message.data != null && Object.hasOwnProperty.call(message, "data"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).bytes(message.data);
+                    if (message.ipfsIndexCid != null && Object.hasOwnProperty.call(message, "ipfsIndexCid"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.ipfsIndexCid);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified SealDocumentHeadData_V1 message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.SealDocumentHeadData_V1.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISealDocumentHeadData_V1} message SealDocumentHeadData_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                SealDocumentHeadData_V1.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a SealDocumentHeadData_V1 message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.SealDocumentHeadData_V1} SealDocumentHeadData_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                SealDocumentHeadData_V1.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.SealDocumentHeadData_V1();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.key = reader.bytes();
+                                break;
+                            case 2:
+                                message.data = reader.bytes();
+                                break;
+                            case 3:
+                                message.ipfsIndexCid = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a SealDocumentHeadData_V1 message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.SealDocumentHeadData_V1} SealDocumentHeadData_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                SealDocumentHeadData_V1.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a SealDocumentHeadData_V1 message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                SealDocumentHeadData_V1.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.key != null && message.hasOwnProperty("key"))
+                        if (!(message.key && typeof message.key.length === "number" || $util.isString(message.key)))
+                            return "key: buffer expected";
+                    if (message.data != null && message.hasOwnProperty("data"))
+                        if (!(message.data && typeof message.data.length === "number" || $util.isString(message.data)))
+                            return "data: buffer expected";
+                    if (message.ipfsIndexCid != null && message.hasOwnProperty("ipfsIndexCid"))
+                        if (!$util.isString(message.ipfsIndexCid))
+                            return "ipfsIndexCid: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a SealDocumentHeadData_V1 message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.SealDocumentHeadData_V1} SealDocumentHeadData_V1
+                 */
+                SealDocumentHeadData_V1.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.SealDocumentHeadData_V1)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.SealDocumentHeadData_V1();
+                    if (object.key != null)
+                        if (typeof object.key === "string")
+                            $util.base64.decode(object.key, message.key = $util.newBuffer($util.base64.length(object.key)), 0);
+                        else if (object.key.length)
+                            message.key = object.key;
+                    if (object.data != null)
+                        if (typeof object.data === "string")
+                            $util.base64.decode(object.data, message.data = $util.newBuffer($util.base64.length(object.data)), 0);
+                        else if (object.data.length)
+                            message.data = object.data;
+                    if (object.ipfsIndexCid != null)
+                        message.ipfsIndexCid = String(object.ipfsIndexCid);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a SealDocumentHeadData_V1 message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.SealDocumentHeadData_V1} message SealDocumentHeadData_V1
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                SealDocumentHeadData_V1.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        if (options.bytes === String)
+                            object.key = "";
+                        else {
+                            object.key = [];
+                            if (options.bytes !== Array)
+                                object.key = $util.newBuffer(object.key);
+                        }
+                        if (options.bytes === String)
+                            object.data = "";
+                        else {
+                            object.data = [];
+                            if (options.bytes !== Array)
+                                object.data = $util.newBuffer(object.data);
+                        }
+                        object.ipfsIndexCid = "";
+                    }
+                    if (message.key != null && message.hasOwnProperty("key"))
+                        object.key = options.bytes === String ? $util.base64.encode(message.key, 0, message.key.length) : options.bytes === Array ? Array.prototype.slice.call(message.key) : message.key;
+                    if (message.data != null && message.hasOwnProperty("data"))
+                        object.data = options.bytes === String ? $util.base64.encode(message.data, 0, message.data.length) : options.bytes === Array ? Array.prototype.slice.call(message.data) : message.data;
+                    if (message.ipfsIndexCid != null && message.hasOwnProperty("ipfsIndexCid"))
+                        object.ipfsIndexCid = message.ipfsIndexCid;
+                    return object;
+                };
+                /**
+                 * Converts this SealDocumentHeadData_V1 to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.SealDocumentHeadData_V1
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                SealDocumentHeadData_V1.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return SealDocumentHeadData_V1;
+            })();
+            qrcode_data.SealIndexObject_V1 = (function () {
+                /**
+                 * Properties of a SealIndexObject_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @interface ISealIndexObject_V1
+                 * @property {Uint8Array|null} [sealKey] SealIndexObject_V1 sealKey
+                 * @property {string|null} [sealTailCid] SealIndexObject_V1 sealTailCid
+                 * @property {string|null} [chain] SealIndexObject_V1 chain
+                 * @property {string|null} [currentBlockHeight] SealIndexObject_V1 currentBlockHeight
+                 * @property {string|null} [accountId] SealIndexObject_V1 accountId
+                 */
+                /**
+                 * Constructs a new SealIndexObject_V1.
+                 * @memberof vereign.protobuf.qrcode_data
+                 * @classdesc Represents a SealIndexObject_V1.
+                 * @implements ISealIndexObject_V1
+                 * @constructor
+                 * @param {vereign.protobuf.qrcode_data.ISealIndexObject_V1=} [properties] Properties to set
+                 */
+                function SealIndexObject_V1(properties) {
+                    if (properties)
+                        for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                            if (properties[keys[i]] != null)
+                                this[keys[i]] = properties[keys[i]];
+                }
+                /**
+                 * SealIndexObject_V1 sealKey.
+                 * @member {Uint8Array} sealKey
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @instance
+                 */
+                SealIndexObject_V1.prototype.sealKey = $util.newBuffer([]);
+                /**
+                 * SealIndexObject_V1 sealTailCid.
+                 * @member {string} sealTailCid
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @instance
+                 */
+                SealIndexObject_V1.prototype.sealTailCid = "";
+                /**
+                 * SealIndexObject_V1 chain.
+                 * @member {string} chain
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @instance
+                 */
+                SealIndexObject_V1.prototype.chain = "";
+                /**
+                 * SealIndexObject_V1 currentBlockHeight.
+                 * @member {string} currentBlockHeight
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @instance
+                 */
+                SealIndexObject_V1.prototype.currentBlockHeight = "";
+                /**
+                 * SealIndexObject_V1 accountId.
+                 * @member {string} accountId
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @instance
+                 */
+                SealIndexObject_V1.prototype.accountId = "";
+                /**
+                 * Creates a new SealIndexObject_V1 instance using the specified properties.
+                 * @function create
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISealIndexObject_V1=} [properties] Properties to set
+                 * @returns {vereign.protobuf.qrcode_data.SealIndexObject_V1} SealIndexObject_V1 instance
+                 */
+                SealIndexObject_V1.create = function create(properties) {
+                    return new SealIndexObject_V1(properties);
+                };
+                /**
+                 * Encodes the specified SealIndexObject_V1 message. Does not implicitly {@link vereign.protobuf.qrcode_data.SealIndexObject_V1.verify|verify} messages.
+                 * @function encode
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISealIndexObject_V1} message SealIndexObject_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                SealIndexObject_V1.encode = function encode(message, writer) {
+                    if (!writer)
+                        writer = $Writer.create();
+                    if (message.sealKey != null && Object.hasOwnProperty.call(message, "sealKey"))
+                        writer.uint32(/* id 1, wireType 2 =*/ 10).bytes(message.sealKey);
+                    if (message.sealTailCid != null && Object.hasOwnProperty.call(message, "sealTailCid"))
+                        writer.uint32(/* id 2, wireType 2 =*/ 18).string(message.sealTailCid);
+                    if (message.chain != null && Object.hasOwnProperty.call(message, "chain"))
+                        writer.uint32(/* id 3, wireType 2 =*/ 26).string(message.chain);
+                    if (message.currentBlockHeight != null && Object.hasOwnProperty.call(message, "currentBlockHeight"))
+                        writer.uint32(/* id 4, wireType 2 =*/ 34).string(message.currentBlockHeight);
+                    if (message.accountId != null && Object.hasOwnProperty.call(message, "accountId"))
+                        writer.uint32(/* id 5, wireType 2 =*/ 42).string(message.accountId);
+                    return writer;
+                };
+                /**
+                 * Encodes the specified SealIndexObject_V1 message, length delimited. Does not implicitly {@link vereign.protobuf.qrcode_data.SealIndexObject_V1.verify|verify} messages.
+                 * @function encodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.ISealIndexObject_V1} message SealIndexObject_V1 message or plain object to encode
+                 * @param {$protobuf.Writer} [writer] Writer to encode to
+                 * @returns {$protobuf.Writer} Writer
+                 */
+                SealIndexObject_V1.encodeDelimited = function encodeDelimited(message, writer) {
+                    return this.encode(message, writer).ldelim();
+                };
+                /**
+                 * Decodes a SealIndexObject_V1 message from the specified reader or buffer.
+                 * @function decode
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @param {number} [length] Message length if known beforehand
+                 * @returns {vereign.protobuf.qrcode_data.SealIndexObject_V1} SealIndexObject_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                SealIndexObject_V1.decode = function decode(reader, length) {
+                    if (!(reader instanceof $Reader))
+                        reader = $Reader.create(reader);
+                    var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.protobuf.qrcode_data.SealIndexObject_V1();
+                    while (reader.pos < end) {
+                        var tag = reader.uint32();
+                        switch (tag >>> 3) {
+                            case 1:
+                                message.sealKey = reader.bytes();
+                                break;
+                            case 2:
+                                message.sealTailCid = reader.string();
+                                break;
+                            case 3:
+                                message.chain = reader.string();
+                                break;
+                            case 4:
+                                message.currentBlockHeight = reader.string();
+                                break;
+                            case 5:
+                                message.accountId = reader.string();
+                                break;
+                            default:
+                                reader.skipType(tag & 7);
+                                break;
+                        }
+                    }
+                    return message;
+                };
+                /**
+                 * Decodes a SealIndexObject_V1 message from the specified reader or buffer, length delimited.
+                 * @function decodeDelimited
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+                 * @returns {vereign.protobuf.qrcode_data.SealIndexObject_V1} SealIndexObject_V1
+                 * @throws {Error} If the payload is not a reader or valid buffer
+                 * @throws {$protobuf.util.ProtocolError} If required fields are missing
+                 */
+                SealIndexObject_V1.decodeDelimited = function decodeDelimited(reader) {
+                    if (!(reader instanceof $Reader))
+                        reader = new $Reader(reader);
+                    return this.decode(reader, reader.uint32());
+                };
+                /**
+                 * Verifies a SealIndexObject_V1 message.
+                 * @function verify
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {Object.<string,*>} message Plain object to verify
+                 * @returns {string|null} `null` if valid, otherwise the reason why it is not
+                 */
+                SealIndexObject_V1.verify = function verify(message) {
+                    if (typeof message !== "object" || message === null)
+                        return "object expected";
+                    if (message.sealKey != null && message.hasOwnProperty("sealKey"))
+                        if (!(message.sealKey && typeof message.sealKey.length === "number" || $util.isString(message.sealKey)))
+                            return "sealKey: buffer expected";
+                    if (message.sealTailCid != null && message.hasOwnProperty("sealTailCid"))
+                        if (!$util.isString(message.sealTailCid))
+                            return "sealTailCid: string expected";
+                    if (message.chain != null && message.hasOwnProperty("chain"))
+                        if (!$util.isString(message.chain))
+                            return "chain: string expected";
+                    if (message.currentBlockHeight != null && message.hasOwnProperty("currentBlockHeight"))
+                        if (!$util.isString(message.currentBlockHeight))
+                            return "currentBlockHeight: string expected";
+                    if (message.accountId != null && message.hasOwnProperty("accountId"))
+                        if (!$util.isString(message.accountId))
+                            return "accountId: string expected";
+                    return null;
+                };
+                /**
+                 * Creates a SealIndexObject_V1 message from a plain object. Also converts values to their respective internal types.
+                 * @function fromObject
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {Object.<string,*>} object Plain object
+                 * @returns {vereign.protobuf.qrcode_data.SealIndexObject_V1} SealIndexObject_V1
+                 */
+                SealIndexObject_V1.fromObject = function fromObject(object) {
+                    if (object instanceof $root.vereign.protobuf.qrcode_data.SealIndexObject_V1)
+                        return object;
+                    var message = new $root.vereign.protobuf.qrcode_data.SealIndexObject_V1();
+                    if (object.sealKey != null)
+                        if (typeof object.sealKey === "string")
+                            $util.base64.decode(object.sealKey, message.sealKey = $util.newBuffer($util.base64.length(object.sealKey)), 0);
+                        else if (object.sealKey.length)
+                            message.sealKey = object.sealKey;
+                    if (object.sealTailCid != null)
+                        message.sealTailCid = String(object.sealTailCid);
+                    if (object.chain != null)
+                        message.chain = String(object.chain);
+                    if (object.currentBlockHeight != null)
+                        message.currentBlockHeight = String(object.currentBlockHeight);
+                    if (object.accountId != null)
+                        message.accountId = String(object.accountId);
+                    return message;
+                };
+                /**
+                 * Creates a plain object from a SealIndexObject_V1 message. Also converts values to other types if specified.
+                 * @function toObject
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @static
+                 * @param {vereign.protobuf.qrcode_data.SealIndexObject_V1} message SealIndexObject_V1
+                 * @param {$protobuf.IConversionOptions} [options] Conversion options
+                 * @returns {Object.<string,*>} Plain object
+                 */
+                SealIndexObject_V1.toObject = function toObject(message, options) {
+                    if (!options)
+                        options = {};
+                    var object = {};
+                    if (options.defaults) {
+                        if (options.bytes === String)
+                            object.sealKey = "";
+                        else {
+                            object.sealKey = [];
+                            if (options.bytes !== Array)
+                                object.sealKey = $util.newBuffer(object.sealKey);
+                        }
+                        object.sealTailCid = "";
+                        object.chain = "";
+                        object.currentBlockHeight = "";
+                        object.accountId = "";
+                    }
+                    if (message.sealKey != null && message.hasOwnProperty("sealKey"))
+                        object.sealKey = options.bytes === String ? $util.base64.encode(message.sealKey, 0, message.sealKey.length) : options.bytes === Array ? Array.prototype.slice.call(message.sealKey) : message.sealKey;
+                    if (message.sealTailCid != null && message.hasOwnProperty("sealTailCid"))
+                        object.sealTailCid = message.sealTailCid;
+                    if (message.chain != null && message.hasOwnProperty("chain"))
+                        object.chain = message.chain;
+                    if (message.currentBlockHeight != null && message.hasOwnProperty("currentBlockHeight"))
+                        object.currentBlockHeight = message.currentBlockHeight;
+                    if (message.accountId != null && message.hasOwnProperty("accountId"))
+                        object.accountId = message.accountId;
+                    return object;
+                };
+                /**
+                 * Converts this SealIndexObject_V1 to JSON.
+                 * @function toJSON
+                 * @memberof vereign.protobuf.qrcode_data.SealIndexObject_V1
+                 * @instance
+                 * @returns {Object.<string,*>} JSON object
+                 */
+                SealIndexObject_V1.prototype.toJSON = function toJSON() {
+                    return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+                };
+                return SealIndexObject_V1;
+            })();
             return qrcode_data;
         })();
         return protobuf;
diff --git a/dist/generated/statuses_pb.js b/dist/generated/statuses_pb.js
index 8312ac13a598445ee57fdfc5e5b97b632114cfac..4acdc8b57bc03e16bdeebec67af3984ec277efcb 100644
--- a/dist/generated/statuses_pb.js
+++ b/dist/generated/statuses_pb.js
@@ -1765,6 +1765,225 @@ $root.vereign = (function () {
             };
             return WrapperData;
         })();
+        statuses.DocumentStatusObject = (function () {
+            /**
+             * Properties of a DocumentStatusObject.
+             * @memberof vereign.statuses
+             * @interface IDocumentStatusObject
+             * @property {number|Long|null} [timestamp] DocumentStatusObject timestamp
+             * @property {Uint8Array|null} [sealHash] DocumentStatusObject sealHash
+             */
+            /**
+             * Constructs a new DocumentStatusObject.
+             * @memberof vereign.statuses
+             * @classdesc Represents a DocumentStatusObject.
+             * @implements IDocumentStatusObject
+             * @constructor
+             * @param {vereign.statuses.IDocumentStatusObject=} [properties] Properties to set
+             */
+            function DocumentStatusObject(properties) {
+                if (properties)
+                    for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)
+                        if (properties[keys[i]] != null)
+                            this[keys[i]] = properties[keys[i]];
+            }
+            /**
+             * DocumentStatusObject timestamp.
+             * @member {number|Long} timestamp
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @instance
+             */
+            DocumentStatusObject.prototype.timestamp = $util.Long ? $util.Long.fromBits(0, 0, false) : 0;
+            /**
+             * DocumentStatusObject sealHash.
+             * @member {Uint8Array} sealHash
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @instance
+             */
+            DocumentStatusObject.prototype.sealHash = $util.newBuffer([]);
+            /**
+             * Creates a new DocumentStatusObject instance using the specified properties.
+             * @function create
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {vereign.statuses.IDocumentStatusObject=} [properties] Properties to set
+             * @returns {vereign.statuses.DocumentStatusObject} DocumentStatusObject instance
+             */
+            DocumentStatusObject.create = function create(properties) {
+                return new DocumentStatusObject(properties);
+            };
+            /**
+             * Encodes the specified DocumentStatusObject message. Does not implicitly {@link vereign.statuses.DocumentStatusObject.verify|verify} messages.
+             * @function encode
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {vereign.statuses.IDocumentStatusObject} message DocumentStatusObject message or plain object to encode
+             * @param {$protobuf.Writer} [writer] Writer to encode to
+             * @returns {$protobuf.Writer} Writer
+             */
+            DocumentStatusObject.encode = function encode(message, writer) {
+                if (!writer)
+                    writer = $Writer.create();
+                if (message.timestamp != null && Object.hasOwnProperty.call(message, "timestamp"))
+                    writer.uint32(/* id 1, wireType 0 =*/ 8).int64(message.timestamp);
+                if (message.sealHash != null && Object.hasOwnProperty.call(message, "sealHash"))
+                    writer.uint32(/* id 2, wireType 2 =*/ 18).bytes(message.sealHash);
+                return writer;
+            };
+            /**
+             * Encodes the specified DocumentStatusObject message, length delimited. Does not implicitly {@link vereign.statuses.DocumentStatusObject.verify|verify} messages.
+             * @function encodeDelimited
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {vereign.statuses.IDocumentStatusObject} message DocumentStatusObject message or plain object to encode
+             * @param {$protobuf.Writer} [writer] Writer to encode to
+             * @returns {$protobuf.Writer} Writer
+             */
+            DocumentStatusObject.encodeDelimited = function encodeDelimited(message, writer) {
+                return this.encode(message, writer).ldelim();
+            };
+            /**
+             * Decodes a DocumentStatusObject message from the specified reader or buffer.
+             * @function decode
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+             * @param {number} [length] Message length if known beforehand
+             * @returns {vereign.statuses.DocumentStatusObject} DocumentStatusObject
+             * @throws {Error} If the payload is not a reader or valid buffer
+             * @throws {$protobuf.util.ProtocolError} If required fields are missing
+             */
+            DocumentStatusObject.decode = function decode(reader, length) {
+                if (!(reader instanceof $Reader))
+                    reader = $Reader.create(reader);
+                var end = length === undefined ? reader.len : reader.pos + length, message = new $root.vereign.statuses.DocumentStatusObject();
+                while (reader.pos < end) {
+                    var tag = reader.uint32();
+                    switch (tag >>> 3) {
+                        case 1:
+                            message.timestamp = reader.int64();
+                            break;
+                        case 2:
+                            message.sealHash = reader.bytes();
+                            break;
+                        default:
+                            reader.skipType(tag & 7);
+                            break;
+                    }
+                }
+                return message;
+            };
+            /**
+             * Decodes a DocumentStatusObject message from the specified reader or buffer, length delimited.
+             * @function decodeDelimited
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from
+             * @returns {vereign.statuses.DocumentStatusObject} DocumentStatusObject
+             * @throws {Error} If the payload is not a reader or valid buffer
+             * @throws {$protobuf.util.ProtocolError} If required fields are missing
+             */
+            DocumentStatusObject.decodeDelimited = function decodeDelimited(reader) {
+                if (!(reader instanceof $Reader))
+                    reader = new $Reader(reader);
+                return this.decode(reader, reader.uint32());
+            };
+            /**
+             * Verifies a DocumentStatusObject message.
+             * @function verify
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {Object.<string,*>} message Plain object to verify
+             * @returns {string|null} `null` if valid, otherwise the reason why it is not
+             */
+            DocumentStatusObject.verify = function verify(message) {
+                if (typeof message !== "object" || message === null)
+                    return "object expected";
+                if (message.timestamp != null && message.hasOwnProperty("timestamp"))
+                    if (!$util.isInteger(message.timestamp) && !(message.timestamp && $util.isInteger(message.timestamp.low) && $util.isInteger(message.timestamp.high)))
+                        return "timestamp: integer|Long expected";
+                if (message.sealHash != null && message.hasOwnProperty("sealHash"))
+                    if (!(message.sealHash && typeof message.sealHash.length === "number" || $util.isString(message.sealHash)))
+                        return "sealHash: buffer expected";
+                return null;
+            };
+            /**
+             * Creates a DocumentStatusObject message from a plain object. Also converts values to their respective internal types.
+             * @function fromObject
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {Object.<string,*>} object Plain object
+             * @returns {vereign.statuses.DocumentStatusObject} DocumentStatusObject
+             */
+            DocumentStatusObject.fromObject = function fromObject(object) {
+                if (object instanceof $root.vereign.statuses.DocumentStatusObject)
+                    return object;
+                var message = new $root.vereign.statuses.DocumentStatusObject();
+                if (object.timestamp != null)
+                    if ($util.Long)
+                        (message.timestamp = $util.Long.fromValue(object.timestamp)).unsigned = false;
+                    else if (typeof object.timestamp === "string")
+                        message.timestamp = parseInt(object.timestamp, 10);
+                    else if (typeof object.timestamp === "number")
+                        message.timestamp = object.timestamp;
+                    else if (typeof object.timestamp === "object")
+                        message.timestamp = new $util.LongBits(object.timestamp.low >>> 0, object.timestamp.high >>> 0).toNumber();
+                if (object.sealHash != null)
+                    if (typeof object.sealHash === "string")
+                        $util.base64.decode(object.sealHash, message.sealHash = $util.newBuffer($util.base64.length(object.sealHash)), 0);
+                    else if (object.sealHash.length)
+                        message.sealHash = object.sealHash;
+                return message;
+            };
+            /**
+             * Creates a plain object from a DocumentStatusObject message. Also converts values to other types if specified.
+             * @function toObject
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @static
+             * @param {vereign.statuses.DocumentStatusObject} message DocumentStatusObject
+             * @param {$protobuf.IConversionOptions} [options] Conversion options
+             * @returns {Object.<string,*>} Plain object
+             */
+            DocumentStatusObject.toObject = function toObject(message, options) {
+                if (!options)
+                    options = {};
+                var object = {};
+                if (options.defaults) {
+                    if ($util.Long) {
+                        var long = new $util.Long(0, 0, false);
+                        object.timestamp = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long;
+                    }
+                    else
+                        object.timestamp = options.longs === String ? "0" : 0;
+                    if (options.bytes === String)
+                        object.sealHash = "";
+                    else {
+                        object.sealHash = [];
+                        if (options.bytes !== Array)
+                            object.sealHash = $util.newBuffer(object.sealHash);
+                    }
+                }
+                if (message.timestamp != null && message.hasOwnProperty("timestamp"))
+                    if (typeof message.timestamp === "number")
+                        object.timestamp = options.longs === String ? String(message.timestamp) : message.timestamp;
+                    else
+                        object.timestamp = options.longs === String ? $util.Long.prototype.toString.call(message.timestamp) : options.longs === Number ? new $util.LongBits(message.timestamp.low >>> 0, message.timestamp.high >>> 0).toNumber() : message.timestamp;
+                if (message.sealHash != null && message.hasOwnProperty("sealHash"))
+                    object.sealHash = options.bytes === String ? $util.base64.encode(message.sealHash, 0, message.sealHash.length) : options.bytes === Array ? Array.prototype.slice.call(message.sealHash) : message.sealHash;
+                return object;
+            };
+            /**
+             * Converts this DocumentStatusObject to JSON.
+             * @function toJSON
+             * @memberof vereign.statuses.DocumentStatusObject
+             * @instance
+             * @returns {Object.<string,*>} JSON object
+             */
+            DocumentStatusObject.prototype.toJSON = function toJSON() {
+                return this.constructor.toObject(this, $protobuf.util.toJSONOptions);
+            };
+            return DocumentStatusObject;
+        })();
         return statuses;
     })();
     return vereign;
diff --git a/dist/services/AeternityService/AeternityService.d.ts b/dist/services/AeternityService/AeternityService.d.ts
index 25dfedce056d947df3f3b81bb53a4868e3182da8..d4ba4a5f13da8d1b17e7c1dbad06f8e0f247defd 100644
--- a/dist/services/AeternityService/AeternityService.d.ts
+++ b/dist/services/AeternityService/AeternityService.d.ts
@@ -1,13 +1,15 @@
 import { TxData, DecodedCallData } from "../../types";
 import { Request } from "../../utils/requestAdapter";
+import { AeternityAPIBlockData } from "./types";
 declare class AeternityService {
     readonly _nodeUrls: any[];
     readonly _compilerUrls: any[];
     readonly _contractBytecode: string;
+    readonly _blockHeightStep: number;
     requestWrapper: Request;
     readonly requestNode: Request;
     readonly requestCompiler: Request;
-    constructor(nodeUrls: string[] | string, compilerUrls: string[] | string, contractBytecode: string);
+    constructor(nodeUrls: string[] | string, compilerUrls: string[] | string, contractBytecode: string, blockHeightStep?: number);
     /**
      * Function provides retry mechanism if node from the array is failing to respond
      * @param apiUrls
@@ -26,5 +28,6 @@ declare class AeternityService {
         hash: string;
     }>;
     getBlockchainHeight(): Promise<number>;
+    getBlockHeightRange(startingBlock: number): Promise<Array<AeternityAPIBlockData>>;
 }
 export default AeternityService;
diff --git a/dist/services/AeternityService/AeternityService.js b/dist/services/AeternityService/AeternityService.js
index 898caa877020eef43542b7ed29773b9180d9ccd3..c10616122863cd87e2ad7a25e549ed69d0427d71 100644
--- a/dist/services/AeternityService/AeternityService.js
+++ b/dist/services/AeternityService/AeternityService.js
@@ -14,7 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
 Object.defineProperty(exports, "__esModule", { value: true });
 const requestAdapter_1 = __importDefault(require("../../utils/requestAdapter"));
 class AeternityService {
-    constructor(nodeUrls, compilerUrls, contractBytecode) {
+    constructor(nodeUrls, compilerUrls, contractBytecode, blockHeightStep) {
         this._nodeUrls = [];
         this._compilerUrls = [];
         this._contractBytecode = "";
@@ -65,6 +65,8 @@ class AeternityService {
         if (!contractBytecode) {
             throw new Error("Aeternity contract bytecode not defined");
         }
+        //Default value for block height step is 2, based on tests
+        this._blockHeightStep = typeof blockHeightStep === "number" ? blockHeightStep : 2;
         this._nodeUrls = typeof nodeUrls === "string" ? [nodeUrls] : nodeUrls;
         this._compilerUrls =
             typeof compilerUrls === "string" ? [compilerUrls] : compilerUrls;
@@ -139,5 +141,13 @@ class AeternityService {
             return data.height;
         });
     }
+    getBlockHeightRange(startingBlock) {
+        return __awaiter(this, void 0, void 0, function* () {
+            const endBlockHeight = startingBlock + this._blockHeightStep;
+            const { data } = yield this.requestNode({ url: `/mdw/v2/blocks?scope=gen${startingBlock}-${endBlockHeight}` })
+                .then(({ data }) => data);
+            return data;
+        });
+    }
 }
 exports.default = AeternityService;
diff --git a/dist/services/AeternityService/types.d.ts b/dist/services/AeternityService/types.d.ts
index 5774a08efbc4925818b96cb6b04e5e0e78f83698..4e618642ed4b961cd1a1aeb1f077cc9ba85bf5af 100644
--- a/dist/services/AeternityService/types.d.ts
+++ b/dist/services/AeternityService/types.d.ts
@@ -1,15 +1,50 @@
 export interface AeternityAPITxData {
+    "block_hash": string;
+    "block_height": number;
+    "hash": string;
+    "signatures": Array<string>;
+    "tx": {
+        "abi_version": number;
+        "amount": number;
+        "call_data": string;
+        "caller_id": string;
+        "contract_id": string;
+        "fee": number;
+        "gas": number;
+        "gas_price": number;
+        "nonce": number;
+        "type": string;
+        "version": number;
+    };
+}
+export interface AeternityAPIMicroBLock {
     hash: string;
-    block_height: number;
-    block_hash: string;
-    tx: {
-        call_data: string;
+    height: number;
+    pof_hash: string;
+    prev_hash: string;
+    prev_key_hash: string;
+    signature: string;
+    state_hash: string;
+    time: number;
+    transactions: {
+        [key: string]: AeternityAPITxData;
     };
 }
 export interface AeternityAPIBlockData {
+    beneficiary: string;
+    hash: string;
     height: number;
+    info: string;
+    microBlock: Array<AeternityAPIMicroBLock>;
+    miner: string;
+    nonce: number;
+    pow: Array<number>;
+    prev_hash: string;
+    prev_key_hash: string;
+    state_hash: string;
+    target: number;
     time: number;
-    hash: string;
+    version: number;
 }
 export interface AeternityAPICurrentHeight {
     height: number;
@@ -30,3 +65,6 @@ export interface AeternityAPIContractData {
         }
     ];
 }
+export interface AeternityAPIBlockRange {
+    data: Array<AeternityAPIBlockData>;
+}
diff --git a/dist/services/CryptoService/CryptoServiceNode.d.ts b/dist/services/CryptoService/CryptoServiceNode.d.ts
index 9b91b3caabc22a7c3cd53dabfb017c040546a537..882cbc3426402696ae2dfac619dcbdf9ab204e03 100644
--- a/dist/services/CryptoService/CryptoServiceNode.d.ts
+++ b/dist/services/CryptoService/CryptoServiceNode.d.ts
@@ -1,8 +1,8 @@
 /// <reference types="node" />
 import { AESGCMOutput, RSAKeys, ICryptoService } from "./ICryptoService";
 declare class CryptoServiceNode implements ICryptoService {
-    encryptAESGCM(data: string): Promise<AESGCMOutput>;
-    encryptAESGCM(data: ArrayBuffer): Promise<AESGCMOutput>;
+    encryptAESGCM(data: string, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
+    encryptAESGCM(data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
     decryptAESGCM(data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>;
     decryptAESGCM(data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, returnBuffer: true): Promise<ArrayBuffer>;
     generateRSAKeys(): Promise<RSAKeys>;
diff --git a/dist/services/CryptoService/CryptoServiceNode.js b/dist/services/CryptoService/CryptoServiceNode.js
index f789e304e709d2a7f8862a7f6d358e83b8b79f9c..85eef9eb2e5510f8604bd45ab1da5a6b7074d434 100644
--- a/dist/services/CryptoService/CryptoServiceNode.js
+++ b/dist/services/CryptoService/CryptoServiceNode.js
@@ -48,10 +48,12 @@ const getBytes = (value, encoding) => {
     return bytes;
 };
 class CryptoServiceNode {
-    encryptAESGCM(data) {
+    encryptAESGCM(data, key, iv) {
         return __awaiter(this, void 0, void 0, function* () {
-            const key = crypto.randomBytes(32);
-            const iv = crypto.randomBytes(12);
+            if (!key && !iv) {
+                key = crypto.randomBytes(32);
+                iv = crypto.randomBytes(12);
+            }
             const cipher = crypto.createCipheriv(AES_GCM_ALGO, key, iv);
             let encrypted;
             if (typeof data === "string") {
@@ -67,8 +69,8 @@ class CryptoServiceNode {
                 Buffer.from(authTag),
             ]);
             return {
-                key: key.buffer,
-                iv: iv.buffer,
+                key: key,
+                iv: iv,
                 data: encryptedWithTag,
             };
         });
diff --git a/dist/services/CryptoService/CryptoServiceWeb.d.ts b/dist/services/CryptoService/CryptoServiceWeb.d.ts
index 3ab743beca0bad3313a4e703de3d659fcd3aaa02..3db528f5803cc287e7b19ec07847f8765a940306 100644
--- a/dist/services/CryptoService/CryptoServiceWeb.d.ts
+++ b/dist/services/CryptoService/CryptoServiceWeb.d.ts
@@ -1,7 +1,8 @@
+/// <reference types="node" />
 import { AESGCMOutput, ICryptoService, RSAKeys } from "./ICryptoService";
 declare class CryptoServiceWeb implements ICryptoService {
-    encryptAESGCM(data: string): Promise<AESGCMOutput>;
-    encryptAESGCM(data: ArrayBuffer): Promise<AESGCMOutput>;
+    encryptAESGCM(data: string, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
+    encryptAESGCM(data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
     decryptAESGCM(data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>;
     decryptAESGCM(data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer, returnBuffer: true): Promise<ArrayBuffer>;
     verifyRSASignature(publicKeyPEM: string, data: ArrayBuffer, signature: ArrayBuffer): Promise<boolean>;
diff --git a/dist/services/CryptoService/CryptoServiceWeb.js b/dist/services/CryptoService/CryptoServiceWeb.js
index be96a6ee078c2a019054b85e3bf832e26ede3620..04fd945b66b6f3637c493600d63b1d7983f42c98 100644
--- a/dist/services/CryptoService/CryptoServiceWeb.js
+++ b/dist/services/CryptoService/CryptoServiceWeb.js
@@ -48,12 +48,23 @@ const getBytes = (value, encoding) => {
     return bytes;
 };
 class CryptoServiceWeb {
-    encryptAESGCM(data) {
+    encryptAESGCM(data, key, iv) {
         return __awaiter(this, void 0, void 0, function* () {
-            const key = yield crypto.subtle.generateKey({
-                name: "AES-GCM",
-                length: 256,
-            }, true, ["encrypt", "decrypt"]);
+            if (!key && !iv) {
+                key = yield crypto.subtle.generateKey({
+                    name: "AES-GCM",
+                    length: 256,
+                }, true, ["encrypt", "decrypt"]);
+                iv = crypto.getRandomValues(new Buffer(12));
+            }
+            else {
+                if (key instanceof Buffer) {
+                    key = yield crypto.subtle.importKey("raw", key, "AES-GCM", true, [
+                        "encrypt",
+                        "decrypt",
+                    ]);
+                }
+            }
             let encoded;
             if (typeof data === "string") {
                 encoded = new TextEncoder().encode(data);
@@ -61,7 +72,6 @@ class CryptoServiceWeb {
             else {
                 encoded = data;
             }
-            const iv = crypto.getRandomValues(new Buffer(12));
             const encrypted = yield crypto.subtle.encrypt({ name: "AES-GCM", iv: iv }, key, encoded);
             return { data: encrypted, key: yield exportKey(key), iv };
         });
diff --git a/dist/services/CryptoService/ICryptoService.d.ts b/dist/services/CryptoService/ICryptoService.d.ts
index 24dfcd1294c69e9cb0ef9035e48651b8936c8d28..8193da99eafb83c2f4e8268ee450a6cd5b3ad7a7 100644
--- a/dist/services/CryptoService/ICryptoService.d.ts
+++ b/dist/services/CryptoService/ICryptoService.d.ts
@@ -1,3 +1,4 @@
+/// <reference types="node" />
 export interface AESGCMOutput {
     data: ArrayBuffer;
     key: ArrayBuffer;
@@ -9,8 +10,8 @@ export interface RSAKeys {
 }
 export interface ICryptoService {
     encryptAESGCM: {
-        (data: string): Promise<AESGCMOutput>;
-        (data: ArrayBuffer): Promise<AESGCMOutput>;
+        (data: string, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
+        (data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
     };
     decryptAESGCM: {
         (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>;
diff --git a/dist/services/QrCodeDataService.d.ts b/dist/services/QrCodeDataService.d.ts
index 1babbf049d295d8854ecdcda67ad720e4fc8a1b0..32ddcbe4fe61a7e6d2eab0394a8b36b4ab783882 100644
--- a/dist/services/QrCodeDataService.d.ts
+++ b/dist/services/QrCodeDataService.d.ts
@@ -1,5 +1,11 @@
-import { KeyDataPair, MessageData } from "../types";
+import { KeyDataPair, MessageData, DocumentData, SealHeadData, SealIndexObject } from "../types";
 declare const _default: {
+    encodeSealHead: (sealHeadData: SealHeadData) => string;
+    decodeSealHead: (binary: string | ArrayBuffer | Uint8Array) => SealHeadData;
+    encodeSealIndexObject: (indexObjectData: SealIndexObject) => string;
+    decodeSealIndexObject: (binary: string | ArrayBuffer | Uint8Array) => SealIndexObject;
+    encodeDocumentData: (documentData: DocumentData) => string;
+    decodeDocumentData: (binary: string | ArrayBuffer | Uint8Array) => DocumentData;
     encodeEmailData: (emailData: MessageData) => string;
     decodeEmailData: (binary: string | ArrayBuffer | Uint8Array) => MessageData;
     encodeKeyDataPair: (keyData: KeyDataPair) => string;
diff --git a/dist/services/QrCodeDataService.js b/dist/services/QrCodeDataService.js
index 1c668db6c7598507da2882538839fcad47506bd2..e455fdbffe0ab5e27d5ced6bb60873a6943bfd4d 100644
--- a/dist/services/QrCodeDataService.js
+++ b/dist/services/QrCodeDataService.js
@@ -12,10 +12,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
 const qrcode_data_pb_1 = require("../generated/qrcode_data_pb");
 const common_1 = require("../utils/common");
 const index_1 = require("../index");
+const DocumentDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.DocumentData_V1;
 const EmailDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.EmailData_V1;
 const KeyDataMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.KeyData_V1;
 const WrapperDataMessage = qrcode_data_pb_1.vereign.protobuf.qrcode_data.WrapperData;
+const SealIndexObjectMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.SealIndexObject_V1;
+const SealHeadMessageV1 = qrcode_data_pb_1.vereign.protobuf.qrcode_data.SealDocumentHeadData_V1;
 const EMAIL_DATA_V1 = "EmailData_V1";
+const DOCUMENT_DATA_V1 = "DocumentData_V1";
 const encodeEmailData = (emailData) => {
     const emailDataMessage = EmailDataMessageV1.fromObject(emailData);
     const emailDataBuffer = EmailDataMessageV1.encode(emailDataMessage).finish();
@@ -83,7 +87,59 @@ const verifyQrCodeSignature = (publicKey, qrCodeSignature, recipientQRCodeHash)
     const result = yield index_1.CryptoService.verifyRSASignature(publicKey, recipientQRCodeHashAsBuffer, qrCodeSignatureAsBuffer);
     return result;
 });
+const decodeDocumentData = (binary) => {
+    const wrappedDataMessage = WrapperDataMessage.decode((0, common_1.ensureUint8Array)(binary));
+    const wrappedData = WrapperDataMessage.toObject(wrappedDataMessage);
+    if (wrappedData.className === DOCUMENT_DATA_V1) {
+        const documentDataMessage = DocumentDataMessageV1.decode((0, common_1.ensureUint8Array)(wrappedData.data));
+        const messageData = DocumentDataMessageV1.toObject(documentDataMessage, {
+            bytes: String,
+        });
+        return messageData;
+    }
+    return null;
+};
+const encodeDocumentData = (documentData) => {
+    const documentDataMessage = DocumentDataMessageV1.fromObject(documentData);
+    const documentDataBuffer = DocumentDataMessageV1.encode(documentDataMessage).finish();
+    const wrappedData = {
+        version: 1,
+        className: DOCUMENT_DATA_V1,
+        data: documentDataBuffer,
+    };
+    const wrappedDataMessage = WrapperDataMessage.fromObject(wrappedData);
+    const wrappedDataBuffer = WrapperDataMessage.encode(wrappedDataMessage).finish();
+    return (0, common_1.arrayBufferToBase64)(wrappedDataBuffer);
+};
+const encodeSealHead = (sealHeadData) => {
+    const sealHeadDataMessage = SealHeadMessageV1.fromObject(sealHeadData);
+    const buffer = SealHeadMessageV1.encode(sealHeadDataMessage).finish();
+    return (0, common_1.arrayBufferToBase64)(buffer);
+};
+const decodeSealHead = (binary) => {
+    const sealHeadDataMessage = SealHeadMessageV1.decode((0, common_1.ensureUint8Array)(binary));
+    return SealHeadMessageV1.toObject(sealHeadDataMessage, {
+        bytes: String,
+    });
+};
+const encodeSealIndexObject = (indexObjectData) => {
+    const sealIndexDataMessage = SealIndexObjectMessageV1.fromObject(indexObjectData);
+    const buffer = SealIndexObjectMessageV1.encode(sealIndexDataMessage).finish();
+    return (0, common_1.arrayBufferToBase64)(buffer);
+};
+const decodeSealIndexObject = (binary) => {
+    const sealIndexDataMessage = SealIndexObjectMessageV1.decode((0, common_1.ensureUint8Array)(binary));
+    return SealIndexObjectMessageV1.toObject(sealIndexDataMessage, {
+        bytes: String,
+    });
+};
 exports.default = {
+    encodeSealHead,
+    decodeSealHead,
+    encodeSealIndexObject,
+    decodeSealIndexObject,
+    encodeDocumentData,
+    decodeDocumentData,
     encodeEmailData,
     decodeEmailData,
     encodeKeyDataPair,
diff --git a/dist/types.d.ts b/dist/types.d.ts
index e346f229980231919afc52f9b8194e0af5367087..71dbbf0daf509ec50beda35c1db5b57c5a6b1577 100644
--- a/dist/types.d.ts
+++ b/dist/types.d.ts
@@ -16,6 +16,12 @@ export interface IpfsContentData {
     key: string;
     head: string;
 }
+export interface IpfsDocumentContentData {
+    head: string;
+    key: string;
+    cid?: string;
+    ipnsKeyId?: string;
+}
 export interface IpfsAttachmentData {
     cid: string;
     key: string;
@@ -135,3 +141,64 @@ export interface KeyDataPair {
     key: string;
     data: string;
 }
+export interface ICert {
+    clientCertificate: boolean;
+    issuedBy: {
+        countryName: string;
+        organizationName: string;
+        commonName: string;
+    };
+    issuedTo: {
+        countryName: string;
+        organizationalUnitName: string;
+        organizationName: string;
+        commonName: string;
+    };
+    validityPeriod: {
+        notBefore: string;
+        notAfter: string;
+    };
+    pemCertificate: string;
+}
+export interface ISignature {
+    isExpired: boolean;
+    meta: {
+        certs: Array<ICert>;
+        reason: string;
+        contactInfo: string;
+        location: string;
+        signDate: string;
+    };
+}
+export interface DocumentData {
+    author: string;
+    documentTitle: string;
+    creationDate: string;
+    lastModDate: string;
+    documentPages: number;
+    expired?: boolean;
+    signatures?: Array<ISignature>;
+    ipfs?: IpfsDocumentContentData;
+}
+export interface DocumentStatusObject {
+    timestamp: number;
+    sealHash: string;
+}
+export interface SealHeadData {
+    key: string;
+    data: string;
+    ipfsIndexCid: string;
+}
+export interface SealCoords {
+    [key: string]: {
+        x: string;
+        y: string;
+    };
+}
+export interface SealIndexObject {
+    sealKey: string;
+    sealTailCid: string;
+    chain: string;
+    currentBlockHeight: number;
+    accountId: string;
+}
diff --git a/src/services/AeternityService/AeternityService.ts b/src/services/AeternityService/AeternityService.ts
index d9fae929170ff253544bd5647bcdf275b39a7e52..2d9ef1aad269779e68be4da1824331ed04f53e0c 100644
--- a/src/services/AeternityService/AeternityService.ts
+++ b/src/services/AeternityService/AeternityService.ts
@@ -5,12 +5,14 @@ import {
   AeternityAPICurrentHeight,
   AeternityAPIContractData,
   AeternityAPITxData,
+  AeternityAPIBlockRange,
 } from "./types";
 
 class AeternityService {
   readonly _nodeUrls = [];
   readonly _compilerUrls = [];
   readonly _contractBytecode: string = "";
+  readonly _blockHeightStep: number;
 
   public requestWrapper: Request = defaultRequest;
 
@@ -20,7 +22,8 @@ class AeternityService {
   constructor(
     nodeUrls: string[] | string,
     compilerUrls: string[] | string,
-    contractBytecode: string
+    contractBytecode: string,
+    blockHeightStep?: number
   ) {
     if (!nodeUrls?.length) {
       throw new Error("Invalid node URLs");
@@ -34,6 +37,9 @@ class AeternityService {
       throw new Error("Aeternity contract bytecode not defined");
     }
 
+    //Default value for block height step is 2, based on tests
+    this._blockHeightStep =
+      typeof blockHeightStep === "number" ? blockHeightStep : 2;
     this._nodeUrls = typeof nodeUrls === "string" ? [nodeUrls] : nodeUrls;
     this._compilerUrls =
       typeof compilerUrls === "string" ? [compilerUrls] : compilerUrls;
@@ -152,6 +158,17 @@ class AeternityService {
     })) as Response<AeternityAPICurrentHeight>;
     return data.height;
   }
+
+  async getBlockHeightRange(
+    startingBlock: number
+  ): Promise<Array<AeternityAPIBlockData>> {
+    const endBlockHeight = startingBlock + this._blockHeightStep;
+    const { data } = await this.requestNode({
+      url: `/mdw/v2/blocks?scope=gen${startingBlock}-${endBlockHeight}`,
+    }).then(({ data }: Response<AeternityAPIBlockRange>) => data);
+
+    return data;
+  }
 }
 
 export default AeternityService;
diff --git a/src/services/AeternityService/types.ts b/src/services/AeternityService/types.ts
index c95b4ed45fa8ea39c459a12c8842005ae53ced40..21b69414448ab91f5b4125da36e9183c218215e8 100644
--- a/src/services/AeternityService/types.ts
+++ b/src/services/AeternityService/types.ts
@@ -1,16 +1,50 @@
 export interface AeternityAPITxData {
-  hash: string;
-  block_height: number;
   block_hash: string;
+  block_height: number;
+  hash: string;
+  signatures: Array<string>;
   tx: {
+    abi_version: number;
+    amount: number;
     call_data: string;
+    caller_id: string;
+    contract_id: string;
+    fee: number;
+    gas: number;
+    gas_price: number;
+    nonce: number;
+    type: string;
+    version: number;
   };
 }
 
-export interface AeternityAPIBlockData {
+export interface AeternityAPIMicroBLock {
+  hash: string;
   height: number;
+  pof_hash: string;
+  prev_hash: string;
+  prev_key_hash: string;
+  signature: string;
+  state_hash: string;
   time: number;
+  transactions: { [key: string]: AeternityAPITxData };
+}
+
+export interface AeternityAPIBlockData {
+  beneficiary: string;
   hash: string;
+  height: number;
+  info: string;
+  microBlock: Array<AeternityAPIMicroBLock>;
+  miner: string;
+  nonce: number;
+  pow: Array<number>;
+  prev_hash: string;
+  prev_key_hash: string;
+  state_hash: string;
+  target: number;
+  time: number;
+  version: number;
 }
 
 export interface AeternityAPICurrentHeight {
@@ -29,3 +63,7 @@ export interface AeternityAPIContractData {
     }
   ];
 }
+
+export interface AeternityAPIBlockRange {
+  data: Array<AeternityAPIBlockData>;
+}
diff --git a/src/services/CryptoService/CryptoServiceNode.ts b/src/services/CryptoService/CryptoServiceNode.ts
index c98ecf2187558d3e30df438d1601e3ed6de46d41..addea23b55e26241494508ceb452d7ee9621bbdb 100644
--- a/src/services/CryptoService/CryptoServiceNode.ts
+++ b/src/services/CryptoService/CryptoServiceNode.ts
@@ -23,13 +23,26 @@ const getBytes = (
 };
 
 class CryptoServiceNode implements ICryptoService {
-  public async encryptAESGCM(data: string): Promise<AESGCMOutput>;
-  public async encryptAESGCM(data: ArrayBuffer): Promise<AESGCMOutput>;
   public async encryptAESGCM(
-    data: string | ArrayBuffer
+    data: string,
+    key?: Buffer,
+    iv?: Buffer
+  ): Promise<AESGCMOutput>;
+  public async encryptAESGCM(
+    data: ArrayBuffer,
+    key?: Buffer,
+    iv?: Buffer
+  ): Promise<AESGCMOutput>;
+  public async encryptAESGCM(
+    data: string | ArrayBuffer,
+    key?: Buffer,
+    iv?: Buffer
   ): Promise<AESGCMOutput> {
-    const key = crypto.randomBytes(32);
-    const iv = crypto.randomBytes(12);
+    if (!key && !iv) {
+      key = crypto.randomBytes(32);
+      iv = crypto.randomBytes(12);
+    }
+
     const cipher = crypto.createCipheriv(AES_GCM_ALGO, key, iv);
 
     let encrypted;
@@ -41,14 +54,15 @@ class CryptoServiceNode implements ICryptoService {
     cipher.final();
 
     const authTag = cipher.getAuthTag();
+
     const encryptedWithTag = Buffer.concat([
       Buffer.from(encrypted),
       Buffer.from(authTag),
     ]);
 
     return {
-      key: key.buffer,
-      iv: iv.buffer,
+      key: key,
+      iv: iv,
       data: encryptedWithTag,
     };
   }
@@ -77,6 +91,7 @@ class CryptoServiceNode implements ICryptoService {
     );
 
     const authTag = data.slice(data.byteLength - 16, data.byteLength);
+
     const encrypted = data.slice(0, data.byteLength - 16);
     if (returnBuffer) {
       const decrypted: Buffer = decipher.update(ensureUint8Array(encrypted));
diff --git a/src/services/CryptoService/CryptoServiceWeb.ts b/src/services/CryptoService/CryptoServiceWeb.ts
index 06534df3aa1ac55180bc501d73b5ee30718fc55d..b11809e18f7303c1556bcd5fc4e89a702f5bf92f 100644
--- a/src/services/CryptoService/CryptoServiceWeb.ts
+++ b/src/services/CryptoService/CryptoServiceWeb.ts
@@ -39,19 +39,40 @@ const getBytes = (value: string | ArrayBuffer, encoding): ArrayBuffer => {
 };
 
 class CryptoServiceWeb implements ICryptoService {
-  public async encryptAESGCM(data: string): Promise<AESGCMOutput>;
-  public async encryptAESGCM(data: ArrayBuffer): Promise<AESGCMOutput>;
   public async encryptAESGCM(
-    data: string | ArrayBuffer
+    data: string,
+    key?: Buffer,
+    iv?: Buffer
+  ): Promise<AESGCMOutput>;
+  public async encryptAESGCM(
+    data: ArrayBuffer,
+    key?: Buffer,
+    iv?: Buffer
+  ): Promise<AESGCMOutput>;
+  public async encryptAESGCM(
+    data: string | ArrayBuffer,
+    key?: Buffer | CryptoKey,
+    iv?: Buffer
   ): Promise<AESGCMOutput> {
-    const key = await crypto.subtle.generateKey(
-      {
-        name: "AES-GCM",
-        length: 256,
-      },
-      true,
-      ["encrypt", "decrypt"]
-    );
+    if (!key && !iv) {
+      key = await crypto.subtle.generateKey(
+        {
+          name: "AES-GCM",
+          length: 256,
+        },
+        true,
+        ["encrypt", "decrypt"]
+      );
+
+      iv = crypto.getRandomValues(new Buffer(12));
+    } else {
+      if (key instanceof Buffer) {
+        key = await crypto.subtle.importKey("raw", key, "AES-GCM", true, [
+          "encrypt",
+          "decrypt",
+        ]);
+      }
+    }
 
     let encoded;
     if (typeof data === "string") {
@@ -59,7 +80,7 @@ class CryptoServiceWeb implements ICryptoService {
     } else {
       encoded = data;
     }
-    const iv = crypto.getRandomValues(new Buffer(12));
+
     const encrypted = await crypto.subtle.encrypt(
       { name: "AES-GCM", iv: iv },
       key,
diff --git a/src/services/CryptoService/ICryptoService.ts b/src/services/CryptoService/ICryptoService.ts
index 0dfd66a86ab28a6a4fe1a2138a78628f18c20a06..d0d4dc9da01090ed6bd4e217829bd13dfdeb828a 100644
--- a/src/services/CryptoService/ICryptoService.ts
+++ b/src/services/CryptoService/ICryptoService.ts
@@ -11,8 +11,8 @@ export interface RSAKeys {
 
 export interface ICryptoService {
   encryptAESGCM: {
-    (data: string): Promise<AESGCMOutput>;
-    (data: ArrayBuffer): Promise<AESGCMOutput>;
+    (data: string, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
+    (data: ArrayBuffer, key?: Buffer, iv?: Buffer): Promise<AESGCMOutput>;
   };
   decryptAESGCM: {
     (data: ArrayBuffer, key: ArrayBuffer, iv: ArrayBuffer): Promise<string>;
diff --git a/src/services/QrCodeDataService.ts b/src/services/QrCodeDataService.ts
index 03bc827ef1452d97d5059839e28c31167d668879..61671350bd2355f51ad5ae6a9f0d94967333da42 100644
--- a/src/services/QrCodeDataService.ts
+++ b/src/services/QrCodeDataService.ts
@@ -1,4 +1,10 @@
-import { KeyDataPair, MessageData } from "../types";
+import {
+  KeyDataPair,
+  MessageData,
+  DocumentData,
+  SealHeadData,
+  SealIndexObject,
+} from "../types";
 import { vereign } from "../generated/qrcode_data_pb";
 
 import {
@@ -9,11 +15,16 @@ import {
 
 import { CryptoService } from "../index";
 
+const DocumentDataMessageV1 = vereign.protobuf.qrcode_data.DocumentData_V1;
 const EmailDataMessageV1 = vereign.protobuf.qrcode_data.EmailData_V1;
 const KeyDataMessageV1 = vereign.protobuf.qrcode_data.KeyData_V1;
 const WrapperDataMessage = vereign.protobuf.qrcode_data.WrapperData;
+const SealIndexObjectMessageV1 =
+  vereign.protobuf.qrcode_data.SealIndexObject_V1;
+const SealHeadMessageV1 = vereign.protobuf.qrcode_data.SealDocumentHeadData_V1;
 
 const EMAIL_DATA_V1 = "EmailData_V1";
+const DOCUMENT_DATA_V1 = "DocumentData_V1";
 
 interface WrappedData {
   version: number;
@@ -133,7 +144,94 @@ const verifyQrCodeSignature = async (
   return result;
 };
 
+const decodeDocumentData = (
+  binary: string | Uint8Array | ArrayBuffer
+): DocumentData => {
+  const wrappedDataMessage = WrapperDataMessage.decode(
+    ensureUint8Array(binary)
+  );
+  const wrappedData = WrapperDataMessage.toObject(
+    wrappedDataMessage
+  ) as WrappedData;
+
+  if (wrappedData.className === DOCUMENT_DATA_V1) {
+    const documentDataMessage = DocumentDataMessageV1.decode(
+      ensureUint8Array(wrappedData.data)
+    );
+
+    const messageData = DocumentDataMessageV1.toObject(documentDataMessage, {
+      bytes: String,
+    }) as DocumentData;
+
+    return messageData;
+  }
+
+  return null;
+};
+
+const encodeDocumentData = (documentData: DocumentData): string => {
+  const documentDataMessage = DocumentDataMessageV1.fromObject(documentData);
+  const documentDataBuffer =
+    DocumentDataMessageV1.encode(documentDataMessage).finish();
+
+  const wrappedData = {
+    version: 1,
+    className: DOCUMENT_DATA_V1,
+    data: documentDataBuffer,
+  };
+
+  const wrappedDataMessage = WrapperDataMessage.fromObject(wrappedData);
+  const wrappedDataBuffer =
+    WrapperDataMessage.encode(wrappedDataMessage).finish();
+  return arrayBufferToBase64(wrappedDataBuffer);
+};
+
+const encodeSealHead = (sealHeadData: SealHeadData): string => {
+  const sealHeadDataMessage = SealHeadMessageV1.fromObject(sealHeadData);
+  const buffer = SealHeadMessageV1.encode(sealHeadDataMessage).finish();
+
+  return arrayBufferToBase64(buffer);
+};
+
+const decodeSealHead = (
+  binary: string | Uint8Array | ArrayBuffer
+): SealHeadData => {
+  const sealHeadDataMessage = SealHeadMessageV1.decode(
+    ensureUint8Array(binary)
+  );
+
+  return SealHeadMessageV1.toObject(sealHeadDataMessage, {
+    bytes: String,
+  }) as SealHeadData;
+};
+
+const encodeSealIndexObject = (indexObjectData: SealIndexObject): string => {
+  const sealIndexDataMessage =
+    SealIndexObjectMessageV1.fromObject(indexObjectData);
+  const buffer = SealIndexObjectMessageV1.encode(sealIndexDataMessage).finish();
+
+  return arrayBufferToBase64(buffer);
+};
+
+const decodeSealIndexObject = (
+  binary: string | Uint8Array | ArrayBuffer
+): SealIndexObject => {
+  const sealIndexDataMessage = SealIndexObjectMessageV1.decode(
+    ensureUint8Array(binary)
+  );
+
+  return SealIndexObjectMessageV1.toObject(sealIndexDataMessage, {
+    bytes: String,
+  }) as SealIndexObject;
+};
+
 export default {
+  encodeSealHead,
+  decodeSealHead,
+  encodeSealIndexObject,
+  decodeSealIndexObject,
+  encodeDocumentData,
+  decodeDocumentData,
   encodeEmailData,
   decodeEmailData,
   encodeKeyDataPair,
diff --git a/src/types.ts b/src/types.ts
index be29d595d9ee722535f70fa3d72f2ef996aa8e6b..2307df34d176465f43e879a512f30818591afda3 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -20,6 +20,13 @@ export interface IpfsContentData {
   head: string;
 }
 
+export interface IpfsDocumentContentData {
+  head: string;
+  key: string;
+  cid?: string;
+  ipnsKeyId?: string;
+}
+
 export interface IpfsAttachmentData {
   cid: string;
   key: string;
@@ -152,3 +159,68 @@ export interface KeyDataPair {
   key: string;
   data: string;
 }
+
+export interface ICert {
+  clientCertificate: boolean;
+  issuedBy: {
+    countryName: string;
+    organizationName: string;
+    commonName: string;
+  };
+  issuedTo: {
+    countryName: string;
+    organizationalUnitName: string;
+    organizationName: string;
+    commonName: string;
+  };
+  validityPeriod: {
+    notBefore: string;
+    notAfter: string;
+  };
+  pemCertificate: string;
+}
+
+export interface ISignature {
+  isExpired: boolean;
+  meta: {
+    certs: Array<ICert>;
+    reason: string;
+    contactInfo: string;
+    location: string;
+    signDate: string;
+  };
+}
+
+export interface DocumentData {
+  author: string;
+  documentTitle: string;
+  creationDate: string;
+  lastModDate: string;
+  documentPages: number;
+  expired?: boolean;
+  signatures?: Array<ISignature>;
+  ipfs?: IpfsDocumentContentData;
+}
+
+export interface DocumentStatusObject {
+  timestamp: number;
+  sealHash: string;
+}
+
+export interface SealHeadData {
+  key: string;
+  data: string;
+  ipfsIndexCid: string;
+}
+
+export interface SealCoords {
+  [key: string]: { x: string; y: string };
+}
+
+export interface SealIndexObject {
+  sealKey: string;
+  sealTailCid: string;
+  chain: string;
+  currentBlockHeight: number;
+  accountId: string;
+}
diff --git a/statuses-protocol b/statuses-protocol
index e6b969480b7ffa7c4b44448882bbb5459ff2efe6..7eed215ca60a10262c2fe041c6eb4c2612cc24c3 160000
--- a/statuses-protocol
+++ b/statuses-protocol
@@ -1 +1 @@
-Subproject commit e6b969480b7ffa7c4b44448882bbb5459ff2efe6
+Subproject commit 7eed215ca60a10262c2fe041c6eb4c2612cc24c3
diff --git a/vereign/protobuf/qrcode_data.proto b/vereign/protobuf/qrcode_data.proto
index 5e4e07ea749162a28d3b14ffbf75ceb40f5627ae..b46cfba1b13c6b183153c292899e5ff384622364 100644
--- a/vereign/protobuf/qrcode_data.proto
+++ b/vereign/protobuf/qrcode_data.proto
@@ -23,9 +23,10 @@ message Recipients_V1 {
 }
 
 message IpfsContentData_V1 {
-    string cid = 1;
-    string key = 2;
-    string head = 3;
+  string head = 1;
+  string key = 2;
+  string cid = 3;
+  string ipnsKeyId = 4;
 }
 
 message IpfsAttachmentData_V1 {
@@ -64,3 +65,67 @@ message WrapperData {
   int32 version = 2;
   string className = 3;
 }
+
+message CertIssuer {
+  string countryName = 1 ;
+  string organizationName = 2;
+  string commonName = 3;
+}
+
+message CertIssedTo {
+  string countryName = 1;
+  string organizationalUnitName = 2;
+  string organizationName = 3;
+  string commonName = 4;
+}
+
+message CertValidity {
+  string notBefore = 1;
+  string notAfter = 2;
+}
+
+message Cert_V1 {
+  bool clientCertificate = 1;
+  CertIssuer issuedBy = 2;
+  CertIssedTo issuedTo = 3;
+  CertValidity validityPeriod = 4;
+  string pemCertificate = 5;
+}
+
+message SignatureMeta_V1 {
+  repeated Cert_V1 certs = 1;
+  string reason = 2;
+  string contactInfo = 3;
+  string location = 4;
+  string signDate = 5;
+}
+
+message Signature_V1 {
+  bool isExpired = 1;
+  SignatureMeta_V1 meta = 2;
+};
+
+message DocumentData_V1 {
+  string author = 1;
+  string documentTitle = 2;
+  string creationDate = 3;
+  string lastModDate = 4;
+  int32 documentPages = 5;
+  bool expired = 6;
+  repeated Signature_V1 signatures = 7;
+  IpfsContentData_V1 ipfs = 8;
+}
+
+ message SealDocumentHeadData_V1 {
+  bytes key = 1;
+  bytes data = 2;
+  string ipfsIndexCid = 3;
+}
+
+message SealIndexObject_V1 {
+  bytes sealKey = 1;
+  string sealTailCid = 2;
+  string chain = 3;
+  string currentBlockHeight = 4;
+  string accountId = 5;
+}
diff --git a/yarn.lock b/yarn.lock
index 2978c2779dd5067e2d0a46b71bec97aee43a54f9..358eead1d573dbd8322be8ead6fbb666417ac629 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,13 @@
 # yarn lockfile v1
 
 
+"@ampproject/remapping@^2.0.0":
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.1.1.tgz#7922fb0817bf3166d8d9e258c57477e3fd1c3610"
+  integrity sha512-Aolwjd7HSC2PyY0fDj/wA/EimQT4HfEnFYNp5s9CQlrdhyvWTtvZ5YzrUPu6R6/1jKiUlxu8bUhkdSnKHNAHMA==
+  dependencies:
+    "@jridgewell/trace-mapping" "^0.3.0"
+
 "@babel/code-frame@7.12.11":
   version "7.12.11"
   resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f"
@@ -16,38 +23,38 @@
   dependencies:
     "@babel/highlight" "^7.16.7"
 
-"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4":
-  version "7.16.4"
-  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.16.4.tgz#081d6bbc336ec5c2435c6346b2ae1fb98b5ac68e"
-  integrity sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==
+"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.16.8":
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34"
+  integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==
 
 "@babel/core@^7.1.0", "@babel/core@^7.11.4", "@babel/core@^7.12.3", "@babel/core@^7.7.5":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.7.tgz#db990f931f6d40cb9b87a0dc7d2adc749f1dcbcf"
-  integrity sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==
+  version "7.17.2"
+  resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.17.2.tgz#2c77fc430e95139d816d39b113b31bf40fb22337"
+  integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw==
   dependencies:
+    "@ampproject/remapping" "^2.0.0"
     "@babel/code-frame" "^7.16.7"
-    "@babel/generator" "^7.16.7"
+    "@babel/generator" "^7.17.0"
     "@babel/helper-compilation-targets" "^7.16.7"
     "@babel/helper-module-transforms" "^7.16.7"
-    "@babel/helpers" "^7.16.7"
-    "@babel/parser" "^7.16.7"
+    "@babel/helpers" "^7.17.2"
+    "@babel/parser" "^7.17.0"
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.16.7"
-    "@babel/types" "^7.16.7"
+    "@babel/traverse" "^7.17.0"
+    "@babel/types" "^7.17.0"
     convert-source-map "^1.7.0"
     debug "^4.1.0"
     gensync "^1.0.0-beta.2"
     json5 "^2.1.2"
     semver "^6.3.0"
-    source-map "^0.5.0"
 
-"@babel/generator@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.7.tgz#b42bf46a3079fa65e1544135f32e7958f048adbb"
-  integrity sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==
+"@babel/generator@^7.17.0":
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.0.tgz#7bd890ba706cd86d3e2f727322346ffdbf98f65e"
+  integrity sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw==
   dependencies:
-    "@babel/types" "^7.16.7"
+    "@babel/types" "^7.17.0"
     jsesc "^2.5.1"
     source-map "^0.5.0"
 
@@ -76,10 +83,10 @@
     browserslist "^4.17.5"
     semver "^6.3.0"
 
-"@babel/helper-create-class-features-plugin@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz#9c5b34b53a01f2097daf10678d65135c1b9f84ba"
-  integrity sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==
+"@babel/helper-create-class-features-plugin@^7.16.10", "@babel/helper-create-class-features-plugin@^7.16.7":
+  version "7.17.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.1.tgz#9699f14a88833a7e055ce57dcd3ffdcd25186b21"
+  integrity sha512-JBdSr/LtyYIno/pNnJ75lBcqc3Z1XXujzPanHqjvvrhOA+DTceTFuJi8XjmWTZh4r3fsdfqaCMN0iZemdkxZHQ==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
     "@babel/helper-environment-visitor" "^7.16.7"
@@ -90,17 +97,17 @@
     "@babel/helper-split-export-declaration" "^7.16.7"
 
 "@babel/helper-create-regexp-features-plugin@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz#0cb82b9bac358eb73bfbd73985a776bfa6b14d48"
-  integrity sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz#1dcc7d40ba0c6b6b25618997c5dbfd310f186fe1"
+  integrity sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
-    regexpu-core "^4.7.1"
+    regexpu-core "^5.0.1"
 
-"@babel/helper-define-polyfill-provider@^0.3.0":
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz#c5b10cf4b324ff840140bb07e05b8564af2ae971"
-  integrity sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==
+"@babel/helper-define-polyfill-provider@^0.3.1":
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz#52411b445bdb2e676869e5a74960d2d3826d2665"
+  integrity sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==
   dependencies:
     "@babel/helper-compilation-targets" "^7.13.0"
     "@babel/helper-module-imports" "^7.12.13"
@@ -188,14 +195,14 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5"
   integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==
 
-"@babel/helper-remap-async-to-generator@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.7.tgz#5ce2416990d55eb6e099128338848ae8ffa58a9a"
-  integrity sha512-C3o117GnP/j/N2OWo+oepeWbFEKRfNaay+F1Eo5Mj3A1SRjyx+qaFhm23nlipub7Cjv2azdUUiDH+VlpdwUFRg==
+"@babel/helper-remap-async-to-generator@^7.16.8":
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz#29ffaade68a367e2ed09c90901986918d25e57e3"
+  integrity sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==
   dependencies:
     "@babel/helper-annotate-as-pure" "^7.16.7"
-    "@babel/helper-wrap-function" "^7.16.7"
-    "@babel/types" "^7.16.7"
+    "@babel/helper-wrap-function" "^7.16.8"
+    "@babel/types" "^7.16.8"
 
 "@babel/helper-replace-supers@^7.16.7":
   version "7.16.7"
@@ -239,38 +246,38 @@
   resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23"
   integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==
 
-"@babel/helper-wrap-function@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.7.tgz#8ddf9eaa770ed43de4bc3687f3f3b0d6d5ecf014"
-  integrity sha512-7a9sABeVwcunnztZZ7WTgSw6jVYLzM1wua0Z4HIXm9S3/HC96WKQTkFgGEaj5W06SHHihPJ6Le6HzS5cGOQMNw==
+"@babel/helper-wrap-function@^7.16.8":
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz#58afda087c4cd235de92f7ceedebca2c41274200"
+  integrity sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==
   dependencies:
     "@babel/helper-function-name" "^7.16.7"
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.16.7"
-    "@babel/types" "^7.16.7"
+    "@babel/traverse" "^7.16.8"
+    "@babel/types" "^7.16.8"
 
-"@babel/helpers@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.7.tgz#7e3504d708d50344112767c3542fc5e357fffefc"
-  integrity sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==
+"@babel/helpers@^7.17.2":
+  version "7.17.2"
+  resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417"
+  integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ==
   dependencies:
     "@babel/template" "^7.16.7"
-    "@babel/traverse" "^7.16.7"
-    "@babel/types" "^7.16.7"
+    "@babel/traverse" "^7.17.0"
+    "@babel/types" "^7.17.0"
 
 "@babel/highlight@^7.10.4", "@babel/highlight@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.7.tgz#81a01d7d675046f0d96f82450d9d9578bdfd6b0b"
-  integrity sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==
+  version "7.16.10"
+  resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88"
+  integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==
   dependencies:
     "@babel/helper-validator-identifier" "^7.16.7"
     chalk "^2.0.0"
     js-tokens "^4.0.0"
 
-"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.7.0":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.7.tgz#d372dda9c89fcec340a82630a9f533f2fe15877e"
-  integrity sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==
+"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.0", "@babel/parser@^7.7.0":
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.0.tgz#f0ac33eddbe214e4105363bb17c3341c5ffcc43c"
+  integrity sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw==
 
 "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7":
   version "7.16.7"
@@ -288,13 +295,13 @@
     "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
     "@babel/plugin-proposal-optional-chaining" "^7.16.7"
 
-"@babel/plugin-proposal-async-generator-functions@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.7.tgz#739adc1212a9e4892de440cd7dfffb06172df78d"
-  integrity sha512-TTXBT3A5c11eqRzaC6beO6rlFT3Mo9C2e8eB44tTr52ESXSK2CIc2fOp1ynpAwQA8HhBMho+WXhMHWlAe3xkpw==
+"@babel/plugin-proposal-async-generator-functions@^7.16.8":
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz#3bdd1ebbe620804ea9416706cd67d60787504bc8"
+  integrity sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
-    "@babel/helper-remap-async-to-generator" "^7.16.7"
+    "@babel/helper-remap-async-to-generator" "^7.16.8"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
 
 "@babel/plugin-proposal-class-properties@^7.16.7":
@@ -390,12 +397,12 @@
     "@babel/helper-skip-transparent-expression-wrappers" "^7.16.0"
     "@babel/plugin-syntax-optional-chaining" "^7.8.3"
 
-"@babel/plugin-proposal-private-methods@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz#e418e3aa6f86edd6d327ce84eff188e479f571e0"
-  integrity sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==
+"@babel/plugin-proposal-private-methods@^7.16.11":
+  version "7.16.11"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz#e8df108288555ff259f4527dbe84813aac3a1c50"
+  integrity sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==
   dependencies:
-    "@babel/helper-create-class-features-plugin" "^7.16.7"
+    "@babel/helper-create-class-features-plugin" "^7.16.10"
     "@babel/helper-plugin-utils" "^7.16.7"
 
 "@babel/plugin-proposal-private-property-in-object@^7.16.7":
@@ -542,14 +549,14 @@
   dependencies:
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-async-to-generator@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.7.tgz#646e1262ac341b587ff5449844d4492dbb10ac4b"
-  integrity sha512-pFEfjnK4DfXCfAlA5I98BYdDJD8NltMzx19gt6DAmfE+2lXRfPUoa0/5SUjT4+TDE1W/rcxU/1lgN55vpAjjdg==
+"@babel/plugin-transform-async-to-generator@^7.16.8":
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz#b83dff4b970cf41f1b819f8b49cc0cfbaa53a808"
+  integrity sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==
   dependencies:
     "@babel/helper-module-imports" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
-    "@babel/helper-remap-async-to-generator" "^7.16.7"
+    "@babel/helper-remap-async-to-generator" "^7.16.8"
 
 "@babel/plugin-transform-block-scoped-functions@^7.16.7":
   version "7.16.7"
@@ -655,10 +662,10 @@
     "@babel/helper-plugin-utils" "^7.16.7"
     babel-plugin-dynamic-import-node "^2.3.3"
 
-"@babel/plugin-transform-modules-commonjs@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.7.tgz#fd119e6a433c527d368425b45df361e1e95d3c1a"
-  integrity sha512-h2RP2kE7He1ZWKyAlanMZrAbdv+Acw1pA8dQZhE025WJZE2z0xzFADAinXA9fxd5bn7JnM+SdOGcndGx1ARs9w==
+"@babel/plugin-transform-modules-commonjs@^7.16.8":
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz#cdee19aae887b16b9d331009aa9a219af7c86afe"
+  integrity sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==
   dependencies:
     "@babel/helper-module-transforms" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
@@ -684,10 +691,10 @@
     "@babel/helper-module-transforms" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
 
-"@babel/plugin-transform-named-capturing-groups-regex@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.7.tgz#749d90d94e73cf62c60a0cc8d6b94d29305a81f2"
-  integrity sha512-kFy35VwmwIQwCjwrAQhl3+c/kr292i4KdLPKp5lPH03Ltc51qnFlIADoyPxc/6Naz3ok3WdYKg+KK6AH+D4utg==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.16.8":
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz#7f860e0e40d844a02c9dcf9d84965e7dfd666252"
+  integrity sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==
   dependencies:
     "@babel/helper-create-regexp-features-plugin" "^7.16.7"
 
@@ -771,9 +778,9 @@
     "@babel/helper-plugin-utils" "^7.16.7"
 
 "@babel/plugin-transform-typescript@^7.16.7":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.7.tgz#33f8c2c890fbfdc4ef82446e9abb8de8211a3ff3"
-  integrity sha512-Hzx1lvBtOCWuCEwMmYOfpQpO7joFeXLgoPuzZZBtTxXqSqUGUubvFGZv2ygo1tB5Bp9q6PXV3H0E/kf7KM0RLA==
+  version "7.16.8"
+  resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz#591ce9b6b83504903fa9dd3652c357c2ba7a1ee0"
+  integrity sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==
   dependencies:
     "@babel/helper-create-class-features-plugin" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
@@ -795,17 +802,17 @@
     "@babel/helper-plugin-utils" "^7.16.7"
 
 "@babel/preset-env@^7.11.0":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.7.tgz#c491088856d0b3177822a2bf06cb74d76327aa56"
-  integrity sha512-urX3Cee4aOZbRWOSa3mKPk0aqDikfILuo+C7qq7HY0InylGNZ1fekq9jmlr3pLWwZHF4yD7heQooc2Pow2KMyQ==
+  version "7.16.11"
+  resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.16.11.tgz#5dd88fd885fae36f88fd7c8342475c9f0abe2982"
+  integrity sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==
   dependencies:
-    "@babel/compat-data" "^7.16.4"
+    "@babel/compat-data" "^7.16.8"
     "@babel/helper-compilation-targets" "^7.16.7"
     "@babel/helper-plugin-utils" "^7.16.7"
     "@babel/helper-validator-option" "^7.16.7"
     "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.16.7"
     "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.16.7"
-    "@babel/plugin-proposal-async-generator-functions" "^7.16.7"
+    "@babel/plugin-proposal-async-generator-functions" "^7.16.8"
     "@babel/plugin-proposal-class-properties" "^7.16.7"
     "@babel/plugin-proposal-class-static-block" "^7.16.7"
     "@babel/plugin-proposal-dynamic-import" "^7.16.7"
@@ -817,7 +824,7 @@
     "@babel/plugin-proposal-object-rest-spread" "^7.16.7"
     "@babel/plugin-proposal-optional-catch-binding" "^7.16.7"
     "@babel/plugin-proposal-optional-chaining" "^7.16.7"
-    "@babel/plugin-proposal-private-methods" "^7.16.7"
+    "@babel/plugin-proposal-private-methods" "^7.16.11"
     "@babel/plugin-proposal-private-property-in-object" "^7.16.7"
     "@babel/plugin-proposal-unicode-property-regex" "^7.16.7"
     "@babel/plugin-syntax-async-generators" "^7.8.4"
@@ -835,7 +842,7 @@
     "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
     "@babel/plugin-syntax-top-level-await" "^7.14.5"
     "@babel/plugin-transform-arrow-functions" "^7.16.7"
-    "@babel/plugin-transform-async-to-generator" "^7.16.7"
+    "@babel/plugin-transform-async-to-generator" "^7.16.8"
     "@babel/plugin-transform-block-scoped-functions" "^7.16.7"
     "@babel/plugin-transform-block-scoping" "^7.16.7"
     "@babel/plugin-transform-classes" "^7.16.7"
@@ -849,10 +856,10 @@
     "@babel/plugin-transform-literals" "^7.16.7"
     "@babel/plugin-transform-member-expression-literals" "^7.16.7"
     "@babel/plugin-transform-modules-amd" "^7.16.7"
-    "@babel/plugin-transform-modules-commonjs" "^7.16.7"
+    "@babel/plugin-transform-modules-commonjs" "^7.16.8"
     "@babel/plugin-transform-modules-systemjs" "^7.16.7"
     "@babel/plugin-transform-modules-umd" "^7.16.7"
-    "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.7"
+    "@babel/plugin-transform-named-capturing-groups-regex" "^7.16.8"
     "@babel/plugin-transform-new-target" "^7.16.7"
     "@babel/plugin-transform-object-super" "^7.16.7"
     "@babel/plugin-transform-parameters" "^7.16.7"
@@ -867,11 +874,11 @@
     "@babel/plugin-transform-unicode-escapes" "^7.16.7"
     "@babel/plugin-transform-unicode-regex" "^7.16.7"
     "@babel/preset-modules" "^0.1.5"
-    "@babel/types" "^7.16.7"
+    "@babel/types" "^7.16.8"
     babel-plugin-polyfill-corejs2 "^0.3.0"
-    babel-plugin-polyfill-corejs3 "^0.4.0"
+    babel-plugin-polyfill-corejs3 "^0.5.0"
     babel-plugin-polyfill-regenerator "^0.3.0"
-    core-js-compat "^3.19.1"
+    core-js-compat "^3.20.2"
     semver "^6.3.0"
 
 "@babel/preset-modules@^0.1.5":
@@ -895,9 +902,9 @@
     "@babel/plugin-transform-typescript" "^7.16.7"
 
 "@babel/runtime@^7.8.4":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.7.tgz#03ff99f64106588c9c403c6ecb8c3bafbbdff1fa"
-  integrity sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==
+  version "7.17.2"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.17.2.tgz#66f68591605e59da47523c631416b18508779941"
+  integrity sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==
   dependencies:
     regenerator-runtime "^0.13.4"
 
@@ -910,26 +917,26 @@
     "@babel/parser" "^7.16.7"
     "@babel/types" "^7.16.7"
 
-"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.7.0":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.7.tgz#dac01236a72c2560073658dd1a285fe4e0865d76"
-  integrity sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.7.0":
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.0.tgz#3143e5066796408ccc880a33ecd3184f3e75cd30"
+  integrity sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg==
   dependencies:
     "@babel/code-frame" "^7.16.7"
-    "@babel/generator" "^7.16.7"
+    "@babel/generator" "^7.17.0"
     "@babel/helper-environment-visitor" "^7.16.7"
     "@babel/helper-function-name" "^7.16.7"
     "@babel/helper-hoist-variables" "^7.16.7"
     "@babel/helper-split-export-declaration" "^7.16.7"
-    "@babel/parser" "^7.16.7"
-    "@babel/types" "^7.16.7"
+    "@babel/parser" "^7.17.0"
+    "@babel/types" "^7.17.0"
     debug "^4.1.0"
     globals "^11.1.0"
 
-"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
-  version "7.16.7"
-  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.7.tgz#4ed19d51f840ed4bd5645be6ce40775fecf03159"
-  integrity sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==
+"@babel/types@^7.0.0", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.16.8", "@babel/types@^7.17.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0":
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b"
+  integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==
   dependencies:
     "@babel/helper-validator-identifier" "^7.16.7"
     to-fast-properties "^2.0.0"
@@ -1163,6 +1170,24 @@
     "@types/yargs" "^15.0.0"
     chalk "^4.0.0"
 
+"@jridgewell/resolve-uri@^3.0.3":
+  version "3.0.5"
+  resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz#68eb521368db76d040a6315cdb24bf2483037b9c"
+  integrity sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+  version "1.4.11"
+  resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz#771a1d8d744eeb71b6adb35808e1a6c7b9b8c8ec"
+  integrity sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==
+
+"@jridgewell/trace-mapping@^0.3.0":
+  version "0.3.4"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3"
+  integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
 "@mapbox/node-pre-gyp@^1.0.0":
   version "1.0.8"
   resolved "https://registry.yarnpkg.com/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz#32abc8a5c624bc4e46c43d84dfb8b26d33a96f58"
@@ -1344,9 +1369,9 @@
   integrity sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==
 
 "@types/node@*", "@types/node@>=13.7.0":
-  version "17.0.7"
-  resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.7.tgz#4a53d8332bb65a45470a2f9e2611f1ced637a5cb"
-  integrity sha512-1QUk+WAUD4t8iR+Oj+UgI8oJa6yyxaB8a8pHaC8uqM6RrS1qbL7bf3Pwl5rHv0psm2CuDErgho6v5N+G+5fwtQ==
+  version "17.0.18"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.18.tgz#3b4fed5cfb58010e3a2be4b6e74615e4847f1074"
+  integrity sha512-eKj4f/BsN/qcculZiRSujogjvp5O/k4lOW5m35NopjZM/QwLOR075a8pJW5hD+Rtdm2DaCVPENS6KtSQnUD6BA==
 
 "@types/normalize-package-data@^2.4.0":
   version "2.4.1"
@@ -1364,9 +1389,9 @@
   integrity sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==
 
 "@types/prettier@^2.0.0":
-  version "2.4.2"
-  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.2.tgz#4c62fae93eb479660c3bd93f9d24d561597a8281"
-  integrity sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==
+  version "2.4.4"
+  resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17"
+  integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==
 
 "@types/stack-utils@^2.0.0":
   version "2.0.1"
@@ -1514,9 +1539,9 @@ ajv@^6.10.0, ajv@^6.12.4:
     uri-js "^4.2.2"
 
 ajv@^8.0.1:
-  version "8.8.2"
-  resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.8.2.tgz#01b4fef2007a28bf75f0b7fc009f62679de4abbb"
-  integrity sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==
+  version "8.10.0"
+  resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.10.0.tgz#e573f719bd3af069017e3b66538ab968d040e54d"
+  integrity sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==
   dependencies:
     fast-deep-equal "^3.1.1"
     json-schema-traverse "^1.0.0"
@@ -1692,28 +1717,28 @@ babel-plugin-jest-hoist@^26.6.2:
     "@types/babel__traverse" "^7.0.6"
 
 babel-plugin-polyfill-corejs2@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz#407082d0d355ba565af24126fb6cb8e9115251fd"
-  integrity sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz#440f1b70ccfaabc6b676d196239b138f8a2cfba5"
+  integrity sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==
   dependencies:
     "@babel/compat-data" "^7.13.11"
-    "@babel/helper-define-polyfill-provider" "^0.3.0"
+    "@babel/helper-define-polyfill-provider" "^0.3.1"
     semver "^6.1.1"
 
-babel-plugin-polyfill-corejs3@^0.4.0:
-  version "0.4.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz#0b571f4cf3d67f911512f5c04842a7b8e8263087"
-  integrity sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==
+babel-plugin-polyfill-corejs3@^0.5.0:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz#aabe4b2fa04a6e038b688c5e55d44e78cd3a5f72"
+  integrity sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==
   dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.0"
-    core-js-compat "^3.18.0"
+    "@babel/helper-define-polyfill-provider" "^0.3.1"
+    core-js-compat "^3.21.0"
 
 babel-plugin-polyfill-regenerator@^0.3.0:
-  version "0.3.0"
-  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz#9ebbcd7186e1a33e21c5e20cae4e7983949533be"
-  integrity sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==
+  version "0.3.1"
+  resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz#2c0678ea47c75c8cc2fbb1852278d8fb68233990"
+  integrity sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==
   dependencies:
-    "@babel/helper-define-polyfill-provider" "^0.3.0"
+    "@babel/helper-define-polyfill-provider" "^0.3.1"
 
 babel-preset-current-node-syntax@^1.0.0:
   version "1.0.1"
@@ -1867,17 +1892,17 @@ camelcase@^6.0.0:
   integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
 
 caniuse-lite@^1.0.30001286:
-  version "1.0.30001296"
-  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001296.tgz#d99f0f3bee66544800b93d261c4be55a35f1cec8"
-  integrity sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==
+  version "1.0.30001312"
+  resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001312.tgz#e11eba4b87e24d22697dae05455d5aea28550d5f"
+  integrity sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==
 
 canvas@^2.8.0:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.8.0.tgz#f99ca7f25e6e26686661ffa4fec1239bbef74461"
-  integrity sha512-gLTi17X8WY9Cf5GZ2Yns8T5lfBOcGgFehDFb+JQwDqdOoBOcECS9ZWMEAqMSVcMYwXD659J8NyzjRY/2aE+C2Q==
+  version "2.9.0"
+  resolved "https://registry.yarnpkg.com/canvas/-/canvas-2.9.0.tgz#7df0400b141a7e42e597824f377935ba96880f2a"
+  integrity sha512-0l93g7uxp7rMyr7H+XRQ28A3ud0dKIUTIEkUe1Dxh4rjUYN7B93+SjC3r1PDKA18xcQN87OFGgUnyw7LSgNLSQ==
   dependencies:
     "@mapbox/node-pre-gyp" "^1.0.0"
-    nan "^2.14.0"
+    nan "^2.15.0"
     simple-get "^3.0.3"
 
 capture-exit@^2.0.0:
@@ -2069,10 +2094,10 @@ copy-descriptor@^0.1.0:
   resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
   integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
 
-core-js-compat@^3.18.0, core-js-compat@^3.19.1:
-  version "3.20.2"
-  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.20.2.tgz#d1ff6936c7330959b46b2e08b122a8b14e26140b"
-  integrity sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==
+core-js-compat@^3.20.2, core-js-compat@^3.21.0:
+  version "3.21.0"
+  resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.21.0.tgz#bcc86aa5a589cee358e7a7fa0a4979d5a76c3885"
+  integrity sha512-OSXseNPSK2OPJa6GdtkMz/XxeXx8/CJvfhQWTqd6neuUraujcL4jVsjkLQz1OWnax8xVQJnRPe0V2jqNWORA+A==
   dependencies:
     browserslist "^4.19.1"
     semver "7.0.0"
@@ -2350,9 +2375,9 @@ easyqrcodejs@^4.3.1:
   integrity sha512-DEr/Txdyfo0RsKuC0tX6t72GF5oqNFbnKVL9dTLatL5yiLJaId65BSfa5HKl4FaJt71yRX3DF1sf977FwynWtw==
 
 electron-to-chromium@^1.4.17:
-  version "1.4.34"
-  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.34.tgz#7d87dc0e95c2c65cbd0687ae23146a662506d1ef"
-  integrity sha512-B7g6Y9No9XMYk1VNrQ8KAmSEo1Iltrz/5EjOGxl1DffQAb3z/XbpHRCfYKwV8D+CPXm4Q7Xg1sceSt9osNwRIA==
+  version "1.4.71"
+  resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.71.tgz#17056914465da0890ce00351a3b946fd4cd51ff6"
+  integrity sha512-Hk61vXXKRb2cd3znPE9F+2pLWdIOmP7GjiTj45y6L3W/lO+hSnUSUhq+6lEaERWBdZOHbk2s3YV5c9xVl3boVw==
 
 emittery@^0.7.1:
   version "0.7.2"
@@ -2723,14 +2748,14 @@ flat-cache@^3.0.4:
     rimraf "^3.0.2"
 
 flatted@^3.1.0:
-  version "3.2.4"
-  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2"
-  integrity sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==
+  version "3.2.5"
+  resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
+  integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
 
 follow-redirects@^1.10.0:
-  version "1.14.6"
-  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.6.tgz#8cfb281bbc035b3c067d6cd975b0f6ade6e855cd"
-  integrity sha512-fhUl5EwSJbbl8AR+uYL2KQDxLkdSjZGR36xy46AO7cOMTrCMON6Sa28FmAnC2tRTDbd/Uuzz3aJBv7EBN7JH8A==
+  version "1.14.8"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc"
+  integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==
 
 for-in@^1.0.2:
   version "1.0.2"
@@ -2884,21 +2909,21 @@ globals@^11.1.0:
   integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
 
 globals@^13.6.0, globals@^13.9.0:
-  version "13.12.0"
-  resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.0.tgz#4d733760304230a0082ed96e21e5c565f898089e"
-  integrity sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==
+  version "13.12.1"
+  resolved "https://registry.yarnpkg.com/globals/-/globals-13.12.1.tgz#ec206be932e6c77236677127577aa8e50bf1c5cb"
+  integrity sha512-317dFlgY2pdJZ9rspXDks7073GpDmXdfbM3vYYp0HAMKGDh1FfWPleI2ljVNLQX5M5lXcAslTcPTrOrMEFOjyw==
   dependencies:
     type-fest "^0.20.2"
 
 google-protobuf@^3.13.0:
-  version "3.19.1"
-  resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.1.tgz#5af5390e8206c446d8f49febaffd4b7f4ac28f41"
-  integrity sha512-Isv1RlNC+IzZzilcxnlVSf+JvuhxmY7DaxYCBy+zPS9XVuJRtlTTIXR9hnZ1YL1MMusJn/7eSy2swCzZIomQSg==
+  version "3.19.4"
+  resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.4.tgz#8d32c3e34be9250956f28c0fb90955d13f311888"
+  integrity sha512-OIPNCxsG2lkIvf+P5FNfJ/Km95CsXOBecS9ZcAU6m2Rq3svc0Apl9nB3GMDNKfQ9asNv4KjyAqGwPQFrVle3Yg==
 
 graceful-fs@^4.2.4:
-  version "4.2.8"
-  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
-  integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+  version "4.2.9"
+  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
+  integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
 
 growly@^1.3.0:
   version "1.3.0"
@@ -3062,9 +3087,9 @@ import-fresh@^3.0.0, import-fresh@^3.2.1:
     resolve-from "^4.0.0"
 
 import-local@^3.0.2:
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.3.tgz#4d51c2c495ca9393da259ec66b62e022920211e0"
-  integrity sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==
+  version "3.1.0"
+  resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+  integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
   dependencies:
     pkg-dir "^4.2.0"
     resolve-cwd "^3.0.0"
@@ -3123,10 +3148,10 @@ is-ci@^2.0.0:
   dependencies:
     ci-info "^2.0.0"
 
-is-core-module@^2.8.0:
-  version "2.8.0"
-  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
-  integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
+is-core-module@^2.8.1:
+  version "2.8.1"
+  resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
+  integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==
   dependencies:
     has "^1.0.3"
 
@@ -3334,9 +3359,9 @@ istanbul-lib-source-maps@^4.0.0:
     source-map "^0.6.1"
 
 istanbul-reports@^3.0.2:
-  version "3.1.3"
-  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.3.tgz#4bcae3103b94518117930d51283690960b50d3c2"
-  integrity sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==
+  version "3.1.4"
+  resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c"
+  integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==
   dependencies:
     html-escaper "^2.0.0"
     istanbul-lib-report "^3.0.0"
@@ -4075,9 +4100,9 @@ mimic-response@^2.0.0:
   integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==
 
 minimatch@^3.0.4:
-  version "3.0.4"
-  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
-  integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.1.tgz#879ad447200773912898b46cd516a7abbb5e50b0"
+  integrity sha512-reLxBcKUPNBnc/sVtAbxgRVFSegoGeLaSjmphNhcwcolhYLRgtJscn5mRl6YRZNQv40Y7P6JM2YhSIsbL9OB5A==
   dependencies:
     brace-expansion "^1.1.7"
 
@@ -4124,7 +4149,7 @@ ms@2.1.2:
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
   integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
 
-nan@^2.14.0:
+nan@^2.15.0:
   version "2.15.0"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
   integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
@@ -4157,9 +4182,9 @@ nice-try@^1.0.4:
   integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
 
 node-fetch@^2.6.5:
-  version "2.6.6"
-  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.6.tgz#1751a7c01834e8e1697758732e9efb6eeadfaf89"
-  integrity sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==
+  version "2.6.7"
+  resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
+  integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
   dependencies:
     whatwg-url "^5.0.0"
 
@@ -4181,9 +4206,9 @@ node-notifier@^8.0.0:
     which "^2.0.2"
 
 node-releases@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5"
-  integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01"
+  integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==
 
 nopt@^5.0.0:
   version "5.0.0"
@@ -4472,9 +4497,9 @@ picomatch@^2.0.4, picomatch@^2.2.3:
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
 pirates@^4.0.1:
-  version "4.0.4"
-  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.4.tgz#07df81e61028e402735cdd49db701e4885b4e6e6"
-  integrity sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==
+  version "4.0.5"
+  resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b"
+  integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==
 
 pkg-dir@^4.2.0:
   version "4.2.0"
@@ -4620,10 +4645,10 @@ readable-stream@^3.6.0:
     string_decoder "^1.1.1"
     util-deprecate "^1.0.1"
 
-regenerate-unicode-properties@^9.0.0:
-  version "9.0.0"
-  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz#54d09c7115e1f53dc2314a974b32c1c344efe326"
-  integrity sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==
+regenerate-unicode-properties@^10.0.1:
+  version "10.0.1"
+  resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
+  integrity sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==
   dependencies:
     regenerate "^1.4.2"
 
@@ -4657,27 +4682,27 @@ regexpp@^3.0.0, regexpp@^3.1.0:
   resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
   integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
 
-regexpu-core@^4.7.1:
-  version "4.8.0"
-  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.8.0.tgz#e5605ba361b67b1718478501327502f4479a98f0"
-  integrity sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==
+regexpu-core@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.0.1.tgz#c531122a7840de743dcf9c83e923b5560323ced3"
+  integrity sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==
   dependencies:
     regenerate "^1.4.2"
-    regenerate-unicode-properties "^9.0.0"
-    regjsgen "^0.5.2"
-    regjsparser "^0.7.0"
+    regenerate-unicode-properties "^10.0.1"
+    regjsgen "^0.6.0"
+    regjsparser "^0.8.2"
     unicode-match-property-ecmascript "^2.0.0"
     unicode-match-property-value-ecmascript "^2.0.0"
 
-regjsgen@^0.5.2:
-  version "0.5.2"
-  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733"
-  integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==
+regjsgen@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.6.0.tgz#83414c5354afd7d6627b16af5f10f41c4e71808d"
+  integrity sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==
 
-regjsparser@^0.7.0:
-  version "0.7.0"
-  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.7.0.tgz#a6b667b54c885e18b52554cb4960ef71187e9968"
-  integrity sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==
+regjsparser@^0.8.2:
+  version "0.8.4"
+  resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.8.4.tgz#8a14285ffcc5de78c5b95d62bbf413b6bc132d5f"
+  integrity sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==
   dependencies:
     jsesc "~0.5.0"
 
@@ -4739,11 +4764,11 @@ resolve-url@^0.2.1:
   integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
 
 resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.18.1:
-  version "1.21.0"
-  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f"
-  integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==
+  version "1.22.0"
+  resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198"
+  integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==
   dependencies:
-    is-core-module "^2.8.0"
+    is-core-module "^2.8.1"
     path-parse "^1.0.7"
     supports-preserve-symlinks-flag "^1.0.0"
 
@@ -4778,9 +4803,9 @@ rsvp@^4.8.4:
   integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
 
 rxjs@^7.5.1:
-  version "7.5.1"
-  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.1.tgz#af73df343cbcab37628197f43ea0c8256f54b157"
-  integrity sha512-KExVEeZWxMZnZhUZtsJcFwz8IvPvgu4G2Z2QyqjZQzUGr32KDYuSxrEYO4w3tFFNbfLozcrKUTvTPi+E9ywJkQ==
+  version "7.5.4"
+  resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.4.tgz#3d6bd407e6b7ce9a123e76b1e770dc5761aa368d"
+  integrity sha512-h5M3Hk78r6wAheJF0a5YahB1yRQKCsZ4MsGdZ5O9ETbVtjPcScGfrMmoOq7EBsCRzd4BDkvDJ7ogP8Sz5tTFiQ==
   dependencies:
     tslib "^2.1.0"
 
@@ -4905,9 +4930,9 @@ shellwords@^0.1.1:
   integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
 
 signal-exit@^3.0.0, signal-exit@^3.0.2:
-  version "3.0.6"
-  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
-  integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
+  version "3.0.7"
+  resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+  integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
 
 simple-concat@^1.0.0:
   version "1.0.1"
@@ -4915,9 +4940,9 @@ simple-concat@^1.0.0:
   integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
 
 simple-get@^3.0.3:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3"
-  integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.1.tgz#cc7ba77cfbe761036fbfce3d021af25fc5584d55"
+  integrity sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==
   dependencies:
     decompress-response "^4.2.0"
     once "^1.3.1"
@@ -5189,9 +5214,9 @@ symbol-tree@^3.2.4:
   integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 
 table@^6.0.9:
-  version "6.7.5"
-  resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238"
-  integrity sha512-LFNeryOqiQHqCVKzhkymKwt6ozeRhlm8IL1mE8rNUurkir4heF6PzMyRgaTa4tlyPTGGgXuvVOF/OLWiH09Lqw==
+  version "6.8.0"
+  resolved "https://registry.yarnpkg.com/table/-/table-6.8.0.tgz#87e28f14fa4321c3377ba286f07b79b281a3b3ca"
+  integrity sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==
   dependencies:
     ajv "^8.0.1"
     lodash.truncate "^4.4.2"
@@ -5377,9 +5402,9 @@ typedarray-to-buffer@^3.1.5:
     is-typedarray "^1.0.0"
 
 typescript@^4.0.2:
-  version "4.5.4"
-  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8"
-  integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==
+  version "4.5.5"
+  resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3"
+  integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==
 
 unicode-canonical-property-names-ecmascript@^2.0.0:
   version "2.0.0"
@@ -5440,9 +5465,9 @@ urix@^0.1.0:
   integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
 
 url-parse@^1.4.7:
-  version "1.5.4"
-  resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.4.tgz#e4f645a7e2a0852cc8a66b14b292a3e9a11a97fd"
-  integrity sha512-ITeAByWWoqutFClc/lRZnFplgXgEZr3WJ6XngMM/N9DMIm4K8zXPCZ1Jdu0rERwO84w1WC5wkle2ubwTA4NTBg==
+  version "1.5.6"
+  resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.6.tgz#b2a41d5a233645f3c31204cc8be60e76a15230a2"
+  integrity sha512-xj3QdUJ1DttD1LeSfvJlU1eiF1RvBSBfUu8GplFGdUzSO28y5yUtEl7wb//PI4Af6qh0o/K8545vUmucRrfWsw==
   dependencies:
     querystringify "^2.1.1"
     requires-port "^1.0.0"
@@ -5651,14 +5676,14 @@ write-file-atomic@^3.0.0:
     typedarray-to-buffer "^3.1.5"
 
 ws@^7.4.6:
-  version "7.5.6"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b"
-  integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==
+  version "7.5.7"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.7.tgz#9e0ac77ee50af70d58326ecff7e85eb3fa375e67"
+  integrity sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==
 
 ws@^8.2.3:
-  version "8.4.0"
-  resolved "https://registry.yarnpkg.com/ws/-/ws-8.4.0.tgz#f05e982a0a88c604080e8581576e2a063802bed6"
-  integrity sha512-IHVsKe2pjajSUIl4KYMQOdlyliovpEPquKkqbwswulszzI7r0SfQrxnXdWAEqOlDCLrVSJzo+O1hAwdog2sKSQ==
+  version "8.5.0"
+  resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f"
+  integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==
 
 xml-name-validator@^3.0.0:
   version "3.0.0"