forked from sheetjs/sheetjs
		
	NUMBERS read/write threaded comments
This commit is contained in:
		
							parent
							
								
									6e260c9185
								
							
						
					
					
						commit
						36c5b7c0f5
					
				@ -374,7 +374,7 @@ function write_comments_biff8(ba/*:BufArray*/, comments/*:Array<[Comment[], numb
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		write_biff_rec(ba, 0x00EC, /* hdr */ bconcat([hdr, _oasc]));
 | 
			
		||||
		write_biff_rec(ba, 0x00EC, /* hdr */ _oasc ? bconcat([hdr, _oasc]) : hdr);
 | 
			
		||||
	}
 | 
			
		||||
	ba.push(pl.end());
 | 
			
		||||
	notes.forEach(function(n) { write_biff_rec(ba, 0x001C, n); });
 | 
			
		||||
 | 
			
		||||
@ -739,98 +739,133 @@ function parse_new_storage(buf, lut) {
 | 
			
		||||
    ret.v /= 86400;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
function write_new_storage(cell, sst, rsst) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;
 | 
			
		||||
function write_new_storage(cell, lut) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, fields = 0;
 | 
			
		||||
  out[0] = 5;
 | 
			
		||||
  switch (cell.t) {
 | 
			
		||||
    case "n":
 | 
			
		||||
      out[1] = 2;
 | 
			
		||||
      writeDecimal128LE(out, l, cell.v);
 | 
			
		||||
      flags |= 1;
 | 
			
		||||
      fields |= 1;
 | 
			
		||||
      l += 16;
 | 
			
		||||
      break;
 | 
			
		||||
    case "b":
 | 
			
		||||
      out[1] = 6;
 | 
			
		||||
      dv.setFloat64(l, cell.v ? 1 : 0, true);
 | 
			
		||||
      flags |= 2;
 | 
			
		||||
      fields |= 2;
 | 
			
		||||
      l += 8;
 | 
			
		||||
      break;
 | 
			
		||||
    case "s":
 | 
			
		||||
      {
 | 
			
		||||
        var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
        if (cell.l) {
 | 
			
		||||
          var irsst = rsst.findIndex(function(v) {
 | 
			
		||||
          var irsst = lut.rsst.findIndex(function(v) {
 | 
			
		||||
            var _a;
 | 
			
		||||
            return v.v == s && v.l == ((_a = cell.l) == null ? void 0 : _a.Target);
 | 
			
		||||
          });
 | 
			
		||||
          if (irsst == -1)
 | 
			
		||||
            rsst[irsst = rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
            lut.rsst[irsst = lut.rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
          out[1] = 9;
 | 
			
		||||
          dv.setUint32(l, irsst, true);
 | 
			
		||||
          flags |= 16;
 | 
			
		||||
          fields |= 16;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        } else {
 | 
			
		||||
          var isst = sst.indexOf(s);
 | 
			
		||||
          var isst = lut.sst.indexOf(s);
 | 
			
		||||
          if (isst == -1)
 | 
			
		||||
            sst[isst = sst.length] = s;
 | 
			
		||||
            lut.sst[isst = lut.sst.length] = s;
 | 
			
		||||
          out[1] = 3;
 | 
			
		||||
          dv.setUint32(l, isst, true);
 | 
			
		||||
          flags |= 8;
 | 
			
		||||
          fields |= 8;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case "z":
 | 
			
		||||
      out[1] = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw "unsupported cell type " + cell.t;
 | 
			
		||||
  }
 | 
			
		||||
  dv.setUint32(8, flags, true);
 | 
			
		||||
  if (cell.c) {
 | 
			
		||||
    lut.cmnt.push(s5s_to_iwa_comment(cell.c));
 | 
			
		||||
    dv.setUint32(l, lut.cmnt.length - 1, true);
 | 
			
		||||
    fields |= 524288;
 | 
			
		||||
    l += 4;
 | 
			
		||||
  }
 | 
			
		||||
  dv.setUint32(8, fields, true);
 | 
			
		||||
  return out[subarray](0, l);
 | 
			
		||||
}
 | 
			
		||||
function write_old_storage(cell, sst, rsst) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;
 | 
			
		||||
function write_old_storage(cell, lut) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, fields = 0;
 | 
			
		||||
  out[0] = 4;
 | 
			
		||||
  switch (cell.t) {
 | 
			
		||||
    case "n":
 | 
			
		||||
      break;
 | 
			
		||||
    case "b":
 | 
			
		||||
      break;
 | 
			
		||||
    case "s":
 | 
			
		||||
      {
 | 
			
		||||
        var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
        if (cell.l) {
 | 
			
		||||
          var irsst = lut.rsst.findIndex(function(v) {
 | 
			
		||||
            var _a;
 | 
			
		||||
            return v.v == s && v.l == ((_a = cell.l) == null ? void 0 : _a.Target);
 | 
			
		||||
          });
 | 
			
		||||
          if (irsst == -1)
 | 
			
		||||
            lut.rsst[irsst = lut.rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
          out[1] = 9;
 | 
			
		||||
          dv.setUint32(l, irsst, true);
 | 
			
		||||
          fields |= 512;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case "z":
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw "unsupported cell type " + cell.t;
 | 
			
		||||
  }
 | 
			
		||||
  if (cell.c) {
 | 
			
		||||
    dv.setUint32(l, lut.cmnt.length - 1, true);
 | 
			
		||||
    fields |= 4096;
 | 
			
		||||
    l += 4;
 | 
			
		||||
  }
 | 
			
		||||
  switch (cell.t) {
 | 
			
		||||
    case "n":
 | 
			
		||||
      out[1] = 2;
 | 
			
		||||
      dv.setFloat64(l, cell.v, true);
 | 
			
		||||
      flags |= 32;
 | 
			
		||||
      fields |= 32;
 | 
			
		||||
      l += 8;
 | 
			
		||||
      break;
 | 
			
		||||
    case "b":
 | 
			
		||||
      out[1] = 6;
 | 
			
		||||
      dv.setFloat64(l, cell.v ? 1 : 0, true);
 | 
			
		||||
      flags |= 32;
 | 
			
		||||
      fields |= 32;
 | 
			
		||||
      l += 8;
 | 
			
		||||
      break;
 | 
			
		||||
    case "s":
 | 
			
		||||
      {
 | 
			
		||||
        var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
        if (cell.l) {
 | 
			
		||||
          var irsst = rsst.findIndex(function(v) {
 | 
			
		||||
            var _a;
 | 
			
		||||
            return v.v == s && v.l == ((_a = cell.l) == null ? void 0 : _a.Target);
 | 
			
		||||
          });
 | 
			
		||||
          if (irsst == -1)
 | 
			
		||||
            rsst[irsst = rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
          out[1] = 9;
 | 
			
		||||
          dv.setUint32(l, irsst, true);
 | 
			
		||||
          flags |= 512;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        } else {
 | 
			
		||||
          var isst = sst.indexOf(s);
 | 
			
		||||
          var isst = lut.sst.indexOf(s);
 | 
			
		||||
          if (isst == -1)
 | 
			
		||||
            sst[isst = sst.length] = s;
 | 
			
		||||
            lut.sst[isst = lut.sst.length] = s;
 | 
			
		||||
          out[1] = 3;
 | 
			
		||||
          dv.setUint32(l, isst, true);
 | 
			
		||||
          flags |= 16;
 | 
			
		||||
          fields |= 16;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case "z":
 | 
			
		||||
      out[1] = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw "unsupported cell type " + cell.t;
 | 
			
		||||
  }
 | 
			
		||||
  dv.setUint32(8, flags, true);
 | 
			
		||||
  dv.setUint32(8, fields, true);
 | 
			
		||||
  return out[subarray](0, l);
 | 
			
		||||
}
 | 
			
		||||
function parse_cell_storage(buf, lut) {
 | 
			
		||||
@ -1035,6 +1070,18 @@ function iwa_to_s5s_comment(iwa) {
 | 
			
		||||
    });
 | 
			
		||||
  return out;
 | 
			
		||||
}
 | 
			
		||||
function s5s_to_iwa_comment(s5s) {
 | 
			
		||||
  var out = { a: "", t: "", replies: [] };
 | 
			
		||||
  for (var i = 0; i < s5s.length; ++i) {
 | 
			
		||||
    if (i == 0) {
 | 
			
		||||
      out.a = s5s[i].a;
 | 
			
		||||
      out.t = s5s[i].t;
 | 
			
		||||
    } else {
 | 
			
		||||
      out.replies.push({ a: s5s[i].a, t: s5s[i].t });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return out;
 | 
			
		||||
}
 | 
			
		||||
function parse_TST_TableModelArchive(M, root, ws) {
 | 
			
		||||
  var _a, _b, _c, _d, _e, _f, _g, _h, _i;
 | 
			
		||||
  var pb = parse_shallow(root.data);
 | 
			
		||||
@ -1208,8 +1255,8 @@ function parse_numbers_iwa(cfb, opts) {
 | 
			
		||||
    throw new Error("Cannot find Document root");
 | 
			
		||||
  return parse_TN_DocumentArchive(M, docroot, opts);
 | 
			
		||||
}
 | 
			
		||||
function write_TST_TileRowInfo(data, SST, RSST, wide) {
 | 
			
		||||
  var _a, _b;
 | 
			
		||||
function write_TST_TileRowInfo(data, lut, wide) {
 | 
			
		||||
  var _a, _b, _c;
 | 
			
		||||
  var tri = [
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
@ -1242,7 +1289,7 @@ function write_TST_TileRowInfo(data, SST, RSST, wide) {
 | 
			
		||||
  var _dv = u8_to_dataview(tri[4][0].data), _last_offset = 0, _cell_storage = [];
 | 
			
		||||
  var width = wide ? 4 : 1;
 | 
			
		||||
  for (var C = 0; C < data.length; ++C) {
 | 
			
		||||
    if (data[C] == null || data[C].t == "z" || data[C].t == "e") {
 | 
			
		||||
    if (data[C] == null || data[C].t == "z" && !((_c = data[C].c) == null ? void 0 : _c.length) || data[C].t == "e") {
 | 
			
		||||
      dv.setUint16(C * 2, 65535, true);
 | 
			
		||||
      _dv.setUint16(C * 2, 65535);
 | 
			
		||||
      continue;
 | 
			
		||||
@ -1253,18 +1300,19 @@ function write_TST_TileRowInfo(data, SST, RSST, wide) {
 | 
			
		||||
    switch (data[C].t) {
 | 
			
		||||
      case "d":
 | 
			
		||||
        if (data[C].v instanceof Date) {
 | 
			
		||||
          celload = write_new_storage({ t: "s", v: data[C].v.toISOString() }, SST, RSST);
 | 
			
		||||
          _celload = write_old_storage({ t: "s", v: data[C].v.toISOString() }, SST, RSST);
 | 
			
		||||
          celload = write_new_storage({ t: "s", v: data[C].v.toISOString() }, lut);
 | 
			
		||||
          _celload = write_old_storage({ t: "s", v: data[C].v.toISOString() }, lut);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        celload = write_new_storage(data[C], SST, RSST);
 | 
			
		||||
        _celload = write_old_storage(data[C], SST, RSST);
 | 
			
		||||
        celload = write_new_storage(data[C], lut);
 | 
			
		||||
        _celload = write_old_storage(data[C], lut);
 | 
			
		||||
        break;
 | 
			
		||||
      case "s":
 | 
			
		||||
      case "n":
 | 
			
		||||
      case "b":
 | 
			
		||||
        celload = write_new_storage(data[C], SST, RSST);
 | 
			
		||||
        _celload = write_old_storage(data[C], SST, RSST);
 | 
			
		||||
      case "z":
 | 
			
		||||
        celload = write_new_storage(data[C], lut);
 | 
			
		||||
        _celload = write_old_storage(data[C], lut);
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        throw new Error("Unsupported value " + data[C]);
 | 
			
		||||
@ -1344,6 +1392,34 @@ function build_numbers_deps(cfb) {
 | 
			
		||||
  });
 | 
			
		||||
  return dependents;
 | 
			
		||||
}
 | 
			
		||||
function write_TSP_Color_RGB(r, g, b) {
 | 
			
		||||
  return write_shallow([
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(1) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([r / 255]).buffer) }],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([g / 255]).buffer) }],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([b / 255]).buffer) }],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([1]).buffer) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(1) }]
 | 
			
		||||
  ]);
 | 
			
		||||
}
 | 
			
		||||
function get_author_color(n) {
 | 
			
		||||
  switch (n) {
 | 
			
		||||
    case 0:
 | 
			
		||||
      return write_TSP_Color_RGB(99, 222, 171);
 | 
			
		||||
    case 1:
 | 
			
		||||
      return write_TSP_Color_RGB(162, 197, 240);
 | 
			
		||||
    case 2:
 | 
			
		||||
      return write_TSP_Color_RGB(255, 189, 189);
 | 
			
		||||
  }
 | 
			
		||||
  return write_TSP_Color_RGB(Math.random() * 255, Math.random() * 255, Math.random() * 255);
 | 
			
		||||
}
 | 
			
		||||
function write_numbers_iwa(wb, opts) {
 | 
			
		||||
  if (!opts || !opts.numbers)
 | 
			
		||||
    throw new Error("Must pass a `numbers` option -- check the README");
 | 
			
		||||
@ -1387,6 +1463,24 @@ function numbers_iwa_find(cfb, deps, id) {
 | 
			
		||||
  });
 | 
			
		||||
  return ainfo;
 | 
			
		||||
}
 | 
			
		||||
function numbers_add_meta(mlist, newid, newloc) {
 | 
			
		||||
  mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(newid) }],
 | 
			
		||||
    [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
    [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
    [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
    [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
  ]) });
 | 
			
		||||
  mlist[1] = [{ type: 0, data: write_varint49(Math.max(newid + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
}
 | 
			
		||||
function numbers_add_msg(cfb, type, msg, path, deps, id) {
 | 
			
		||||
  if (!id)
 | 
			
		||||
    id = get_unique_msgid({ deps: [], location: "", type: type }, deps);
 | 
			
		||||
@ -1399,26 +1493,55 @@ function numbers_add_msg(cfb, type, msg, path, deps, id) {
 | 
			
		||||
  var newloc = loc.replace(/^[\/]/, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
    var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
    mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
      [],
 | 
			
		||||
      [{ type: 0, data: write_varint49(id) }],
 | 
			
		||||
      [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
      [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
      [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
      [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
      [],
 | 
			
		||||
      [],
 | 
			
		||||
      [],
 | 
			
		||||
      [],
 | 
			
		||||
      [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
      [],
 | 
			
		||||
      [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
    ]) });
 | 
			
		||||
    mlist[1] = [{ type: 0, data: write_varint49(Math.max(id + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
    numbers_add_meta(mlist, id || 0, newloc);
 | 
			
		||||
    ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
  });
 | 
			
		||||
  return id;
 | 
			
		||||
}
 | 
			
		||||
function numbers_meta_add_dep(mlist, deps, id, dep) {
 | 
			
		||||
  var loc = deps[id].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
    var _a, _b;
 | 
			
		||||
    var mm = parse_shallow(m.data);
 | 
			
		||||
    if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
      return u8str(mm[3][0].data) == loc;
 | 
			
		||||
    if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
      return true;
 | 
			
		||||
    return false;
 | 
			
		||||
  });
 | 
			
		||||
  var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
  if (!parent[6])
 | 
			
		||||
    parent[6] = [];
 | 
			
		||||
  (Array.isArray(dep) ? dep : [dep]).forEach(function(dep2) {
 | 
			
		||||
    parent[6].push({
 | 
			
		||||
      type: 2,
 | 
			
		||||
      data: write_shallow([
 | 
			
		||||
        [],
 | 
			
		||||
        [{ type: 0, data: write_varint49(dep2) }]
 | 
			
		||||
      ])
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
  mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
}
 | 
			
		||||
function numbers_meta_del_dep(mlist, deps, id, dep) {
 | 
			
		||||
  var loc = deps[id].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
    var _a, _b;
 | 
			
		||||
    var mm = parse_shallow(m.data);
 | 
			
		||||
    if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
      return u8str(mm[3][0].data) == loc;
 | 
			
		||||
    if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
      return true;
 | 
			
		||||
    return false;
 | 
			
		||||
  });
 | 
			
		||||
  var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
  if (!parent[6])
 | 
			
		||||
    parent[6] = [];
 | 
			
		||||
  parent[6] = parent[6].filter(function(m) {
 | 
			
		||||
    return varint_to_i32(parse_shallow(m.data)[1][0].data) != dep;
 | 
			
		||||
  });
 | 
			
		||||
  mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
}
 | 
			
		||||
function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
  var sheetref = -1, newsheetref = -1;
 | 
			
		||||
  var remap = {};
 | 
			
		||||
@ -1457,31 +1580,9 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
    if (deps[drawables[0]].location == deps[newsheetref].location)
 | 
			
		||||
      arch.push(tia);
 | 
			
		||||
    else {
 | 
			
		||||
      var loc2 = deps[newsheetref].location;
 | 
			
		||||
      loc2 = loc2.replace(/^Root Entry\//, "");
 | 
			
		||||
      loc2 = loc2.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
      numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
        var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
        var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
          var _a, _b;
 | 
			
		||||
          var mm = parse_shallow(m.data);
 | 
			
		||||
          if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
            return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
          if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
            return true;
 | 
			
		||||
          return false;
 | 
			
		||||
        });
 | 
			
		||||
        var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
        if (!parent[6])
 | 
			
		||||
          parent[6] = [];
 | 
			
		||||
        parent[6].push({
 | 
			
		||||
          type: 2,
 | 
			
		||||
          data: write_shallow([
 | 
			
		||||
            [],
 | 
			
		||||
            [{ type: 0, data: write_varint49(tiaref) }]
 | 
			
		||||
          ])
 | 
			
		||||
        });
 | 
			
		||||
        mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
        numbers_meta_add_dep(mlist, deps, newsheetref, tiaref);
 | 
			
		||||
        ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
      });
 | 
			
		||||
      numbers_iwa_doit(cfb, deps, tiaref, function(_, x) {
 | 
			
		||||
@ -1515,9 +1616,6 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
      });
 | 
			
		||||
    tiaroot.messages[0].data = write_shallow(tia);
 | 
			
		||||
  });
 | 
			
		||||
  var loc = deps[tmaref].location;
 | 
			
		||||
  loc = loc.replace(/^Root Entry\//, "");
 | 
			
		||||
  loc = loc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  numbers_iwa_doit(cfb, deps, tmaref, function(tmaroot, arch) {
 | 
			
		||||
    var _a, _b;
 | 
			
		||||
    var tma = parse_shallow(tmaroot.messages[0].data);
 | 
			
		||||
@ -1599,47 +1697,11 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
          if (deps[newref].location == deps[oldref].location)
 | 
			
		||||
            deps[newref].location = deps[newref].location.replace(/\.iwa/, "-".concat(newref, ".iwa"));
 | 
			
		||||
          CFB.utils.cfb_add(cfb, deps[newref].location, compress_iwa_file(write_iwa_file([msg])));
 | 
			
		||||
          var newloc = deps[newref].location;
 | 
			
		||||
          newloc = newloc.replace(/^Root Entry\//, "");
 | 
			
		||||
          newloc = newloc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
          var newloc = deps[newref].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
          numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
            var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
            mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(newref) }],
 | 
			
		||||
              [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
              [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
              [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
              [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
              [],
 | 
			
		||||
              [],
 | 
			
		||||
              [],
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
            ]) });
 | 
			
		||||
            mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a3, _b2;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a3 = mm[3]) == null ? void 0 : _a3[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc;
 | 
			
		||||
              if (((_b2 = mm[2]) == null ? void 0 : _b2[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(newref) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_add_meta(mlist, newref, newloc);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tmaref, newref);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
@ -1662,47 +1724,11 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
            if (deps[newref].location == deps[oldref].location)
 | 
			
		||||
              deps[newref].location = deps[newref].location.replace(/\.iwa/, "-".concat(newref, ".iwa"));
 | 
			
		||||
            CFB.utils.cfb_add(cfb, deps[newref].location, compress_iwa_file(write_iwa_file([msg])));
 | 
			
		||||
            var newloc = deps[newref].location;
 | 
			
		||||
            newloc = newloc.replace(/^Root Entry\//, "");
 | 
			
		||||
            newloc = newloc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            var newloc = deps[newref].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
              var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
              mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(newref) }],
 | 
			
		||||
                [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
                [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
                [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
                [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
              ]) });
 | 
			
		||||
              mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
              var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
                var _a2, _b2;
 | 
			
		||||
                var mm = parse_shallow(m.data);
 | 
			
		||||
                if ((_a2 = mm[3]) == null ? void 0 : _a2[0])
 | 
			
		||||
                  return u8str(mm[3][0].data) == loc;
 | 
			
		||||
                if (((_b2 = mm[2]) == null ? void 0 : _b2[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                  return true;
 | 
			
		||||
                return false;
 | 
			
		||||
              });
 | 
			
		||||
              var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
              if (!parent[6])
 | 
			
		||||
                parent[6] = [];
 | 
			
		||||
              parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(newref) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
              mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
              numbers_add_meta(mlist, newref, newloc);
 | 
			
		||||
              numbers_meta_add_dep(mlist, deps, tmaref, newref);
 | 
			
		||||
              ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
@ -1743,26 +1769,7 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
                [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
              ]) });
 | 
			
		||||
              mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileref + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
              var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
                var _a2, _b2;
 | 
			
		||||
                var mm = parse_shallow(m.data);
 | 
			
		||||
                if ((_a2 = mm[3]) == null ? void 0 : _a2[0])
 | 
			
		||||
                  return u8str(mm[3][0].data) == loc;
 | 
			
		||||
                if (((_b2 = mm[2]) == null ? void 0 : _b2[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                  return true;
 | 
			
		||||
                return false;
 | 
			
		||||
              });
 | 
			
		||||
              var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
              if (!parent[6])
 | 
			
		||||
                parent[6] = [];
 | 
			
		||||
              parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(newtileref) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
              mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
              numbers_meta_add_dep(mlist, deps, tmaref, newtileref);
 | 
			
		||||
              ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
@ -1825,12 +1832,15 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  sheet_to_json(ws, { range: range, header: 1 });
 | 
			
		||||
  var SST = ["~Sh33tJ5~"];
 | 
			
		||||
  var RSST = [{ v: "~54ee77S~", l: "https://sheetjs.com/" }];
 | 
			
		||||
  var loc = deps[tmaref].location;
 | 
			
		||||
  loc = loc.replace(/^Root Entry\//, "");
 | 
			
		||||
  loc = loc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  var LUT = {
 | 
			
		||||
    cmnt: [{ a: "~54ee77S~", t: "... the people who are crazy enough to think they can change the world, are the ones who do." }],
 | 
			
		||||
    ferr: [],
 | 
			
		||||
    fmla: [],
 | 
			
		||||
    nfmt: [],
 | 
			
		||||
    ofmt: [],
 | 
			
		||||
    rsst: [{ v: "~54ee77S~", l: "https://sheetjs.com/" }],
 | 
			
		||||
    sst: ["~Sh33tJ5~"]
 | 
			
		||||
  };
 | 
			
		||||
  var pb = parse_shallow(tmaroot.messages[0].data);
 | 
			
		||||
  {
 | 
			
		||||
    pb[6][0].data = write_varint49(range.e.r + 1);
 | 
			
		||||
@ -1884,22 +1894,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
            mlist[3] = mlist[3].filter(function(m) {
 | 
			
		||||
              return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref;
 | 
			
		||||
            });
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6] = parent[6].filter(function(m) {
 | 
			
		||||
              return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref;
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_meta_del_dep(mlist, deps, tmaref, tileref);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
          numbers_del_oref(tmaroot, tileref);
 | 
			
		||||
@ -1925,7 +1920,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
            [{ type: 0, data: write_varint49(USE_WIDE_ROWS ? 1 : 0) }]
 | 
			
		||||
          ];
 | 
			
		||||
          for (var R = tidx * tstride; R <= Math.min(range.e.r, (tidx + 1) * tstride - 1); ++R) {
 | 
			
		||||
            var tilerow = write_TST_TileRowInfo(data[R], SST, RSST, USE_WIDE_ROWS);
 | 
			
		||||
            var tilerow = write_TST_TileRowInfo(data[R], LUT, USE_WIDE_ROWS);
 | 
			
		||||
            tilerow[1][0].data = write_varint49(R - tidx * tstride);
 | 
			
		||||
            tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
 | 
			
		||||
          }
 | 
			
		||||
@ -1958,26 +1953,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
              [{ type: 0, data: write_varint49(save_token) }]
 | 
			
		||||
            ]) });
 | 
			
		||||
            mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileid + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(newtileid) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tmaref, newtileid);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
          numbers_add_oref(tmaroot, newtileid);
 | 
			
		||||
@ -2019,26 +1995,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
        store[13] = [{ type: 2, data: write_TSP_Reference(mergeid) }];
 | 
			
		||||
        numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
          var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
          var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
            var _a, _b;
 | 
			
		||||
            var mm = parse_shallow(m.data);
 | 
			
		||||
            if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
              return u8str(mm[3][0].data) == loc;
 | 
			
		||||
            if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
              return true;
 | 
			
		||||
            return false;
 | 
			
		||||
          });
 | 
			
		||||
          var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
          if (!parent[6])
 | 
			
		||||
            parent[6] = [];
 | 
			
		||||
          parent[6].push({
 | 
			
		||||
            type: 2,
 | 
			
		||||
            data: write_shallow([
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(mergeid) }]
 | 
			
		||||
            ])
 | 
			
		||||
          });
 | 
			
		||||
          mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
          numbers_meta_add_dep(mlist, deps, tmaref, mergeid);
 | 
			
		||||
          ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
        });
 | 
			
		||||
        numbers_add_oref(tmaroot, mergeid);
 | 
			
		||||
@ -2049,7 +2006,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
        var sstdata = parse_shallow(sstroot.messages[0].data);
 | 
			
		||||
        {
 | 
			
		||||
          sstdata[3] = [];
 | 
			
		||||
          SST.forEach(function(str, i) {
 | 
			
		||||
          LUT.sst.forEach(function(str, i) {
 | 
			
		||||
            if (i == 0)
 | 
			
		||||
              return;
 | 
			
		||||
            sstdata[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
@ -2072,7 +2029,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
          903815,
 | 
			
		||||
          903845
 | 
			
		||||
        ];
 | 
			
		||||
        RSST.forEach(function(rsst, i) {
 | 
			
		||||
        LUT.rsst.forEach(function(rsst, i) {
 | 
			
		||||
          if (i == 0)
 | 
			
		||||
            return;
 | 
			
		||||
          var tswpsa = [
 | 
			
		||||
@ -2143,85 +2100,116 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
          numbers_add_oref(rsstroot, rtpaid);
 | 
			
		||||
          numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
            var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
            var loc2 = deps[rsstref].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(rtpaid) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            loc2 = deps[rtpaid].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(tswpsaid) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            loc2 = deps[tswpsaid].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            tswpsarefs.forEach(function(id) {
 | 
			
		||||
              return parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(id) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
            style_indices.forEach(function(n) {
 | 
			
		||||
              return parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(n) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, rsstref, rtpaid);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, rtpaid, tswpsaid);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tswpsaid, tswpsarefs);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tswpsaid, style_indices);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
        rsstroot.messages[0].data = write_shallow(rsstdata);
 | 
			
		||||
      });
 | 
			
		||||
      if (LUT.cmnt.length > 1) {
 | 
			
		||||
        var cmntref = parse_TSP_Reference(store[19][0].data);
 | 
			
		||||
        var authors = {}, iauthor = 0;
 | 
			
		||||
        numbers_iwa_doit(cfb, deps, cmntref, function(cmntroot) {
 | 
			
		||||
          var cmntdata = parse_shallow(cmntroot.messages[0].data);
 | 
			
		||||
          {
 | 
			
		||||
            cmntdata[3] = [];
 | 
			
		||||
            LUT.cmnt.forEach(function(cc, i) {
 | 
			
		||||
              if (i == 0)
 | 
			
		||||
                return;
 | 
			
		||||
              var replies = [];
 | 
			
		||||
              if (cc.replies)
 | 
			
		||||
                cc.replies.forEach(function(c) {
 | 
			
		||||
                  if (!authors[c.a || ""])
 | 
			
		||||
                    authors[c.a || ""] = numbers_add_msg(cfb, 212, [
 | 
			
		||||
                      [],
 | 
			
		||||
                      [{ type: 2, data: stru8(c.a || "") }],
 | 
			
		||||
                      [{ type: 2, data: get_author_color(++iauthor) }],
 | 
			
		||||
                      [],
 | 
			
		||||
                      [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
                    ], "/Index/Tables/DataList", deps);
 | 
			
		||||
                  var aaaid2 = authors[c.a || ""];
 | 
			
		||||
                  var csaid2 = numbers_add_msg(cfb, 3056, [
 | 
			
		||||
                    [],
 | 
			
		||||
                    [{ type: 2, data: stru8(c.t || "") }],
 | 
			
		||||
                    [{ type: 2, data: write_shallow([
 | 
			
		||||
                      [],
 | 
			
		||||
                      [{ type: 1, data: new Uint8Array([0, 0, 0, 128, 116, 109, 182, 65]) }]
 | 
			
		||||
                    ]) }],
 | 
			
		||||
                    [{ type: 2, data: write_TSP_Reference(aaaid2) }]
 | 
			
		||||
                  ], "/Index/Tables/DataList", deps);
 | 
			
		||||
                  numbers_iwa_doit(cfb, deps, csaid2, function(iwa) {
 | 
			
		||||
                    return numbers_add_oref(iwa, aaaid2);
 | 
			
		||||
                  });
 | 
			
		||||
                  replies.push(csaid2);
 | 
			
		||||
                  numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
                    var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
                    numbers_meta_add_dep(mlist, deps, csaid2, aaaid2);
 | 
			
		||||
                    ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
                  });
 | 
			
		||||
                });
 | 
			
		||||
              if (!authors[cc.a || ""])
 | 
			
		||||
                authors[cc.a || ""] = numbers_add_msg(cfb, 212, [
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 2, data: stru8(cc.a || "") }],
 | 
			
		||||
                  [{ type: 2, data: get_author_color(++iauthor) }],
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
                ], "/Index/Tables/DataList", deps);
 | 
			
		||||
              var aaaid = authors[cc.a || ""];
 | 
			
		||||
              var csaid = numbers_add_msg(cfb, 3056, [
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 2, data: stru8(cc.t || "") }],
 | 
			
		||||
                [{ type: 2, data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 1, data: new Uint8Array([0, 0, 0, 128, 116, 109, 182, 65]) }]
 | 
			
		||||
                ]) }],
 | 
			
		||||
                [{ type: 2, data: write_TSP_Reference(aaaid) }],
 | 
			
		||||
                replies.map(function(r) {
 | 
			
		||||
                  return { type: 2, data: write_TSP_Reference(r) };
 | 
			
		||||
                }),
 | 
			
		||||
                [{ type: 2, data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(i) }],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
                ]) }]
 | 
			
		||||
              ], "/Index/Tables/DataList", deps);
 | 
			
		||||
              numbers_iwa_doit(cfb, deps, csaid, function(iwa) {
 | 
			
		||||
                numbers_add_oref(iwa, aaaid);
 | 
			
		||||
                replies.forEach(function(r) {
 | 
			
		||||
                  return numbers_add_oref(iwa, r);
 | 
			
		||||
                });
 | 
			
		||||
              });
 | 
			
		||||
              cmntdata[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(i) }],
 | 
			
		||||
                [{ type: 0, data: write_varint49(1) }],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 2, data: write_TSP_Reference(csaid) }]
 | 
			
		||||
              ]) });
 | 
			
		||||
              numbers_add_oref(cmntroot, csaid);
 | 
			
		||||
              numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
                var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
                numbers_meta_add_dep(mlist, deps, cmntref, csaid);
 | 
			
		||||
                numbers_meta_add_dep(mlist, deps, csaid, aaaid);
 | 
			
		||||
                if (replies.length)
 | 
			
		||||
                  numbers_meta_add_dep(mlist, deps, csaid, replies);
 | 
			
		||||
                ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
          cmntdata[2][0].data = write_varint49(LUT.cmnt.length + 1);
 | 
			
		||||
          cmntroot.messages[0].data = write_shallow(cmntdata);
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    pb[4][0].data = write_shallow(store);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -739,98 +739,133 @@ function parse_new_storage(buf, lut) {
 | 
			
		||||
    ret.v /= 86400;
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
function write_new_storage(cell, sst, rsst) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;
 | 
			
		||||
function write_new_storage(cell, lut) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, fields = 0;
 | 
			
		||||
  out[0] = 5;
 | 
			
		||||
  switch (cell.t) {
 | 
			
		||||
    case "n":
 | 
			
		||||
      out[1] = 2;
 | 
			
		||||
      writeDecimal128LE(out, l, cell.v);
 | 
			
		||||
      flags |= 1;
 | 
			
		||||
      fields |= 1;
 | 
			
		||||
      l += 16;
 | 
			
		||||
      break;
 | 
			
		||||
    case "b":
 | 
			
		||||
      out[1] = 6;
 | 
			
		||||
      dv.setFloat64(l, cell.v ? 1 : 0, true);
 | 
			
		||||
      flags |= 2;
 | 
			
		||||
      fields |= 2;
 | 
			
		||||
      l += 8;
 | 
			
		||||
      break;
 | 
			
		||||
    case "s":
 | 
			
		||||
      {
 | 
			
		||||
        var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
        if (cell.l) {
 | 
			
		||||
          var irsst = rsst.findIndex(function(v) {
 | 
			
		||||
          var irsst = lut.rsst.findIndex(function(v) {
 | 
			
		||||
            var _a;
 | 
			
		||||
            return v.v == s && v.l == ((_a = cell.l) == null ? void 0 : _a.Target);
 | 
			
		||||
          });
 | 
			
		||||
          if (irsst == -1)
 | 
			
		||||
            rsst[irsst = rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
            lut.rsst[irsst = lut.rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
          out[1] = 9;
 | 
			
		||||
          dv.setUint32(l, irsst, true);
 | 
			
		||||
          flags |= 16;
 | 
			
		||||
          fields |= 16;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        } else {
 | 
			
		||||
          var isst = sst.indexOf(s);
 | 
			
		||||
          var isst = lut.sst.indexOf(s);
 | 
			
		||||
          if (isst == -1)
 | 
			
		||||
            sst[isst = sst.length] = s;
 | 
			
		||||
            lut.sst[isst = lut.sst.length] = s;
 | 
			
		||||
          out[1] = 3;
 | 
			
		||||
          dv.setUint32(l, isst, true);
 | 
			
		||||
          flags |= 8;
 | 
			
		||||
          fields |= 8;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case "z":
 | 
			
		||||
      out[1] = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw "unsupported cell type " + cell.t;
 | 
			
		||||
  }
 | 
			
		||||
  dv.setUint32(8, flags, true);
 | 
			
		||||
  if (cell.c) {
 | 
			
		||||
    lut.cmnt.push(s5s_to_iwa_comment(cell.c));
 | 
			
		||||
    dv.setUint32(l, lut.cmnt.length - 1, true);
 | 
			
		||||
    fields |= 524288;
 | 
			
		||||
    l += 4;
 | 
			
		||||
  }
 | 
			
		||||
  dv.setUint32(8, fields, true);
 | 
			
		||||
  return out[subarray](0, l);
 | 
			
		||||
}
 | 
			
		||||
function write_old_storage(cell, sst, rsst) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;
 | 
			
		||||
function write_old_storage(cell, lut) {
 | 
			
		||||
  var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, fields = 0;
 | 
			
		||||
  out[0] = 4;
 | 
			
		||||
  switch (cell.t) {
 | 
			
		||||
    case "n":
 | 
			
		||||
      break;
 | 
			
		||||
    case "b":
 | 
			
		||||
      break;
 | 
			
		||||
    case "s":
 | 
			
		||||
      {
 | 
			
		||||
        var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
        if (cell.l) {
 | 
			
		||||
          var irsst = lut.rsst.findIndex(function(v) {
 | 
			
		||||
            var _a;
 | 
			
		||||
            return v.v == s && v.l == ((_a = cell.l) == null ? void 0 : _a.Target);
 | 
			
		||||
          });
 | 
			
		||||
          if (irsst == -1)
 | 
			
		||||
            lut.rsst[irsst = lut.rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
          out[1] = 9;
 | 
			
		||||
          dv.setUint32(l, irsst, true);
 | 
			
		||||
          fields |= 512;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        } else {
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case "z":
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw "unsupported cell type " + cell.t;
 | 
			
		||||
  }
 | 
			
		||||
  if (cell.c) {
 | 
			
		||||
    dv.setUint32(l, lut.cmnt.length - 1, true);
 | 
			
		||||
    fields |= 4096;
 | 
			
		||||
    l += 4;
 | 
			
		||||
  }
 | 
			
		||||
  switch (cell.t) {
 | 
			
		||||
    case "n":
 | 
			
		||||
      out[1] = 2;
 | 
			
		||||
      dv.setFloat64(l, cell.v, true);
 | 
			
		||||
      flags |= 32;
 | 
			
		||||
      fields |= 32;
 | 
			
		||||
      l += 8;
 | 
			
		||||
      break;
 | 
			
		||||
    case "b":
 | 
			
		||||
      out[1] = 6;
 | 
			
		||||
      dv.setFloat64(l, cell.v ? 1 : 0, true);
 | 
			
		||||
      flags |= 32;
 | 
			
		||||
      fields |= 32;
 | 
			
		||||
      l += 8;
 | 
			
		||||
      break;
 | 
			
		||||
    case "s":
 | 
			
		||||
      {
 | 
			
		||||
        var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
        if (cell.l) {
 | 
			
		||||
          var irsst = rsst.findIndex(function(v) {
 | 
			
		||||
            var _a;
 | 
			
		||||
            return v.v == s && v.l == ((_a = cell.l) == null ? void 0 : _a.Target);
 | 
			
		||||
          });
 | 
			
		||||
          if (irsst == -1)
 | 
			
		||||
            rsst[irsst = rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
          out[1] = 9;
 | 
			
		||||
          dv.setUint32(l, irsst, true);
 | 
			
		||||
          flags |= 512;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        } else {
 | 
			
		||||
          var isst = sst.indexOf(s);
 | 
			
		||||
          var isst = lut.sst.indexOf(s);
 | 
			
		||||
          if (isst == -1)
 | 
			
		||||
            sst[isst = sst.length] = s;
 | 
			
		||||
            lut.sst[isst = lut.sst.length] = s;
 | 
			
		||||
          out[1] = 3;
 | 
			
		||||
          dv.setUint32(l, isst, true);
 | 
			
		||||
          flags |= 16;
 | 
			
		||||
          fields |= 16;
 | 
			
		||||
          l += 4;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      break;
 | 
			
		||||
    case "z":
 | 
			
		||||
      out[1] = 0;
 | 
			
		||||
      break;
 | 
			
		||||
    default:
 | 
			
		||||
      throw "unsupported cell type " + cell.t;
 | 
			
		||||
  }
 | 
			
		||||
  dv.setUint32(8, flags, true);
 | 
			
		||||
  dv.setUint32(8, fields, true);
 | 
			
		||||
  return out[subarray](0, l);
 | 
			
		||||
}
 | 
			
		||||
function parse_cell_storage(buf, lut) {
 | 
			
		||||
@ -1035,6 +1070,18 @@ function iwa_to_s5s_comment(iwa) {
 | 
			
		||||
    });
 | 
			
		||||
  return out;
 | 
			
		||||
}
 | 
			
		||||
function s5s_to_iwa_comment(s5s) {
 | 
			
		||||
  var out = { a: "", t: "", replies: [] };
 | 
			
		||||
  for (var i = 0; i < s5s.length; ++i) {
 | 
			
		||||
    if (i == 0) {
 | 
			
		||||
      out.a = s5s[i].a;
 | 
			
		||||
      out.t = s5s[i].t;
 | 
			
		||||
    } else {
 | 
			
		||||
      out.replies.push({ a: s5s[i].a, t: s5s[i].t });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return out;
 | 
			
		||||
}
 | 
			
		||||
function parse_TST_TableModelArchive(M, root, ws) {
 | 
			
		||||
  var _a, _b, _c, _d, _e, _f, _g, _h, _i;
 | 
			
		||||
  var pb = parse_shallow(root.data);
 | 
			
		||||
@ -1208,8 +1255,8 @@ function parse_numbers_iwa(cfb, opts) {
 | 
			
		||||
    throw new Error("Cannot find Document root");
 | 
			
		||||
  return parse_TN_DocumentArchive(M, docroot, opts);
 | 
			
		||||
}
 | 
			
		||||
function write_TST_TileRowInfo(data, SST, RSST, wide) {
 | 
			
		||||
  var _a, _b;
 | 
			
		||||
function write_TST_TileRowInfo(data, lut, wide) {
 | 
			
		||||
  var _a, _b, _c;
 | 
			
		||||
  var tri = [
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
@ -1242,7 +1289,7 @@ function write_TST_TileRowInfo(data, SST, RSST, wide) {
 | 
			
		||||
  var _dv = u8_to_dataview(tri[4][0].data), _last_offset = 0, _cell_storage = [];
 | 
			
		||||
  var width = wide ? 4 : 1;
 | 
			
		||||
  for (var C = 0; C < data.length; ++C) {
 | 
			
		||||
    if (data[C] == null || data[C].t == "z" || data[C].t == "e") {
 | 
			
		||||
    if (data[C] == null || data[C].t == "z" && !((_c = data[C].c) == null ? void 0 : _c.length) || data[C].t == "e") {
 | 
			
		||||
      dv.setUint16(C * 2, 65535, true);
 | 
			
		||||
      _dv.setUint16(C * 2, 65535);
 | 
			
		||||
      continue;
 | 
			
		||||
@ -1253,18 +1300,19 @@ function write_TST_TileRowInfo(data, SST, RSST, wide) {
 | 
			
		||||
    switch (data[C].t) {
 | 
			
		||||
      case "d":
 | 
			
		||||
        if (data[C].v instanceof Date) {
 | 
			
		||||
          celload = write_new_storage({ t: "s", v: data[C].v.toISOString() }, SST, RSST);
 | 
			
		||||
          _celload = write_old_storage({ t: "s", v: data[C].v.toISOString() }, SST, RSST);
 | 
			
		||||
          celload = write_new_storage({ t: "s", v: data[C].v.toISOString() }, lut);
 | 
			
		||||
          _celload = write_old_storage({ t: "s", v: data[C].v.toISOString() }, lut);
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
        celload = write_new_storage(data[C], SST, RSST);
 | 
			
		||||
        _celload = write_old_storage(data[C], SST, RSST);
 | 
			
		||||
        celload = write_new_storage(data[C], lut);
 | 
			
		||||
        _celload = write_old_storage(data[C], lut);
 | 
			
		||||
        break;
 | 
			
		||||
      case "s":
 | 
			
		||||
      case "n":
 | 
			
		||||
      case "b":
 | 
			
		||||
        celload = write_new_storage(data[C], SST, RSST);
 | 
			
		||||
        _celload = write_old_storage(data[C], SST, RSST);
 | 
			
		||||
      case "z":
 | 
			
		||||
        celload = write_new_storage(data[C], lut);
 | 
			
		||||
        _celload = write_old_storage(data[C], lut);
 | 
			
		||||
        break;
 | 
			
		||||
      default:
 | 
			
		||||
        throw new Error("Unsupported value " + data[C]);
 | 
			
		||||
@ -1344,6 +1392,34 @@ function build_numbers_deps(cfb) {
 | 
			
		||||
  });
 | 
			
		||||
  return dependents;
 | 
			
		||||
}
 | 
			
		||||
function write_TSP_Color_RGB(r, g, b) {
 | 
			
		||||
  return write_shallow([
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(1) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([r / 255]).buffer) }],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([g / 255]).buffer) }],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([b / 255]).buffer) }],
 | 
			
		||||
    [{ type: 5, data: new Uint8Array(Float32Array.from([1]).buffer) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(1) }]
 | 
			
		||||
  ]);
 | 
			
		||||
}
 | 
			
		||||
function get_author_color(n) {
 | 
			
		||||
  switch (n) {
 | 
			
		||||
    case 0:
 | 
			
		||||
      return write_TSP_Color_RGB(99, 222, 171);
 | 
			
		||||
    case 1:
 | 
			
		||||
      return write_TSP_Color_RGB(162, 197, 240);
 | 
			
		||||
    case 2:
 | 
			
		||||
      return write_TSP_Color_RGB(255, 189, 189);
 | 
			
		||||
  }
 | 
			
		||||
  return write_TSP_Color_RGB(Math.random() * 255, Math.random() * 255, Math.random() * 255);
 | 
			
		||||
}
 | 
			
		||||
function write_numbers_iwa(wb, opts) {
 | 
			
		||||
  if (!opts || !opts.numbers)
 | 
			
		||||
    throw new Error("Must pass a `numbers` option -- check the README");
 | 
			
		||||
@ -1387,6 +1463,24 @@ function numbers_iwa_find(cfb, deps, id) {
 | 
			
		||||
  });
 | 
			
		||||
  return ainfo;
 | 
			
		||||
}
 | 
			
		||||
function numbers_add_meta(mlist, newid, newloc) {
 | 
			
		||||
  mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(newid) }],
 | 
			
		||||
    [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
    [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
    [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
    [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
    [],
 | 
			
		||||
    [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
  ]) });
 | 
			
		||||
  mlist[1] = [{ type: 0, data: write_varint49(Math.max(newid + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
}
 | 
			
		||||
function numbers_add_msg(cfb, type, msg, path, deps, id) {
 | 
			
		||||
  if (!id)
 | 
			
		||||
    id = get_unique_msgid({ deps: [], location: "", type: type }, deps);
 | 
			
		||||
@ -1399,26 +1493,55 @@ function numbers_add_msg(cfb, type, msg, path, deps, id) {
 | 
			
		||||
  var newloc = loc.replace(/^[\/]/, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
    var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
    mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
      [],
 | 
			
		||||
      [{ type: 0, data: write_varint49(id) }],
 | 
			
		||||
      [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
      [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
      [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
      [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
      [],
 | 
			
		||||
      [],
 | 
			
		||||
      [],
 | 
			
		||||
      [],
 | 
			
		||||
      [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
      [],
 | 
			
		||||
      [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
    ]) });
 | 
			
		||||
    mlist[1] = [{ type: 0, data: write_varint49(Math.max(id + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
    numbers_add_meta(mlist, id || 0, newloc);
 | 
			
		||||
    ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
  });
 | 
			
		||||
  return id;
 | 
			
		||||
}
 | 
			
		||||
function numbers_meta_add_dep(mlist, deps, id, dep) {
 | 
			
		||||
  var loc = deps[id].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
    var _a, _b;
 | 
			
		||||
    var mm = parse_shallow(m.data);
 | 
			
		||||
    if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
      return u8str(mm[3][0].data) == loc;
 | 
			
		||||
    if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
      return true;
 | 
			
		||||
    return false;
 | 
			
		||||
  });
 | 
			
		||||
  var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
  if (!parent[6])
 | 
			
		||||
    parent[6] = [];
 | 
			
		||||
  (Array.isArray(dep) ? dep : [dep]).forEach(function(dep2) {
 | 
			
		||||
    parent[6].push({
 | 
			
		||||
      type: 2,
 | 
			
		||||
      data: write_shallow([
 | 
			
		||||
        [],
 | 
			
		||||
        [{ type: 0, data: write_varint49(dep2) }]
 | 
			
		||||
      ])
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
  mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
}
 | 
			
		||||
function numbers_meta_del_dep(mlist, deps, id, dep) {
 | 
			
		||||
  var loc = deps[id].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
    var _a, _b;
 | 
			
		||||
    var mm = parse_shallow(m.data);
 | 
			
		||||
    if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
      return u8str(mm[3][0].data) == loc;
 | 
			
		||||
    if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
      return true;
 | 
			
		||||
    return false;
 | 
			
		||||
  });
 | 
			
		||||
  var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
  if (!parent[6])
 | 
			
		||||
    parent[6] = [];
 | 
			
		||||
  parent[6] = parent[6].filter(function(m) {
 | 
			
		||||
    return varint_to_i32(parse_shallow(m.data)[1][0].data) != dep;
 | 
			
		||||
  });
 | 
			
		||||
  mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
}
 | 
			
		||||
function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
  var sheetref = -1, newsheetref = -1;
 | 
			
		||||
  var remap = {};
 | 
			
		||||
@ -1457,31 +1580,9 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
    if (deps[drawables[0]].location == deps[newsheetref].location)
 | 
			
		||||
      arch.push(tia);
 | 
			
		||||
    else {
 | 
			
		||||
      var loc2 = deps[newsheetref].location;
 | 
			
		||||
      loc2 = loc2.replace(/^Root Entry\//, "");
 | 
			
		||||
      loc2 = loc2.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
      numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
        var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
        var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
          var _a, _b;
 | 
			
		||||
          var mm = parse_shallow(m.data);
 | 
			
		||||
          if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
            return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
          if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
            return true;
 | 
			
		||||
          return false;
 | 
			
		||||
        });
 | 
			
		||||
        var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
        if (!parent[6])
 | 
			
		||||
          parent[6] = [];
 | 
			
		||||
        parent[6].push({
 | 
			
		||||
          type: 2,
 | 
			
		||||
          data: write_shallow([
 | 
			
		||||
            [],
 | 
			
		||||
            [{ type: 0, data: write_varint49(tiaref) }]
 | 
			
		||||
          ])
 | 
			
		||||
        });
 | 
			
		||||
        mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
        numbers_meta_add_dep(mlist, deps, newsheetref, tiaref);
 | 
			
		||||
        ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
      });
 | 
			
		||||
      numbers_iwa_doit(cfb, deps, tiaref, function(_, x) {
 | 
			
		||||
@ -1515,9 +1616,6 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
      });
 | 
			
		||||
    tiaroot.messages[0].data = write_shallow(tia);
 | 
			
		||||
  });
 | 
			
		||||
  var loc = deps[tmaref].location;
 | 
			
		||||
  loc = loc.replace(/^Root Entry\//, "");
 | 
			
		||||
  loc = loc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  numbers_iwa_doit(cfb, deps, tmaref, function(tmaroot, arch) {
 | 
			
		||||
    var _a, _b;
 | 
			
		||||
    var tma = parse_shallow(tmaroot.messages[0].data);
 | 
			
		||||
@ -1599,47 +1697,11 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
          if (deps[newref].location == deps[oldref].location)
 | 
			
		||||
            deps[newref].location = deps[newref].location.replace(/\.iwa/, "-".concat(newref, ".iwa"));
 | 
			
		||||
          CFB.utils.cfb_add(cfb, deps[newref].location, compress_iwa_file(write_iwa_file([msg])));
 | 
			
		||||
          var newloc = deps[newref].location;
 | 
			
		||||
          newloc = newloc.replace(/^Root Entry\//, "");
 | 
			
		||||
          newloc = newloc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
          var newloc = deps[newref].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
          numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
            var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
            mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(newref) }],
 | 
			
		||||
              [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
              [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
              [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
              [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
              [],
 | 
			
		||||
              [],
 | 
			
		||||
              [],
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
            ]) });
 | 
			
		||||
            mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a3, _b2;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a3 = mm[3]) == null ? void 0 : _a3[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc;
 | 
			
		||||
              if (((_b2 = mm[2]) == null ? void 0 : _b2[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(newref) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_add_meta(mlist, newref, newloc);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tmaref, newref);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
        }
 | 
			
		||||
@ -1662,47 +1724,11 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
            if (deps[newref].location == deps[oldref].location)
 | 
			
		||||
              deps[newref].location = deps[newref].location.replace(/\.iwa/, "-".concat(newref, ".iwa"));
 | 
			
		||||
            CFB.utils.cfb_add(cfb, deps[newref].location, compress_iwa_file(write_iwa_file([msg])));
 | 
			
		||||
            var newloc = deps[newref].location;
 | 
			
		||||
            newloc = newloc.replace(/^Root Entry\//, "");
 | 
			
		||||
            newloc = newloc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            var newloc = deps[newref].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
              var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
              mlist[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(newref) }],
 | 
			
		||||
                [{ type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
                [{ type: 2, data: stru8(newloc) }],
 | 
			
		||||
                [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
                [{ type: 2, data: new Uint8Array([2, 0, 0]) }],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(0) }],
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
              ]) });
 | 
			
		||||
              mlist[1] = [{ type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
              var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
                var _a2, _b2;
 | 
			
		||||
                var mm = parse_shallow(m.data);
 | 
			
		||||
                if ((_a2 = mm[3]) == null ? void 0 : _a2[0])
 | 
			
		||||
                  return u8str(mm[3][0].data) == loc;
 | 
			
		||||
                if (((_b2 = mm[2]) == null ? void 0 : _b2[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                  return true;
 | 
			
		||||
                return false;
 | 
			
		||||
              });
 | 
			
		||||
              var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
              if (!parent[6])
 | 
			
		||||
                parent[6] = [];
 | 
			
		||||
              parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(newref) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
              mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
              numbers_add_meta(mlist, newref, newloc);
 | 
			
		||||
              numbers_meta_add_dep(mlist, deps, tmaref, newref);
 | 
			
		||||
              ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
@ -1743,26 +1769,7 @@ function numbers_add_ws(cfb, deps, wsidx) {
 | 
			
		||||
                [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
              ]) });
 | 
			
		||||
              mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileref + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
              var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
                var _a2, _b2;
 | 
			
		||||
                var mm = parse_shallow(m.data);
 | 
			
		||||
                if ((_a2 = mm[3]) == null ? void 0 : _a2[0])
 | 
			
		||||
                  return u8str(mm[3][0].data) == loc;
 | 
			
		||||
                if (((_b2 = mm[2]) == null ? void 0 : _b2[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                  return true;
 | 
			
		||||
                return false;
 | 
			
		||||
              });
 | 
			
		||||
              var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
              if (!parent[6])
 | 
			
		||||
                parent[6] = [];
 | 
			
		||||
              parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(newtileref) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
              mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
              numbers_meta_add_dep(mlist, deps, tmaref, newtileref);
 | 
			
		||||
              ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
@ -1825,12 +1832,15 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  sheet_to_json(ws, { range: range, header: 1 });
 | 
			
		||||
  var SST = ["~Sh33tJ5~"];
 | 
			
		||||
  var RSST = [{ v: "~54ee77S~", l: "https://sheetjs.com/" }];
 | 
			
		||||
  var loc = deps[tmaref].location;
 | 
			
		||||
  loc = loc.replace(/^Root Entry\//, "");
 | 
			
		||||
  loc = loc.replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
  var LUT = {
 | 
			
		||||
    cmnt: [{ a: "~54ee77S~", t: "... the people who are crazy enough to think they can change the world, are the ones who do." }],
 | 
			
		||||
    ferr: [],
 | 
			
		||||
    fmla: [],
 | 
			
		||||
    nfmt: [],
 | 
			
		||||
    ofmt: [],
 | 
			
		||||
    rsst: [{ v: "~54ee77S~", l: "https://sheetjs.com/" }],
 | 
			
		||||
    sst: ["~Sh33tJ5~"]
 | 
			
		||||
  };
 | 
			
		||||
  var pb = parse_shallow(tmaroot.messages[0].data);
 | 
			
		||||
  {
 | 
			
		||||
    pb[6][0].data = write_varint49(range.e.r + 1);
 | 
			
		||||
@ -1884,22 +1894,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
            mlist[3] = mlist[3].filter(function(m) {
 | 
			
		||||
              return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref;
 | 
			
		||||
            });
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6] = parent[6].filter(function(m) {
 | 
			
		||||
              return varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref;
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_meta_del_dep(mlist, deps, tmaref, tileref);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
          numbers_del_oref(tmaroot, tileref);
 | 
			
		||||
@ -1925,7 +1920,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
            [{ type: 0, data: write_varint49(USE_WIDE_ROWS ? 1 : 0) }]
 | 
			
		||||
          ];
 | 
			
		||||
          for (var R = tidx * tstride; R <= Math.min(range.e.r, (tidx + 1) * tstride - 1); ++R) {
 | 
			
		||||
            var tilerow = write_TST_TileRowInfo(data[R], SST, RSST, USE_WIDE_ROWS);
 | 
			
		||||
            var tilerow = write_TST_TileRowInfo(data[R], LUT, USE_WIDE_ROWS);
 | 
			
		||||
            tilerow[1][0].data = write_varint49(R - tidx * tstride);
 | 
			
		||||
            tiledata[5].push({ data: write_shallow(tilerow), type: 2 });
 | 
			
		||||
          }
 | 
			
		||||
@ -1958,26 +1953,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
              [{ type: 0, data: write_varint49(save_token) }]
 | 
			
		||||
            ]) });
 | 
			
		||||
            mlist[1] = [{ type: 0, data: write_varint49(Math.max(newtileid + 1, varint_to_i32(mlist[1][0].data))) }];
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(newtileid) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tmaref, newtileid);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
          numbers_add_oref(tmaroot, newtileid);
 | 
			
		||||
@ -2019,26 +1995,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
        store[13] = [{ type: 2, data: write_TSP_Reference(mergeid) }];
 | 
			
		||||
        numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
          var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
          var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
            var _a, _b;
 | 
			
		||||
            var mm = parse_shallow(m.data);
 | 
			
		||||
            if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
              return u8str(mm[3][0].data) == loc;
 | 
			
		||||
            if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc)
 | 
			
		||||
              return true;
 | 
			
		||||
            return false;
 | 
			
		||||
          });
 | 
			
		||||
          var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
          if (!parent[6])
 | 
			
		||||
            parent[6] = [];
 | 
			
		||||
          parent[6].push({
 | 
			
		||||
            type: 2,
 | 
			
		||||
            data: write_shallow([
 | 
			
		||||
              [],
 | 
			
		||||
              [{ type: 0, data: write_varint49(mergeid) }]
 | 
			
		||||
            ])
 | 
			
		||||
          });
 | 
			
		||||
          mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
          numbers_meta_add_dep(mlist, deps, tmaref, mergeid);
 | 
			
		||||
          ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
        });
 | 
			
		||||
        numbers_add_oref(tmaroot, mergeid);
 | 
			
		||||
@ -2049,7 +2006,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
        var sstdata = parse_shallow(sstroot.messages[0].data);
 | 
			
		||||
        {
 | 
			
		||||
          sstdata[3] = [];
 | 
			
		||||
          SST.forEach(function(str, i) {
 | 
			
		||||
          LUT.sst.forEach(function(str, i) {
 | 
			
		||||
            if (i == 0)
 | 
			
		||||
              return;
 | 
			
		||||
            sstdata[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
@ -2072,7 +2029,7 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
          903815,
 | 
			
		||||
          903845
 | 
			
		||||
        ];
 | 
			
		||||
        RSST.forEach(function(rsst, i) {
 | 
			
		||||
        LUT.rsst.forEach(function(rsst, i) {
 | 
			
		||||
          if (i == 0)
 | 
			
		||||
            return;
 | 
			
		||||
          var tswpsa = [
 | 
			
		||||
@ -2143,85 +2100,116 @@ function write_numbers_tma(cfb, deps, ws, tmaroot, tmafile, tmaref) {
 | 
			
		||||
          numbers_add_oref(rsstroot, rtpaid);
 | 
			
		||||
          numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
            var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
            var loc2 = deps[rsstref].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            var parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(rtpaid) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            loc2 = deps[rtpaid].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            parent[6].push({
 | 
			
		||||
              type: 2,
 | 
			
		||||
              data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(tswpsaid) }]
 | 
			
		||||
              ])
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            loc2 = deps[tswpsaid].location.replace(/^Root Entry\//, "").replace(/^Index\//, "").replace(/\.iwa$/, "");
 | 
			
		||||
            parentidx = mlist[3].findIndex(function(m) {
 | 
			
		||||
              var _a, _b;
 | 
			
		||||
              var mm = parse_shallow(m.data);
 | 
			
		||||
              if ((_a = mm[3]) == null ? void 0 : _a[0])
 | 
			
		||||
                return u8str(mm[3][0].data) == loc2;
 | 
			
		||||
              if (((_b = mm[2]) == null ? void 0 : _b[0]) && u8str(mm[2][0].data) == loc2)
 | 
			
		||||
                return true;
 | 
			
		||||
              return false;
 | 
			
		||||
            });
 | 
			
		||||
            parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
            if (!parent[6])
 | 
			
		||||
              parent[6] = [];
 | 
			
		||||
            tswpsarefs.forEach(function(id) {
 | 
			
		||||
              return parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(id) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
            style_indices.forEach(function(n) {
 | 
			
		||||
              return parent[6].push({
 | 
			
		||||
                type: 2,
 | 
			
		||||
                data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(n) }]
 | 
			
		||||
                ])
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
            mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, rsstref, rtpaid);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, rtpaid, tswpsaid);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tswpsaid, tswpsarefs);
 | 
			
		||||
            numbers_meta_add_dep(mlist, deps, tswpsaid, style_indices);
 | 
			
		||||
            ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
          });
 | 
			
		||||
        });
 | 
			
		||||
        rsstroot.messages[0].data = write_shallow(rsstdata);
 | 
			
		||||
      });
 | 
			
		||||
      if (LUT.cmnt.length > 1) {
 | 
			
		||||
        var cmntref = parse_TSP_Reference(store[19][0].data);
 | 
			
		||||
        var authors = {}, iauthor = 0;
 | 
			
		||||
        numbers_iwa_doit(cfb, deps, cmntref, function(cmntroot) {
 | 
			
		||||
          var cmntdata = parse_shallow(cmntroot.messages[0].data);
 | 
			
		||||
          {
 | 
			
		||||
            cmntdata[3] = [];
 | 
			
		||||
            LUT.cmnt.forEach(function(cc, i) {
 | 
			
		||||
              if (i == 0)
 | 
			
		||||
                return;
 | 
			
		||||
              var replies = [];
 | 
			
		||||
              if (cc.replies)
 | 
			
		||||
                cc.replies.forEach(function(c) {
 | 
			
		||||
                  if (!authors[c.a || ""])
 | 
			
		||||
                    authors[c.a || ""] = numbers_add_msg(cfb, 212, [
 | 
			
		||||
                      [],
 | 
			
		||||
                      [{ type: 2, data: stru8(c.a || "") }],
 | 
			
		||||
                      [{ type: 2, data: get_author_color(++iauthor) }],
 | 
			
		||||
                      [],
 | 
			
		||||
                      [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
                    ], "/Index/Tables/DataList", deps);
 | 
			
		||||
                  var aaaid2 = authors[c.a || ""];
 | 
			
		||||
                  var csaid2 = numbers_add_msg(cfb, 3056, [
 | 
			
		||||
                    [],
 | 
			
		||||
                    [{ type: 2, data: stru8(c.t || "") }],
 | 
			
		||||
                    [{ type: 2, data: write_shallow([
 | 
			
		||||
                      [],
 | 
			
		||||
                      [{ type: 1, data: new Uint8Array([0, 0, 0, 128, 116, 109, 182, 65]) }]
 | 
			
		||||
                    ]) }],
 | 
			
		||||
                    [{ type: 2, data: write_TSP_Reference(aaaid2) }]
 | 
			
		||||
                  ], "/Index/Tables/DataList", deps);
 | 
			
		||||
                  numbers_iwa_doit(cfb, deps, csaid2, function(iwa) {
 | 
			
		||||
                    return numbers_add_oref(iwa, aaaid2);
 | 
			
		||||
                  });
 | 
			
		||||
                  replies.push(csaid2);
 | 
			
		||||
                  numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
                    var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
                    numbers_meta_add_dep(mlist, deps, csaid2, aaaid2);
 | 
			
		||||
                    ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
                  });
 | 
			
		||||
                });
 | 
			
		||||
              if (!authors[cc.a || ""])
 | 
			
		||||
                authors[cc.a || ""] = numbers_add_msg(cfb, 212, [
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 2, data: stru8(cc.a || "") }],
 | 
			
		||||
                  [{ type: 2, data: get_author_color(++iauthor) }],
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
                ], "/Index/Tables/DataList", deps);
 | 
			
		||||
              var aaaid = authors[cc.a || ""];
 | 
			
		||||
              var csaid = numbers_add_msg(cfb, 3056, [
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 2, data: stru8(cc.t || "") }],
 | 
			
		||||
                [{ type: 2, data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 1, data: new Uint8Array([0, 0, 0, 128, 116, 109, 182, 65]) }]
 | 
			
		||||
                ]) }],
 | 
			
		||||
                [{ type: 2, data: write_TSP_Reference(aaaid) }],
 | 
			
		||||
                replies.map(function(r) {
 | 
			
		||||
                  return { type: 2, data: write_TSP_Reference(r) };
 | 
			
		||||
                }),
 | 
			
		||||
                [{ type: 2, data: write_shallow([
 | 
			
		||||
                  [],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(i) }],
 | 
			
		||||
                  [{ type: 0, data: write_varint49(0) }]
 | 
			
		||||
                ]) }]
 | 
			
		||||
              ], "/Index/Tables/DataList", deps);
 | 
			
		||||
              numbers_iwa_doit(cfb, deps, csaid, function(iwa) {
 | 
			
		||||
                numbers_add_oref(iwa, aaaid);
 | 
			
		||||
                replies.forEach(function(r) {
 | 
			
		||||
                  return numbers_add_oref(iwa, r);
 | 
			
		||||
                });
 | 
			
		||||
              });
 | 
			
		||||
              cmntdata[3].push({ type: 2, data: write_shallow([
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 0, data: write_varint49(i) }],
 | 
			
		||||
                [{ type: 0, data: write_varint49(1) }],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [],
 | 
			
		||||
                [{ type: 2, data: write_TSP_Reference(csaid) }]
 | 
			
		||||
              ]) });
 | 
			
		||||
              numbers_add_oref(cmntroot, csaid);
 | 
			
		||||
              numbers_iwa_doit(cfb, deps, 2, function(ai) {
 | 
			
		||||
                var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
                numbers_meta_add_dep(mlist, deps, cmntref, csaid);
 | 
			
		||||
                numbers_meta_add_dep(mlist, deps, csaid, aaaid);
 | 
			
		||||
                if (replies.length)
 | 
			
		||||
                  numbers_meta_add_dep(mlist, deps, csaid, replies);
 | 
			
		||||
                ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
              });
 | 
			
		||||
            });
 | 
			
		||||
          }
 | 
			
		||||
          cmntdata[2][0].data = write_varint49(LUT.cmnt.length + 1);
 | 
			
		||||
          cmntroot.messages[0].data = write_shallow(cmntdata);
 | 
			
		||||
        });
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    pb[4][0].data = write_shallow(store);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@ -11,7 +11,6 @@ declare var encode_row: typeof utils.encode_row;
 | 
			
		||||
declare var encode_range: typeof utils.encode_range;
 | 
			
		||||
declare var book_new: typeof utils.book_new;
 | 
			
		||||
declare var book_append_sheet: typeof utils.book_append_sheet;
 | 
			
		||||
declare var sheet_to_json: typeof utils.sheet_to_json;
 | 
			
		||||
declare var decode_range: typeof utils.decode_range;
 | 
			
		||||
import * as _CFB from 'cfb';
 | 
			
		||||
declare var CFB: typeof _CFB;
 | 
			
		||||
@ -600,51 +599,72 @@ function parse_new_storage(buf: Uint8Array, lut: DataLUT): CellObject | void {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Write a cell "new storage" (version 5) */
 | 
			
		||||
function write_new_storage(cell: CellObject, sst: string[], rsst: RichText[]): Uint8Array {
 | 
			
		||||
	var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;
 | 
			
		||||
function write_new_storage(cell: CellObject, lut: DataLUT): Uint8Array {
 | 
			
		||||
	var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, fields = 0;
 | 
			
		||||
	out[0] = 5;
 | 
			
		||||
	switch(cell.t) {
 | 
			
		||||
		case "n": out[1] = 2; writeDecimal128LE(out, l, cell.v as number); flags |= 1; l += 16; break;
 | 
			
		||||
		case "b": out[1] = 6; dv.setFloat64(l, cell.v ? 1 : 0, true); flags |= 2; l += 8; break;
 | 
			
		||||
		case "n": out[1] = 2; writeDecimal128LE(out, l, cell.v as number); fields |= 1; l += 16; break;
 | 
			
		||||
		case "b": out[1] = 6; dv.setFloat64(l, cell.v ? 1 : 0, true); fields |= 2; l += 8; break;
 | 
			
		||||
		case "s": {
 | 
			
		||||
			var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
			if(cell.l) {
 | 
			
		||||
				var irsst = rsst.findIndex(v => v.v == s && v.l == cell.l?.Target);
 | 
			
		||||
				if(irsst == -1) rsst[irsst = rsst.length] = { v: s , l: cell.l.Target };
 | 
			
		||||
				out[1] = 9; dv.setUint32(l, irsst, true); flags |= 0x10; l += 4;
 | 
			
		||||
				var irsst = lut.rsst.findIndex(v => v.v == s && v.l == cell.l?.Target);
 | 
			
		||||
				if(irsst == -1) lut.rsst[irsst = lut.rsst.length] = { v: s , l: cell.l.Target };
 | 
			
		||||
				out[1] = 9; dv.setUint32(l, irsst, true); fields |= 0x10; l += 4;
 | 
			
		||||
			} else {
 | 
			
		||||
				var isst = sst.indexOf(s);
 | 
			
		||||
				if(isst == -1) sst[isst = sst.length] = s;
 | 
			
		||||
				out[1] = 3; dv.setUint32(l, isst, true); flags |= 8; l += 4;
 | 
			
		||||
				var isst = lut.sst.indexOf(s);
 | 
			
		||||
				if(isst == -1) lut.sst[isst = lut.sst.length] = s;
 | 
			
		||||
				out[1] = 3; dv.setUint32(l, isst, true); fields |= 8; l += 4;
 | 
			
		||||
			}
 | 
			
		||||
		} break;
 | 
			
		||||
		case "z": out[1] = 0; break;
 | 
			
		||||
		default: throw "unsupported cell type " + cell.t;
 | 
			
		||||
	}
 | 
			
		||||
	dv.setUint32(8, flags, true);
 | 
			
		||||
	if(cell.c) {
 | 
			
		||||
		lut.cmnt.push(s5s_to_iwa_comment(cell.c));
 | 
			
		||||
		dv.setUint32(l, lut.cmnt.length - 1, true); fields |= 0x80000; l += 4;
 | 
			
		||||
	}
 | 
			
		||||
	dv.setUint32(8, fields, true);
 | 
			
		||||
	return out[subarray](0, l);
 | 
			
		||||
}
 | 
			
		||||
/** Write a cell "old storage" (version 4) */
 | 
			
		||||
function write_old_storage(cell: CellObject, sst: string[], rsst: RichText[]): Uint8Array {
 | 
			
		||||
	var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;
 | 
			
		||||
function write_old_storage(cell: CellObject, lut: DataLUT): Uint8Array {
 | 
			
		||||
	var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, fields = 0;
 | 
			
		||||
	out[0] = 4;
 | 
			
		||||
	/* note: rich text appears *before* comments */
 | 
			
		||||
	switch(cell.t) {
 | 
			
		||||
		case "n": out[1] = 2; dv.setFloat64(l, cell.v as number, true); flags |= 0x20; l += 8; break;
 | 
			
		||||
		case "b": out[1] = 6; dv.setFloat64(l, cell.v ? 1 : 0, true); flags |= 0x20; l += 8; break;
 | 
			
		||||
		case "n": break;
 | 
			
		||||
		case "b": break;
 | 
			
		||||
		case "s": {
 | 
			
		||||
			var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
			if(cell.l) {
 | 
			
		||||
				var irsst = rsst.findIndex(v => v.v == s && v.l == cell.l?.Target);
 | 
			
		||||
				if(irsst == -1) rsst[irsst = rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
				out[1] = 9; dv.setUint32(l, irsst, true); flags |= 0x200; l += 4;
 | 
			
		||||
			} else {
 | 
			
		||||
				var isst = sst.indexOf(s);
 | 
			
		||||
				if(isst == -1) sst[isst = sst.length] = s;
 | 
			
		||||
				out[1] = 3; dv.setUint32(l, isst, true); flags |= 0x10; l += 4;
 | 
			
		||||
			}
 | 
			
		||||
				var irsst = lut.rsst.findIndex(v => v.v == s && v.l == cell.l?.Target);
 | 
			
		||||
				if(irsst == -1) lut.rsst[irsst = lut.rsst.length] = { v: s, l: cell.l.Target };
 | 
			
		||||
				out[1] = 9; dv.setUint32(l, irsst, true); fields |= 0x200; l += 4;
 | 
			
		||||
			} else { }
 | 
			
		||||
		} break;
 | 
			
		||||
		case "z": break;
 | 
			
		||||
		default: throw "unsupported cell type " + cell.t;
 | 
			
		||||
	}
 | 
			
		||||
	dv.setUint32(8, flags, true);
 | 
			
		||||
	if(cell.c) {
 | 
			
		||||
		/* NOTE: THIS ASSUMES write_new_storage was called */
 | 
			
		||||
		dv.setUint32(l, lut.cmnt.length - 1, true); fields |= 0x1000; l += 4;
 | 
			
		||||
	}
 | 
			
		||||
	switch(cell.t) {
 | 
			
		||||
		case "n": out[1] = 2; dv.setFloat64(l, cell.v as number, true); fields |= 0x20; l += 8; break;
 | 
			
		||||
		case "b": out[1] = 6; dv.setFloat64(l, cell.v ? 1 : 0, true); fields |= 0x20; l += 8; break;
 | 
			
		||||
		case "s": {
 | 
			
		||||
			var s = cell.v == null ? "" : String(cell.v);
 | 
			
		||||
			if(cell.l) { } else {
 | 
			
		||||
				var isst = lut.sst.indexOf(s);
 | 
			
		||||
				if(isst == -1) lut.sst[isst = lut.sst.length] = s;
 | 
			
		||||
				out[1] = 3; dv.setUint32(l, isst, true); fields |= 0x10; l += 4;
 | 
			
		||||
			}
 | 
			
		||||
		} break;
 | 
			
		||||
		case "z": out[1] = 0; break;
 | 
			
		||||
		default: throw "unsupported cell type " + cell.t;
 | 
			
		||||
	}
 | 
			
		||||
	dv.setUint32(8, fields, true);
 | 
			
		||||
	return out[subarray](0, l);
 | 
			
		||||
}
 | 
			
		||||
//<<export { write_new_storage, write_old_storage };
 | 
			
		||||
@ -669,8 +689,7 @@ function parse_TSP_Reference(buf: Uint8Array): number {
 | 
			
		||||
}
 | 
			
		||||
/** Write .TSP.Reference */
 | 
			
		||||
function write_TSP_Reference(idx: number): Uint8Array {
 | 
			
		||||
	return write_shallow([
 | 
			
		||||
		[],
 | 
			
		||||
	return write_shallow([ [],
 | 
			
		||||
		[ { type: 0, data: write_varint49(idx) } ]
 | 
			
		||||
	]);
 | 
			
		||||
}
 | 
			
		||||
@ -853,6 +872,17 @@ function iwa_to_s5s_comment(iwa: IWAComment): Comments {
 | 
			
		||||
	});
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
/** Create IWA comment from SheetJS threaded comment structure */
 | 
			
		||||
function s5s_to_iwa_comment(s5s: Comments): IWAComment {
 | 
			
		||||
	var out: IWAComment = {a: "", t:"", replies:[]};
 | 
			
		||||
	for(var i = 0; i < s5s.length; ++i) {
 | 
			
		||||
		if(i == 0) { out.a = s5s[i].a; out.t = s5s[i].t; }
 | 
			
		||||
		else {
 | 
			
		||||
			out.replies!.push({a: s5s[i].a, t: s5s[i].t});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return out;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Parse .TST.TableModelArchive (6001) */
 | 
			
		||||
function parse_TST_TableModelArchive(M: MessageSpace, root: IWAMessage, ws: WorkSheet) {
 | 
			
		||||
@ -1024,7 +1054,7 @@ interface DependentInfo {
 | 
			
		||||
	type: number;
 | 
			
		||||
}
 | 
			
		||||
/** Write .TST.TileRowInfo */
 | 
			
		||||
function write_TST_TileRowInfo(data: CellObject[], SST: string[], RSST: RichText[], wide: boolean): ProtoMessage {
 | 
			
		||||
function write_TST_TileRowInfo(data: CellObject[], lut: DataLUT, wide: boolean): ProtoMessage {
 | 
			
		||||
	var tri: ProtoMessage = [
 | 
			
		||||
		[],
 | 
			
		||||
		[ { type: 0, data: write_varint49(0) }],
 | 
			
		||||
@ -1056,7 +1086,8 @@ function write_TST_TileRowInfo(data: CellObject[], SST: string[], RSST: RichText
 | 
			
		||||
	var _dv = u8_to_dataview(tri[4][0].data), _last_offset = 0, _cell_storage: Uint8Array[] = [];
 | 
			
		||||
	var width = wide ? 4 : 1;
 | 
			
		||||
	for(var C = 0; C < data.length; ++C) {
 | 
			
		||||
		if(data[C] == null || data[C].t == "z" || data[C].t == "e") { dv.setUint16(C*2, 0xFFFF, true); _dv.setUint16(C*2, 0xFFFF); continue; }
 | 
			
		||||
		/* TODO: serialize errors */
 | 
			
		||||
		if(data[C] == null || (data[C].t == "z" && !data[C].c?.length) || data[C].t == "e") { dv.setUint16(C*2, 0xFFFF, true); _dv.setUint16(C*2, 0xFFFF); continue; }
 | 
			
		||||
		dv.setUint16(C*2, last_offset / width, true);
 | 
			
		||||
		/*if(!wide)*/ _dv.setUint16(C*2, _last_offset / width, true);
 | 
			
		||||
		var celload: Uint8Array, _celload: Uint8Array;
 | 
			
		||||
@ -1064,17 +1095,17 @@ function write_TST_TileRowInfo(data: CellObject[], SST: string[], RSST: RichText
 | 
			
		||||
			case "d":
 | 
			
		||||
				// TODO: write the actual date code
 | 
			
		||||
				if(data[C].v instanceof Date) {
 | 
			
		||||
					celload = write_new_storage({t: "s", v: (data[C].v as Date).toISOString()}, SST, RSST);
 | 
			
		||||
					/*if(!wide)*/ _celload = write_old_storage({t: "s", v: (data[C].v as Date).toISOString()}, SST, RSST);
 | 
			
		||||
					celload = write_new_storage({t: "s", v: (data[C].v as Date).toISOString()}, lut);
 | 
			
		||||
					/*if(!wide)*/ _celload = write_old_storage({t: "s", v: (data[C].v as Date).toISOString()}, lut);
 | 
			
		||||
					break;
 | 
			
		||||
				}
 | 
			
		||||
				/* TODO: can esbuild preserve falls through comments ? */
 | 
			
		||||
				celload = write_new_storage(data[C], SST, RSST);
 | 
			
		||||
				/*if(!wide)*/ _celload = write_old_storage(data[C], SST, RSST);
 | 
			
		||||
				celload = write_new_storage(data[C], lut);
 | 
			
		||||
				/*if(!wide)*/ _celload = write_old_storage(data[C], lut);
 | 
			
		||||
				break;
 | 
			
		||||
			case "s": case "n": case "b":
 | 
			
		||||
				celload = write_new_storage(data[C], SST, RSST);
 | 
			
		||||
				/*if(!wide)*/ _celload = write_old_storage(data[C], SST, RSST);
 | 
			
		||||
			case "s": case "n": case "b": case "z":
 | 
			
		||||
				celload = write_new_storage(data[C], lut);
 | 
			
		||||
				/*if(!wide)*/ _celload = write_old_storage(data[C], lut);
 | 
			
		||||
				break;
 | 
			
		||||
			default:
 | 
			
		||||
				throw new Error("Unsupported value " + data[C]);
 | 
			
		||||
@ -1153,6 +1184,27 @@ function build_numbers_deps(cfb: CFB$Container): Dependents {
 | 
			
		||||
	return dependents;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Generate .TSP.Color from r/g/b (0-255) */
 | 
			
		||||
function write_TSP_Color_RGB(r: number, g: number, b: number): Uint8Array { return write_shallow([[],
 | 
			
		||||
	[{ type: 0, data: write_varint49(1) }],
 | 
			
		||||
	[],
 | 
			
		||||
	[{ type: 5, data: new Uint8Array(Float32Array.from([r/255]).buffer)}],
 | 
			
		||||
	[{ type: 5, data: new Uint8Array(Float32Array.from([g/255]).buffer)}],
 | 
			
		||||
	[{ type: 5, data: new Uint8Array(Float32Array.from([b/255]).buffer)}],
 | 
			
		||||
	[{ type: 5, data: new Uint8Array(Float32Array.from([1]).buffer)}],
 | 
			
		||||
	[], [], [], [], [],
 | 
			
		||||
	[{ type: 0, data: write_varint49(1) }]
 | 
			
		||||
]); }
 | 
			
		||||
 | 
			
		||||
function get_author_color(n: number): Uint8Array {
 | 
			
		||||
	switch(n) {
 | 
			
		||||
		case 0: return write_TSP_Color_RGB(0x63, 0xDE, 0xAB);
 | 
			
		||||
		case 1: return write_TSP_Color_RGB(0xA2, 0xC5, 0xF0);
 | 
			
		||||
		case 2: return write_TSP_Color_RGB(0xFF, 0xBD, 0xBD);
 | 
			
		||||
	}
 | 
			
		||||
	return write_TSP_Color_RGB(Math.random()*255, Math.random()*255, Math.random()*255);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Write NUMBERS workbook */
 | 
			
		||||
function write_numbers_iwa(wb: WorkBook, opts?: WritingOptions): CFB$Container {
 | 
			
		||||
	if(!opts || !opts.numbers) throw new Error("Must pass a `numbers` option -- check the README");
 | 
			
		||||
@ -1198,6 +1250,21 @@ function numbers_iwa_find(cfb: CFB$Container, deps: Dependents, id: number) {
 | 
			
		||||
	return ainfo;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function numbers_add_meta(mlist: ProtoMessage, newid: number, newloc: string) {
 | 
			
		||||
	mlist[3].push({type: 2, data: write_shallow([ [],
 | 
			
		||||
		[{type: 0, data: write_varint49(newid)}],
 | 
			
		||||
		[{type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
		[{type: 2, data: stru8(newloc)}],
 | 
			
		||||
		[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
		[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
		[], [], [], [], // skip fields 6-9
 | 
			
		||||
		[{type: 0, data: write_varint49(0)}],
 | 
			
		||||
		[],
 | 
			
		||||
		[{type: 0, data: write_varint49(0 /* TODO: save_token */)}],
 | 
			
		||||
	])});
 | 
			
		||||
	mlist[1] = [{type: 0, data: write_varint49(Math.max(newid + 1, varint_to_i32(mlist[1][0].data) ))}];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function numbers_add_msg(cfb: CFB$Container, type: number, msg: ProtoMessage, path: string, deps: Dependents, id?: number): number {
 | 
			
		||||
	if(!id) id = get_unique_msgid({ deps: [], location: "", type }, deps);
 | 
			
		||||
	var loc = `${path}-${id}.iwa`;
 | 
			
		||||
@ -1209,25 +1276,50 @@ function numbers_add_msg(cfb: CFB$Container, type: number, msg: ProtoMessage, pa
 | 
			
		||||
	var newloc = loc.replace(/^[\/]/, "").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
	numbers_iwa_doit(cfb, deps, 2, ai => {
 | 
			
		||||
		var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
 | 
			
		||||
		mlist[3].push({type: 2, data: write_shallow([ [],
 | 
			
		||||
			[{type: 0, data: write_varint49(id as number)}],
 | 
			
		||||
			[{type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
			[{type: 2, data: stru8(newloc)}],
 | 
			
		||||
			[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
			[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
			[], [], [], [],
 | 
			
		||||
			[{type: 0, data: write_varint49(0)}],
 | 
			
		||||
			[],
 | 
			
		||||
			[{type: 0, data: write_varint49(0 /* TODO: save_token */)}],
 | 
			
		||||
		])});
 | 
			
		||||
		mlist[1] = [{type: 0, data: write_varint49(Math.max((id as number) + 1, varint_to_i32(mlist[1][0].data) ))}];
 | 
			
		||||
		numbers_add_meta(mlist, id||0, newloc);
 | 
			
		||||
 | 
			
		||||
		ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
	})
 | 
			
		||||
	return id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Add dependency to metadata */
 | 
			
		||||
function numbers_meta_add_dep(mlist: ProtoMessage, deps: Dependents, id: number, dep: number|number[]) {
 | 
			
		||||
	var loc = deps[id].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
	var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
		var mm = parse_shallow(m.data);
 | 
			
		||||
		if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
		if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
		return false;
 | 
			
		||||
	});
 | 
			
		||||
	var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
	if(!parent[6]) parent[6] = [];
 | 
			
		||||
	(Array.isArray(dep) ? dep : [dep]).forEach(dep => {
 | 
			
		||||
		parent[6].push({
 | 
			
		||||
			type: 2,
 | 
			
		||||
			data: write_shallow([ [],
 | 
			
		||||
				[{type: 0, data: write_varint49(dep) }]
 | 
			
		||||
			])
 | 
			
		||||
		});
 | 
			
		||||
	});
 | 
			
		||||
	mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Remove dependency from metadata */
 | 
			
		||||
function numbers_meta_del_dep(mlist: ProtoMessage, deps: Dependents, id: number, dep: number|number[]) {
 | 
			
		||||
	var loc = deps[id].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
	var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
		var mm = parse_shallow(m.data);
 | 
			
		||||
		if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
		if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
		return false;
 | 
			
		||||
	});
 | 
			
		||||
	var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
	if(!parent[6]) parent[6] = [];
 | 
			
		||||
	parent[6] = parent[6].filter(m => varint_to_i32(parse_shallow(m.data)[1][0].data) != dep);
 | 
			
		||||
	mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/** Deep copy of the essential parts of a worksheet */
 | 
			
		||||
function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
	var sheetref = -1, newsheetref = -1;
 | 
			
		||||
@ -1277,29 +1369,12 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
		tia.id = tiaref;
 | 
			
		||||
		if(deps[drawables[0]].location == deps[newsheetref].location) arch.push(tia);
 | 
			
		||||
		else {
 | 
			
		||||
			var loc = deps[newsheetref].location;
 | 
			
		||||
			loc = loc.replace(/^Root Entry\//,""); // NOTE: the Root Entry prefix is an artifact of the CFB container library
 | 
			
		||||
			loc = loc.replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
			/* TODO: there are a number of places that assume the metadata record has ID=2 */
 | 
			
		||||
			numbers_iwa_doit(cfb, deps, 2, (ai => {
 | 
			
		||||
				var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
 | 
			
		||||
				/* add reference from SheetArchive file to TIA */
 | 
			
		||||
				var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
					var mm = parse_shallow(m.data);
 | 
			
		||||
					if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
					if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
					return false;
 | 
			
		||||
				});
 | 
			
		||||
				var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
				if(!parent[6]) parent[6] = [];
 | 
			
		||||
				parent[6].push({
 | 
			
		||||
					type: 2,
 | 
			
		||||
					data: write_shallow([
 | 
			
		||||
						[],
 | 
			
		||||
						[{type: 0, data: write_varint49(tiaref) }]
 | 
			
		||||
					])
 | 
			
		||||
				});
 | 
			
		||||
				mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
				numbers_meta_add_dep(mlist, deps, newsheetref, tiaref);
 | 
			
		||||
 | 
			
		||||
				ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
			}));
 | 
			
		||||
@ -1340,11 +1415,6 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
		tiaroot.messages[0].data = write_shallow(tia);
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	/* identifier for finding the TableModelArchive in the archive */
 | 
			
		||||
	var loc = deps[tmaref].location;
 | 
			
		||||
	loc = loc.replace(/^Root Entry\//,""); // NOTE: the Root Entry prefix is an artifact of the CFB container library
 | 
			
		||||
	loc = loc.replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
 | 
			
		||||
	/* .TST.TableModelArchive */
 | 
			
		||||
	numbers_iwa_doit(cfb, deps, tmaref, (tmaroot: IWAArchiveInfo, arch: IWAArchiveInfo[]) => {
 | 
			
		||||
		/* TODO: formulae currently break due to missing CE details */
 | 
			
		||||
@ -1412,46 +1482,14 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
					if(deps[newref].location == deps[oldref].location) deps[newref].location = deps[newref].location.replace(/\.iwa/, `-${newref}.iwa`);
 | 
			
		||||
					CFB.utils.cfb_add(cfb, deps[newref].location, compress_iwa_file(write_iwa_file([ msg ])));
 | 
			
		||||
 | 
			
		||||
					var newloc = deps[newref].location;
 | 
			
		||||
					newloc = newloc.replace(/^Root Entry\//,""); // NOTE: the Root Entry prefix is an artifact of the CFB container library
 | 
			
		||||
					newloc = newloc.replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
					var newloc = deps[newref].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
 | 
			
		||||
					numbers_iwa_doit(cfb, deps, 2, ai => {
 | 
			
		||||
						var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
						mlist[3].push({type: 2, data: write_shallow([
 | 
			
		||||
							[],
 | 
			
		||||
							[{type: 0, data: write_varint49(newref)}],
 | 
			
		||||
							[{type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
							[{type: 2, data: stru8(newloc)}],
 | 
			
		||||
							[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
							[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
							[],
 | 
			
		||||
							[],
 | 
			
		||||
							[],
 | 
			
		||||
							[],
 | 
			
		||||
							[{type: 0, data: write_varint49(0)}],
 | 
			
		||||
							[],
 | 
			
		||||
							[{type: 0, data: write_varint49(0 /* TODO: save_token */)}],
 | 
			
		||||
						])});
 | 
			
		||||
						mlist[1] = [{type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data) ))}];
 | 
			
		||||
						numbers_add_meta(mlist, newref, newloc);
 | 
			
		||||
 | 
			
		||||
						/* add reference from TableModelArchive file to Tile */
 | 
			
		||||
						var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
							var mm = parse_shallow(m.data);
 | 
			
		||||
							if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
							if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
							return false;
 | 
			
		||||
						});
 | 
			
		||||
						var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
						if(!parent[6]) parent[6] = [];
 | 
			
		||||
						parent[6].push({
 | 
			
		||||
							type: 2,
 | 
			
		||||
							data: write_shallow([
 | 
			
		||||
								[],
 | 
			
		||||
								[{type: 0, data: write_varint49(newref) }]
 | 
			
		||||
							])
 | 
			
		||||
						});
 | 
			
		||||
						mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
						numbers_meta_add_dep(mlist, deps, tmaref, newref);
 | 
			
		||||
 | 
			
		||||
						ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
					});
 | 
			
		||||
@ -1477,45 +1515,14 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
						if(deps[newref].location == deps[oldref].location) deps[newref].location = deps[newref].location.replace(/\.iwa/, `-${newref}.iwa`);
 | 
			
		||||
						CFB.utils.cfb_add(cfb, deps[newref].location, compress_iwa_file(write_iwa_file([ msg ])));
 | 
			
		||||
 | 
			
		||||
						var newloc = deps[newref].location;
 | 
			
		||||
						newloc = newloc.replace(/^Root Entry\//,""); // NOTE: the Root Entry prefix is an artifact of the CFB container library
 | 
			
		||||
						newloc = newloc.replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
						var newloc = deps[newref].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
 | 
			
		||||
						numbers_iwa_doit(cfb, deps, 2, (ai => {
 | 
			
		||||
							var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
							mlist[3].push({type: 2, data: write_shallow([ [],
 | 
			
		||||
								[{type: 0, data: write_varint49(newref)}],
 | 
			
		||||
								[{type: 2, data: stru8(newloc.replace(/-.*$/, "")) }],
 | 
			
		||||
								[{type: 2, data: stru8(newloc)}],
 | 
			
		||||
								[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
								[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
								[],
 | 
			
		||||
								[],
 | 
			
		||||
								[],
 | 
			
		||||
								[],
 | 
			
		||||
								[{type: 0, data: write_varint49(0)}],
 | 
			
		||||
								[],
 | 
			
		||||
								[{type: 0, data: write_varint49(0 /* TODO: save_token */)}],
 | 
			
		||||
							])});
 | 
			
		||||
							mlist[1] = [{type: 0, data: write_varint49(Math.max(newref + 1, varint_to_i32(mlist[1][0].data) ))}];
 | 
			
		||||
							numbers_add_meta(mlist, newref, newloc);
 | 
			
		||||
 | 
			
		||||
							/* add reference from TableModelArchive file to Tile */
 | 
			
		||||
							var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
								var mm = parse_shallow(m.data);
 | 
			
		||||
								if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
								if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
								return false;
 | 
			
		||||
							});
 | 
			
		||||
							var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
							if(!parent[6]) parent[6] = [];
 | 
			
		||||
							parent[6].push({
 | 
			
		||||
								type: 2,
 | 
			
		||||
								data: write_shallow([
 | 
			
		||||
									[],
 | 
			
		||||
									[{type: 0, data: write_varint49(newref) }]
 | 
			
		||||
								])
 | 
			
		||||
							});
 | 
			
		||||
							mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
							numbers_meta_add_dep(mlist, deps, tmaref, newref);
 | 
			
		||||
 | 
			
		||||
							ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
						}));
 | 
			
		||||
@ -1552,10 +1559,7 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
								[{type: 2, data: stru8(`Tables/Tile-${newtileref}`)}],
 | 
			
		||||
								[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
								[{type: 2, data: new Uint8Array([2, 0, 0])}],
 | 
			
		||||
								[],
 | 
			
		||||
								[],
 | 
			
		||||
								[],
 | 
			
		||||
								[],
 | 
			
		||||
								[], [], [], [], // skip fields 6-9
 | 
			
		||||
								[{type: 0, data: write_varint49(0)}],
 | 
			
		||||
								[],
 | 
			
		||||
								[{type: 0, data: write_varint49(0 /* TODO: save_token */)}],
 | 
			
		||||
@ -1563,22 +1567,7 @@ function numbers_add_ws(cfb: CFB$Container, deps: Dependents, wsidx: number) {
 | 
			
		||||
							mlist[1] = [{type: 0, data: write_varint49(Math.max(newtileref + 1, varint_to_i32(mlist[1][0].data) ))}];
 | 
			
		||||
 | 
			
		||||
							/* add reference from TableModelArchive file to Tile */
 | 
			
		||||
							var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
								var mm = parse_shallow(m.data);
 | 
			
		||||
								if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
								if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
								return false;
 | 
			
		||||
							});
 | 
			
		||||
							var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
							if(!parent[6]) parent[6] = [];
 | 
			
		||||
							parent[6].push({
 | 
			
		||||
								type: 2,
 | 
			
		||||
								data: write_shallow([
 | 
			
		||||
									[],
 | 
			
		||||
									[{type: 0, data: write_varint49(newtileref) }]
 | 
			
		||||
								])
 | 
			
		||||
							});
 | 
			
		||||
							mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
							numbers_meta_add_dep(mlist, deps, tmaref, newtileref);
 | 
			
		||||
 | 
			
		||||
							ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
						}));
 | 
			
		||||
@ -1648,14 +1637,17 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
				data[R_][_C] = _cell;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}	sheet_to_json<any>(ws, { range, header: 1 });
 | 
			
		||||
	var SST: string[] = ["~Sh33tJ5~"];
 | 
			
		||||
	var RSST: RichText[] = [{v:"~54ee77S~", l: "https://sheetjs.com/"}];
 | 
			
		||||
	}
 | 
			
		||||
	var LUT: DataLUT = {
 | 
			
		||||
		 cmnt: [{a: "~54ee77S~", t: "... the people who are crazy enough to think they can change the world, are the ones who do."}],
 | 
			
		||||
		 ferr: [],
 | 
			
		||||
		 fmla: [],
 | 
			
		||||
		 nfmt: [],
 | 
			
		||||
		 ofmt: [],
 | 
			
		||||
		 rsst: [{v:"~54ee77S~", l: "https://sheetjs.com/"}],
 | 
			
		||||
		 sst:  ["~Sh33tJ5~"]
 | 
			
		||||
	};
 | 
			
		||||
 | 
			
		||||
	/* identifier for finding the TableModelArchive in the archive */
 | 
			
		||||
	var loc = deps[tmaref].location;
 | 
			
		||||
	loc = loc.replace(/^Root Entry\//,""); // NOTE: the Root Entry prefix is an artifact of the CFB container library
 | 
			
		||||
	loc = loc.replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
 | 
			
		||||
	var pb = parse_shallow(tmaroot.messages[0].data);
 | 
			
		||||
	{
 | 
			
		||||
@ -1721,23 +1713,15 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
				{
 | 
			
		||||
					CFB.utils.cfb_del(cfb, deps[tileref].location);
 | 
			
		||||
 | 
			
		||||
					/* remove existing tile from reference -- TODO: can this have an id other than 2? */
 | 
			
		||||
					/* remove existing tile from reference */
 | 
			
		||||
					numbers_iwa_doit(cfb, deps, 2, (ai => {
 | 
			
		||||
						var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
 | 
			
		||||
						/* remove metadata entry for tile */
 | 
			
		||||
						mlist[3] = mlist[3].filter(m => varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref);
 | 
			
		||||
 | 
			
		||||
						/* remove reference from TableModelArchive file to Tile */
 | 
			
		||||
						var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
							var mm = parse_shallow(m.data);
 | 
			
		||||
							if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
							if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
							return false;
 | 
			
		||||
						});
 | 
			
		||||
						var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
						if(!parent[6]) parent[6] = [];
 | 
			
		||||
						parent[6] = parent[6].filter(m => varint_to_i32(parse_shallow(m.data)[1][0].data) != tileref);
 | 
			
		||||
						mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
						numbers_meta_del_dep(mlist, deps, tmaref, tileref);
 | 
			
		||||
 | 
			
		||||
						ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
					}));
 | 
			
		||||
@ -1769,7 +1753,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
						[{type: 0, data: write_varint49(USE_WIDE_ROWS ? 1 : 0)}]
 | 
			
		||||
					];
 | 
			
		||||
					for(var R = tidx * tstride; R <= Math.min(range.e.r, (tidx + 1) * tstride - 1); ++R) {
 | 
			
		||||
						var tilerow = write_TST_TileRowInfo(data[R], SST, RSST, USE_WIDE_ROWS);
 | 
			
		||||
						var tilerow = write_TST_TileRowInfo(data[R], LUT, USE_WIDE_ROWS);
 | 
			
		||||
						tilerow[1][0].data = write_varint49(R - tidx * tstride);
 | 
			
		||||
						tiledata[5].push({data: write_shallow(tilerow), type: 2});
 | 
			
		||||
					}
 | 
			
		||||
@ -1788,7 +1772,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
					var tilecontent = compress_iwa_file(write_iwa_file([newtile]));
 | 
			
		||||
					CFB.utils.cfb_add(cfb, `/Index/Tables/Tile-${newtileid}.iwa`, tilecontent);
 | 
			
		||||
 | 
			
		||||
					/* update metadata -- TODO: can this have an id other than 2? */
 | 
			
		||||
					/* update metadata */
 | 
			
		||||
					numbers_iwa_doit(cfb, deps, 2, (ai => {
 | 
			
		||||
						var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
						mlist[3].push({type: 2, data: write_shallow([ [],
 | 
			
		||||
@ -1805,21 +1789,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
						mlist[1] = [{type: 0, data: write_varint49(Math.max(newtileid + 1, varint_to_i32(mlist[1][0].data) ))}];
 | 
			
		||||
 | 
			
		||||
						/* add reference from TableModelArchive file to Tile */
 | 
			
		||||
						var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
							var mm = parse_shallow(m.data);
 | 
			
		||||
							if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
							if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
							return false;
 | 
			
		||||
						});
 | 
			
		||||
						var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
						if(!parent[6]) parent[6] = [];
 | 
			
		||||
						parent[6].push({
 | 
			
		||||
							type: 2,
 | 
			
		||||
							data: write_shallow([ [],
 | 
			
		||||
								[{type: 0, data: write_varint49(newtileid) }]
 | 
			
		||||
							])
 | 
			
		||||
						});
 | 
			
		||||
						mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
						numbers_meta_add_dep(mlist, deps, tmaref, newtileid);
 | 
			
		||||
 | 
			
		||||
						ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
					}));
 | 
			
		||||
@ -1865,22 +1835,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
					var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
 | 
			
		||||
					/* add reference from TableModelArchive file to merge */
 | 
			
		||||
					var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
						var mm = parse_shallow(m.data);
 | 
			
		||||
						if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
						if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
						return false;
 | 
			
		||||
					});
 | 
			
		||||
					var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
					if(!parent[6]) parent[6] = [];
 | 
			
		||||
					parent[6].push({
 | 
			
		||||
						type: 2,
 | 
			
		||||
						data: write_shallow([
 | 
			
		||||
							[],
 | 
			
		||||
							[{type: 0, data: write_varint49(mergeid) }]
 | 
			
		||||
						])
 | 
			
		||||
					});
 | 
			
		||||
					mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
					numbers_meta_add_dep(mlist, deps, tmaref, mergeid);
 | 
			
		||||
 | 
			
		||||
					ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
				}));
 | 
			
		||||
@ -1896,7 +1851,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
				var sstdata = parse_shallow(sstroot.messages[0].data);
 | 
			
		||||
				{
 | 
			
		||||
					sstdata[3] = [];
 | 
			
		||||
					SST.forEach((str, i) => {
 | 
			
		||||
					LUT.sst.forEach((str, i) => {
 | 
			
		||||
						if(i == 0) return; // Numbers will assert if index zero
 | 
			
		||||
						sstdata[3].push({type: 2, data: write_shallow([ [],
 | 
			
		||||
							[ { type: 0, data: write_varint49(i) } ],
 | 
			
		||||
@ -1923,7 +1878,7 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
					903845  // character style
 | 
			
		||||
				];
 | 
			
		||||
 | 
			
		||||
				RSST.forEach((rsst, i) => {
 | 
			
		||||
				LUT.rsst.forEach((rsst, i) => {
 | 
			
		||||
					if(i == 0) return;
 | 
			
		||||
 | 
			
		||||
					/* create .TSWP.StorageArchive (2001) */
 | 
			
		||||
@ -1999,70 +1954,117 @@ function write_numbers_tma(cfb: CFB$Container, deps: Dependents, ws: WorkSheet,
 | 
			
		||||
						var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
 | 
			
		||||
						/* rsst -> rich text payload */
 | 
			
		||||
						var loc = deps[rsstref].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
						var parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
							var mm = parse_shallow(m.data);
 | 
			
		||||
							if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
							if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
							return false;
 | 
			
		||||
						});
 | 
			
		||||
						var parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
						if(!parent[6]) parent[6] = [];
 | 
			
		||||
						parent[6].push({
 | 
			
		||||
							type: 2,
 | 
			
		||||
							data: write_shallow([ [],
 | 
			
		||||
								[{type: 0, data: write_varint49(rtpaid) }]
 | 
			
		||||
							])
 | 
			
		||||
						});
 | 
			
		||||
						mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
						numbers_meta_add_dep(mlist, deps, rsstref, rtpaid);
 | 
			
		||||
 | 
			
		||||
						/* rich text payload -> storage archive */
 | 
			
		||||
						loc = deps[rtpaid].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
						parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
							var mm = parse_shallow(m.data);
 | 
			
		||||
							if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
							if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
							return false;
 | 
			
		||||
						});
 | 
			
		||||
						parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
						if(!parent[6]) parent[6] = [];
 | 
			
		||||
						parent[6].push({
 | 
			
		||||
							type: 2,
 | 
			
		||||
							data: write_shallow([ [],
 | 
			
		||||
								[{type: 0, data: write_varint49(tswpsaid) }]
 | 
			
		||||
							])
 | 
			
		||||
						});
 | 
			
		||||
						mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
						numbers_meta_add_dep(mlist, deps, rtpaid, tswpsaid);
 | 
			
		||||
 | 
			
		||||
						/* storage archive -> smart fields */
 | 
			
		||||
						loc = deps[tswpsaid].location.replace(/^Root Entry\//,"").replace(/^Index\//, "").replace(/\.iwa$/,"");
 | 
			
		||||
						parentidx = mlist[3].findIndex(m => {
 | 
			
		||||
							var mm = parse_shallow(m.data);
 | 
			
		||||
							if(mm[3]?.[0]) return u8str(mm[3][0].data) == loc;
 | 
			
		||||
							if(mm[2]?.[0] && u8str(mm[2][0].data) == loc) return true;
 | 
			
		||||
							return false;
 | 
			
		||||
						});
 | 
			
		||||
						parent = parse_shallow(mlist[3][parentidx].data);
 | 
			
		||||
						if(!parent[6]) parent[6] = [];
 | 
			
		||||
						tswpsarefs.forEach(id => parent[6].push({
 | 
			
		||||
							type: 2,
 | 
			
		||||
							data: write_shallow([ [],
 | 
			
		||||
								[{type: 0, data: write_varint49(id) }]
 | 
			
		||||
							])
 | 
			
		||||
						}));
 | 
			
		||||
						style_indices.forEach(n => parent[6].push({
 | 
			
		||||
							type: 2,
 | 
			
		||||
							data: write_shallow([ [],
 | 
			
		||||
								[{type: 0, data: write_varint49(n) }]
 | 
			
		||||
							])
 | 
			
		||||
						}));
 | 
			
		||||
						mlist[3][parentidx].data = write_shallow(parent);
 | 
			
		||||
						numbers_meta_add_dep(mlist, deps, tswpsaid, tswpsarefs);
 | 
			
		||||
						numbers_meta_add_dep(mlist, deps, tswpsaid, style_indices);
 | 
			
		||||
 | 
			
		||||
						ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
					});
 | 
			
		||||
				});
 | 
			
		||||
				rsstroot.messages[0].data = write_shallow(rsstdata);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
			/* rebuild comment table */
 | 
			
		||||
			if(LUT.cmnt.length > 1) {
 | 
			
		||||
				/* TODO: verify zahl has a comment storage */
 | 
			
		||||
				var cmntref = parse_TSP_Reference(store[19][0].data);
 | 
			
		||||
				var authors: {[a: string]: number} = {}, iauthor = 0; /* TODO: this should be a Map */
 | 
			
		||||
				numbers_iwa_doit(cfb, deps, cmntref, (cmntroot) => {
 | 
			
		||||
					var cmntdata = parse_shallow(cmntroot.messages[0].data);
 | 
			
		||||
					{
 | 
			
		||||
						cmntdata[3] = [];
 | 
			
		||||
						LUT.cmnt.forEach((cc,i) => {
 | 
			
		||||
							if(i == 0) return;
 | 
			
		||||
							var replies: number[] = [];
 | 
			
		||||
							/* TODO: this assumes one level of replies */
 | 
			
		||||
							if(cc.replies) cc.replies.forEach(c => {
 | 
			
		||||
								/* .TSK.AnnotationAuthorArchive (212) TODO: unify names across book */
 | 
			
		||||
								if(!authors[c.a||""]) authors[c.a||""] = numbers_add_msg(cfb, 212, [ [],
 | 
			
		||||
									[ { type: 2, data: stru8(c.a||"") }],
 | 
			
		||||
									[ { type: 2, data: get_author_color(++iauthor) }],
 | 
			
		||||
									[],
 | 
			
		||||
									[ { type: 0, data: write_varint49(0) } ]
 | 
			
		||||
								], "/Index/Tables/DataList", deps);
 | 
			
		||||
								var aaaid = authors[c.a||""];
 | 
			
		||||
 | 
			
		||||
								/* .TSD.CommentStorageArchive (3056) */
 | 
			
		||||
								var csaid = numbers_add_msg(cfb, 3056, [ [],
 | 
			
		||||
									[ { type: 2, data: stru8(c.t||"") }],
 | 
			
		||||
									[ { type: 2, data: write_shallow([[],
 | 
			
		||||
										[ { type: 1, data: new Uint8Array([0, 0, 0, 128, 116, 109, 182, 65]) }]
 | 
			
		||||
									]) }],
 | 
			
		||||
									[ { type: 2, data: write_TSP_Reference(aaaid) }]
 | 
			
		||||
								], "/Index/Tables/DataList", deps);
 | 
			
		||||
								numbers_iwa_doit(cfb, deps, csaid, iwa => numbers_add_oref(iwa, aaaid));
 | 
			
		||||
								replies.push(csaid);
 | 
			
		||||
 | 
			
		||||
								/* meta deps */
 | 
			
		||||
								numbers_iwa_doit(cfb, deps, 2, ai => {
 | 
			
		||||
									var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
 | 
			
		||||
									/* CSA -> AAA */
 | 
			
		||||
									numbers_meta_add_dep(mlist, deps, csaid, aaaid);
 | 
			
		||||
 | 
			
		||||
									ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
								});
 | 
			
		||||
							});
 | 
			
		||||
 | 
			
		||||
							/* .TSK.AnnotationAuthorArchive (212) TODO: unify names across book */
 | 
			
		||||
							if(!authors[cc.a||""]) authors[cc.a||""] = numbers_add_msg(cfb, 212, [ [],
 | 
			
		||||
								[ { type: 2, data: stru8(cc.a||"") }],
 | 
			
		||||
								[ { type: 2, data: get_author_color(++iauthor) }],
 | 
			
		||||
								[],
 | 
			
		||||
								[ { type: 0, data: write_varint49(0) } ]
 | 
			
		||||
							], "/Index/Tables/DataList", deps);
 | 
			
		||||
							var aaaid = authors[cc.a||""];
 | 
			
		||||
 | 
			
		||||
							/* .TSD.CommentStorageArchive (3056) */
 | 
			
		||||
							var csaid = numbers_add_msg(cfb, 3056, [ [],
 | 
			
		||||
								[ { type: 2, data: stru8(cc.t||"") }],
 | 
			
		||||
								[ { type: 2, data: write_shallow([[],
 | 
			
		||||
									[ { type: 1, data: new Uint8Array([0, 0, 0, 128, 116, 109, 182, 65]) }]
 | 
			
		||||
								]) }],
 | 
			
		||||
								[ { type: 2, data: write_TSP_Reference(aaaid) }],
 | 
			
		||||
								replies.map(r => ({type: 2, data: write_TSP_Reference(r)})),
 | 
			
		||||
								[ { type: 2, data: write_shallow([[],
 | 
			
		||||
									[ { type: 0, data: write_varint49(i) }],
 | 
			
		||||
									[ { type: 0, data: write_varint49(0) }]
 | 
			
		||||
								]) }],
 | 
			
		||||
							], "/Index/Tables/DataList", deps);
 | 
			
		||||
							numbers_iwa_doit(cfb, deps, csaid, iwa => {
 | 
			
		||||
								numbers_add_oref(iwa, aaaid);
 | 
			
		||||
								replies.forEach(r => numbers_add_oref(iwa, r));
 | 
			
		||||
							});
 | 
			
		||||
 | 
			
		||||
							/* add to TableDataList */
 | 
			
		||||
							cmntdata[3].push({type: 2, data: write_shallow([ [],
 | 
			
		||||
								[ { type: 0, data: write_varint49(i) } ],
 | 
			
		||||
								[ { type: 0, data: write_varint49(1) } ],
 | 
			
		||||
								[], [], [], [], [], [], [], // skip fields 3-9
 | 
			
		||||
								[ { type: 2, data: write_TSP_Reference(csaid) } ]
 | 
			
		||||
							])});
 | 
			
		||||
							numbers_add_oref(cmntroot, csaid);
 | 
			
		||||
 | 
			
		||||
							/* meta deps */
 | 
			
		||||
							numbers_iwa_doit(cfb, deps, 2, ai => {
 | 
			
		||||
								var mlist = parse_shallow(ai.messages[0].data);
 | 
			
		||||
								numbers_meta_add_dep(mlist, deps, cmntref, csaid); //  table -> CSA
 | 
			
		||||
								numbers_meta_add_dep(mlist, deps, csaid, aaaid); // CSA -> author
 | 
			
		||||
								if(replies.length) numbers_meta_add_dep(mlist, deps, csaid, replies); // CSA -> replies
 | 
			
		||||
								ai.messages[0].data = write_shallow(mlist);
 | 
			
		||||
							});
 | 
			
		||||
 | 
			
		||||
						});
 | 
			
		||||
					}
 | 
			
		||||
					cmntdata[2][0].data = write_varint49(LUT.cmnt.length + 1);
 | 
			
		||||
					cmntroot.messages[0].data = write_shallow(cmntdata);
 | 
			
		||||
				});
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		pb[4][0].data = write_shallow(store);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user