UNPKG

gy-rtzh-ui

Version:

gy

42,841 lines 1.85 MB
import { defineComponent, ref, watch, nextTick, onMounted } from "vue";
import { swiperSlide, swiper as swiper$1 } from "vue-awesome-swiper";
import { Message as Message$3, Loading } from "element-ui";
import gmCrypt, { sm4 as sm4$2 } from "gm-crypt";
import { jsPDF } from "jspdf";
import axios from "axios";
import { default as default2 } from "axios";
import qs from "qs";
import smCrypto from "sm-crypto";
import { on, off, isInContainer, getScrollContainer } from "element-ui/src/utils/dom";
import { isFirefox, rafThrottle } from "element-ui/src/utils/util";
import Locale from "element-ui/src/mixins/locale";
import { isHtmlElement, isString } from "element-ui/src/utils/types";
import throttle from "throttle-debounce/throttle";
import Compressor from "compressorjs";
const _sfc_main$y = /* @__PURE__ */ defineComponent({
  __name: "GyButton",
  props: {
    type: {
      type: String,
      default: "primary"
    },
    size: {
      type: String,
      default: "medium"
    },
    loading: {
      type: Boolean,
      default: false
    },
    round: {
      type: Boolean,
      default: false
    },
    isText: {
      type: Boolean,
      default: false
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  emits: ["click"],
  setup(__props, { emit: emits }) {
    const props = __props;
    const btnClick = () => {
      if (!props.disabled) {
        emits("click");
      }
    };
    return { __sfc: true, props, emits, btnClick };
  }
});
const GyButton_vue_vue_type_style_index_0_scoped_b80944ed_lang = "";
const GyButton_vue_vue_type_style_index_1_lang = "";
function normalizeComponent(scriptExports, render36, staticRenderFns, functionalTemplate, injectStyles, scopeId, moduleIdentifier, shadowMode) {
  var options = typeof scriptExports === "function" ? scriptExports.options : scriptExports;
  if (render36) {
    options.render = render36;
    options.staticRenderFns = staticRenderFns;
    options._compiled = true;
  }
  if (functionalTemplate) {
    options.functional = true;
  }
  if (scopeId) {
    options._scopeId = "data-v-" + scopeId;
  }
  var hook;
  if (moduleIdentifier) {
    hook = function(context) {
      context = context || // cached call
      this.$vnode && this.$vnode.ssrContext || // stateful
      this.parent && this.parent.$vnode && this.parent.$vnode.ssrContext;
      if (!context && typeof __VUE_SSR_CONTEXT__ !== "undefined") {
        context = __VUE_SSR_CONTEXT__;
      }
      if (injectStyles) {
        injectStyles.call(this, context);
      }
      if (context && context._registeredComponents) {
        context._registeredComponents.add(moduleIdentifier);
      }
    };
    options._ssrRegister = hook;
  } else if (injectStyles) {
    hook = shadowMode ? function() {
      injectStyles.call(
        this,
        (options.functional ? this.parent : this).$root.$options.shadowRoot
      );
    } : injectStyles;
  }
  if (hook) {
    if (options.functional) {
      options._injectStyles = hook;
      var originalRender = options.render;
      options.render = function renderWithStyleInjection(h, context) {
        hook.call(context);
        return originalRender(h, context);
      };
    } else {
      var existing = options.beforeCreate;
      options.beforeCreate = existing ? [].concat(existing, hook) : [hook];
    }
  }
  return {
    exports: scriptExports,
    options
  };
}
var _sfc_render$y = function render() {
  var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
  return _c("button", { staticClass: "gy-button", class: `
      ${_vm.isText ? "gy-button-text" : ""}
      gy-button-${_vm.type} gy-button-${_vm.size} ${_vm.round ? "gy-button-round" : ""}
      ${_vm.loading ? "gy-button-loading" : ""}
      ${_vm.disabled ? "gy-button-disabled" : ""}`, on: { "click": _setup.btnClick } }, [!_vm.loading ? _vm._t("default") : _c("div", { staticClass: "gy-button-loading-quan" })], 2);
};
var _sfc_staticRenderFns$y = [];
var __component__$y = /* @__PURE__ */ normalizeComponent(
  _sfc_main$y,
  _sfc_render$y,
  _sfc_staticRenderFns$y,
  false,
  null,
  "b80944ed",
  null,
  null
);
const GyButton = __component__$y.exports;
const gyRtzhUiOptions$4 = ref({
  // 组件库的名称
  name: "gy-rtzh-ui",
  router: null
});
const useGymRtzhUiOptions = () => {
  const setGymRtzhUiOptions2 = (options) => {
    options.name = "gy-rtzh-ui";
    gyRtzhUiOptions$4.value = options;
  };
  return {
    gyRtzhUiOptions: gyRtzhUiOptions$4,
    setGymRtzhUiOptions: setGymRtzhUiOptions2
  };
};
let messageInstance = null;
const resetMessage = (options) => {
  if (messageInstance) {
    messageInstance.close();
  }
  options.offset = 40;
  messageInstance = Message$3(options);
};
["error", "success", "info", "warning"].forEach((type) => {
  resetMessage[type] = (options) => {
    if (typeof options === "string") {
      options = {
        message: options
      };
    }
    options.type = type;
    return resetMessage(options);
  };
});
const Message$2 = resetMessage;
let regexp = {
  isPassword: function(str) {
    let reg = /^(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#$%^&*()])(?=.*\d)[^]{8,20}$/;
    return reg.test(str);
  },
  //签章密码校验
  isQianZhangPassword: function(str) {
    let reg = /^[a-zA-Z0-9]{5,16}$/;
    return reg.test(str);
  },
  isEmail: function(str) {
    let reg = /^[A-Za-z\d]+([-_.A-Za-z\d]+)*@([A-Za-z\d]+[-_.])+[A-Za-z\d_-]{2,5}$/;
    return reg.test(str);
  },
  isPhoneNum: function(str) {
    let reg = /^1[3456789]\d{9}$/;
    return reg.test(str);
  },
  isIdCard: function(str) {
    let reg = /^(\d{15}$|^\d{18}$|^\d{17}(\d|X|x))$/;
    let flag = reg.test(str);
    if (str.indexOf("*") > -1) {
      return true;
    } else {
      return flag;
    }
  },
  isNumeric: function(str) {
    let reg = /^-?[0-9]+\.?[0-9]*$/;
    return reg.test(str);
  },
  isIntNum: function(str) {
    let reg = /^-?[0-9]*$/;
    return reg.test(str);
  },
  isDigital: function(str) {
    let reg = /^[0-9]+$/;
    return reg.test(str);
  },
  isChinese: function(str) {
    let testStr = /^[\u4e00-\u9fa5]*$/;
    return testStr.test(str);
  },
  isEmpty: function(str) {
    return str.replace(/^\s+|\s+$/g, "") == "";
  },
  isImg: function(str) {
    let reg = /.+(\.gif|\.jpg|\.jpeg|\.png)$/i;
    return reg.test(str);
  },
  isUrl: function(str) {
    return /^(https:|http:|ftp:)\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[/=?%\-&_~`@[\]':+!]*([^<>"])*$/.test(
      str
    );
  },
  // 5到10位用户名
  isUser: function(str) {
    return /^[a-zA-Z0-9_-]{5,10}$/.test(str);
  },
  jifenCheck: function(str) {
    if (!/\S/.test(str)) {
      return false;
    } else if (!/^-?\d+$/.test(str)) {
      return false;
    } else if (str > 12 || str < 0) {
      return false;
    }
    return true;
  }
};
let regFun = function(obj) {
  let ele = document.querySelector("[data-visel=" + obj.el + "]");
  if (!ele) {
    return true;
  }
  switch (obj.type) {
    case "username":
      if (regexp.isUser(obj.value)) {
        ele.innerHTML = "";
        return true;
      } else {
        ele.innerHTML = "5-10位大小写字母、数字组合";
        return false;
      }
    case "email":
      if (regexp.isEmail(obj.value)) {
        ele.innerHTML = "";
        return true;
      } else {
        ele.innerHTML = "邮箱格式不正确";
        return false;
      }
    case "phone":
      if (regexp.isPhoneNum(obj.value)) {
        ele.innerHTML = "";
        return true;
      } else {
        ele.innerHTML = "手机号格式不正确";
        return false;
      }
    case "idCard":
      if (regexp.isIdCard(obj.value)) {
        ele.innerHTML = "";
        return true;
      } else {
        ele.innerHTML = "身份证格式不正确";
        return false;
      }
    case "password":
      if (regexp.isPassword(obj.value)) {
        ele.innerHTML = "";
        return true;
      } else {
        ele.innerHTML = "8-20位大写字母、小写字母、特殊字符和数字组合";
        return false;
      }
    case "jifen":
      if (regexp.jifenCheck(obj.value)) {
        ele.innerHTML = "";
        return true;
      } else {
        ele.innerHTML = "积分仅支持0-12的整数";
        return false;
      }
    default:
      return true;
  }
};
let validator = function(obj) {
  let ele = document.querySelector("[data-visel=" + obj.el + "]");
  if (!ele) {
    return true;
  }
  if (obj.require) {
    if (obj.value) {
      ele.innerHTML = "";
      return regFun(obj);
    } else {
      ele.innerHTML = "必填信息";
    }
    return false;
  } else {
    if (obj.value) {
      return regFun(obj);
    }
    return true;
  }
};
let regMessageFun = function(obj) {
  switch (obj.type) {
    case "email":
      if (regexp.isEmail(obj.value)) {
        return true;
      } else {
        Message$2.info("邮箱格式不正确");
        return false;
      }
    case "number":
      let regStr = "isNumeric";
      if (obj.isInt) {
        regStr = "isIntNum";
      }
      if (obj.isDigital) {
        regStr = "isDigital";
      }
      if (regexp[regStr](obj.value)) {
        let maxNum = Math.pow(10, obj.len);
        if (parseFloat(obj.value) > maxNum) {
          Message$2.info(`${obj.name}不能超过${obj.len}位数!`);
          return false;
        }
        return true;
      } else {
        if (obj.isInt) {
          Message$2.info(`${obj.name}必须为整数!`);
        } else {
          Message$2.info(`${obj.name}必须为数字!`);
        }
        return false;
      }
    case "phone":
      if (regexp.isPhoneNum(obj.value)) {
        return true;
      } else {
        Message$2.info("手机号格式不正确");
        return false;
      }
    case "username":
      if (regexp.isPhoneNum(obj.value)) {
        return true;
      } else {
        Message$2.info("5-10位大小写字母、数字组合");
        return false;
      }
    case "password":
      if (regexp.isPassword(obj.value)) {
        return true;
      } else {
        Message$2.info("不低于8位的英文和数字组合!");
        return false;
      }
    case "qzPassword":
      if (regexp.isPassword(obj.value)) {
        return true;
      } else {
        Message$2.info("不低于8位的英文和数字组合!");
        return false;
      }
    case "lenControl":
      if (obj.value.length <= obj.len) {
        return true;
      } else {
        obj.value.substring(0, obj.len);
        Message$2.info(`${obj.name}不能超过${obj.len}位!`);
        return false;
      }
    case "idcard":
      if (regexp.isIdCard(obj.value)) {
        return true;
      } else {
        Message$2.info("请输入正确的身份证号!");
        return false;
      }
    case "integer":
      if (/^[1-9]\d*$/.test(obj.value)) {
        return true;
      } else {
        Message$2.info("仅支持正整数!");
        return false;
      }
    default:
      return false;
  }
};
let validatorMessage = function(obj) {
  if (typeof obj.value == "string") {
    let len = obj.value.length;
    obj.value = obj.value.trim();
    let len2 = obj.value.length;
    if (len != len2) {
      Message$2.info(`文字前后请勿添加多余空格`);
      return;
    }
  }
  if (obj.require) {
    if (obj.type) {
      if (obj.value === 0 || obj.value) {
        return regMessageFun(obj);
      } else {
        Message$2.info(`请添加${obj.name}!`);
        return false;
      }
    } else {
      if (Array.isArray(obj.value)) {
        if (obj.value.length != 0) {
          return true;
        } else {
          Message$2.info(`请添加${obj.name}!`);
          return false;
        }
      } else {
        if (obj.value === 0 || obj.value) {
          return true;
        } else {
          Message$2.info(`请添加${obj.name}!`);
          return false;
        }
      }
    }
  } else {
    if (obj.value) {
      return regMessageFun(obj);
    }
    return true;
  }
};
const sm4$1 = new sm4$2({
  // sm4 密钥
  key: "2XyA2w6NWhQmCkY3",
  // 加密模式cbc 或 ecb
  mode: "cbc",
  // default
  // optional; when use cbc mode, it's �necessary
  iv: "2XyA2w6NWhQmCkY3",
  // default is null
  // 类型,base64 或 text
  cipherType: "base64"
  // default is base64
});
const Message$1 = resetMessage;
Array.prototype.remove = function(val) {
  let index2 = this.indexOf(val);
  if (index2 > -1) {
    this.splice(index2, 1);
  }
};
const $common = {
  /*
  * author: g
  * time: 2020/8/28 9:20
  * @desc 水印
  * @params
  */
  watermark({
    t1,
    t2,
    t3,
    id,
    defaultSettings = {
      watermark_color: "#0e8eb5",
      //水印字体颜色
      watermark_alpha: 0.1,
      //水印透明度
      watermark_fontsize: "17px",
      //水印字体大小
      watermark_font: "微软雅黑",
      watermark_width: 200,
      //水印宽度
      watermark_height: 80,
      //水印长度
      watermark_angle: 15
      //水印倾斜度数
    },
    intervalWidth = 300,
    intervalheight = 100,
    isOne = false
  }) {
    let maxWidth = document.documentElement.clientWidth;
    let maxHeight = document.documentElement.clientHeight;
    let rowNumber = (maxWidth - 40 - 200) / intervalWidth;
    let coumnNumber = (maxHeight - 40 - 150) / intervalheight;
    if (document.getElementById("shuiyin")) {
      document.getElementById("shuiyin").remove();
    }
    let _temp = document.createElement("div");
    let addMarkFun = (x, y) => {
      let mark_div = document.createElement("div");
      mark_div.id = "mark_div" + i + j;
      mark_div.className = "mark_div";
      let span0 = document.createElement("div");
      span0.appendChild(document.createTextNode(t1));
      if (t2) {
        let span1 = document.createElement("div");
        span1.appendChild(document.createTextNode(t2));
        mark_div.appendChild(span1);
      }
      if (t3) {
        let span2 = document.createElement("div");
        span2.appendChild(document.createTextNode(t3));
        mark_div.appendChild(span2);
      }
      mark_div.appendChild(span0);
      mark_div.style.webkitTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
      mark_div.style.MozTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
      mark_div.style.msTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
      mark_div.style.OTransform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
      mark_div.style.transform = "rotate(-" + defaultSettings.watermark_angle + "deg)";
      mark_div.style.visibility = "";
      mark_div.style.left = x + "px";
      mark_div.style.top = y + "px";
      mark_div.style.overflow = "hidden";
      mark_div.style.zIndex = "9999";
      mark_div.style.pointerEvents = "none";
      mark_div.style.opacity = defaultSettings.watermark_alpha;
      mark_div.style.fontFamily = defaultSettings.watermark_font;
      mark_div.style.color = defaultSettings.watermark_color;
      mark_div.style.textAlign = "center";
      mark_div.style.display = "block";
      if (isOne) {
        mark_div.style.display = "flex";
        mark_div.style.justifyContent = "center";
        mark_div.style.alignItems = "center";
        mark_div.style.fontSize = "12em";
        mark_div.style.position = "fixed";
        mark_div.style.width = "100%";
        mark_div.style.height = "100%";
      } else {
        mark_div.style.fontSize = defaultSettings.watermark_fontsize;
        mark_div.style.position = "absolute";
        mark_div.style.width = defaultSettings.watermark_width + "px";
        mark_div.style.height = defaultSettings.watermark_height + "px";
      }
      _temp.appendChild(mark_div);
    };
    _temp.id = "shuiyin";
    if (isOne) {
      addMarkFun(0, 0);
    } else {
      for (let i2 = 0; i2 < rowNumber; i2++) {
        for (let j2 = 0; j2 < coumnNumber; j2++) {
          let x = intervalWidth * i2 + 20;
          let y = intervalheight * j2 + 30;
          addMarkFun(x, y);
        }
      }
    }
    if (id) {
      document.getElementById(id).appendChild(_temp);
    } else {
      document.body.appendChild(_temp);
    }
  },
  daochuFun(fun, searchKeys, name) {
    fun(searchKeys).then((resp) => {
      this.downFileSuccFun(resp, name);
    });
  },
  downFileSuccFun(resp, name) {
    const content = resp;
    const blob = new Blob([content]);
    const fileName = name;
    if ("download" in document.createElement("a")) {
      const elink = document.createElement("a");
      elink.download = fileName;
      elink.style.display = "none";
      elink.href = URL.createObjectURL(blob);
      document.body.appendChild(elink);
      elink.click();
      URL.revokeObjectURL(elink.href);
      document.body.removeChild(elink);
    } else {
      navigator.msSaveBlob(blob, fileName);
    }
  },
  /*
  * author: g
  * time: 2020/7/21 14:08
  * @desc 获取周一和周日日期
  * @return [mon, sun] Date格式
  */
  getMonSunDate(nowDate) {
    nowDate = new Date(nowDate);
    let day = nowDate.getDay();
    day == 0 && (day = 7);
    let start = new Date(nowDate.setDate(nowDate.getDate() - (day - 1)));
    let end = new Date(new Date(start).setDate(start.getDate() + 6));
    return [start, end];
  },
  /*
  * author: g
  * time: 2020/7/21 14:09
  * @desc 获取一周的日期数组
  * @return 数组 数据格式为Date
  */
  getWeekArr(nowDate) {
    let [start, end] = this.getMonSunDate(nowDate);
    let arr = [new Date(start)];
    for (let i2 = 0; i2 < 6; i2++) {
      start.setDate(start.getDate() + 1);
      arr.push(new Date(start));
    }
    return arr;
  },
  /*
  * author: g
  * time: 2020/7/16 10:52
  * @desc 根据键名比较获取对应的另一个键名的值
  * @params1 val 判断值
  * @params2 list 数组或对象
  * @params3 idCol 需要比较的键名
  * @params4 nameCol 需要获取的键名
  */
  getNameById(val, list, idCol, nameCol) {
    if (list) {
      for (let i2 in list) {
        if (list[i2][idCol] == val)
          return list[i2][nameCol];
      }
    }
    return null;
  },
  /*
  * author: g
  * time: 2020/7/16 10:58
  * @desc 表单验证
  * @params1 formData
  * @params2 验证规则对象
  */
  formDataValidator(formData, validatorObj) {
    for (let item of Object.values(validatorObj)) {
      if (item.required || item.type || item.len) {
        if (!validatorMessage({
          require: item.required,
          value: formData[item.prop],
          name: item.label,
          type: item.type || (item.len ? "lenControl" : ""),
          len: item.len,
          isDigital: item.isDigital,
          isInt: item.isInt
        })) {
          return false;
        }
      }
    }
    return true;
  },
  /*删除数组中的某一个对象
  _arr:数组
  _obj:需删除的对象
  */
  removeArray(_arr, _obj) {
    _arr.length;
    let index2 = _arr.findIndex((item) => item.id == _obj);
    if (index2 > -1) {
      _arr.splice(index2, 1);
      return _arr;
    }
    return _arr;
  },
  removeArrayByName(_arr, _obj) {
    _arr.length;
    let index2 = _arr.findIndex((item) => item.name == _obj);
    if (index2 > -1) {
      _arr.splice(index2, 1);
      return _arr;
    }
    return _arr;
  },
  /*
    通过 'id' 删除数组中的某一个对象
  _arr:数组
  _obj:需删除的对象
  */
  removeArrayById(_arr, _obj) {
    let length = _arr.length;
    for (let i2 = 0; i2 < length; i2++) {
      if (_arr[i2].id == _obj.id) {
        if (i2 == 0) {
          _arr.shift();
          return _arr;
        } else if (i2 == length - 1) {
          _arr.pop();
          return _arr;
        } else {
          _arr.splice(i2, 1);
          return _arr;
        }
      }
    }
  },
  //提示信息
  showMsg(msg) {
    Message$1.info(msg);
  },
  //格式化日期
  /**
   * time 一个日期或者时间戳(number)
   * type 需要转换时间的格式
   *      hms 返回 h:m:s
   *      ymd 返回 y-m-d
   *      其他或者不传为:y-m-d h:m:s
   * customFormat 自定义返回时间格式
   *      例 y-m-d h:M:s、 yy/m/d、h:M:s、m/d h:M:s
   *      y:年,yy:年后两位,m:月,d:日,h:时,M:分,s: 秒
   *
   * */
  formatTime: function(time, type, customFormat) {
    let date = new Date(time);
    if (date == "Invalid Date") {
      console.error("日期格式错误");
      return;
    }
    let dataStr = "";
    let y = date.getFullYear().toString(), m = date.getMonth() < 9 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1, d = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(), h = date.getHours() < 10 ? "0" + date.getHours() : date.getHours(), M = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes(), s = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();
    dataStr = y + "-" + m + "-" + d + " " + h + ":" + M + ":" + s;
    if (customFormat) {
      customFormat = customFormat.replace(/yy/g, y.substring(2));
      customFormat = customFormat.replace(/y/g, y);
      customFormat = customFormat.replace(/m/g, m);
      customFormat = customFormat.replace(/d/g, d);
      customFormat = customFormat.replace(/h/g, h);
      customFormat = customFormat.replace(/M/g, M);
      customFormat = customFormat.replace(/s/g, s);
      return customFormat;
    } else {
      if (type === "hms") {
        dataStr = h + ":" + M + ":" + s;
      } else if (type === "ymd") {
        dataStr = y + "-" + m + "-" + d;
      }
    }
    return dataStr;
  },
  formatEchatsData(xData, yData) {
    let newArrData = [];
    let xNewData = [];
    let yNewData = [];
    if (Array.isArray(xData)) {
      let xIndex = 0;
      xData.forEach((v, i2) => {
        let arr1 = v.split(" ");
        let time = arr1.length > 1 ? arr1[1] : arr1[0];
        let arr2 = time.split(":");
        let xHour = parseFloat(arr2[0]);
        if (xHour == xIndex) {
          if (i2 === 0) {
            if (parseFloat(arr2[1]) !== 0) {
              xNewData.push(0);
              yNewData.push(null);
              newArrData.push([0, null]);
              let arr22 = 0;
              if (arr2[2]) {
                arr22 = arr2[2];
              }
              let x = parseFloat(arr2[0]) + parseFloat(arr2[1]) / 60 + parseFloat(arr22) / 3600;
              xNewData.push(x);
              yNewData.push(yData[i2]);
              newArrData.push([x, yData[i2]]);
            } else {
              xNewData.push(0);
              yNewData.push(yData[i2]);
              newArrData.push([0, yData[i2]]);
            }
          } else {
            let arr22 = 0;
            if (arr2[2]) {
              arr22 = arr2[2];
            }
            let x = parseFloat(arr2[0]) + parseFloat(arr2[1]) / 60 + parseFloat(arr22) / 3600;
            xNewData.push(x);
            yNewData.push(yData[i2]);
            newArrData.push([x, yData[i2]]);
          }
        } else {
          let len = xHour - xIndex;
          if (i2 === 0) {
            xNewData.push(0);
            yNewData.push(null);
            newArrData.push([0, null]);
          }
          for (let j2 = 1; j2 < len; j2++) {
            xNewData.push(xIndex + j2);
            if (yNewData.length > 0) {
              yNewData.push(yNewData[yNewData.length - 1]);
              newArrData.push([xIndex + j2, yNewData[yNewData.length - 1]]);
            } else {
              yNewData.push(null);
              newArrData.push([xIndex + j2, null]);
            }
          }
          if (parseFloat(arr2[1]) !== 0) {
            xNewData.push(parseFloat(arr2[0]));
            yNewData.push(yNewData[yNewData.length - 1]);
            newArrData.push([parseFloat(arr2[0]), yNewData[yNewData.length - 1]]);
            let arr22 = 0;
            if (arr2[2]) {
              arr22 = arr2[2];
            }
            let x = parseFloat(arr2[0]) + parseFloat(arr2[1]) / 60 + parseFloat(arr22) / 3600;
            x = parseFloat(x.toFixed(2));
            xNewData.push(x);
            yNewData.push(yData[i2]);
            newArrData.push([x, yData[i2]]);
          } else {
            let arr22 = 0;
            if (arr2[2]) {
              arr22 = arr2[2];
            }
            let x = parseFloat(arr2[0]) + parseFloat(arr2[1]) / 60 + parseFloat(arr22) / 3600;
            x = parseFloat(x.toFixed(2));
            xNewData.push(x);
            yNewData.push(yData[i2]);
            newArrData.push([x, yData[i2]]);
          }
        }
        xIndex = xHour;
      });
      return newArrData;
    } else {
      return [];
    }
  },
  //将时分秒变为数字
  formatHourToNum(v) {
    if (!v) {
      v = "";
    }
    let arr1 = v.split(" ");
    let time = arr1.length > 1 ? arr1[1] : arr1[0];
    let arr2 = time.split(":");
    let arr22 = 0;
    if (arr2[2]) {
      arr22 = arr2[2];
    }
    let x = parseFloat(arr2[0]) + parseFloat(arr2[1]) / 60 + parseFloat(arr22) / 3600;
    return x;
  },
  timeToCh: function(time) {
    let newTime = time.slice(0, 11);
    let T = newTime.split("-");
    return T[0] + "年" + T[1] + "月" + T[2] + "日";
  },
  tableRowClassName: function({ row, rowIndex }) {
    if (rowIndex % 2 == 1) {
      return "lightColor";
    } else {
      return "darkColor";
    }
  },
  tableRowClassNameResourceLibraryManage: function({ row, rowIndex }) {
    row.selectIndex = rowIndex;
    if (rowIndex % 2 == 1) {
      return "lightColor";
    } else {
      return "darkColor";
    }
  },
  cloneObj: function(obj) {
    let copy;
    switch (typeof obj) {
      case "undefined":
        break;
      case "number":
        copy = obj - 0;
        break;
      case "string":
        copy = obj + "";
        break;
      case "boolean":
        copy = obj;
        break;
      case "object":
        if (obj === null) {
          copy = null;
        } else {
          if (Object.prototype.toString.call(obj).slice(8, -1) === "Array") {
            copy = [];
            for (let i2 = 0; i2 < obj.length; i2++) {
              copy.push(this.cloneObj(obj[i2]));
            }
          } else {
            copy = {};
            for (let j2 in obj) {
              copy[j2] = this.cloneObj(obj[j2]);
            }
          }
        }
        break;
      default:
        copy = obj;
        break;
    }
    return copy;
  },
  // 遍历ID获取name
  idToName(treeData, id) {
    let result = "";
    let recursion = (treeData2, id2) => {
      if (!treeData2 || !treeData2.length) {
        return;
      }
      for (let i2 = 0, len = treeData2.length; i2 < len; i2++) {
        let childs = treeData2[i2].children;
        if (treeData2[i2].id == id2) {
          result = treeData2[i2].name;
        }
        if (childs && childs.length > 0) {
          recursion(childs, id2);
        }
      }
      return result || "";
    };
    return recursion(treeData, id);
  },
  idToValueByKeyDefined(treeData, id, key) {
    let result = "";
    let recursion = (treeData2, id2) => {
      if (!treeData2 || !treeData2.length) {
        return;
      }
      for (let i2 = 0, len = treeData2.length; i2 < len; i2++) {
        let childs = treeData2[i2].children;
        if (treeData2[i2].id == id2) {
          result = treeData2[i2][key];
        }
        if (childs && childs.length > 0) {
          recursion(childs, id2);
        }
      }
      return result || "";
    };
    return recursion(treeData, id);
  },
  idToValueDefinedByKeyDefined(treeData, valueKey, value, key) {
    let result = "";
    let recursion = (treeData2, valueKey2) => {
      if (!treeData2 || !treeData2.length) {
        return;
      }
      for (let i2 = 0, len = treeData2.length; i2 < len; i2++) {
        let childs = treeData2[i2].children;
        if (treeData2[i2][valueKey2] == value) {
          result = treeData2[i2][key];
        }
        if (childs && childs.length > 0) {
          recursion(childs, valueKey2);
        }
      }
      return result || "";
    };
    return recursion(treeData, valueKey);
  },
  // 移除当前树节点
  removeNode(arr, id) {
    arr.forEach((v, k) => {
      if (v.id == id) {
        if (arr instanceof Array) {
          for (let i2 = 0; i2 < arr.length; i2++) {
            if (arr[i2].id == id) {
              arr.splice(i2, 1);
              i2--;
            }
          }
        }
        arr.splice(i, 1);
      } else {
        if (v.children) {
          this.removeNode(v.children, id);
        }
      }
    });
    return arr;
  },
  //查找当前节点的指定父节点
  parentsUntil(el, selector, filter) {
    const result = [];
    const matchesSelector = el.matches || el.webkitMatchesSelector || el.mozMatchesSelector || el.msMatchesSelector;
    el = el.parentElement;
    while (el && !matchesSelector.call(el, selector)) {
      if (!filter) {
        result.push(el);
      } else {
        if (matchesSelector.call(el, filter)) {
          result.push(el);
        }
      }
      el = el.parentElement;
    }
    return result;
  },
  //表格 有些行中 根据某些参数值相同进行合并时 调用此方法
  getRowIndex(objArr, index2) {
    return objArr[index2]._rs === 0 ? this.getRowIndex(objArr, index2 - 1) : index2;
  },
  spanMethod(name) {
    let _this = this;
    let a = [];
    return function objectSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (column.property === name) {
        let aI = a[columnIndex] && a[columnIndex][rowIndex];
        if (!aI) {
          if (!a[columnIndex]) {
            a[columnIndex] = [];
          }
          aI = {
            _rs: 1,
            _cs: 1,
            [name]: row[name]
          };
          a[columnIndex][rowIndex] = aI;
          if (rowIndex && a[columnIndex][rowIndex - 1][name] === row[name]) {
            aI._rs = 0;
            aI._cs = 0;
            a[columnIndex][_this.getRowIndex(a[columnIndex], rowIndex - 1)]._rs += 1;
          }
        }
        return [aI._rs, aI._cs];
      }
    };
  },
  //筛选树形table数据
  searchChildrenFilter(data, val, key) {
    key || (key = "name");
    if (data[key].indexOf(val) != -1) {
      return true;
    } else {
      if (data.children && Array.isArray(data.children)) {
        let children = [];
        let newChild = data.children;
        for (let i2 = 0; i2 < newChild.length; i2++) {
          let v = newChild[i2];
          if (this.searchChildrenFilter(v, val, key)) {
            children.push(v);
          }
        }
        data.children = children;
        if (data.children.length > 0) {
          return true;
        } else {
          return false;
        }
      } else {
        return false;
      }
    }
  },
  //小数乘法
  floarMul: function(num1, num2) {
    let m = 0, s1 = num1.toString(), s2 = num2.toString();
    try {
      m += s1.split(".")[1].length;
    } catch (e) {
    }
    try {
      m += s2.split(".")[1].length;
    } catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  },
  //除法
  floarDiv: function(num1, num2) {
    if (num2 == 0) {
      return 0;
    }
    let t1 = 0, t2 = 0, r1, r2;
    try {
      t1 = num1.toString().split(".")[1].length;
    } catch (e) {
    }
    try {
      t2 = num2.toString().split(".")[1].length;
    } catch (e) {
    }
    r1 = Number(num1.toString().replace(".", ""));
    r2 = Number(num2.toString().replace(".", ""));
    return r1 / r2 * Math.pow(10, t2 - t1);
  },
  //小数加法
  floarAdd: function(num1, num2) {
    let r1, r2, m;
    try {
      r1 = num1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = num2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    return Math.round(num1 * m + num2 * m) / m;
  },
  //小数减法
  floarSub: function(num1, num2) {
    let r1, r2, m;
    try {
      r1 = num1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = num2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2));
    let n = r1 >= r2 ? r1 : r2;
    return (Math.round(num1 * m - num2 * m) / m).toFixed(n);
  },
  //获取本月最大天数
  getEvryDay: function(date) {
    let curDate = date ? new Date(date) : /* @__PURE__ */ new Date();
    let curMonth = curDate.getMonth();
    curDate.setMonth(curMonth + 1);
    curDate.setDate(0);
    let day = curDate.getDate();
    return day;
  },
  keyToVal: function(key, val, arr, value) {
    for (let i2 = 0; i2 < arr.length; i2++) {
      if (arr[i2][key] == value) {
        return arr[i2][val];
      }
    }
  },
  objectSpanMethod({ row, column, rowIndex, columnIndex }) {
    const span = column["property"] + "-span";
    if (row[span]) {
      return row[span];
    }
  },
  mergeTableRow(data, merge) {
    if (!merge || merge.length === 0) {
      return data;
    }
    let keyType = "";
    merge.forEach((m, i2) => {
      const mList = {};
      data = data.map((v, index2) => {
        const rowVal = v[m];
        if (i2 != 0) {
          let str = "";
          for (let n = 0; n < i2; n++) {
            let mergeKey = merge[n];
            str += v[mergeKey];
          }
          keyType = str;
        }
        let key = keyType + rowVal;
        if (mList[key]) {
          mList[key]++;
          data[index2 - (mList[key] - 1)][m + "-span"].rowspan++;
          v[m + "-span"] = {
            rowspan: 0,
            colspan: 0
          };
        } else {
          mList[key] = 1;
          v[m + "-span"] = {
            rowspan: 1,
            colspan: 1
          };
        }
        return v;
      });
    });
    return data;
  },
  //HPLC获取字典表
  getHplcDict(vue, type, arrName) {
    vue.$dxcjAjax.getHplcDict({
      dictType: type
    }).then((resp) => {
      let result = resp.result;
      let obj = {};
      if (result) {
        if (Array.isArray(result)) {
          result.forEach((v) => {
            obj[v.value] = {
              name: v.label
            };
          });
        }
      }
      if (vue.$data[arrName])
        vue.$data[arrName] = obj;
    });
  },
  //接口数组转为对象
  getObjforAjax(vue, urlFun, arrName, keyName, callback) {
    vue.$dxcjAjax[urlFun]().then((resp) => {
      let result = resp.result;
      if (result) {
        let obj = {};
        if (Array.isArray(result)) {
          result.forEach((v) => {
            let key = v[keyName];
            obj[key] = v;
          });
        }
        vue.$data[arrName] = obj;
        if (callback) {
          callback();
        }
      }
    });
  },
  // 树转一维数组
  tree2array: function(tree, child) {
    let lists = [];
    let toArr = function(children, child2) {
      for (let i2 = 0; i2 < children.length; i2++) {
        let c = children[i2][child2];
        lists.push(children[i2]);
        if (c && c.length > 0) {
          toArr(c, child2);
        }
      }
    };
    toArr(tree, child);
    return lists;
  },
  // 使用服务器路径下载文件并修改名字
  downloadWidthName(name, url) {
    this.getBlob(url, (blob) => {
      this.saveAs(blob, name);
    });
  },
  getBlob(url, cb) {
    let xhr = new XMLHttpRequest();
    xhr.open("GET", url, true);
    xhr.responseType = "blob";
    xhr.onload = function() {
      if (xhr.status === 200) {
        cb(xhr.response);
      }
    };
    xhr.send();
  },
  saveAs(blob, filename) {
    if (window.navigator.msSaveOrOpenBlob) {
      navigator.msSaveBlob(blob, filename);
    } else {
      let link = document.createElement("a");
      let body = document.querySelector("body");
      link.href = window.URL.createObjectURL(blob);
      link.download = filename;
      link.style.display = "none";
      body.appendChild(link);
      link.click();
      body.removeChild(link);
      window.URL.revokeObjectURL(link.href);
    }
  },
  router2Obj(tree, parent) {
    let lists = [];
    let obj = {};
    let toArr = function(children, parent2) {
      for (let i2 = 0; i2 < children.length; i2++) {
        let c = children[i2]["children"];
        let path = children[i2].path;
        path[0] == "/" && (path = path.substr(1));
        let name = children[i2].name;
        children[i2].path = "/" + parent2 + path;
        obj[name] = children[i2];
        if (c && c.length > 0) {
          let childParent = parent2 + path + "/";
          toArr(c, childParent);
          delete children[i2].children;
        }
        lists.push(children[i2]);
      }
    };
    toArr(tree, parent);
    return obj;
  },
  setLocalStorage(key, value) {
    localStorage.setItem(key, sm4$1.encrypt(value));
  },
  setSessionStorage(key, value) {
    sessionStorage.setItem(key, sm4$1.encrypt(value));
  },
  getLocalStorage(key) {
    let item = localStorage.getItem(key);
    if (item) {
      try {
        item = sm4$1.decrypt(item);
      } catch (ignore) {
      }
      return item;
    }
    return null;
  },
  getSessionStorage(key) {
    let item = sessionStorage.getItem(key);
    if (item) {
      try {
        item = sm4$1.decrypt(item);
      } catch (ignore) {
      }
      return item;
    }
    return null;
  },
  clearSessionStorage(noClear) {
    if (noClear && !Array.isArray(noClear)) {
      noClear = [noClear];
    }
    if (noClear) {
      let keyArr = Object.keys(sessionStorage);
      for (let i2 = 0; i2 < keyArr.length; i2++) {
        let key = keyArr[i2];
        if (!noClear.includes(key)) {
          sessionStorage.removeItem(key);
        }
      }
    } else {
      sessionStorage.clear();
    }
  },
  // 判断图片是否存在
  checkImgExists(imgurl) {
    return new Promise((resolve, reject) => {
      const ImgObj = new Image();
      ImgObj.src = imgurl;
      ImgObj.onload = function(res) {
        resolve(true);
      };
      ImgObj.onerror = function(err) {
        reject(false);
      };
    });
  },
  // debounce(fn, delay = 500) {
  //   // timer 是在闭包中的
  //   let timer = null;
  //
  //   return function () {
  //     if (timer) {
  //       clearTimeout(timer)
  //     }
  //     timer = setTimeout(() => {
  //       fn.apply(this, arguments)
  //       timer = null
  //     }, delay)
  //   }
  // }
  debounce(func, wait) {
    let timeout;
    return function() {
      const context = this;
      const args = arguments;
      clearTimeout(timeout);
      timeout = setTimeout(function() {
        func.apply(context, args);
      }, wait);
    };
  },
  // 数字超长处理 补0
  makeUp0(num, digits = 2) {
    if (!num) {
      return 0;
    }
    return Number(num).toFixed(digits);
  },
  // 数字超长处理 不补0
  noMakeUp0(num, digits = 2) {
    if (!num) {
      return 0;
    }
    let str = num.toString();
    let dotIndex = str.indexOf(".");
    if (dotIndex === -1) {
      return num;
    }
    if (str.length - dotIndex > digits) {
      str = Number(str).toFixed(digits);
    }
    return parseFloat(str);
  },
  timeDifference(date, date2, timeDiff, geshi) {
    let kaishi = date;
    let jieshu = null;
    if (date2) {
      jieshu = date2;
    } else {
      jieshu = /* @__PURE__ */ new Date();
    }
    if (!timeDiff) {
      timeDiff = 0;
    }
    let dateDiff = jieshu.getTime() - kaishi.getTime() - timeDiff;
    let dayDiff = Math.floor(dateDiff / (24 * 3600 * 1e3));
    let leave1 = dateDiff % (24 * 3600 * 1e3);
    let hours = Math.floor(leave1 / (3600 * 1e3));
    let leave2 = leave1 % (3600 * 1e3);
    let minutes = Math.floor(leave2 / (60 * 1e3));
    let leave3 = leave2 % (60 * 1e3);
    let seconds = Math.round(leave3 / 1e3);
    seconds >= 0 && seconds < 10 && (seconds = "0" + seconds);
    minutes >= 0 && minutes < 10 && (minutes = "0" + minutes);
    hours < 10 && (hours = "0" + hours);
    let shijian = dayDiff + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒";
    if (geshi) {
      shijian = dayDiff + geshi + hours + geshi + minutes + geshi + seconds;
    }
    if (parseFloat(dayDiff)) {
      shijian = dayDiff + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒";
      if (geshi) {
        shijian = dayDiff + geshi + hours + geshi + minutes + geshi + seconds;
      }
    } else {
      if (parseFloat(hours)) {
        shijian = hours + "小时" + minutes + "分钟" + seconds + "秒";
        if (geshi) {
          shijian = hours + geshi + minutes + geshi + seconds;
        }
      } else {
        shijian = minutes + "分钟" + seconds + "秒";
        if (geshi) {
          shijian = minutes + geshi + seconds;
        }
      }
    }
    return shijian;
  },
  dataURLtoFile: (dataurl, filename) => {
    let arr = dataurl.split(",");
    let mime = arr[0].match(/:(.*?);/)[1];
    let bstr = atob(arr[1]);
    let n = bstr.length;
    let u8arr = new Uint8Array(n);
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n);
    }
    return new File([u8arr], filename, { type: mime });
  },
  regReplacePhone: /^(\d{3})\d*(\d{4})$/,
  regReplaceEmail: /^.*(@.*)$/,
  regReplaceIdCard: /^(\d{3})\d{11}(\d{3}[\dxyXY])$/,
  replacePhnoe(phone) {
    return !phone ? "" : phone.replace(/^(\d{3})\d*(\d{4})$/, "$1****$2");
  },
  replaceEmail(email) {
    return !email ? "" : email.replace(/^.*(@.*)$/, "****$1");
  },
  replaceIdCard(idCard) {
    if (!idCard)
      return "";
    if (idCard.length === 15) {
      return idCard.replace(/^(\d{3})\d{8}(\d{3}[\dxyXY])$/, "$1********$2");
    } else if (idCard.length === 18) {
      return idCard.replace(/^(\d{3})\d{11}(\d{3}[\dxyXY])$/, "$1***********$2");
    }
    return idCard;
  },
  /*
  * author: g
  * time: 2020/9/7 15:34
  * @desc 删除数组某个值
  * @params
  */
  arrRemoveVal(arr, val) {
    var index2 = arr.indexOf(val);
    if (index2 > -1) {
      arr.splice(index2, 1);
    }
  }
};
const { gyRtzhUiOptions: gyRtzhUiOptions$3 } = useGymRtzhUiOptions();
const useGpy = () => {
  const gpyCamList = ref([]);
  const gpyIndex = ref(-1);
  const gpyIndexResolution = ref("");
  let isSocketConnect = false;
  const isCameraOpen = ref(false);
  const FileType = 0;
  const gpyLocalUrl = gyRtzhUiOptions$3.value.gpyLocalUrl || "";
  const photoArray = ref([]);
  let photoShowIndex = 0;
  let MainDom = null;
  let MainCanvas = null;
  let MainContext = null;
  let pALastX = 0;
  let pALastY = 0;
  let pACurrentX = 0;
  let pACurrentY = 0;
  let pMainShowStartX = 0;
  let pMainShowStartY = 0;
  let MainCamCutMode = 0;
  let socket = null;
  let intervalId = null;
  let reconnectNum = 0;
  const reconnect = () => {
    if (reconnectNum > 4) {
      return;
    }
    reconnectNum++;
    clearInterval(intervalId);
    intervalId = setInterval(function() {
      if (isSocketConnect == false) {
        init(MainDom);
      }
    }, 3e3);
  };
  let heartTimerId = null;
  const heartCheck = () => {
    clearInterval(heartTimerId);
    heartTimerId = setInterval(function() {
      if (isSocketConnect) {
        let aDataArray = new Uint8Array(3);
        aDataArray[0] = 17;
        aDataArray[1] = 17;
        aDataArray[2] = 17;
        socket.send(aDataArray.buffer);
      }
    }, 6e3);
  };
  const WebSocketConnect = () => {
    return new Promise((resolve) => {
      socket = new WebSocket(gyRtzhUiOptions$3.value.gpyBaseUrl || "ws://127.0.0.1:22225");
      socket.binaryType = "arraybuffer";
      try {
        socket.onopen = () => {
          heartCheck();
          isSocketConnect = true;
          clearInterval(intervalId);
          intervalId = null;
          resolve(true);
        };
        socket.onclose = () => {
          isSocketConnect = false;
        };
        socket.onerror = () => {
          isSocketConnect = false;
          reconnect();
        };
        socket.onmessage = function(event) {
          let rDataArr = new Uint8Array(event.data);
          if (rDataArr.length > 0) {
            if (rDataArr[0] == 17 && rDataArr[1] == 17 && rDataArr[2] == 17) {
              console.log("heart socket!!!!");
            } else if (rDataArr[0] == 85 && rDataArr[1] == 102) {
              if (rDataArr[2] == 80) {
                let devNameBufLen = rDataArr.length - 4;
                let devNameData = new Uint8Array(devNameBufLen);
                for (let i2 = 0; i2 < devNameBufLen; i2++) {
                  devNameData[i2] = rDataArr[4 + i2];
                }
                let str = byteToString(devNameData);
                let AllCamName = decodeURIComponent(str);
                gpyCamList.value = AllCamName.split("|");
                gpyIndex.value = gpyCamList.value.length !== 0 ? 0 : -1;
              }
              if (rDataArr[2] == 81) {
                let resCount = rDataArr[3];
                let resArr = [];
                for (let i2 = 0; i2 < resCount; i2++) {
                  let width = rDataArr[4 + i2 * 4] * 256 + rDataArr[4 + i2 * 4 + 1];
                  let height = rDataArr[4 + i2 * 4 + 2] * 256 + rDataArr[4 + i2 * 4 + 3];
                  let resStr = "" + width + "*" + height;
                  resArr.push(resStr);
                }
                if (resArr.length > 0) {
                  gpyIndexResolution.value = resArr.includes("2592*1944") ? "2592*1944" : resArr[0];
                }
              }
              if (rDataArr[2] == 1) {
                if (rDataArr[3] == 1) {
                  isCameraOpen.value = true;
                }
                if (rDataArr[3] == 3) {
                  isCameraOpen.value = false;
                }
              }
              if (rDataArr[2] == 16) {
                if (rDataArr[3] == 1) {
                  let imgpathLen = rDataArr[4] * 256 + rDataArr[5];
                  let result;
                  if (imgpathLen == 0) {
                    let base64Len = rDataArr[6] * 65536 + rDataArr[7] * 256 + rDataArr[8];
                    let imgPathStr = "";
                    let base64Data = new Uint8Array(base64Len);
                    for (let i2 = 0; i2 < base64Len; i2++) {
                      base64Data[i2] = rDataArr[9 + imgpathLen + i2];
                    }
                    let base64Str = Uint8ArrayToString(base64Data);
                    result = [0, imgPathStr, "data:;base64," + base64Str];
                  } else {
                    let base64Len = rDataArr[6] * 65536 + rDataArr[7] * 256 + rDataArr[8];
                    let pData = new Uint8Array(imgpathLen);
                    for (let i2 = 0; i2 < imgpathLen; i2++) {
                      pData[i2] = rDataArr[9 + i2];
                    }
                    let str = byteToString(pData);
                    let imgPathStr = decodeURIComponent(str);
                    let base64Data = new Uint8Array(base64Len);
                    for (let i2 = 0; i2 < base64Len; i2++) {
                      base64Data[i2] = rDataArr[9 + imgpathLen + i2];
                    }
                    let base64Str = Uint8ArrayToString(base64Data);
                    result = [0, imgPathStr, "data:;base64," + base64Str];
                  }
                  photoArray.value.splice(photoShowIndex + 1, 0, result);
                }
              }
              if (rDataArr[2] == 204) {
                let ww = rDataArr[3] * 256 + rDataArr[4];
                let hh = rDataArr[5] * 256 + rDataArr[6];
                pMainShowStartX = rDataArr[7] * 256 + rDataArr[8];
                pMainShowStartY = rDataArr[9] * 256 + rDataArr[10];
                MainContext.clearRect(0, 0, MainCanvas.width, MainCanvas.height);
                let imgData = MainContext.createImageData(ww, hh);
                let dataNum = 0;
                dataNum = dataNum + 11;
                for (let i2 = 0; i2 < imgData.data.length; i2 += 4) {
                  imgData.data[i2] = rDataArr[dataNum];
                  imgData.data[i2 + 1] = rDataArr[dataNum + 1];
                  imgData.data[i2 + 2] = rDataArr[dataNum + 2];
                  imgData.data[i2 + 3] = 255;
                  dataNum = dataNum + 3;
                }
                MainContext.putImageData(imgData, pMainShowStartX, pMainShowStartY);
                if (MainCamCutMode == 2)
                  ;
              }
              rDataArr = null;
            }
          }
        };
      } catch (ex) {
        alert("异常错误!");
      }
    });
  };
  const init = (dom) => {
    if (isSocketConnect) {
      return;
    }
    MainDom = dom;
    WebSocketConnect().then(() => {
      GetDevCount();
      console.log("GetDevCount");
    });
    InitCanvas();
  };
  const InitCanvas = () => {
    let w = MainDom.clientWidth;
    let h = MainDom.clientHeight;
    if (w > 0 && h > 0) {
      MainCanvas = document.createElement("canvas");
      MainCanvas.id = "MainCamCanvas";
      MainCanvas.width = w;
      MainCanvas.height = h;
      MainContext = MainCanvas.getContext("2d");
      MainDom.appendChild(MainCanvas);
    }
  };
  const destroy = () => {
    if (isSocketConnect) {
      CloseCamera();
      clearInterval(intervalId);
      intervalId = null;
      socket.close();
      MainDom = null;
      MainCanvas.remove();
      MainCanvas = null;
      isCameraOpen.value = false;
      isSocketConnect = false;
      socket = null;
      photoArray.value = [];
      reconnectNum = 0;
      gpyIndex.value = -1;
      gpyIndexResolution.value = "";
      console.log("destroy");
    }
  };
  watch(gpyIndex, (newVal) => {
    if (newVal == -1) {
      return;
    }
    GetResolution(newVal);
  });
  watch(gpyIndexResolution, (newVal) => {
    if (!newVal) {
      return;
    }
    CloseCamera();
    toSleep(100);
    let gpyIndexResolutionArr = gpyIndexResolution.value.split("*");
    if (gpyIndexResolutionArr.length == 2) {
      let width = parseInt(gpyIndexResolutionArr[0]);
      let height = parseInt(gpyIndexResolutionArr[1]);
      if (width > 0 && height > 0) {
        OpenCamera(gpyIndex.value, width, height);
      }
    }
  });
  const GetDevCount = () => {
    let aDataArray = new Uint8Array(3);
    aDataArray[0] = 119;
    aDataArray[1] = 136;
    aDataArray[2] = 80;
    socket.send(aDataArray.buffer);
  };
  const GetResolution = (iCamNo) => {
    let aDataArray = new Uint8Array(4);
    aDataArray[0] = 119;
    aDataArray[1] = 136;
    aDataArray[2] = 81;
    aDataArray[3] = iCamNo;
    socket.send(aDataArray.buffer);
  };
  const CloseCamera = () => {
    if (isSocketConnect) {
      let aDataArray = new Uint8Array(4);
      aDataArray[0] = 119;
      aDataArray[1] = 136;
      aDataArray[2] = 2;
      aDataArray[3] = 0;
      socket.send(aDataArray.buffer);
    }
  };
  const OpenCamera = (iCamNo, width, height) => {
    pALastX = 0;
    pALastY = 0;
    pACurrentX = 0;
    pACurrentY = 0;
    if (isSocketConnect) {
      let aDataArray = new Uint8Array(12);
      aDataArray[0] = 119;
      aDataArray[1] = 136;
      aDataArray[2] = 1;
      aDataArray[3] = iCamNo;
      aDataArray[4] = MainCanvas.width >> 8 & 255;
      aDataArray[5] = MainCanvas.width & 255;
      aDataArray[6] = MainCanvas.height >> 8 & 255;
      aDataArray[7] = MainCanvas.height & 255;
      aDataArray[8] = width >> 8 & 255;
      aDataArray[9] = width & 255;
      aDataArray[10] = height >> 8 & 255;
      aDataArray[11] = height & 255;
      socket.send(aDataArray.buffer);
    }
  };
  const byteToString = (arr) => {
    if (typeof arr === "string") {
      return arr;
    }
    let str = "", _arr = arr;
    for (let i2 = 0; i2 < _arr.length; i2++) {
      let one = _arr[i2].toString(2), v = one.match(/^1+?(?=0)/);
      if (v && one.length == 8) {
        let bytesLength = v[0].length;
        let store = _arr[i2].toString(2).slice(7 - bytesLength);
        for (let st = 1; st < bytesLength; st++) {
          store += _arr[st + i2].toString(2).slice(2);
        }
        str += String.fromCharCode(parseInt(store, 2));
        i2 += bytesLength - 1;
      } else {
        str += String.fromCharCode(_arr[i2]);
      }
    }
    return str;
  };
  const Uint8ArrayToString = (fileData) => {
    let dataString = "";
    for (let i2 = 0; i2 < fileData.length; i2++) {
      dataString += String.fromCharCode(fileData[i2]);
    }
    return dataString;
  };
  const stringToByte = (str) => {
    let bytes = [];
    let len, c;
    len = str.length;
    for (let i2 = 0; i2 < len; i2++) {
      c = str.charCodeAt(i2);
      if (c >= 65536 && c <= 1114111) {
        bytes.push(c >> 18 & 7 | 240);
        bytes.push(c >> 12 & 63 | 128);
        bytes.push(c >> 6 & 63 | 128);
        bytes.push(c & 63 | 128);
      } else if (c >= 2048 && c <= 65535) {
        bytes.push(c >> 12 & 15 | 224);
        bytes.push(c >> 6 & 63 | 128);
        bytes.push(c & 63 | 128);
      } else if (c >= 128 && c <= 2047) {
        bytes.push(c >> 6 & 31 | 192);
        bytes.push(c & 63 | 128);
      } else {
        bytes.push(c & 255);
      }
    }
    return bytes;
  };
  const toSleep = (milliSeconds) => {
    let startTime = (/* @__PURE__ */ new Date()).getTime();
    while ((/* @__PURE__ */ new Date()).getTime() < startTime + milliSeconds)
      ;
  };
  const SetFileType = (filetype) => {
    if (isSocketConnect) {
      let aDataArray = new Uint8Array(4);
      aDataArray[0] = 119;
      aDataArray[1] = 136;
      aDataArray[2] = 40;
      aDataArray[3] = filetype;
      if (filetype == 1)
        aDataArray[3] = 2;
      if (filetype == 2)
        aDataArray[3] = 3;
      if (filetype == 3)
        aDataArray[3] = 4;
      socket.send(aDataArray.buffer);
    }
  };
  const CaptureImage = (fileAddr) => {
    if (isSocketConnect) {
      if (fileAddr == "") {
        let packageCount = 1;
        let len = 0;
        let pindex = 0;
        let totalLen = 12;
        let aDataArray = new Uint8Array(totalLen);
        aDataArray[0] = 119;
        aDataArray[1] = 136;
        aDataArray[2] = 16;
        aDataArray[3] = 0;
        aDataArray[4] = len >> 16 & 255;
        aDataArray[5] = len >> 8 & 255;
        aDataArray[6] = len & 255;
        aDataArray[7] = packageCount >> 8 & 255;
        aDataArray[8] = packageCount & 255;
        aDataArray[9] = 0;
        aDataArray[10] = pindex >> 8 & 255;
        aDataArray[11] = pindex & 255;
        socket.send(aDataArray.buffer);
      } else {
        let path = encodeURI(fileAddr);
        let pathArray = stringToByte(path);
        let len = pathArray.length;
        let packageCount = 0;
        let tmpLen = len;
        while (tmpLen > 0) {
          tmpLen = tmpLen - 90;
          packageCount++;
        }
        let pindex = 0;
        tmpLen = len;
        while (tmpLen > 0) {
          tmpLen = tmpLen - 90;
          if (tmpLen > 0) {
            let totalLen = 90 + 12;
            let aDataArray = new Uint8Array(totalLen);
            aDataArray[0] = 119;
            aDataArray[1] = 136;
            aDataArray[2] = 16;
            aDataArray[3] = 0;
            aDataArray[4] = len >> 16 & 255;
            aDataArray[5] = len >> 8 & 255;
            aDataArray[6] = len & 255;
            aDataArray[7] = packageCount >> 8 & 255;
            aDataArray[8] = packageCount & 255;
            aDataArray[9] = 90;
            aDataArray[10] = pindex >> 8 & 255;
            aDataArray[11] = pindex & 255;
            for (let i2 = 0; i2 < 90; i2++) {
              aDataArray[12 + i2] = pathArray[i2 + pindex * 90];
            }
            socket.send(aDataArray.buffer);
          } else {
            let totalLen = 90 + tmpLen + 12;
            let aDataArray = new Uint8Array(totalLen);
            aDataArray[0] = 119;
            aDataArray[1] = 136;
            aDataArray[2] = 16;
            aDataArray[3] = 0;
            aDataArray[4] = len >> 16 & 255;
            aDataArray[5] = len >> 8 & 255;
            aDataArray[6] = len & 255;
            aDataArray[7] = packageCount >> 8 & 255;
            aDataArray[8] = packageCount & 255;
            aDataArray[9] = 90 + tmpLen;
            aDataArray[10] = pindex >> 8 & 255;
            aDataArray[11] = pindex & 255;
            for (let i2 = 0; i2 < 90 + tmpLen; i2++) {
              aDataArray[12 + i2] = pathArray[i2 + pindex * 90];
            }
            socket.send(aDataArray.buffer);
          }
          pindex++;
          toSleep(80);
        }
      }
    }
  };
  const takePhoto = (index2) => {
    if (isSocketConnect) {
      let name = $common.formatTime(/* @__PURE__ */ new Date(), null, "ymdhMs");
      SetFileType(FileType);
      let fileTypeArr = ["jpg", "png", "tif", "pdf"];
      let path = gpyLocalUrl ? gpyLocalUrl + name + "." + fileTypeArr[FileType] : "";
      photoShowIndex = index2;
      CaptureImage(path);
    }
  };
  const delTakePhoto = (index2) => {
    if (photoArray.value.length > index2) {
      photoArray.value.splice(index2, 1);
    }
  };
  return {
    gpyCamList,
    gpyIndex,
    photoArray,
    init,
    destroy,
    takePhoto,
    delTakePhoto
  };
};
const Message = resetMessage;
const { gyRtzhUiOptions: gyRtzhUiOptions$2 } = useGymRtzhUiOptions();
const sm3 = smCrypto.sm3;
const SM2 = smCrypto.sm2;
const SM4 = gmCrypt.sm4;
const sm2Encrypt = function(t, e) {
  let i2 = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0;
  return "04" + SM2.doEncrypt(t, e, i2);
};
const encryptionUrlArr = [
  /* {name:'用户添加编辑保存',url:'/sys/user/save'},
  {name:'用户添加编辑保存',url:'/sys/user/save'},
  {name:'修改密码',url:'/sys/user/changePassword'},
  {name:'登录',url:'/auth/oauth/token'}, */
];
let getAesKey = function(len) {
  len = len || 32;
  var $chars = "ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678";
  var maxPos = $chars.length;
  var keyStr = "";
  for (let i2 = 0; i2 < len; i2++) {
    keyStr += $chars.charAt(Math.floor(Math.random() * maxPos));
  }
  return keyStr;
};
var aeskey = getAesKey().toString().substring(0, 16);
var aesiv = getAesKey().toString().substring(0, 16);
let sm4Config = {
  // sm4 密钥
  key: aeskey,
  // key: 'Fd6xZfwz5JizJinM',
  // 加密模式cbc 或 ecb
  mode: "cbc",
  // default
  // optional; when use cbc mode, it's �necessary
  iv: aesiv,
  // default is null
  // 类型,base64 或 text
  cipherType: "base64"
  // default is base64
};
let sm4 = new SM4(sm4Config);
var publicKey = "041CB0B7F9910687E87836EB28F46875448B25E78B103C7E0E750F7D00626CB51CE25C4DAAC7745EDAF538001F79F8BD4C0ECC14F4E838A75893749B6066731B6B";
const enKey = sm2Encrypt(aeskey, publicKey);
const eniv = sm2Encrypt(aesiv, publicKey);
axios.defaults.transformRequest = [function(data, config) {
  if (config["Content-Type"] == "application/x-www-form-urlencoded") {
    return qs.stringify(data);
  } else if (config["Content-Type"] == "application/json") {
    return JSON.stringify(data);
  } else {
    return data;
  }
}];
const service = axios.create({
  // baseURL: 'http://192.168.1.99:10000',
  timeout: 3e5
  // 请求超时时间
});
let loadingInstance;
var i$1 = 0;
service.interceptors.request.use(
  async (config) => {
    if (config.url.indexOf("auth/oauth/token") >= 0 || config.url.indexOf("svg/rtDaxingerzhiModbus") >= 0 || config.url.indexOf("/dpweb/jiexiantu/loadJiexiantuDataNew") >= 0)
      ;
    else {
      if (config.url.indexOf("/sys/user/changePassword") != -1 || config.url.indexOf("/sys/dynamic/pwd/generate") != -1 || config.url.indexOf("/sys/dynamic/pwd/validate") != -1) {
        config.headers["Authorization"] = sessionStorage.getItem("zhxd_token_linshi") ? "bearer" + sessionStorage.getItem("zhxd_token_linshi") : sessionStorage.getItem("zhxd_token") ? sessionStorage.getItem("zhxd_token") : "";
      } else
        config.headers["Authorization"] = sessionStorage.getItem("zhxd_token") ? "bearer" + sessionStorage.getItem("zhxd_token") : "";
    }
    if (gyRtzhUiOptions$2.value.formatAxiosHeaders) {
      config.headers = gyRtzhUiOptions$2.value.formatAxiosHeaders(config.headers, config);
    }
    let postNoloading = false;
    if (config.method == "post") {
      let postData = config.data;
      if (postData && postData.noLoading) {
        postNoloading = true;
      }
    }
    if (!(config.params && config.params.noLoading || postNoloading)) {
      i$1++;
      loadingInstance = Loading.service({
        //加载loading
        fullscreen: true,
        text: "Loading",
        // spinner: 'el-icon-loading',
        background: "rgba(0, 0, 0, 0.7)"
      });
    }
    let enableSta = false;
    encryptionUrlArr.forEach((v, k) => {
      if (config.url.indexOf(v.url) > -1) {
        enableSta = true;
        return enableSta;
      }
    });
    if (!enableSta && !window.encryption?.enableAES) {
      return config;
    }
    if (config.data && config.data.toString() == "[object FormData]") {
      let headers = config.headers;
      new Array();
      var delEntity = new Array();
      var ent = config.data.entries();
      let hasFile = false;
      while (true) {
        var entry = ent.next();
        if (entry.done) {
          break;
        }
        if (entry.value[1].type == void 0) {
          let key = entry.value[0];
          let value = entry.value[1];
          delEntity.push({ [key]: value });
          config.data.delete(key);
        } else {
          if (entry.value[0] == "file")
            hasFile = true;
        }
      }
      if (delEntity && delEntity[0]) {
        config.data.append("zhxd-data", sm4.encrypt(JSON.stringify(delEntity[0])));
        headers["sm4-key"] = enKey;
        headers["sm4-key-i"] = eniv;
        headers["sm3-key"] = sm3(sm4.encrypt(JSON.stringify(delEntity[0])));
      }
      if (hasFile) {
        let setFileSm3 = function(file2) {
          return new Promise((resolve) => {
            if (window.FileReader) {
              let size = file2.size;
              let offset = 1024 * 50;
              let chunks = [file2.slice(0, offset)];
              let cur = offset;
              let promiseArr = [];
              while (cur < size) {
                let end = cur + offset;
                if (end >= size) {
                  chunks.push(file2.slice(cur, end));
                } else {
                  const mid = cur + offset / 2;
                  chunks.push(file2.slice(cur, cur + 2));
                  chunks.push(file2.slice(mid, mid + 2));
                  chunks.push(file2.slice(end - 2, end));
                }
                cur += offset;
              }
              chunks.forEach((b) => {
                promiseArr.push(b.arrayBuffer());
              });
              Promise.all(promiseArr).then((result) => {
                let binary = "";
                for (let j2 = 0; j2 < result.length; j2++) {
                  let byteArray = new Uint8Array(result[j2]);
                  let len = byteArray.byteLength;
                  let binary_linshi = "";
                  for (let i2 = 0; i2 < len; i2++) {
                    binary_linshi += String.fromCharCode(byteArray[i2]);
                  }
                  binary += binary_linshi;
                }
                binary = window.btoa(binary);
                headers["sm3-key"] = sm3(binary);
                headers["sm4-key"] = enKey;
                headers["sm4-key-i"] = eniv;
                resolve(config);
              });
            } else {
              resolve(config);
            }
          });
        };
        let file = config.data.get("file");
        return await setFileSm3(file);
      } else {
        return config;
      }
    } else {
      let url = config.url;
      let whIndex = url.indexOf("?");
      let urlPObj = null;
      let str3 = "";
      let strD3 = "";
      if (whIndex != -1) {
        let newUrl = url.substring(0, whIndex);
        config.url = newUrl;
        let p = url.substring(whIndex + 1);
        let pArr = p.split("&");
        urlPObj = {};
        pArr.forEach((v) => {
          let vArr = v.split("=");
          if (vArr.length > 1) {
            urlPObj[vArr[0]] = vArr[1];
          }
        });
      }
      let params = config.params;
      let datas = config.data;
      let signdata = "";
      let signdataD = "";
      if (params || urlPObj || datas) {
        params || (params = {});
        datas || (datas = {});
        urlPObj || (urlPObj = {});
        let newP = {};
        let newD = {};
        newP = { ...params, ...urlPObj };
        newD = datas;
        signdata = JSON.stringify(newP);
        signdataD = JSON.stringify(newD);
        let str = sm4.encrypt(signdata);
        let strD = sm4.encrypt(signdataD);
        str3 = sm3(JSON.parse(JSON.stringify(str)));
        strD3 = sm3(JSON.parse(JSON.stringify(strD)));
        let obj = {
          "zhxd-data": str
        };
        let objD = {
          "zhxd-data": strD
        };
        config.params = JSON.stringify(newP) == "{}" ? {} : obj;
        config.data = JSON.stringify(newD) == "{}" ? {} : objD;
      }
      let headers = config.headers;
      headers["sm4-key"] = enKey;
      headers["sm4-key-i"] = eniv;
      if (JSON.stringify(datas) != "{}") {
        headers["sm3-key"] = strD3;
      } else {
        headers["sm3-key"] = str3;
      }
      return config;
    }
  },
  (error) => {
    console.error(error);
    return Promise.reject(error);
  }
);
service.interceptors.response.use(
  (response) => {
    let params = response.config.params;
    let config = response.config;
    let postNoloading = false;
    if (config.method == "post") {
      let str = config.data;
      if (typeof str == "string" && str.indexOf("noLoading") != -1) {
        postNoloading = true;
      }
    }
    if (!(params && params.noLoading || postNoloading)) {
      i$1--;
    }
    i$1 <= 0 && loadingInstance && loadingInstance.close && setTimeout(() => {
      loadingInstance.close();
    }, 500);
    let status;
    let dataAxios;
    let enableSta = false;
    encryptionUrlArr.forEach((v, k) => {
      if (response.config.url.indexOf(v.url) > -1) {
        enableSta = true;
        return enableSta;
      }
    });
    if (enableSta || window.encryption?.enableAES && (response.headers["content-type"] && response.headers["content-type"].indexOf("application/json") > -1)) {
      if (response && response.data && response.data["zhxd-data"]) {
        dataAxios = JSON.parse(sm4.decrypt(response && response.data && response.data["zhxd-data"]));
      } else {
        dataAxios = response && response.data;
      }
      status = dataAxios.status;
    } else {
      dataAxios = response.data;
      status = dataAxios.status;
    }
    if (status == "SUCCEED" || status == "WARRING" || status == void 0) {
      return dataAxios;
    } else {
      if (dataAxios.errorMessage) {
        Message({
          message: dataAxios.errorMessage || "服务器内部错误!",
          type: "info"
        });
      }
      return Promise.reject(response.data);
    }
  },
  (error) => {
    var msgData = null;
    let enableSta = false;
    encryptionUrlArr.forEach((v, k) => {
      if (error.response.config.url.indexOf(v.url) > -1) {
        enableSta = true;
        return enableSta;
      }
    });
    if (enableSta || window.encryption?.enableAES) {
      if (error.response.status == "478" || error.response.status == "401") {
        msgData = error.response.data;
      } else {
        msgData = JSON.parse(sm4.decrypt(error.response.data["zhxd-data"]));
      }
    } else {
      msgData = error.response.data;
    }
    let config = error.response.config;
    let params = config.params;
    let postNoloading = false;
    if (config.method == "post") {
      let str = config.data;
      if (typeof str == "string" && str.indexOf("noLoading") != -1) {
        postNoloading = true;
      }
    }
    if (!(params && params.noLoading || postNoloading)) {
      i$1--;
    }
    i$1 <= 0 && loadingInstance && loadingInstance.close && loadingInstance.close();
    if (error && error.response) {
      var status = error.response.status;
      if (status == 478) {
        Message({
          message: msgData.errorMessage,
          type: "info"
        });
      } else if (status == 401) {
        if (msgData.errorCode != "SYS.0017") {
          Message({
            message: msgData.errorMessage,
            type: "info"
          });
        }
        sessionStorage.clear();
        if (window.location.href.indexOf("startexam") != -1) {
          gyRtzhUiOptions$2.value.router.replace("/answerlogin");
        } else {
          gyRtzhUiOptions$2.value.router.replace("/login");
        }
        return;
      } else if (status == 403) {
        gyRtzhUiOptions$2.value.router.push({
          name: "errorPage",
          replace: true,
          params: {
            status
          }
        });
        return;
      } else {
        let url = error.response && error.response.config && error.response.config.url || "";
        if (status == 404 && url.indexOf("file") != -1) {
          Message({
            message: "文件已被删除!",
            type: "info"
          });
        } else {
          Message({
            message: msgData.errorMessage || "服务器内部错误!",
            type: "info"
          });
        }
      }
    }
    return Promise.reject(error);
  }
);
const get = (data) => {
  return service({
    method: "get",
    url: data.url,
    params: data.data,
    headers: {
      "Content-Type": "application/json",
      "Accept": data.accept || "application/json, text/plain, */*"
    },
    auth: data.auth
  });
};
const post = (data) => {
  return service({
    method: "post",
    url: data.url,
    data: data.data,
    headers: {
      "Content-Type": "application/json"
    },
    auth: data.auth
  });
};
const put = (data) => {
  return service({
    method: "put",
    url: data.url,
    data: data.data,
    headers: {
      "Content-Type": "application/x-www-form-urlencoded",
      charset: "UTF-8"
    }
  });
};
const deleted = (data) => {
  return service({
    method: "delete",
    url: data.url,
    data: data.data
  });
};
const postFormdata = (data) => {
  return service({
    method: "post",
    url: data.url,
    data: data.data,
    headers: {
      "Content-Type": "application/x-www-form-urlencoded"
    },
    auth: data.auth
  });
};
const ajaxFile = (data) => {
  let opt = {
    method: data.method || "get",
    url: data.url,
    responseType: data.responseType || "blob",
    // 表明返回服务器返回的数据类型
    headers: {
      "Content-Type": data.contenType || "multipart/form-data"
    }
  };
  if (data.method == "post") {
    opt.data = data.data;
  } else {
    opt.params = data.data;
  }
  return service(opt);
};
const { gyRtzhUiOptions: gyRtzhUiOptions$1 } = useGymRtzhUiOptions();
const getURLPROXY = () => {
  return gyRtzhUiOptions$1.value.BASEURL + "/rbac";
};
const uploadFile = (data) => {
  return ajaxFile({
    method: "post",
    responseType: "json",
    contenType: "",
    url: getURLPROXY() + "/sys/file/uploadOne",
    data
  });
};
const _sfc_main$x = /* @__PURE__ */ defineComponent({
  __name: "index",
  props: {
    isShowDialog: {
      type: Boolean,
      default: false
    },
    title: {
      type: String,
      default: "高拍仪上传"
    },
    uploadFileFun: {
      default: null
    }
  },
  emits: ["update:isShowDialog", "uploadSuccessUrl"],
  setup(__props, { emit: emits }) {
    const props = __props;
    const { init, destroy, photoArray, takePhoto, delTakePhoto, gpyIndex } = useGpy();
    const visible = ref(false);
    watch(() => props.isShowDialog, () => {
      visible.value = props.isShowDialog;
    });
    const imageList = ref([]);
    const ImageListDialog = ref(null);
    watch(photoArray, () => {
      imageList.value = photoArray.value.map((item) => {
        return {
          imgUrl: item[2]
        };
      });
      if (currentIndex.value === imageList.value.length - 1) {
        nextTick(() => {
          ImageListDialog.value.$refs.swiperBottom.swiper.slideTo(imageList.value.length);
          ImageListDialog.value.$refs.swiperTop.swiper.slideTo(imageList.value.length);
        });
      }
    }, {
      deep: true
    });
    const updateVisible = (val) => {
      emits("update:isShowDialog", val);
      if (!val) {
        destroy();
      }
    };
    const CameraCtl = ref(null);
    onMounted(() => {
      console.log(CameraCtl.value);
    });
    const readySwiperTop = () => {
      init(CameraCtl.value);
    };
    const currentIndex = ref(0);
    const changeIndex = (index2) => {
      currentIndex.value = index2;
    };
    const vis_delete_confirm_show = ref(false);
    const formData = ref({
      fileName: ""
    });
    const validatorObj = ref({
      fileName: {
        required: true
      }
    });
    const uploadFileFun = () => {
      if (imageList.value.length === 0) {
        $common.showMsg("请先拍照");
        return;
      }
      vis_delete_confirm_show.value = true;
    };
    const cancelClick = () => {
      vis_delete_confirm_show.value = false;
    };
    const confirmClick = async () => {
      if (formData.value.fileName === "") {
        $common.showMsg("请输入文件名");
        return;
      }
      vis_delete_confirm_show.value = false;
      let img = new Image();
      let doc;
      img.src = imageList.value[0].imgUrl;
      await new Promise((resolve) => {
        img.onload = function() {
          let imgWidth, imgHeight;
          imgWidth = img.width;
          imgHeight = img.height;
          const isLandscape = imgWidth > imgHeight;
          const orientation = isLandscape ? "l" : "p";
          doc = new jsPDF({
            orientation,
            unit: "mm"
          });
          imageList.value.forEach((item, index2) => {
            const pageWidth = doc.internal.pageSize.getWidth();
            const pageHeight = doc.internal.pageSize.getHeight();
            const ratio = Math.min(pageWidth / imgWidth, pageHeight / imgHeight) * 0.9;
            const scaledWidth = imgWidth * ratio;
            const scaledHeight = imgHeight * ratio;
            const x = (pageWidth - scaledWidth) / 2;
            const y = (pageHeight - scaledHeight) / 2;
            doc.addImage(item.imgUrl, "JPEG", x, y, scaledWidth, scaledHeight);
            if (index2 < imageList.value.length - 1) {
              doc.addPage(orientation);
            }
          });
          resolve(true);
        };
      });
      const pdfBlob = doc.output("blob");
      const pdfFile = new File([pdfBlob], "document.pdf", { type: "application/pdf" });
      const formDataFile = new FormData();
      formDataFile.append("file", pdfFile);
      try {
        let uploadFile_ls = props.uploadFileFun || uploadFile;
        const res = await uploadFile_ls(formDataFile);
        updateVisible(false);
        emits("uploadSuccessUrl", res.result, formData.value.fileName + ".pdf");
      } catch (error) {
        console.error("上传失败:", error);
      }
    };
    return { __sfc: true, init, destroy, photoArray, takePhoto, delTakePhoto, gpyIndex, props, emits, visible, imageList, ImageListDialog, updateVisible, CameraCtl, readySwiperTop, currentIndex, changeIndex, vis_delete_confirm_show, formData, validatorObj, uploadFileFun, cancelClick, confirmClick, swiperSlide, RtzhInput: ListItemInput, RtzhConfirm: VisConfirm, RtzhImageListDialog, RtzhButton };
  }
});
const index_vue_vue_type_style_index_0_lang$2 = "";
var _sfc_render$x = function render2() {
  var _vm = this, _c = _vm._self._c, _setup = _vm._self._setupProxy;
  return _c("div", [_c(_setup.RtzhImageListDialog, { ref: "ImageListDialog", staticClass: "RtzhGpyDialog", attrs: { "title": _vm.title, "isShowDialog": _setup.visible, "imageList": _setup.imageList, "modal": false }, on: { "update:isShowDialog": [function($event) {
    _setup.visible = $event;
  }, _setup.updateVisible], "update:is-show-dialog": function($event) {
    _setup.visible = $event;
  }, "readySwiperTop": _setup.readySwiperTop, "changeIndex": _setup.changeIndex }, scopedSlots: _vm._u([{ key: "slideTopEnd", fn: function() {
    return [_c(_setup.swiperSlide, [_c("div", { ref: "CameraCtl", staticClass: "RtzhGpyDialog-gpy-camera" })])];
  }, proxy: true }, { key: "slideBottomEnd", fn: function() {
    return [_c(_setup.swiperSlide, [_c("div", { staticClass: "RtzhGpyDialog-camera-btn" }, [_c("i", { staticClass: "el-icon-camera" })])])];
  }, proxy: true }, { key: "footer", fn: function() {
    return [_c("div", { staticClass: "RtzhGpyDialog-footer" }, [_c(_setup.RtzhButton, { attrs: { "vis_text": "拍照" }, on: { "click": function($event) {
      return _setup.takePhoto(_setup.currentIndex);
    } } }), _c(_setup.RtzhButton, { attrs: { "vis_text": "删除" }, on: { "click": function($event) {
      return _setup.delTakePhoto(_setup.currentIndex);
    } } }), _c(_setup.RtzhButton, { attrs: { "vis_text": "上传" }, on: { "click": _setup.uploadFileFun } }), _c(_setup.RtzhButton, { attrs: { "vis_text": "关闭" }, on: { "click": function($event) {
      _setup.visible = false;
    } } })], 1)];
  }, proxy: true }]) }), _c(_setup.RtzhConfirm, { staticClass: "RtzhGpyDialog-confirm", attrs: { "vis_show": _setup.vis_delete_confirm_show }, on: { "cancel": _setup.cancelClick, "confirm": _setup.confirmClick } }, [_c(_setup.RtzhInput, { attrs: { "label-name": "文件名", "formData": _setup.formData, "validator-obj": _setup.validatorObj, "divClassName": "confirm-item", "keyAttr": "fileName", "detailAttr": "fileName", "type": 1 } })], 1)], 1);
};
var _sfc_staticRenderFns$x = [];
var __component__$x = /* @__PURE__ */ normalizeComponent(
  _sfc_main$x,
  _sfc_render$x,
  _sfc_staticRenderFns$x,
  false,
  null,
  null,
  null,
  null
);
const index$5 = __component__$x.exports;
const ZhxdDialog_vue_vue_type_style_index_0_lang = "";
const ZhxdDialog_vue_vue_type_style_index_1_scoped_875131bc_lang = "";
const _sfc_main$w = {
  name: "ZhxdDialog",
  create() {
  },
  props: {
    themeType: {
      type: String,
      default: ""
    },
    classNama: {
      type: String,
      default: ""
    },
    customClass: {
      type: String,
      default: ""
    },
    title: {
      type: String,
      default: ""
    },
    visible: {
      type: Boolean,
      default: false
    },
    showClose: {
      type: Boolean,
      default: true
    }
  },
  data() {
    return {
      dataVisible: false,
      dialogVisible: false
    };
  },
  watch: {
    visible(val) {
      this.visibleChange();
      this.dialogVisible = val;
    }
  },
  methods: {
    visibleChange() {
      let val = this.visible;
      if (val) {
        this.dataVisible = true;
        setTimeout(() => {
          this.$refs.divDalBody && (this.$refs.divDalBody.style.height = "600px");
        }, 50);
      } else {
        this.$refs.divDalBody && (this.$refs.divDalBody.style.height = "0");
        setTimeout(() => {
          this.dataVisible = false;
        }, 300);
      }
    },
    closeDialog() {
      this.$emit("update:visible", false);
    },
    closeFun() {
      this.$emit("close");
      this.closeDialog();
    }
  },
  mounted() {
    this.visibleChange();
  }
};
var _sfc_render$w = function render3() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "ZhxdDialog" }, [_vm.themeType != "theme2" ? _c("el-dialog", _vm._g(_vm._b({ class: _vm.classNama, attrs: { "title": _vm.title, "visible": _vm.dialogVisible, "show-close": _vm.showClose, "custom-class": _vm.customClass }, on: { "update:visible": function($event) {
    _vm.dialogVisible = $event;
  }, "close": _vm.closeFun }, scopedSlots: _vm._u([{ key: "title", fn: function() {
    return [_vm._t("dialogTitle")];
  }, proxy: true }], null, true) }, "el-dialog", _vm.$attrs, false), _vm.$listeners), [_vm._t("default"), _c("div", { attrs: { "slot": "footer" }, slot: "footer" }, [_vm._t("footer")], 2)], 2) : _vm._e(), _vm.themeType == "theme2" ? _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.dataVisible, expression: "dataVisible" }], staticClass: "ZhxdDialog-modal" }, [_c("div", { class: ["ZhxdDialog-con", _vm.classNama] }, [_c("div", { staticClass: "ZhxdDialog-header" }, [_vm._v(" " + _vm._s(_vm.title) + " "), _vm._t("dialogTitle"), _c("div", { staticClass: "ZhxdDialog-line" })], 2), _c("div", { ref: "divDalBody", class: [_vm.customClass, "ZhxdDialog-body"] }, [_c("div", { staticClass: "el-dialog" }, [_c("div", { staticClass: "ZhxdDialog-body-body" }, [_vm._t("default"), _vm._t("footer")], 2), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.showClose, expression: "showClose" }], staticClass: "ZhxdDialog-close", on: { "click": _vm.closeDialog } })])]), _vm._m(0)])]) : _vm._e()], 1);
};
var _sfc_staticRenderFns$w = [function() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "ZhxdDialog-footer" }, [_c("div", { staticClass: "ZhxdDialog-line" })]);
}];
var __component__$w = /* @__PURE__ */ normalizeComponent(
  _sfc_main$w,
  _sfc_render$w,
  _sfc_staticRenderFns$w,
  false,
  null,
  "875131bc",
  null,
  null
);
const RtzhDialog = __component__$w.exports;
const index_vue_vue_type_style_index_0_scoped_26dc743b_lang = "";
const _sfc_main$v = {
  name: "vis_button",
  props: {
    "disabled": {
      type: Boolean,
      default: false
    },
    "vis_text": {
      type: String,
      default: ""
    },
    "icon_class": {
      type: String,
      default: ""
    }
  },
  methods: {
    btnClick() {
      if (!this.disabled) {
        this.$emit("click");
      }
    }
  }
};
var _sfc_render$v = function render4() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "vis_button", class: { "disabled": _vm.disabled }, on: { "click": _vm.btnClick } }, [_c("i", { directives: [{ name: "show", rawName: "v-show", value: _vm.icon_class, expression: "icon_class" }], class: _vm.icon_class }), _c("span", [_vm._v(_vm._s(_vm.vis_text))])]);
};
var _sfc_staticRenderFns$v = [];
var __component__$v = /* @__PURE__ */ normalizeComponent(
  _sfc_main$v,
  _sfc_render$v,
  _sfc_staticRenderFns$v,
  false,
  null,
  "26dc743b",
  null,
  null
);
const RtzhButton = __component__$v.exports;
const ListItemInput_vue_vue_type_style_index_0_scoped_e801d65a_lang = "";
const _sfc_main$u = {
  name: "ListItemInput",
  props: {
    divClassName: {
      default: "list-item"
    },
    defineClick: {
      type: Boolean,
      default: false
    },
    maxLength: {
      default: "-1"
    },
    formatter: {
      type: Function,
      default: null
    },
    rows: {
      type: Number,
      default: 2
    },
    isTextarea: {
      default: false
    },
    formData: {
      default: () => ({})
    },
    labelName: {
      default: "label"
    },
    placeholder: {
      default: ""
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    disabled: {
      default: false
    },
    actionType: ""
  },
  data: function() {
    return {};
  },
  computed: {
    getTextareaContent() {
      return (content) => {
        return (content || "").replaceAll("\n", "<br/>");
      };
    }
  },
  methods: {
    blurFun() {
      if (this.formData[this.keyAttr] && this.formData[this.keyAttr].trim) {
        this.formData[this.keyAttr] = this.formData[this.keyAttr].trim();
      }
    },
    inputFun(val) {
      this.$emit("onInput", val, this.keyAttr, this.formData);
    },
    changeInput(val) {
      this.$emit("onChange", val, this.keyAttr);
    },
    listItemInputClick() {
      this.$emit("click", this.keyAttr);
    },
    onFocus() {
      if (!this.defineClick)
        return;
      this.$refs.input.blur();
      this.$emit("onFocus", this.keyAttr);
    }
  },
  mounted() {
  }
};
var _sfc_render$u = function render5() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemInput", _vm.divClassName] }, [_c("div", { staticClass: "vis_input" }, [_vm.labelName ? _c("label", { style: { "lineHeight": _vm.labelName.length > 9 ? "14px" : "" } }, [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require", on: { "click": _vm.listItemInputClick } }, [!_vm.actionType || _vm.actionType === "input" || _vm.actionType === "textarea" ? _c("el-input", _vm._g(_vm._b({ ref: "input", attrs: { "size": "small", "type": _vm.isTextarea ? "textarea" : "text", "placeholder": _vm.placeholder, "disabled": _vm.disabled, "rows": _vm.rows, "maxLength": _vm.maxLength == -1 ? _vm.isTextarea ? 200 : 50 : _vm.maxLength }, on: { "blur": _vm.blurFun, "focus": _vm.onFocus, "change": _vm.changeInput }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }, "el-input", _vm.$attrs, false), _vm.$listeners)) : _vm.actionType === "number" ? _c("el-input", _vm._g(_vm._b({ ref: "input", attrs: { "size": "small", "type": "number", "placeholder": _vm.placeholder, "disabled": _vm.disabled, "maxLength": _vm.maxLength == -1 ? _vm.isTextarea ? 200 : 50 : _vm.maxLength }, on: { "input": _vm.inputFun, "blur": _vm.blurFun, "focus": _vm.onFocus, "change": _vm.changeInput }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, _vm._n($$v));
  }, expression: "formData[keyAttr]" } }, "el-input", _vm.$attrs, false), _vm.$listeners)) : _vm._e()], 1) : _vm._e(), _vm.type === 2 && !_vm.isTextarea ? _c("div", { staticClass: "vis_input_box vis_input_box_detail" }, [_vm._v(_vm._s(_vm.formatter ? _vm.formatter(_vm.formData[_vm.detailAttr || _vm.keyAttr]) : _vm.formData[_vm.detailAttr || _vm.keyAttr]))]) : _vm.type === 2 && _vm.isTextarea ? _c("div", { staticClass: "vis_input_box vis_input_box_detail", domProps: { "innerHTML": _vm._s(_vm.getTextareaContent(_vm.formatter ? _vm.formatter(_vm.formData[_vm.detailAttr || _vm.keyAttr]) : _vm.formData[_vm.detailAttr || _vm.keyAttr])) } }) : _vm._e()])]);
};
var _sfc_staticRenderFns$u = [];
var __component__$u = /* @__PURE__ */ normalizeComponent(
  _sfc_main$u,
  _sfc_render$u,
  _sfc_staticRenderFns$u,
  false,
  null,
  "e801d65a",
  null,
  null
);
const ListItemInput = __component__$u.exports;
const ListItemRadio_vue_vue_type_style_index_0_scoped_774300e6_lang = "";
const _sfc_main$t = {
  name: "ListItemRadio",
  props: {
    groupArr: {
      default: () => []
    },
    divClassName: {
      default: "list-item"
    },
    formData: {
      default: () => ({})
    },
    labelName: {
      default: "label"
    },
    placeholder: {
      default: ""
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    nameKeyAttr: {
      default: "label"
    },
    valueKeyAttr: {
      default: "value"
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    hasDetail: {
      default: false
    }
  },
  computed: {
    handleTranslate() {
      return (value) => {
        let result;
        if (Array.isArray(this.groupArr)) {
          let option = this.groupArr.find((item) => item.value === value);
          result = option && option.label ? option.label : value;
        } else {
          result = this.groupArr[value] ? this.groupArr[value] : value;
        }
        return result;
      };
    }
  },
  data: function() {
    return {
      radioVal: null
    };
  },
  methods: {
    changeRadio(val) {
      this.$set(this.formData, this.keyAttr, val);
    }
  },
  mounted() {
    this.radioVal = this.formData[this.keyAttr] || null;
  }
};
var _sfc_render$t = function render6() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemradio", _vm.divClassName] }, [_c("div", { staticClass: "vis_input" }, [_vm.labelName ? _c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("el-radio-group", { on: { "change": _vm.changeRadio }, model: { value: _vm.radioVal, callback: function($$v) {
    _vm.radioVal = $$v;
  }, expression: "radioVal" } }, _vm._l(_vm.groupArr, function(item, index2) {
    return _c("el-radio", { key: "radio-" + index2, attrs: { "label": item[_vm.valueKeyAttr] } }, [_vm._v(_vm._s(item[_vm.nameKeyAttr]))]);
  }), 1)], 1) : _c("div", { staticClass: "vis_input_box vis_input_box_detail" }, [_vm._v(_vm._s(_vm.hasDetail ? _vm.formData[_vm.detailAttr || _vm.keyAttr] : _vm.handleTranslate(_vm.formData[_vm.keyAttr])))])])]);
};
var _sfc_staticRenderFns$t = [];
var __component__$t = /* @__PURE__ */ normalizeComponent(
  _sfc_main$t,
  _sfc_render$t,
  _sfc_staticRenderFns$t,
  false,
  null,
  "774300e6",
  null,
  null
);
const ListItemRadio = __component__$t.exports;
const workStopPeview_vue_vue_type_style_index_0_scoped_7b2b8287_lang = "";
const _sfc_main$s = {
  name: "DemoZhxdDialog2",
  components: {
    ZhxdDialog: RtzhDialog,
    VisBttton: RtzhButton,
    ListItemInput,
    ListItemRadio
  },
  props: {
    isShowDialog: {
      type: Boolean,
      default: false
    },
    appendToBody: {
      type: Boolean,
      default: false
    },
    getDataUrl: {
      type: String,
      default: "/web/machineIdle/page"
    },
    approveUrl: {
      type: String,
      default: "/web/machineIdle/approve"
    },
    index: {
      type: Number,
      default: 1
    },
    parentFormData: {
      type: Object,
      default: null
    }
  },
  emits: ["update:isShowDialog"],
  data() {
    return {
      currentIndex: 1,
      total: 0,
      visible: false,
      formData: {
        type: "挖掘机",
        num: 2,
        time: "2025/03/08 09:00-18:00",
        yiju: "铲斗静止超9小时",
        agentResult: "挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。挖掘机铲斗未有明显动作,且周围环境未见物料移动,判断为窝工。 ",
        isStop: "",
        text: ""
      },
      radioList: [
        {
          value: "1",
          label: "确认"
        },
        {
          value: "2",
          label: "驳回"
        }
      ],
      isShowImgsList: false,
      swiperList: []
    };
  },
  watch: {
    isShowDialog(val) {
      this.visible = val;
      if (val) {
        this.currentIndex = this.index || 1;
        this.getTableData();
      }
    },
    parentFormData(val) {
      if (val) {
        this.init();
      }
    }
  },
  onMounted() {
    this.init();
  },
  methods: {
    init() {
      this.currentIndex = this.index || 1;
      if (this.currentIndex === -1) {
        let formData = { ...this.parentFormData };
        let idleStartTime = formData.idleStartTime;
        let idleEndTime = formData.idleEndTime.split(" ");
        formData.time = idleStartTime + "-" + idleEndTime[1];
        this.formData = formData;
        this.swiperList = (this.formData.imgList || []).map((item) => {
          return {
            imgUrl: item.imgUrl,
            msg: item.createTime
          };
        });
        return;
      }
      this.visible = this.isShowDialog;
      this.getTableData();
    },
    handleCurrentChange(val) {
      this.currentIndex = val;
      this.getTableData();
    },
    showImageListFun() {
      if (this.swiperList.length > 0) {
        this.isShowImgsList = true;
      }
    },
    updateVisible(val) {
      this.$emit("update:isShowDialog", val);
    },
    btnClick(type) {
      if (type === 1) {
        if (this.formData.approveStatus !== "1" && this.formData.approveStatus !== "2") {
          $common.showMsg("请选择是否窝工");
          return;
        }
        postFormdata({
          url: this.getBaseUrl() + this.approveUrl,
          data: {
            id: this.formData.id,
            reason: this.formData.idleReason,
            status: this.formData.approveStatus
          }
        }).then(() => {
          if (this.index === -1) {
            this.formData = {};
            this.swiperList = [];
            this.$emit("changeStatus");
            this.$emit("update:isShowDialog", false);
            return;
          }
          if (this.total === 1) {
            this.$emit("update:isShowDialog", false);
          } else {
            this.currentIndex--;
            this.getTableData();
          }
          this.$emit("changeStatus");
        });
      } else {
        this.$emit("update:isShowDialog", false);
        this.$emit("cancel");
      }
    },
    getBaseUrl() {
      const { gyRtzhUiOptions: gyRtzhUiOptions2 } = useGymRtzhUiOptions();
      return gyRtzhUiOptions2.value.BASEURL;
    },
    getTableData() {
      if (this.index === -1) {
        return;
      }
      if (this.getDataUrl) {
        let baseurl = this.getBaseUrl();
        post({
          url: baseurl + this.getDataUrl,
          data: {
            pageSize: 1,
            pageNum: this.currentIndex,
            approveStatus: 0
          }
        }).then((res) => {
          let result = res.result || {};
          if (result) {
            let list = result.records || [];
            this.total = +result.total || 0;
            if (list.length > 0) {
              let data = list[0];
              let idleStartTime = data.idleStartTime;
              let idleEndTime = data.idleEndTime.split(" ");
              data.time = idleStartTime + "-" + idleEndTime[1];
              this.formData = data;
              this.swiperList = (this.formData.imgList || []).map((item) => {
                return {
                  imgUrl: item.imgUrl,
                  msg: item.createTime
                };
              });
            } else {
              this.formData = {};
            }
          }
        });
      }
    }
  }
};
var _sfc_render$s = function render7() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", [_c("ZhxdDialog", { attrs: { "title": "机械窝工审核", "visible": _vm.visible, "width": "40%", "show-close": false, "close-on-click-modal": false, "close-on-press-escape": false, "append-to-body": _vm.appendToBody }, on: { "update:visible": _vm.updateVisible } }, [_c("div", { directives: [{ name: "dialog-bg", rawName: "v-dialog-bg" }] }), _c("div", { staticClass: "ZhxdDialog-con" }, [_c("div", { staticClass: "tab-add-edit tab-add-edit-detail" }, [_c("ListItemInput", { attrs: { "formData": _vm.formData, "labelName": "机械类型", "keyAttr": "machineTypeName", "detailAttr": "machineTypeName", "type": 2 } }), _c("ListItemInput", { attrs: { "formData": _vm.formData, "labelName": "窝工时段", "keyAttr": "time", "detailAttr": "time", "type": 2 } }), _c("ListItemInput", { attrs: { "formData": _vm.formData, "labelName": "窝工数量", "keyAttr": "idleNum", "detailAttr": "idleNum", "type": 2 } }), _c("ListItemInput", { attrs: { "isTextarea": true, "formData": _vm.formData, "labelName": "判断依据", "keyAttr": "agentResult", "detailAttr": "agentResult", "type": 2 } }), _vm.swiperList[0] ? _c("div", { staticClass: "workStopPeview-img-con", on: { "click": _vm.showImageListFun } }, [_c("img", { attrs: { "src": _vm.$getFileUrl(_vm.swiperList[0].imgUrl) } })]) : _vm._e(), _c("ListItemRadio", { ref: "radio", attrs: { "labelName": "是否窝工", "formData": _vm.formData, "keyAttr": "approveStatus", "groupArr": _vm.radioList, "valueKeyAttr": "value", "nameKeyAttr": "label" } }), _c("ListItemInput", { attrs: { "isTextarea": true, "formData": _vm.formData, "labelName": "窝工原因", "keyAttr": "idleReason", "detailAttr": "idleReason", "type": 1 } })], 1), _c("div", { staticClass: "ZhxdDialog-con-btns" }, [_c("vis-bttton", { staticClass: "reset", attrs: { "vis_text": "取消" }, on: { "click": function($event) {
    return _vm.btnClick(0);
  } } }), _c("vis-bttton", { staticClass: "reset", attrs: { "vis_text": "确认" }, on: { "click": function($event) {
    return _vm.btnClick(1);
  } } })], 1), _vm.index !== -1 ? _c("div", { staticClass: "vis_paging" }, [_c("el-pagination", { attrs: { "background": "", "page-size": 1, "pager-count": 5, "current-page": _vm.currentIndex, "layout": "prev, pager, next", "total": _vm.total }, on: { "current-change": _vm.handleCurrentChange, "update:currentPage": function($event) {
    _vm.currentIndex = $event;
  }, "update:current-page": function($event) {
    _vm.currentIndex = $event;
  } } })], 1) : _vm._e()])]), _c("ImageListDialog", { attrs: { "title": "窝工图像记录", "isShowDialog": _vm.isShowImgsList, "imageList": _vm.swiperList }, on: { "update:isShowDialog": function($event) {
    _vm.isShowImgsList = $event;
  }, "update:is-show-dialog": function($event) {
    _vm.isShowImgsList = $event;
  } }, scopedSlots: _vm._u([{ key: "dialogTitle", fn: function() {
    return [_c("div", { staticClass: "ZhxdDialog-title" }, [_vm._v(" 窝工图像记录 "), _c("div", { staticClass: "ZhxdDialog-title-des" }, [_vm._v("(" + _vm._s(_vm.formData.machineTypeName) + " " + _vm._s(_vm.formData.idleNum) + "台疑似窝工,窝工时段:" + _vm._s(_vm.formData.time) + ")")])])];
  }, proxy: true }, { key: "conTop", fn: function({ current }) {
    return [_c("div", { staticClass: "ImageListDialog-all-img" }, [_vm._v(" ( " + _vm._s(current + 1)), _c("span", { staticClass: "ImageListDialog-all-img-list" }, [_vm._v("/")]), _vm._v(" "), _c("span", [_vm._v(_vm._s(_vm.swiperList.length))]), _vm._v(" ) "), _vm.formData.bigImg && _vm.formData.bigImg.imgUrl ? _c("div", { staticClass: "el-icon-s-grid full-hide-el-image" }, [_c("el-image", { attrs: { "fit": "contain", "src": _vm.$getFileUrl(_vm.formData.bigImg.imgUrl), "preview-src-list": [_vm.$getFileUrl(_vm.formData.bigImg.imgUrl)] } })], 1) : _vm._e()])];
  } }]) })], 1);
};
var _sfc_staticRenderFns$s = [];
var __component__$s = /* @__PURE__ */ normalizeComponent(
  _sfc_main$s,
  _sfc_render$s,
  _sfc_staticRenderFns$s,
  false,
  null,
  "7b2b8287",
  null,
  null
);
const workStopPeview = __component__$s.exports;
const ListItemCheckbox_vue_vue_type_style_index_0_scoped_6c03813e_lang = "";
const _sfc_main$r = {
  name: "ListItemCheckbox",
  props: {
    groupArr: {
      default: () => []
    },
    divClassName: {
      default: "list-item"
    },
    formData: {
      default: () => ({})
    },
    labelName: {
      default: "label"
    },
    placeholder: {
      default: ""
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    nameKeyAttr: {
      default: ""
    },
    valueKeyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    }
  },
  data: function() {
    return {
      checkboxVal: []
    };
  },
  methods: {
    changeCheckbox(val) {
      this.$set(this.formData, this.keyAttr, val);
      this.$emit("changeCheckbox", val, this.keyAttr);
    }
  },
  mounted() {
    this.checkboxVal = this.formData[this.keyAttr] || [];
  }
};
var _sfc_render$r = function render8() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemCheckbox", _vm.divClassName] }, [_c("div", { staticClass: "vis_input" }, [_vm.labelName ? _c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("el-checkbox-group", _vm._g(_vm._b({ on: { "change": _vm.changeCheckbox }, model: { value: _vm.checkboxVal, callback: function($$v) {
    _vm.checkboxVal = $$v;
  }, expression: "checkboxVal" } }, "el-checkbox-group", _vm.$attrs, false), _vm.$listeners), _vm._l(_vm.groupArr, function(item, index2) {
    return _c("el-checkbox", _vm._g(_vm._b({ key: "checkbox-" + index2, attrs: { "label": item[_vm.valueKeyAttr] } }, "el-checkbox", _vm.$attrs, false), _vm.$listeners), [_vm._v(" " + _vm._s(item[_vm.nameKeyAttr]) + " ")]);
  }), 1)], 1), _vm.type === 2 ? _c("div", { staticClass: "vis_input_box vis_input_box_detail" }, [_vm._v(_vm._s(_vm.formData[_vm.detailAttr || _vm.keyAttr]))]) : _vm._e()])]);
};
var _sfc_staticRenderFns$r = [];
var __component__$r = /* @__PURE__ */ normalizeComponent(
  _sfc_main$r,
  _sfc_render$r,
  _sfc_staticRenderFns$r,
  false,
  null,
  "6c03813e",
  null,
  null
);
const ListItemCheckbox = __component__$r.exports;
const ListItemDate_vue_vue_type_style_index_0_lang = "";
const _sfc_main$q = {
  name: "ListItemDate",
  props: {
    defaultTime: {
      default: () => {
        return ["00:00:00", "23:59:59"];
      }
    },
    popperClass: {
      default: "vis_picker"
    },
    endPlaceholder: {
      default: "结束日期"
    },
    time_left: {
      default: false
    },
    startPlaceholder: {
      default: "开始日期"
    },
    placeholder: {
      default: "请选择"
    },
    valueFormat: {
      default: "yyyy-MM-dd HH:mm:ss"
    },
    format: {
      default: "yyyy-MM-dd HH:mm:ss"
    },
    valueFormatShow: {
      default: "yyyy-MM-dd HH:mm:ss"
    },
    detaildFormat: {
      default: ""
    },
    dataType: {
      default: "datetimerange"
    },
    divClassName: {
      default: "list-item"
    },
    formData: {
      default: {}
    },
    labelName: {
      default: "label"
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    disabled: {
      default: false
    }
  },
  data: function() {
    return {};
  },
  methods: {
    formatTime: $common.formatTime,
    handleChangeDate(val) {
      if (this.dataType.includes("range")) {
        this.$emit("onChange", val, this.keyAttr, this.dataType);
      } else {
        this.$emit("onChange", val, this.keyAttr);
      }
    }
  },
  mounted() {
  }
};
var _sfc_render$q = function render9() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemDate", _vm.divClassName] }, [_c("div", { staticClass: "vis_input" }, [_c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]), _vm.type != 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require", style: { marginLeft: _vm.time_left ? "-8px" : "0px" } }, [_vm.dataType.indexOf("range") != -1 ? _c("div", { staticClass: "time_packer" }, [_c("el-date-picker", _vm._g(_vm._b({ attrs: { "size": "small", "popper-class": _vm.popperClass, "type": _vm.dataType, "disabled": _vm.disabled, "clearable": false, "value-format": _vm.valueFormat, "format": _vm.format, "start-placeholder": _vm.startPlaceholder, "end-placeholder": _vm.endPlaceholder, "default-time": _vm.defaultTime }, on: { "change": _vm.handleChangeDate }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }, "el-date-picker", _vm.$attrs, false), _vm.$listeners))], 1) : _c("div", { staticClass: "time_packer" }, [_c("el-date-picker", _vm._g(_vm._b({ attrs: { "size": "small", "popper-class": _vm.popperClass, "type": _vm.dataType, "disabled": _vm.disabled, "clearable": false, "value-format": _vm.valueFormat, "format": _vm.format, "placeholder": _vm.placeholder }, on: { "change": _vm.handleChangeDate }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }, "el-date-picker", _vm.$attrs, false), _vm.$listeners))], 1)]) : _vm._e(), _vm.type === 2 ? _c("div", { staticClass: "vis_input_box vis_input_box_detail" }, [_vm._v(" " + _vm._s(_vm.formData[_vm.detailAttr] && _vm.formatTime(_vm.formData[_vm.detailAttr], null, _vm.detaildFormat || _vm.valueFormatShow)) + " ")]) : _vm._e()])]);
};
var _sfc_staticRenderFns$q = [];
var __component__$q = /* @__PURE__ */ normalizeComponent(
  _sfc_main$q,
  _sfc_render$q,
  _sfc_staticRenderFns$q,
  false,
  null,
  null,
  null,
  null
);
const ListItemDate = __component__$q.exports;
const index_vue_vue_type_style_index_0_scoped_24cda555_lang = "";
const _sfc_main$p = {
  name: "vis_files_remote",
  inheritAttrs: false,
  components: {
    visBttton: RtzhButton
  },
  props: {
    file_limit_allow: {
      type: Boolean,
      default: true
    },
    file_limit: {
      type: Number,
      default: 1
    },
    acceptStr: {
      type: String
    },
    iptFilesName: {
      type: String
    },
    size: {
      type: String
    },
    empty: {
      type: Boolean,
      default: false
    },
    resetName: {
      type: Boolean,
      default: false
    },
    acceptType: {
      type: String,
      default: ""
    },
    iptFiles: {
      type: String,
      default: ""
    },
    iptFilesObj: {}
  },
  data() {
    return {
      fileName: !this.iptFiles ? "请选择文件" : "已上传",
      userImg: "",
      fontWhite: ""
    };
  },
  watch: {
    iptFilesName(newval) {
      if (newval == "") {
        this.fileName = "请选择文件";
        this.$refs.file.value = null;
        this.$emit("update:iptFiles", null);
        this.fontWhite = "";
      }
    },
    empty(newValue, oldValue) {
      if (newValue) {
        this.fileName = "请选择文件";
        this.$refs.file.value = null;
        this.$emit("update:iptFiles", null);
        this.fontWhite = "";
      } else {
        this.fontWhite = "fontWhite";
      }
    }
  },
  methods: {
    chooseFile() {
      if (!this.file_limit_allow) {
        $common.showMsg("文件最多上传" + this.file_limit + "个!");
      } else {
        this.$refs.file.click();
      }
    },
    async changeFile() {
      const _this = this;
      let files = _this.$refs.file.files[0];
      var allowMaxSize = _this.size * 1024;
      if (allowMaxSize !== 0 && allowMaxSize < files.size) {
        let num = Number(allowMaxSize) / 1e3;
        if (num > 1024) {
          num = parseInt($common.floarDiv(num, 1024));
          $common.showMsg("文件不能大于" + num + "M");
        } else {
          $common.showMsg("文件不能大于" + (Number(allowMaxSize) / 1e3).toFixed(0) + "K");
        }
        return;
      }
      if (this.acceptType) {
        let fileType = files.name.split(".");
        fileType = fileType[fileType.length - 1];
        fileType = fileType.toLowerCase();
        if (this.acceptType.indexOf(fileType) == -1) {
          $common.showMsg("仅支持 " + this.acceptType + " 格式文件");
          return;
        }
      }
      this.fontWhite = "fontWhite";
      _this.fileName = this.$refs.file.files[0].name;
      _this.$emit("update:iptFilesName", _this.fileName);
      _this.$emit("update:iptFilesObj", this.$refs.file.files);
      let formData = new FormData();
      const compressedFile = await this.$compressImage(_this.$refs.file.files[0]);
      formData.append("file", compressedFile);
      _this.$emit("uploadImgInfo", {
        // 返回文件信息给前端
        fileName: _this.fileName,
        fileSize: files.size
      });
      uploadFile(formData).then((res) => {
        if (res.status === "SUCCEED") {
          _this.fileName = _this.$refs.file.files[0].name;
          _this.$emit("update:iptFiles", res.result);
          _this.$emit("importSuccessFun");
          _this.$emit("changeFile", {
            name: _this.fileName,
            url: res.result
          });
          this.$refs.file.value = null;
        }
      }).catch((res) => {
        _this.$emit("update:iptFiles", "");
        _this.$emit("importFailFun");
      });
    }
  }
};
var _sfc_render$p = function render10() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "vis_files vis_files_remote" }, [_c("div", { on: { "click": _vm.chooseFile } }, [!_vm.resetName ? _c("div", { staticClass: "file_name", class: [_vm.fontWhite] }, [_vm._v(_vm._s(_vm.iptFilesName || _vm.fileName))]) : _vm._e(), _vm.resetName ? _c("div", { staticClass: "file_name" }, [_vm._v("选择文件")]) : _vm._e(), _c("vis-bttton", { staticClass: "fileChooseBtn", attrs: { "vis_text": "选择文件" } }), _c("input", { directives: [{ name: "show", rawName: "v-show", value: 0, expression: "0" }], ref: "file", attrs: { "type": "file", "accept": _vm.acceptStr }, on: { "change": _vm.changeFile } })], 1)]);
};
var _sfc_staticRenderFns$p = [];
var __component__$p = /* @__PURE__ */ normalizeComponent(
  _sfc_main$p,
  _sfc_render$p,
  _sfc_staticRenderFns$p,
  false,
  null,
  "24cda555",
  null,
  null
);
const fileDiv$2 = __component__$p.exports;
const ListItemFiles_vue_vue_type_style_index_0_scoped_030c0261_lang = "";
const _sfc_main$o = {
  name: "ListItemFiles",
  components: {
    fileDiv: fileDiv$2,
    visBttton: RtzhButton
  },
  props: {
    dataType: {
      type: Array,
      default: () => [0]
      //  0 返回path 1 返回name, 2 返回文件对象
    },
    formData: {
      default: () => ({})
    },
    labelName: {
      default: "label"
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    detailsProps: {
      default: null
    },
    type: {
      default: 1
    },
    showDownLoadBtn: {
      type: Boolean,
      default: false
    },
    fileType: {
      default: "file"
    }
  },
  data: function() {
    return {
      fileName: "",
      filePath: "",
      fileObj: {}
    };
  },
  watch: {
    formData: {
      deep: true,
      handler(newval) {
        let val = newval && newval[this.keyAttr];
        if (val) {
          this.dataType.forEach((v, i2) => {
            if (v == 0) {
              this.filePath = val[i2] || "";
            } else if (v == 1) {
              this.fileName = val[i2] || "";
            } else if (v == 2) {
              this.fileObj = val[i2] || "";
            }
          });
        }
      },
      immediate: true
    },
    filePath() {
      let data = [];
      if (this.fileName || this.filePath) {
        this.dataType.forEach((v) => {
          if (v == 0) {
            data.push(this.filePath);
          } else if (v == 1) {
            data.push(this.fileName);
          } else if (v == 2) {
            data.push(this.fileObj);
          }
        });
      }
      this.$set(this.formData, this.keyAttr, data);
    }
  },
  methods: {
    downLoadShow(val) {
      let name = val.gongdianShuomingName || "";
      let url = val.gongdianShuomingUrl || "";
      if (this.detailsProps) {
        name = val[this.detailsProps.name];
        url = val[this.detailsProps.url];
      }
      $common.downloadWidthName(name, url);
    }
  },
  mounted() {
  }
};
var _sfc_render$o = function render11() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "list-item ListItemFiles" }, [_c("div", { staticClass: "vis_input" }, [_c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && !_vm.$attrs.useDefine && "vis_input_icon_require" }, [_c("div", { staticClass: "flex_align" }, [_c("file-div", _vm._b({ attrs: { "iptFilesName": _vm.fileName, "iptFiles": _vm.filePath, "iptFilesObj": _vm.fileObj }, on: { "update:iptFilesName": function($event) {
    _vm.fileName = $event;
  }, "update:ipt-files-name": function($event) {
    _vm.fileName = $event;
  }, "update:iptFiles": function($event) {
    _vm.filePath = $event;
  }, "update:ipt-files": function($event) {
    _vm.filePath = $event;
  }, "update:iptFilesObj": function($event) {
    _vm.fileObj = $event;
  }, "update:ipt-files-obj": function($event) {
    _vm.fileObj = $event;
  } } }, "file-div", _vm.$attrs, false)), _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && _vm.$attrs.useDefine ? _c("div", { staticClass: "required_icon" }, [_vm._v(" * ")]) : _vm._e()], 1), _vm.fileType === "image" && _vm.formData[_vm.keyAttr] && _vm.formData[_vm.keyAttr][0] ? _c("div", { staticClass: "img-con" }, [_c("img", { attrs: { "src": _vm.formData[_vm.keyAttr][0], "alt": "" } })]) : _vm._e()]) : _vm._e(), _vm.type === 2 && _vm.fileType === "file" ? _c("div", { staticClass: "vis_input_box vis_input_box_detail" }, [_vm._v(" " + _vm._s(_vm.detailsProps ? _vm.formData[_vm.detailsProps.name] : _vm.formData[_vm.detailAttr]) + " "), _vm.showDownLoadBtn && _vm.formData[_vm.detailAttr] ? _c("vis-bttton", { staticClass: "downBtn", attrs: { "vis_text": "下载查看" }, on: { "click": function($event) {
    return _vm.downLoadShow(_vm.formData);
  } } }) : _vm._e()], 1) : _vm.type === 2 && _vm.fileType === "image" ? _c("div", { staticClass: "img-con" }, [_c("img", { attrs: { "src": _vm.formData[_vm.keyAttr] && _vm.formData[_vm.keyAttr][0], "alt": "" } })]) : _vm._e()])]);
};
var _sfc_staticRenderFns$o = [];
var __component__$o = /* @__PURE__ */ normalizeComponent(
  _sfc_main$o,
  _sfc_render$o,
  _sfc_staticRenderFns$o,
  false,
  null,
  "030c0261",
  null,
  null
);
const ListItemFiles = __component__$o.exports;
const __$_require_ed7708e0__ = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEwAAAA4CAYAAABXJB78AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRERUI5OURDMTcwNzExRUE4OUY0Rjg0QUJGOEYxRDg2IiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjRERUI5OUREMTcwNzExRUE4OUY0Rjg0QUJGOEYxRDg2Ij4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NERFQjk5REExNzA3MTFFQTg5RjRGODRBQkY4RjFEODYiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NERFQjk5REIxNzA3MTFFQTg5RjRGODRBQkY4RjFEODYiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6l8IxEAAAM8UlEQVR42uRaB5RV1RW9UxBpUkUQpcnQe5ERBxBBQA0YqiAKgUkIoYUYHbEFUSM4BKLSIjhSFBaEoYkibUGkLYqIAgICWQSkSWihw1CyN3e/9f8w7/35f2CAmX/XOuv9ufPe/e/tf84++5z7jAnjcbVnzyhYZCjXRIcpUEVxeBHWD9YflhTstRFhBlR1HF6BtYPNgG2HPQ+rHDFu3NVg1ogME6CawL7Gx1Ww/8LKA6AXcHwflgv2dNh7mLipLSwBVgb2EWw07ASsDay3PK0rrAMAbBiWgAGouwXCS+Lo4bBPYVf85svr9Fdho2B7YS0B2rqwAQxA5cfhD7A/wg7CEmHJsLyw38MGwIpddxnPKw0bBKsAwNpne8AAVDGBRLC+gw3Fgy/C/P34/CeBlS/AEr+FfQnbDauGa/+dLUkfgJSFjcVHPmBFWAs87OM4/gfzn/Co8MuXzlKUF4dhU2B/znYeJmkwEPZr2HTYMAC1FfN1/SRDqM/VCrZTHloK6x3J8h4GQOJgX0ka0CMq4sG641gc84txXA9rn0EneBlr/YTjEljfLOthACJCGulVhR0z2kjYMXkYPa1emgvzIQovXjTmwgX7d86cxtSvb8yKFVjUU5/iBJMDNhf2IAA8l2VKIwDF+3pWgBSA/R02DnZRypzaqoLrxZUqGdMdjnfqlDETJhhTs6Yxj4Pa8uQx5swZYzZsCORlHfDdO/CZnjvmjvcw3Gwu3ezLsAuSBp/D7oL9TgT9QMBFWreGT14n3OlV34GevkQyPHDA68or0mc1yIuwGAB45Y70MABVQLJggEQks9tsWCHY6+KVQmkuLFjQmOPHfX8XKWLD8QqeMxL0fPkyciWS5Y8/GrNlSyCwHD53CvKhqhKS7yjSB1Ak7PcFEiVBF/yq9UTgIyQN/uIK1gsoBYcMMaZsWft3587GvPOOMY0aWbA4Bg82ZtMm63XNmwdzS931XcMV9ndGlgRI5WD/kIZ6iGABqCdwPIB5EI/ZJTGax3ORc+DkCDBKy5bG5IfIL1bMkjy9ieMESsZffjHmvvvs34eRWEuVwrfh63Ln9lqVlNAHNpkVAO6l4W0FDDdQEzYNHzcpI9VSOcJGHkMQcWN+o/8FHkuW2JCrDln23nvG3A9h/zqi9/vvfQA1aYJvqGX/3gsnfhZ5JAGOU7lyoJUdWTFSuu7WAwYwGqu9grxu9qu9Eq9fcSmOayQTgktChQtDnrazHkaLBhUfOWJD8d577Tnlwd+dOsFnclnS37PHehgHec17FPHLko/h/irdEtKXhmolDRWj9koXtVfa4/+UDLXSXahiRXvcvt03dxeSZr16Fqxr+Q0kP368lRJVq/rOowdGRSHwEfllylhgmSSOHEnvW1mDkjImKgHFZ5qskIbqLA2VTwTK2i4F1k1kWi7NheQVesPRoxaIGjUsP/FB9+0z5t13U4tOkvguUN0rihoCwUzINXjN3LnWC8lvkyfb0KxWzZhly4yZNi2YR+kAo2gjKT6EiDh4Uz1MGipeGuqMuplTqbPVrHvRpb1iwWnQwJg2baw6/xqR27QpCp7ivnMegPSqUsUC4oxFi+yRXkUpQYnRsKHVW2+8Ycyjj1qwKFbJX8yqHASN37l1q7WUFK9HegkgxeK52Mnor0i5cQ+ThuorDbVLGuYLMo0yHf+X31v9gHd69LAh5i80qcgXLDCmWTP7UF9gyZMn015PwienOUQ/fbr1vLfftoDNmoVC58HU6zuDoZqYGOjxGjEfq8YsznIp8gaAooaiIka8mIZq88biuFF8tVei0xss1nhPQE1UqODjHHrIoEGWk8hN5KCHH07nZhSqLH927rTeSrAY3rt3G1O3rv3/5ygapk6153A4EsR7JOCZvtUz9ciQhwGkGIVdVxWqbNhtxHwV8Rb5KyrgInnz2vqORs6hB1EO8IGpk5KSjImLs5LBGfS22bPTrkVxmgMq5PRpmwVnzLBrNm5sAWrVyoY0QRo+3Adu0aKWAqjX3MdlUQplTkslgVKRIQBVD8atqc2aqgqgWCDnwvw8aajn0wWrdm0bRk69R84aCJw/+8yCRa/r3duCtW2bMUuX2vMIAIG4fhAUeiIB5WAIc03qrdKlLViXLhkzZUrqpMHwdQfrjDQYiZ5OESdaYdwXjg5CGjSXgKsjlLkDc4io4/+fKhyDH9RAOaRLyTdr1tiOwpNPWrCc8eGHVko88og0uLzGAcYZ9Jw5cxA0G33KniFMHmO4cySjJDx4ML07OyoqGeO0jySyY9RW6srGYkQAadBRQBVVe+Vjod9BoVc9YMgxSy1ebH/96wdJng/2888QGOVsRuR569dbDySgrAFLlLCE7hTTJP3XXvPObAxjZsND+D3fesvyGLPrqlUBf0JJnySFobOzdLczD6DOugpXAJVb0oC97fOwv6muivKbL+351Uzt/FV54/QWuvzatWnPY/jx/wxNHulJnKNEYMeBocmQpCSg99ALmQjuucd63PLl7t/P88hZ1HRU/Aw7b7A2KaPPUM3aT4KV3VykWPNPAHXJtb0DoIooTvuqt03NNEeV+0DpkMKeQJFAW7SwDxPlR2EUnuvWpe1y0kNofBgSP4GgFmPt518Yz5tntRK7DVT3jmBdudLdc8lVo0ZZD/PWV7jYDCF7Shf+FdZLIpUEvyjQawMRAguFlvlGGW855krJm3oE7BiQUMk9der4yhSWHXxItlk4Ro+24eU2ChWyCt4BmRxEjmIYUQqw+0CguDbDlx0Jrj1pkvW+0AYF6BA832p2S/wyPecTMb8+mEWiRXZHRWwrsRhD8LmA2Y4h89RTqes2kiqzE3mIHhUTY7mJXuYF2LFj9vzYWAsWw46cVqCAT6dxXZI2NRNlB+VD8IOcNE2OsAXPVgvGnabW6uRWx/zOUBaMUEiyB9QeFzeRRPiV69n8hbt0sZ0AZ1AYEiiC4h96DLFu3eznYcNs1nIbBJVAOV5EVc5x9qwNz/37bWPw6tVQnuu8SJxbcHvwTI+JWuKU6Udg/kBGBHuEXx3IvNtMTbTlntlv6FCbxUjUBMq/i+AMZieGKjmJY/Nmyy1eg7qLxTYHlf78+TYUE9T0HDkydR3pPf5n7AsnHyhqnG5JOc2NBlDHb6QUvEb6rJHUAWUp0BGf12rbKfVgOLC0YG/cradE8meWpHdFKwFTCjiliKO/ridk8hYB4/rMlmfP+mo9tqBpgQE7pJb2WG2ePCdJlFcbGp94bZtlyMOc2lAt4yoSqTM8r+KDMyPSRoywKZycRvJ3+ums4xYuNGb1akvq9EyKT3YZZs5MuyaLY4a1s5fIUbKkBddbdO4SIBPVpY2XhjrldEvcpMFNAUygJak6p4z4ybVv5WTHN9+0n+ltbA/7kz89hnLCP/UPGGD3DMl5BO/GxkZpqGTtW/bVPe+UZJgX7BuFGQpJv0Fly3ekBkndj3a9ig09hgizpAMWQ5Sc9sMP7gRNHiNg9BqG66UM/fDL6DkAYyF+3BLyrp7Gvj7QDvPfZHa7PVXxzZc6cPiXGn7cvfHu5RIcfw7ilhc7Dm5gMQM6/XSGZ3RIfcurEtGxfm/nJMmbCFojzLe8FWB5bYIkqkww0mYe7LHLkrJ/F9MNKHITO6D1lUPYgTh/Pph7SxE3sSvCVywvA6hkhWOKNFQntpZu5c6XV/G9TjpmphqBuVyvZr3Xp4+gHWXD7lqgR1sxStHq7OLQ81gKsV8VGLAz2gOgVtqLe2mmjFdfWfADp79+O4ZXbAxTjTVeodnb9SwC5JB+x442o5GjWB+yEHe6qEwAzJiBWyxHxZnO2zltABZ/sJLSUOzonjC3eXh5WKQ4gvUWWNzs8NzD5G5Mr14uAZVii2TKCJZA3mOfNBR/HP+3c3Lqh5twszRUpgHmVy7xXYcG6rR6vzDbtq3tVjglDdsv3Jlmu8Z7bBcgzts5PdUlOSYNNf1ma6jMBoy8heLOPCOSXRtwJYYgaz8W0YElw3ppKKd91E86aps01PzM0lCZlSUdiXFOWTJB768vD7gSN1JZKHuDxdcqm2EtbgF9K53HN5e5pfMM5uNgX93JYKW7a+TXK6ut3va8UDeZlGnZXtmA9SqLn9j+nq35zSYLjXS32fCQY1Sn9dTOUOUgNdQktVd2YI1YSYPmfvO7TRYcwWyzsVzqos2QEemce0pEXhqA8BXLMgCL5cwCkXxZzPfOqmAF5WHysmQV44ON3WUp7tJeoVbiztJpZdQEncf5sQDppMkGI9iiLlFewiz2kY5G+szZWaK3cg+AewGXnHkAdd5koxH0qwLwshXqkU0WkY8RcRdUJdBfWY/gznJ7AzmcPMxITFJmjAEYTQFgSUkDehW3rjpifpnJ5iMUD+O5W6XM+VpgB3ka+1ObTJiMkN7eAWjx4rCR6iYcNmE2Qn0DkZ2LiQDqsgnT8X8BBgBv89au57ECiwAAAABJRU5ErkJggg==";
const imageViewer_vue_vue_type_style_index_0_scoped_0007026c_lang = "";
const imageViewer_vue_vue_type_style_index_1_lang = "";
const Mode = {
  CONTAIN: {
    name: "contain",
    icon: "el-icon-full-screen"
  },
  ORIGINAL: {
    name: "original",
    icon: "el-icon-c-scale-to-original"
  }
};
const mousewheelEventName = isFirefox() ? "DOMMouseScroll" : "mousewheel";
const _sfc_main$n = {
  name: "elImageViewer",
  props: {
    urlList: {
      type: Array,
      default: () => []
    },
    statusList: {
      type: Array,
      default: () => []
    },
    zIndex: {
      type: Number,
      default: 2e3
    },
    onSwitch: {
      type: Function,
      default: () => {
      }
    },
    onClose: {
      type: Function,
      default: () => {
      }
    },
    initialIndex: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      index: this.initialIndex,
      isShow: false,
      infinite: true,
      loading: false,
      mode: Mode.CONTAIN,
      transform: {
        scale: 1,
        deg: 0,
        offsetX: 0,
        offsetY: 0,
        enableTransition: false
      }
    };
  },
  computed: {
    isSingle() {
      return this.urlList.length <= 1;
    },
    isFirst() {
      return this.index === 0;
    },
    isLast() {
      return this.index === this.urlList.length - 1;
    },
    currentImg() {
      return this.urlList[this.index];
    },
    imgStyle() {
      const { scale, deg, offsetX, offsetY, enableTransition } = this.transform;
      const style = {
        transform: `scale(${scale}) rotate(${deg}deg)`,
        transition: enableTransition ? "transform .3s" : "",
        "margin-left": `${offsetX}px`,
        "margin-top": `${offsetY}px`
      };
      if (this.mode === Mode.CONTAIN) {
        style.maxWidth = style.maxHeight = "100%";
      }
      return style;
    }
  },
  watch: {
    index: {
      handler: function(val) {
        this.reset();
        this.onSwitch(val);
      }
    },
    currentImg(val) {
      this.$nextTick((_) => {
        const $img = this.$refs.img[0];
        if (!$img.complete) {
          this.loading = true;
        }
      });
    }
  },
  methods: {
    shenheFunImg() {
      this.$emit("shenheFun", this.index);
    },
    shenheFunImgNo() {
      this.$emit("shenheFunNo", this.index);
    },
    test() {
    },
    hide() {
      this.deviceSupportUninstall();
      this.onClose();
    },
    deviceSupportInstall() {
      this._keyDownHandler = rafThrottle((e) => {
        const keyCode = e.keyCode;
        switch (keyCode) {
          case 27:
            this.hide();
            break;
          case 32:
            this.toggleMode();
            break;
          case 37:
            this.prev();
            break;
          case 38:
            this.handleActions("zoomIn");
            break;
          case 39:
            this.next();
            break;
          case 40:
            this.handleActions("zoomOut");
            break;
        }
      });
      this._mouseWheelHandler = rafThrottle((e) => {
        const delta = e.wheelDelta ? e.wheelDelta : -e.detail;
        if (delta > 0) {
          this.handleActions("zoomIn", {
            zoomRate: 0.015,
            enableTransition: false
          });
        } else {
          this.handleActions("zoomOut", {
            zoomRate: 0.015,
            enableTransition: false
          });
        }
      });
      on(document, "keydown", this._keyDownHandler);
      on(document, mousewheelEventName, this._mouseWheelHandler);
    },
    deviceSupportUninstall() {
      off(document, "keydown", this._keyDownHandler);
      off(document, mousewheelEventName, this._mouseWheelHandler);
      this._keyDownHandler = null;
      this._mouseWheelHandler = null;
    },
    handleImgLoad(e) {
      this.loading = false;
    },
    handleImgError(e) {
      this.loading = false;
      e.target.alt = "加载失败";
    },
    handleMouseDown(e) {
      if (this.loading || e.button !== 0)
        return;
      const { offsetX, offsetY } = this.transform;
      const startX = e.pageX;
      const startY = e.pageY;
      this._dragHandler = rafThrottle((ev) => {
        this.transform.offsetX = offsetX + ev.pageX - startX;
        this.transform.offsetY = offsetY + ev.pageY - startY;
      });
      on(document, "mousemove", this._dragHandler);
      on(document, "mouseup", (ev) => {
        off(document, "mousemove", this._dragHandler);
      });
      e.preventDefault();
    },
    reset() {
      this.transform = {
        scale: 1,
        deg: 0,
        offsetX: 0,
        offsetY: 0,
        enableTransition: false
      };
    },
    toggleMode() {
      if (this.loading)
        return;
      const modeNames = Object.keys(Mode);
      const modeValues = Object.values(Mode);
      const index2 = modeValues.indexOf(this.mode);
      const nextIndex = (index2 + 1) % modeNames.length;
      this.mode = Mode[modeNames[nextIndex]];
      this.reset();
    },
    prev() {
      if (this.isFirst && !this.infinite)
        return;
      const len = this.urlList.length;
      this.index = (this.index - 1 + len) % len;
    },
    next() {
      if (this.isLast && !this.infinite)
        return;
      const len = this.urlList.length;
      this.index = (this.index + 1) % len;
    },
    handleActions(action, options = {}) {
      if (this.loading)
        return;
      const { zoomRate, rotateDeg, enableTransition } = {
        zoomRate: 0.2,
        rotateDeg: 90,
        enableTransition: true,
        ...options
      };
      const { transform } = this;
      switch (action) {
        case "zoomOut":
          if (transform.scale > 0.2) {
            transform.scale = parseFloat((transform.scale - zoomRate).toFixed(3));
          }
          break;
        case "zoomIn":
          transform.scale = parseFloat((transform.scale + zoomRate).toFixed(3));
          break;
        case "clocelise":
          transform.deg += rotateDeg;
          break;
        case "anticlocelise":
          transform.deg -= rotateDeg;
          break;
      }
      transform.enableTransition = enableTransition;
    }
  },
  mounted() {
    this.reset();
    this.deviceSupportInstall();
    this.$refs["el-image-viewer__wrapper"].focus();
  }
};
var _sfc_render$n = function render12() {
  var _vm = this, _c = _vm._self._c;
  return _c("transition", { attrs: { "name": "viewer-fade" } }, [_c("div", { ref: "el-image-viewer__wrapper", staticClass: "el-image-viewer__wrapper", style: { "z-index": _vm.zIndex }, attrs: { "tabindex": "-1" } }, [_c("div", { staticClass: "el-image-viewer__mask", on: { "click": _vm.hide } }), _c("span", { staticClass: "el-image-viewer__btn el-image-viewer__close", on: { "click": _vm.hide } }, [_c("i", { staticClass: "el-icon-circle-close" })]), !_vm.isSingle ? [_c("span", { staticClass: "el-image-viewer__btn el-image-viewer__prev", class: { "is-disabled": !_vm.infinite && _vm.isFirst }, on: { "click": _vm.prev } }, [_c("i", { staticClass: "el-icon-arrow-left" })]), _c("span", { staticClass: "el-image-viewer__btn el-image-viewer__next", class: { "is-disabled": !_vm.infinite && _vm.isLast }, on: { "click": _vm.next } }, [_c("i", { staticClass: "el-icon-arrow-right" })])] : _vm._e(), _c("div", { staticClass: "el-image-viewer__btn el-image-viewer__actions el-image-viewer__btn_show" }, [_c("div", { staticClass: "el-image-viewer__actions__inner" }, [_c("i", { staticClass: "el-icon-zoom-out", on: { "click": function($event) {
    return _vm.handleActions("zoomOut");
  } } }), _c("i", { staticClass: "el-icon-zoom-in", on: { "click": function($event) {
    return _vm.handleActions("zoomIn");
  } } }), _c("i", { staticClass: "el-image-viewer__actions__divider" }), _c("i", { class: _vm.mode.icon, on: { "click": _vm.toggleMode } }), _c("i", { staticClass: "el-image-viewer__actions__divider" }), _c("i", { staticClass: "el-icon-refresh-left", on: { "click": function($event) {
    return _vm.handleActions("anticlocelise");
  } } }), _c("i", { staticClass: "el-icon-refresh-right", on: { "click": function($event) {
    return _vm.handleActions("clocelise");
  } } }), _vm.statusList.length != 0 && !_vm.statusList[_vm.index] ? _c("i", { staticClass: "vis-image-shenhe yes", on: { "click": _vm.shenheFunImg } }, [_vm._v("审核通过")]) : _vm._e(), _vm.statusList.length != 0 && !_vm.statusList[_vm.index] ? _c("i", { staticClass: "vis-image-shenhe no", on: { "click": _vm.shenheFunImgNo } }, [_vm._v("审核不通过")]) : _vm._e()])]), _c("div", { staticClass: "el-image-viewer__canvas" }, _vm._l(_vm.urlList, function(url, i2) {
    return i2 === _vm.index ? _c("div", { key: url, ref: "img", refInFor: true, staticClass: "el-image-viewer__img", style: _vm.imgStyle }, [_c("img", { attrs: { "src": _vm.currentImg }, on: { "load": _vm.handleImgLoad, "error": _vm.handleImgError, "mousedown": _vm.handleMouseDown } }), _vm.statusList.length != 0 && _vm.statusList[_vm.index] ? _c("div", { staticClass: "el-image-viewer__img_status" }, [_c("img", { attrs: { "src": __$_require_ed7708e0__ } })]) : _vm._e()]) : _vm._e();
  }), 0)], 2)]);
};
var _sfc_staticRenderFns$n = [];
var __component__$n = /* @__PURE__ */ normalizeComponent(
  _sfc_main$n,
  _sfc_render$n,
  _sfc_staticRenderFns$n,
  false,
  null,
  "0007026c",
  null,
  null
);
const ImageViewer = __component__$n.exports;
const index_vue_vue_type_style_index_0_scoped_a0e7d1f6_lang = "";
const _sfc_main$m = {
  name: "vis_files_multiple",
  components: {
    ZhxdDialog: RtzhDialog,
    ImageView: ImageViewer
  },
  props: {
    oldFileList: {
      default: () => []
    },
    file_limit_allow: {
      type: Boolean,
      default: true
    },
    file_limit: {
      type: Number,
      default: 1
    },
    fileUrlProp: {
      default: "fileUrl"
    },
    fileNameProp: {
      default: "fileName"
    },
    type: {
      default: 1
    },
    acceptStr: {
      type: String
    },
    iptFilesName: {
      type: String
    },
    size: {
      type: [String, Number]
    },
    acceptType: {
      type: String,
      default: ""
    },
    addSussArr: {
      // 上传成功的文件列表
      default: () => []
    },
    iptFilesObj: {},
    tipsStr: {
      type: String,
      default: "查看已导入文件"
    }
  },
  data() {
    return {
      showPicture: false,
      dialogDanwei: false,
      fileUrl: "",
      iframeUrl: "",
      tableData: [],
      showAllfiles: false,
      sussArr: [],
      deleteFilesArr: [],
      deleteAddFilesArr: []
    };
  },
  watch: {},
  methods: {
    tableRowClassName: $common.tableRowClassName,
    handleClose() {
      this.showAllfiles = false;
      this.$emit("onClose", structuredClone(this.tableData));
    },
    previewClose() {
      this.showPicture = false;
    },
    closeKKfile() {
      this.showAllfiles = true;
    },
    showAllFilesFun() {
      let arr = [].concat(this.sussArr);
      this.oldFileList.forEach((v) => {
        let obj = this.deleteFilesArr.find((val) => val.id == v.id);
        if (!obj && v[this.fileUrlProp]) {
          arr.push(v);
        }
      });
      this.tableData = arr;
      this.showAllfiles = true;
    },
    downFile(row) {
      $common.downloadWidthName(row.fileName, row[this.fileUrlProp]);
    },
    previewFile(row) {
      const { gyRtzhUiOptions: gyRtzhUiOptions2 } = useGymRtzhUiOptions();
      const BASTURL = gyRtzhUiOptions2.BASEURL;
      let accept = [".png", ".jpg", ".jpeg"];
      let acceptLower = accept.join("|\\").toLowerCase();
      let regularString = new RegExp("(\\" + accept.join("|\\") + "|\\" + acceptLower + ")$");
      if (regularString.test(row.fileName)) {
        this.fileUrl = row[this.fileUrlProp];
        this.iframeUrl = BASTURL + "/preview/onlinePreview?url=" + encodeURIComponent(this.fileUrl);
        this.showPicture = true;
      } else {
        this.fileUrl = row[this.fileUrlProp];
        this.dialogDanwei = true;
        this.showAllfiles = false;
        this.iframeUrl = this.$getFileUrl(this.fileUrl);
      }
    },
    deleteFn(row, i2) {
      row.delFlag = 1;
      this.deleteFilesArr.push(row);
      if (row.id) {
        this.tableData.splice(i2, 1);
      } else {
        this.sussArr.splice(i2, 1);
        this.tableData.splice(i2, 1);
      }
      console.log(this.sussArr, "deleteFn");
      this.changeFileFun();
    },
    chooseFile() {
      if (!this.file_limit_allow) {
        $common.showMsg("文件最多上传" + this.file_limit + "个!");
      } else {
        this.$refs.file.click();
      }
    },
    changeFile() {
      const _this = this;
      let filesArr = _this.$refs.file.files;
      let fileNum = 0;
      let errorArr = [];
      for (let i2 = 0; i2 < filesArr.length; i2++) {
        let files = filesArr[i2];
        let fileName = files.name;
        var allowMaxSize = _this.size * 1024;
        if (allowMaxSize !== 0 && allowMaxSize < files.size) {
          let num = Number(allowMaxSize) / 1e3;
          if (num > 1024) {
            num = parseInt($common.floarDiv(num, 1024));
            $common.showMsg("文件不能大于" + num + "M");
          } else {
            $common.showMsg("文件不能大于" + (Number(allowMaxSize) / 1e3).toFixed(0) + "K");
          }
          fileNum++;
          errorArr.push(fileName);
          _this.allFileUpload(fileNum, filesArr.length, errorArr);
          continue;
        }
        if (this.acceptType) {
          let fileType = fileName.split(".");
          fileType = fileType[fileType.length - 1];
          fileType = fileType.toLowerCase();
          if (this.acceptType.indexOf(fileType) == -1) {
            fileNum++;
            errorArr.push(fileName);
            $common.showMsg("仅支持 " + this.acceptType + " 格式文件");
            _this.allFileUpload(fileNum, filesArr.length, errorArr);
            continue;
          }
        }
        let formData = new FormData();
        formData.append("file", files);
        uploadFile(formData).then((res) => {
          if (res.status === "SUCCEED") {
            fileNum++;
            let obj = {
              fileSize: files.size
            };
            obj[this.fileUrlProp] = res.result;
            obj[this.fileNameProp] = files.name;
            this.sussArr.push(obj);
            $common.showMsg("上传成功");
            _this.allFileUpload(fileNum, filesArr.length, errorArr);
          }
        }).catch((res) => {
          fileNum++;
          errorArr.push(fileName);
          _this.allFileUpload(fileNum, filesArr.length, errorArr);
        });
      }
    },
    changeFileFun() {
      let arr = this.sussArr;
      this.$emit("changeFile", arr);
    },
    allFileUpload(fileNum, len, errorArr) {
      if (fileNum == len) {
        this.changeFileFun();
        this.$refs.file.value = null;
        if (errorArr.length != 0)
          ;
      }
    }
  }
};
var _sfc_render$m = function render13() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "visFilesMultiple" }, [_c("div", { staticClass: "vis_files vis_files_remote" }, [_vm.type != 2 ? _c("div", { on: { "click": _vm.chooseFile } }, [_c("div", { staticClass: "file_name fontWhite", staticStyle: { "cursor": "pointer" }, on: { "click": function($event) {
    $event.stopPropagation();
    return _vm.showAllFilesFun.apply(null, arguments);
  } } }, [_vm._v(_vm._s(_vm.tipsStr))]), _c("vis-bttton", { directives: [{ name: "show", rawName: "v-show", value: _vm.type != 2, expression: "type != 2" }], staticClass: "fileChooseBtn", attrs: { "vis_text": "选择文件" } }), _c("input", { directives: [{ name: "show", rawName: "v-show", value: 0, expression: "0" }], ref: "file", attrs: { "type": "file", "accept": _vm.acceptStr, "multiple": "" }, on: { "change": _vm.changeFile } })], 1) : _c("div", { staticStyle: { "justify-content": "center", "cursor": "pointer", "font-size": "0.9rem" } }, [_c("div", { on: { "click": function($event) {
    $event.stopPropagation();
    return _vm.showAllFilesFun.apply(null, arguments);
  } } }, [_vm._v(_vm._s(_vm.tipsStr))])])]), _c("ZhxdDialog", { attrs: { "title": "文件列表", "close-on-click-modal": false, "close-on-press-escape": false, "show-close": false, "visible": _vm.showAllfiles, "custom-class": "dxjx-dialog" }, on: { "update:visible": function($event) {
    _vm.showAllfiles = $event;
  }, "close": _vm.handleClose } }, [_c("div", { staticClass: "vis_table" }, [_c("el-table", { attrs: { "data": _vm.tableData, "size": "small", "width": "100%", "height": "100%", "border": "", "row-class-name": _vm.tableRowClassName } }, [_c("el-table-column", { attrs: { "type": "index", "label": "序号" } }), _c("el-table-column", { attrs: { "prop": "fileName", "label": "文件名" } }), _c("el-table-column", { attrs: { "label": "操作", "width": "185" }, scopedSlots: _vm._u([{ key: "default", fn: function({ row, $index }) {
    return [_vm.type == 2 ? _c("span", { staticClass: "vis_edit_btn", on: { "click": function($event) {
      return _vm.previewFile(row);
    } } }, [_vm._v("预览")]) : _vm._e(), _vm.type != 2 ? _c("span", { staticClass: "vis_edit_btn", on: { "click": function($event) {
      return _vm.deleteFn(row, $index);
    } } }, [_vm._v("删除")]) : _vm._e()];
  } }]) })], 1)], 1), _c("div", { staticClass: "tab-scroll table-add-edit" }, [_c("div", { staticClass: "dxjx-dialog-footer", staticStyle: { "left": "85% !important", "bottom": "20px" } }, [_c("vis-bttton", { staticClass: "rightBtn", attrs: { "vis_text": "关 闭" }, on: { "click": _vm.handleClose } })], 1)])]), _c("ZhxdDialog", { attrs: { "title": "预览", "close-on-click-modal": false, "close-on-press-escape": false, "show-close": true, "visible": _vm.dialogDanwei, "custom-class": "dxjx-dialog" }, on: { "update:visible": function($event) {
    _vm.dialogDanwei = $event;
  }, "close": _vm.closeKKfile } }, [_c("div", { directives: [{ name: "dialog-bg", rawName: "v-dialog-bg" }] }), _vm.iframeUrl ? _c("iframe", { staticStyle: { "width": "100%", "height": "99%", "background": "#fff" }, attrs: { "allowfullscreen": "true", "src": _vm.iframeUrl, "frameborder": "0" } }) : _vm._e()]), _vm.showPicture ? _c("ImageView", { attrs: { "zIndex": 2e4, "urlList": [_vm.fileUrl] }, on: { "closeFun": _vm.previewClose } }) : _vm._e()], 1);
};
var _sfc_staticRenderFns$m = [];
var __component__$m = /* @__PURE__ */ normalizeComponent(
  _sfc_main$m,
  _sfc_render$m,
  _sfc_staticRenderFns$m,
  false,
  null,
  "a0e7d1f6",
  null,
  null
);
const visFilesMultiple = __component__$m.exports;
const ListItemFilesMultiple_vue_vue_type_style_index_0_scoped_1af839b6_lang = "";
const _sfc_main$l = {
  name: "ListItemFilesMultiple",
  components: {
    visFilesMultiple
  },
  props: {
    formData: {
      default: {}
    },
    fileUrlProp: {
      default: "fileUrl"
    },
    fileNameProp: {
      default: "fileName"
    },
    labelName: {
      default: "label"
    },
    validatorObj: {
      default: () => ({})
    },
    acceptStr: {
      default: "application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain, application/pdf"
    },
    acceptType: {
      default: ".xlsx,.xls,.pdf,.docx,.doc"
    },
    keyAttr: {
      default: ""
    },
    submitKeyAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    showDownLoadBtn: {
      type: Boolean,
      default: false
    },
    fileSize: {
      default: ""
    }
  },
  data: function() {
    return {
      oldArr: [],
      fileName: "",
      filePath: "",
      fileObj: {},
      change: false
    };
  },
  watch: {
    formData: {
      deep: true,
      handler(newval) {
        if (!this.change) {
          let val = newval[this.keyAttr] || [];
          let noIdArr = [], hasIdArr = [];
          for (let item of val) {
            if (item.id) {
              hasIdArr.push(item);
            } else {
              noIdArr.push(item);
            }
          }
          this.oldArr = [...hasIdArr];
          this.$refs.visFilesMultiple.sussArr = [...noIdArr];
        }
      }
    }
  },
  methods: {
    downLoadShow(val) {
      let name = val.gongdianShuomingName;
      let url = val.gongdianShuomingUrl;
      $common.downloadWidthName(name, url);
    },
    changeFile(arr) {
      this.change = true;
      this.$set(this.formData, this.submitKeyAttr, arr);
    }
  },
  mounted() {
    let val = this.formData[this.keyAttr] || [];
    this.oldArr = [...val];
  }
};
var _sfc_render$l = function render14() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "list-item ListItemFiles" }, [_c("div", { staticClass: "vis_input" }, [_vm.labelName != "" ? _c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("visFilesMultiple", _vm._b({ ref: "visFilesMultiple", attrs: { "type": _vm.type, "fileUrlProp": _vm.fileUrlProp, "fileNameProp": _vm.fileNameProp, "acceptStr": _vm.acceptStr, "acceptType": _vm.acceptType, "oldFileList": _vm.oldArr || [], "size": _vm.fileSize }, on: { "changeFile": _vm.changeFile } }, "visFilesMultiple", _vm.$attrs, false))], 1)])]);
};
var _sfc_staticRenderFns$l = [];
var __component__$l = /* @__PURE__ */ normalizeComponent(
  _sfc_main$l,
  _sfc_render$l,
  _sfc_staticRenderFns$l,
  false,
  null,
  "1af839b6",
  null,
  null
);
const ListItemFilesMultiple = __component__$l.exports;
const indexUploadone_vue_vue_type_style_index_0_scoped_ec1420f4_lang = "";
const _sfc_main$k = {
  name: "vis_files_remote",
  inheritAttrs: false,
  components: {
    visBttton: RtzhButton
  },
  props: {
    file_limit_allow: {
      type: Boolean,
      default: true
    },
    file_limit: {
      type: Number,
      default: 1
    },
    acceptStr: {
      type: String
    },
    iptFilesName: {
      type: String
    },
    size: {
      type: String
    },
    empty: {
      type: Boolean,
      default: false
    },
    resetName: {
      type: Boolean,
      default: false
    },
    acceptType: {
      type: String,
      default: ""
    },
    iptFiles: {
      type: String,
      default: ""
    },
    iptFilesObj: {},
    btnText: {
      default: ""
    },
    showInput: {
      default: true
    }
  },
  data() {
    return {
      fileName: !this.iptFiles ? "请选择文件" : "已上传",
      userImg: "",
      fontWhite: ""
    };
  },
  watch: {
    iptFilesName(newval) {
      if (newval == "") {
        this.fileName = "请选择文件";
        this.$refs.file.value = null;
        this.$emit("update:iptFiles", null);
        this.fontWhite = "";
      }
    },
    empty(newValue, oldValue) {
      if (newValue) {
        this.fileName = "请选择文件";
        this.$refs.file.value = null;
        this.$emit("update:iptFiles", null);
        this.fontWhite = "";
      } else {
        this.fontWhite = "fontWhite";
      }
    }
  },
  methods: {
    chooseFile() {
      if (!this.file_limit_allow) {
        $common.showMsg("文件最多上传" + this.file_limit + "个!");
      } else {
        this.$refs.file.click();
      }
    },
    async changeFile() {
      const _this = this;
      let files = _this.$refs.file.files[0];
      var allowMaxSize = _this.size * 1024;
      if (allowMaxSize !== 0 && allowMaxSize < files.size) {
        let num = Number(allowMaxSize) / 1e3;
        if (num > 1024) {
          num = parseInt($common.floarDiv(num, 1024));
          $common.showMsg("文件不能大于" + num + "M");
        } else {
          $common.showMsg("文件不能大于" + (Number(allowMaxSize) / 1e3).toFixed(0) + "K");
        }
        return;
      }
      if (this.acceptType) {
        let fileType = files.name.split(".");
        fileType = fileType[fileType.length - 1];
        fileType = fileType.toLowerCase();
        if (this.acceptType.indexOf(fileType) == -1) {
          $common.showMsg("仅支持 " + this.acceptType + " 格式文件");
          return;
        }
      }
      this.fontWhite = "fontWhite";
      _this.fileName = this.$refs.file.files[0].name;
      _this.$emit("update:iptFilesName", _this.fileName);
      _this.$emit("update:iptFilesObj", this.$refs.file.files[0]);
      let formData = new FormData();
      const compressedFile = await this.$compressImage(_this.$refs.file.files[0]);
      formData.append("file", compressedFile);
      _this.$emit("uploadImgInfo", {
        // 返回文件信息给前端
        fileName: _this.fileName,
        fileSize: files.size
      });
      uploadFile(formData).then((res) => {
        if (res.status === "SUCCEED") {
          _this.fileName = _this.$refs.file.files[0].name;
          _this.$emit("update:iptFiles", res.result);
          _this.$emit("importSuccessFun");
          _this.$emit("changeFile", {
            name: _this.fileName,
            url: res.result
          });
          this.$refs.file.value = null;
        }
      }).catch((res) => {
        _this.$emit("update:iptFiles", "");
        _this.$emit("importFailFun");
      });
    }
  }
};
var _sfc_render$k = function render15() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "vis_files vis_files_remote" }, [_c("div", { on: { "click": _vm.chooseFile } }, [!_vm.resetName && _vm.showInput ? _c("div", { staticClass: "file_name", class: [_vm.fontWhite] }, [_vm._v(_vm._s(_vm.iptFilesName || _vm.fileName))]) : _vm._e(), _vm.resetName && _vm.showInput ? _c("div", { staticClass: "file_name" }, [_vm._v("选择文件")]) : _vm._e(), _c("vis-bttton", { staticClass: "fileChooseBtn", attrs: { "vis_text": _vm.btnText || "选择文件" } }), _c("input", { directives: [{ name: "show", rawName: "v-show", value: 0, expression: "0" }], ref: "file", attrs: { "type": "file", "accept": _vm.acceptStr }, on: { "change": _vm.changeFile } })], 1)]);
};
var _sfc_staticRenderFns$k = [];
var __component__$k = /* @__PURE__ */ normalizeComponent(
  _sfc_main$k,
  _sfc_render$k,
  _sfc_staticRenderFns$k,
  false,
  null,
  "ec1420f4",
  null,
  null
);
const fileDiv$1 = __component__$k.exports;
const _sfc_main$j = {
  name: "ListItemFiles",
  components: {
    fileDiv: fileDiv$1
  },
  props: {
    divClassName: {
      default: "list-item"
    },
    dataType: {
      type: Array,
      default: () => [0]
      //  0 返回path 1 返回name, 2 返回文件对象
    },
    formData: {
      default: {}
    },
    labelName: {
      default: "label"
    },
    validatorObj: {
      default: () => ({})
    },
    acceptStr: {
      default: "application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain, application/pdf"
    },
    acceptType: {
      default: ".xlsx,.xls,.pdf,.docx,.doc,.png,.jpg,.jpeg,.txt"
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    }
  },
  data: function() {
    return {
      fileName: "",
      filePath: "",
      fileObj: {}
    };
  },
  watch: {
    filePath() {
      let data = [];
      if (this.fileName == "")
        ;
      else {
        this.dataType.forEach((v) => {
          if (v == 0) {
            data.push(this.filePath);
          } else if (v == 1) {
            data.push(this.fileName);
          } else if (v == 2) {
            data.push(this.fileObj);
          } else if (v == 3) {
            data.push(this.fileObj.size);
          }
        });
      }
      this.$set(this.formData, this.keyAttr, data);
    }
  },
  methods: {},
  mounted() {
    if (this.type == 1) {
      this.filePath = this.formData[this.keyAttr][0];
      this.fileName = this.formData[this.keyAttr][1];
    }
  }
};
var _sfc_render$j = function render16() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemFiles", _vm.divClassName] }, [_c("div", { staticClass: "vis_input" }, [_c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]), _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_vm.type !== 2 ? _c("file-div", { attrs: { "iptFilesName": _vm.fileName, "iptFiles": _vm.filePath, "iptFilesObj": _vm.fileObj, "acceptType": _vm.acceptType, "acceptStr": _vm.acceptStr }, on: { "update:iptFilesName": function($event) {
    _vm.fileName = $event;
  }, "update:ipt-files-name": function($event) {
    _vm.fileName = $event;
  }, "update:iptFiles": function($event) {
    _vm.filePath = $event;
  }, "update:ipt-files": function($event) {
    _vm.filePath = $event;
  }, "update:iptFilesObj": function($event) {
    _vm.fileObj = $event;
  }, "update:ipt-files-obj": function($event) {
    _vm.fileObj = $event;
  } } }) : _vm._e()], 1), _vm.type === 2 ? _c("div", { staticClass: "vis_input_box vis_input_box_detail" }, [_vm._v(_vm._s(_vm.formData[_vm.detailAttr]))]) : _vm._e()])]);
};
var _sfc_staticRenderFns$j = [];
var __component__$j = /* @__PURE__ */ normalizeComponent(
  _sfc_main$j,
  _sfc_render$j,
  _sfc_staticRenderFns$j,
  false,
  null,
  null,
  null,
  null
);
const ListItemFilesOne = __component__$j.exports;
const isSupportObjectFit = () => document.documentElement.style.objectFit !== void 0;
const ObjectFit = {
  NONE: "none",
  CONTAIN: "contain",
  COVER: "cover",
  FILL: "fill",
  SCALE_DOWN: "scale-down"
};
let prevOverflow = "";
const _sfc_main$i = {
  name: "ElImage",
  mixins: [Locale],
  inheritAttrs: false,
  components: {
    ImageViewer
  },
  props: {
    src: String,
    fit: String,
    lazy: Boolean,
    scrollContainer: {},
    previewSrcList: {
      type: Array,
      default: () => []
    },
    imgStatusList: {
      type: Array,
      default: () => []
    },
    zIndex: {
      type: Number,
      default: 2e3
    }
  },
  data() {
    return {
      loading: true,
      error: false,
      show: !this.lazy,
      imageWidth: 0,
      imageHeight: 0,
      showViewer: false
    };
  },
  computed: {
    imageStyle() {
      const { fit } = this;
      if (!this.$isServer && fit) {
        return isSupportObjectFit() ? { "object-fit": fit } : this.getImageStyle(fit);
      }
      return {};
    },
    alignCenter() {
      return !this.$isServer && !isSupportObjectFit() && this.fit !== ObjectFit.FILL;
    },
    preview() {
      const { previewSrcList } = this;
      return Array.isArray(previewSrcList) && previewSrcList.length > 0;
    },
    imageIndex() {
      return this.previewSrcList.indexOf(this.src);
    }
  },
  watch: {
    src(val) {
      this.show && this.loadImage();
    },
    show(val) {
      val && this.loadImage();
    }
  },
  mounted() {
    if (this.lazy) {
      this.addLazyLoadListener();
    } else {
      this.loadImage();
    }
  },
  beforeDestroy() {
    this.lazy && this.removeLazyLoadListener();
  },
  methods: {
    shenheFunImg(index2) {
      this.$emit("shenheFun", index2);
    },
    shenheFunNo(index2) {
      this.$emit("shenheFunNo", index2);
    },
    loadImage() {
      if (this.$isServer)
        return;
      this.loading = true;
      this.error = false;
      const img = new Image();
      img.onload = (e) => this.handleLoad(e, img);
      img.onerror = this.handleError.bind(this);
      Object.keys(this.$attrs).forEach((key) => {
        const value = this.$attrs[key];
        img.setAttribute(key, value);
      });
      img.src = this.src;
    },
    handleLoad(e, img) {
      this.imageWidth = img.width;
      this.imageHeight = img.height;
      this.loading = false;
    },
    handleError(e) {
      this.loading = false;
      this.error = true;
      this.$emit("error", e);
    },
    handleLazyLoad() {
      if (isInContainer(this.$el, this._scrollContainer)) {
        this.show = true;
        this.removeLazyLoadListener();
      }
    },
    addLazyLoadListener() {
      if (this.$isServer)
        return;
      const { scrollContainer } = this;
      let _scrollContainer = null;
      if (isHtmlElement(scrollContainer)) {
        _scrollContainer = scrollContainer;
      } else if (isString(scrollContainer)) {
        _scrollContainer = document.querySelector(scrollContainer);
      } else {
        _scrollContainer = getScrollContainer(this.$el);
      }
      if (_scrollContainer) {
        this._scrollContainer = _scrollContainer;
        this._lazyLoadHandler = throttle(200, this.handleLazyLoad);
        on(_scrollContainer, "scroll", this._lazyLoadHandler);
        this.handleLazyLoad();
      }
    },
    removeLazyLoadListener() {
      const { _scrollContainer, _lazyLoadHandler } = this;
      if (this.$isServer || !_scrollContainer || !_lazyLoadHandler)
        return;
      off(_scrollContainer, "scroll", _lazyLoadHandler);
      this._scrollContainer = null;
      this._lazyLoadHandler = null;
    },
    /**
     * simulate object-fit behavior to compatible with IE11 and other browsers which not support object-fit
     */
    getImageStyle(fit) {
      const { imageWidth, imageHeight } = this;
      const {
        clientWidth: containerWidth,
        clientHeight: containerHeight
      } = this.$el;
      if (!imageWidth || !imageHeight || !containerWidth || !containerHeight)
        return {};
      const vertical = imageWidth / imageHeight < 1;
      if (fit === ObjectFit.SCALE_DOWN) {
        const isSmaller = imageWidth < containerWidth && imageHeight < containerHeight;
        fit = isSmaller ? ObjectFit.NONE : ObjectFit.CONTAIN;
      }
      switch (fit) {
        case ObjectFit.NONE:
          return { width: "auto", height: "auto" };
        case ObjectFit.CONTAIN:
          return vertical ? { width: "auto" } : { height: "auto" };
        case ObjectFit.COVER:
          return vertical ? { height: "auto" } : { width: "auto" };
        default:
          return {};
      }
    },
    clickHandler() {
      prevOverflow = document.body.style.overflow;
      document.body.style.overflow = "hidden";
      this.showViewer = true;
    },
    closeViewer() {
      document.body.style.overflow = prevOverflow;
      this.showViewer = false;
    }
  }
};
var _sfc_render$i = function render17() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "el-image" }, [_vm.loading ? _vm._t("placeholder", function() {
    return [_c("div", { staticClass: "el-image__placeholder" })];
  }) : _vm.error ? _vm._t("error", function() {
    return [_c("div", { staticClass: "el-image__error" }, [_vm._v(_vm._s(_vm.t("el.image.error")))])];
  }) : _c("img", _vm._g(_vm._b({ staticClass: "el-image__inner", class: { "el-image__inner--center": _vm.alignCenter, "el-image__preview": _vm.preview }, style: _vm.imageStyle, attrs: { "src": _vm.src }, on: { "click": _vm.clickHandler } }, "img", _vm.$attrs, false), _vm.$listeners)), _vm.preview ? [_vm.showViewer ? _c("image-viewer", { attrs: { "z-index": _vm.zIndex, "initial-index": _vm.imageIndex, "on-close": _vm.closeViewer, "url-list": _vm.previewSrcList, "status-list": _vm.imgStatusList }, on: { "shenheFun": _vm.shenheFunImg, "shenheFunNo": _vm.shenheFunNo } }) : _vm._e()] : _vm._e()], 2);
};
var _sfc_staticRenderFns$i = [];
var __component__$i = /* @__PURE__ */ normalizeComponent(
  _sfc_main$i,
  _sfc_render$i,
  _sfc_staticRenderFns$i,
  false,
  null,
  null,
  null,
  null
);
const visImage = __component__$i.exports;
const ChooseMoreImg_vue_vue_type_style_index_0_lang = "";
const _sfc_main$h = {
  name: "ChooseMoreImg",
  components: {
    fileDiv: fileDiv$2,
    visImage
  },
  props: {
    isBig: {
      default: false
    },
    isShowAddImg: {
      default: false
    },
    formData: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    isUrl: {
      default: true
    },
    imgLen: {
      default: 1
    },
    type: {
      default: 0
    },
    delAttr: {
      default: ""
    }
  },
  watch: {
    fileImg(val) {
      if (val) {
        if (!this.formData[this.keyAttr]) {
          this.$set(this.formData, this.keyAttr, []);
        }
        this.formData[this.keyAttr].push({
          isAdd: 1,
          imgName: this.fileImgName,
          url: val
        });
        this.fileImgName = "";
      }
    }
  },
  data: function() {
    return {
      fileImg: "",
      imgArrDeleteIndex: -1,
      fileImgName: ""
    };
  },
  methods: {
    deleteImg(i2) {
      let row = this.formData[this.keyAttr][i2];
      row.delFlag = 1;
      if (row.id && this.delAttr) {
        if (this.formData[this.delAttr]) {
          this.formData[this.delAttr].push(row);
        } else {
          this.$set(this.formData, this.delAttr, [row]);
        }
      }
      this.formData[this.keyAttr].splice(i2, 1);
      this.imgArrDeleteIndex = -1;
    },
    showImgDelete(i2) {
      this.imgArrDeleteIndex = i2;
    },
    hideImgDelete() {
      this.imgArrDeleteIndex = -1;
    },
    noCanAddImg() {
      $common.showMsg(`最多允许添加${this.imgLen}张图片!`);
    }
  },
  mounted() {
  }
};
var _sfc_render$h = function render18() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ChooseMoreImg", _vm.isShowAddImg && "isShowAddImg"] }, [_c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.formData[_vm.keyAttr] && _vm.formData[_vm.keyAttr].length >= this.imgLen && _vm.type != 2, expression: "\n      formData[keyAttr] &&\n      formData[keyAttr].length >= this.imgLen &&\n      type != 2\n    " }], staticClass: "search-item-qx-img-no-file", on: { "click": _vm.noCanAddImg } }), _vm.type != 2 ? _c("div", { staticClass: "search-item-qx-img-add-img" }, [_c("i", { staticClass: "el-icon-plus" })]) : _vm._e(), _vm.type != 2 ? _c("fileDiv", { attrs: { "iptFiles": _vm.fileImg, "iptFilesName": _vm.fileImgName, "acceptType": "image/jpg,image/png,image/jpeg", "acceptStr": "image/jpg,image/png,image/jpeg", "size": "5000" }, on: { "update:iptFiles": function($event) {
    _vm.fileImg = $event;
  }, "update:ipt-files": function($event) {
    _vm.fileImg = $event;
  }, "update:iptFilesName": function($event) {
    _vm.fileImgName = $event;
  }, "update:ipt-files-name": function($event) {
    _vm.fileImgName = $event;
  } } }) : _vm._e(), _c("div", { staticClass: "qx-img-list", style: { marginTop: _vm.type != 2 ? "30px" : 0, textAlign: "left" } }, _vm._l(_vm.formData[_vm.keyAttr], function(item, i2) {
    return _c("div", { key: "cc" + i2, staticClass: "qx-img-con", on: { "mouseenter": function($event) {
      return _vm.showImgDelete(i2);
    }, "mouseleave": function($event) {
      return _vm.hideImgDelete(i2);
    } } }, [_c("div", { class: [
      "img-delete",
      { active: _vm.imgArrDeleteIndex == i2 && _vm.type != 2 }
    ], on: { "click": function($event) {
      return _vm.deleteImg(i2);
    } } }, [_c("i", { staticClass: "el-icon-delete" })]), _vm.type != 2 ? _c("img", { attrs: { "src": _vm.$getFileUrl(_vm.isUrl ? item.url : item.imgFile) } }) : _c("vis-image", { attrs: { "src": _vm.$getFileUrl(_vm.isUrl ? item.url : item.imgFile), "preview-src-list": [_vm.$getFileUrl(_vm.isUrl ? item.url : item.imgFile)] } })], 1);
  }), 0)], 1);
};
var _sfc_staticRenderFns$h = [];
var __component__$h = /* @__PURE__ */ normalizeComponent(
  _sfc_main$h,
  _sfc_render$h,
  _sfc_staticRenderFns$h,
  false,
  null,
  null,
  null,
  null
);
const ChooseMoreImg = __component__$h.exports;
const ListItemImgs_vue_vue_type_style_index_0_lang = "";
const _sfc_main$g = {
  name: "ListItemImgs",
  components: {
    ChooseMoreImg
  },
  props: {
    validatorObj: {
      default: () => ({})
    },
    formData: {
      default: () => ({})
    },
    type: {
      default: 0
    },
    labelName: {
      default: "图片"
    },
    keyAttr: {
      default: ""
    },
    imgLen: {
      default: 1
    },
    delAttr: {
      default: null
    }
  }
};
var _sfc_render$g = function render19() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "list-item ListItemImgs" }, [_c("div", { staticClass: "vis_input" }, [_c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]), _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("ChooseMoreImg", _vm._b({ attrs: { "formData": _vm.formData, "imgLen": _vm.imgLen, "type": _vm.type, "keyAttr": _vm.keyAttr, "delAttr": _vm.delAttr } }, "ChooseMoreImg", _vm.$attrs, false))], 1)])]);
};
var _sfc_staticRenderFns$g = [];
var __component__$g = /* @__PURE__ */ normalizeComponent(
  _sfc_main$g,
  _sfc_render$g,
  _sfc_staticRenderFns$g,
  false,
  null,
  null,
  null,
  null
);
const ListItemImgs = __component__$g.exports;
const ListItemInputSelect_vue_vue_type_style_index_0_scoped_0cf2183d_lang = "";
const _sfc_main$f = {
  name: "ListItemInputSelect",
  props: {
    isClearable: {
      default: true
    },
    isShowAlll: {
      default: true
    },
    collapseTags: {
      default: false
    },
    divClassName: {
      default: "list-item"
    },
    formData: {
      default: () => {
      }
    },
    labelName: {
      default: "label"
    },
    placeholder: {
      default: "请选择"
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    isMultiple: {
      default: false
    },
    limitNum: {
      type: Number,
      default: 0
    },
    hasDetail: {
      default: false
    },
    disabled: {
      default: false
    },
    listProps: {
      type: Object,
      default: () => ({
        label: "label",
        value: "value"
      })
    },
    // 字典
    list: {
      default: () => []
    },
    isAllowCreate: {
      default: false
    },
    isAppendToBody: {
      default: false
    },
    // 控制哪个值可以输入
    labelValue: {
      default: ""
    }
  },
  watch: {
    formData: {
      deep: true,
      handler(val) {
        if (this.labelValue && val[this.detailAttr] == this.labelValue) {
          this.showInput = true;
        }
      }
    }
  },
  computed: {
    handleTranslate() {
      return (value) => {
        let result = "";
        if (Array.isArray(this.list)) {
          let option = this.list.find((item) => item.value === value);
          result = option && option.label ? option.label : value;
        } else {
          result = this.list[value] ? this.list[value] : value;
        }
        return result;
      };
    }
  },
  data: function() {
    return {
      inputFlag: null,
      showInput: false
    };
  },
  methods: {
    changeSelect(val) {
      if (val != this.labelValue) {
        this.showInput = false;
      }
      this.$emit("onChange", val, this.keyAttr);
    },
    focusFun() {
      if (this.inputFlag) {
        this.$refs.listItemSelectIpt.blur();
      }
    },
    blurFun() {
    },
    visibleChange(val) {
      setTimeout(() => {
        this.inputFlag = val;
      }, 0);
    }
  },
  mounted() {
  }
};
var _sfc_render$f = function render20() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemSelect", _vm.divClassName] }, [_c("div", { staticClass: "vis_input vis_input_more_sel" }, [_vm.labelName ? _c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("el-select", _vm._g(_vm._b({ ref: "listItemSelectIpt", attrs: { "size": "small", "disabled": _vm.disabled, "popper-append-to-body": _vm.isAppendToBody, "placeholder": _vm.placeholder, "filterable": "", "clearable": _vm.isClearable, "multiple": _vm.isMultiple, "multiple-limit": _vm.limitNum, "collapse-tags": _vm.collapseTags, "allow-create": _vm.isAllowCreate }, on: { "change": _vm.changeSelect, "blur": _vm.blurFun, "focus": _vm.focusFun }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }, "el-select", _vm.$attrs, false), _vm.$listeners), [_vm.divClassName == "search-item" && _vm.isShowAlll ? _c("el-option", { attrs: { "label": "全部", "value": "" } }) : _vm._e(), _vm._l(_vm.list, function(item, index2) {
    return _c("el-option", _vm._g(_vm._b({ key: "part" + index2, attrs: { "label": item[_vm.listProps.label], "value": item[_vm.listProps.value] } }, "el-option", _vm.$attrs, false), _vm.$listeners));
  })], 2), _vm.showInput ? _c("el-input", { staticClass: "positionInput", attrs: { "size": "small" }, on: { "blur": function($event) {
    _vm.formData[_vm.keyAttr] = _vm.formData[_vm.keyAttr].trim();
  } }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }) : _vm._e()], 1) : _vm._e(), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.type === 2, expression: "type === 2" }], staticClass: "vis_input_box vis_input_box_detail" }, [!_vm.isMultiple ? [_vm._v(" " + _vm._s(_vm.hasDetail ? _vm.formData[_vm.detailAttr] : _vm.handleTranslate(_vm.formData[_vm.keyAttr])) + " ")] : _vm._l(_vm.formData[_vm.keyAttr], function(item, index2) {
    return _c("span", { key: index2 }, [_vm._v(_vm._s(index2 == 0 ? _vm.handleTranslate(item) : `, ${_vm.handleTranslate(item)}`))]);
  })], 2)])]);
};
var _sfc_staticRenderFns$f = [];
var __component__$f = /* @__PURE__ */ normalizeComponent(
  _sfc_main$f,
  _sfc_render$f,
  _sfc_staticRenderFns$f,
  false,
  null,
  "0cf2183d",
  null,
  null
);
const ListItemSelect$1 = __component__$f.exports;
const ListItemNumber_vue_vue_type_style_index_0_scoped_f8207d3f_lang = "";
const _sfc_main$e = {
  name: "ListItemNumber",
  props: {
    minNum: {
      default: 0
    },
    maxNum: {
      default: 9999
    },
    validatorObj: {
      default: {}
    },
    formData: {
      default: {}
    },
    type: {
      default: 0
    },
    labelName: {
      default: "图片"
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    delAttr: {
      default: null
    }
  }
};
var _sfc_render$e = function render21() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "list-item" }, [_c("div", { staticClass: "vis_input" }, [_c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("el-input-number", { attrs: { "min": _vm.minNum, "max": _vm.maxNum }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, _vm._n($$v));
  }, expression: "formData[keyAttr]" } })], 1) : _vm._e(), _vm.type === 2 ? _c("div", { staticClass: "vis_input_box vis_input_box_detail", domProps: { "innerHTML": _vm._s(_vm.formData[_vm.detailAttr || _vm.keyAttr]) } }) : _vm._e()])]);
};
var _sfc_staticRenderFns$e = [];
var __component__$e = /* @__PURE__ */ normalizeComponent(
  _sfc_main$e,
  _sfc_render$e,
  _sfc_staticRenderFns$e,
  false,
  null,
  "f8207d3f",
  null,
  null
);
const ListItemNumber = __component__$e.exports;
const ListItemSelect_vue_vue_type_style_index_0_lang = "";
const _sfc_main$d = {
  name: "ListItemSelect",
  props: {
    isClearable: {
      default: true
    },
    isShowAlll: {
      default: true
    },
    collapseTags: {
      default: false
    },
    divClassName: {
      default: "list-item"
    },
    formData: {
      default: () => {
      }
    },
    labelName: {
      default: "label"
    },
    placeholder: {
      default: "请选择"
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    isMultiple: {
      default: false
    },
    hasDetail: {
      default: false
    },
    disabled: {
      default: false
    },
    listProps: {
      type: Object,
      default: () => ({
        label: "label",
        value: "value"
      })
    },
    // 字典
    list: {
      default: () => []
    },
    isAllowCreate: {
      default: false
    },
    isAppendToBody: {
      default: false
    },
    zssName: {
      default: "no"
    }
  },
  watch: {},
  computed: {
    handleTranslate() {
      return (value) => {
        let result = "";
        if (Array.isArray(this.list)) {
          let option = this.list.find((item) => item.value === value);
          result = option && option.label ? option.label : value;
        } else {
          result = this.list[value] ? this.list[value] : value;
        }
        return result;
      };
    }
  },
  data: function() {
    return {
      inputFlag: null,
      oldValue: ""
    };
  },
  methods: {
    changeSelect(val) {
      if (this.isMultiple && ((this.divClassName === "search-item" || this.zssName === "yes") && this.isShowAlll)) {
        if (val.includes("") && !this.oldValue.includes("")) {
          val = this.list.map((_) => _[this.listProps.value]);
          val.push("");
        } else if (!val.includes("") && this.oldValue.includes("")) {
          val = [];
        } else if (val.includes("") && this.oldValue.includes("")) {
          if (val.length !== this.list.length + 1) {
            val = val.filter((_) => _);
          }
        } else if (!val.includes("") && !this.oldValue.includes("")) {
          if (val.length === this.list.length) {
            val.push("");
          }
        }
        this.$set(this.formData, this.keyAttr, val);
      }
      this.$emit("onChange", val, this.keyAttr);
      this.oldValue = val;
    },
    focusFun() {
      if (this.inputFlag) {
        this.$refs.listItemSelectIpt.blur();
      }
    },
    blurFun() {
    },
    visibleChange(val) {
      if (!this.isMultiple) {
        setTimeout(() => {
          this.inputFlag = val;
        }, 0);
      }
    }
  },
  mounted() {
    if (this.formData[this.keyAttr] === void 0) {
      this.$set(this.formData, this.keyAttr, "");
      this.oldValue = "";
    } else {
      this.oldValue = this.formData[this.keyAttr];
    }
  }
};
var _sfc_render$d = function render22() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemSelect", _vm.divClassName] }, [_c("div", { staticClass: "vis_input vis_input_more_sel" }, [_vm.labelName ? _c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("el-select", _vm._g(_vm._b({ ref: "listItemSelectIpt", attrs: { "size": "small", "disabled": _vm.disabled, "popper-append-to-body": _vm.isAppendToBody, "placeholder": _vm.placeholder, "filterable": "", "clearable": _vm.isClearable, "multiple": _vm.isMultiple, "collapse-tags": _vm.collapseTags, "allow-create": _vm.isAllowCreate }, on: { "change": _vm.changeSelect, "blur": _vm.blurFun, "focus": _vm.focusFun, "visible-change": _vm.visibleChange }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }, "el-select", _vm.$attrs, false), _vm.$listeners), [(_vm.divClassName == "search-item" || _vm.zssName == "yes") && _vm.isShowAlll ? _c("el-option", { attrs: { "label": "全部", "value": "" } }) : _vm._e(), _vm._l(_vm.list, function(item, index2) {
    return _c("el-option", _vm._g(_vm._b({ key: "part" + index2, attrs: { "label": item[_vm.listProps.label], "value": item[_vm.listProps.value] } }, "el-option", _vm.$attrs, false), _vm.$listeners));
  })], 2)], 1) : _vm._e(), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.type === 2, expression: "type === 2" }], staticClass: "vis_input_box vis_input_box_detail" }, [!_vm.isMultiple ? [_vm._v(" " + _vm._s(_vm.hasDetail ? _vm.formData[_vm.detailAttr] : _vm.handleTranslate(_vm.formData[_vm.keyAttr])) + " ")] : _vm._l(_vm.formData[_vm.keyAttr], function(item, index2) {
    return _c("span", { key: index2 }, [_vm._v(_vm._s(index2 == 0 ? _vm.handleTranslate(item) : `, ${_vm.handleTranslate(item)}`))]);
  })], 2)])]);
};
var _sfc_staticRenderFns$d = [];
var __component__$d = /* @__PURE__ */ normalizeComponent(
  _sfc_main$d,
  _sfc_render$d,
  _sfc_staticRenderFns$d,
  false,
  null,
  null,
  null,
  null
);
const ListItemSelect = __component__$d.exports;
const swiper = "";
const index_vue_vue_type_style_index_0_scoped_6e29164c_lang = "";
const _sfc_main$c = {
  name: "ImageListDialog",
  components: {
    ZhxdDialog: RtzhDialog,
    swiper: swiper$1,
    swiperSlide
  },
  props: {
    isShowDialog: {
      type: Boolean,
      default: false
    },
    modal: {
      type: Boolean,
      default: true
    },
    title: {
      type: String,
      default: ""
    },
    imageList: {
      type: Array,
      default: () => []
    }
  },
  watch: {
    isShowDialog(val) {
      this.currentIndex = 0;
      this.$emit("changeIndex", 0);
      this.visible = val;
    }
  },
  emits: ["update:isShowDialog", "changeIndex"],
  data() {
    return {
      currentIndex: 0,
      visible: false,
      swiperOption: null,
      swiperOption1: {
        spaceBetween: 10,
        slidesPerView: 5,
        freeMode: true,
        watchSlidesVisibility: true,
        watchSlidesProgress: true
      }
    };
  },
  mounted() {
  },
  methods: {
    readySwiperTop() {
      this.$emit("readySwiperTop");
    },
    readySwiper() {
      if (this.$refs.swiperBottom.swiper) {
        const self2 = this;
        this.swiperOption = {
          spaceBetween: 10,
          navigation: {
            nextEl: ".swiper-button-next",
            prevEl: ".swiper-button-prev"
          },
          on: {
            slideChange: function() {
              self2.currentIndex = this.activeIndex;
              self2.$emit("changeIndex", self2.currentIndex);
            }
          },
          thumbs: {
            swiper: this.$refs.swiperBottom.swiper
          }
        };
      }
    },
    updateVisible(val) {
      if (val === false) {
        this.$refs.swiperBottom.swiper.destroy();
        this.$refs.swiperTop.swiper.destroy();
        this.swiperOption = null;
      }
      this.$emit("update:isShowDialog", val);
    }
  }
};
var _sfc_render$c = function render23() {
  var _vm = this, _c = _vm._self._c;
  return _c("ZhxdDialog", { attrs: { "title": _vm.title, "visible": _vm.visible, "width": "70%", "show-close": true, "modal": _vm.modal, "close-on-click-modal": false, "close-on-press-escape": false }, on: { "update:visible": _vm.updateVisible }, scopedSlots: _vm._u([{ key: "dialogTitle", fn: function() {
    return [_vm._t("dialogTitle")];
  }, proxy: true }, { key: "footer", fn: function() {
    return [_vm._t("footer")];
  }, proxy: true }], null, true) }, [_c("div", { directives: [{ name: "dialog-bg", rawName: "v-dialog-bg" }] }), _c("div", { staticClass: "ZhxdDialog-con" }, [_c("div", { staticClass: "ZhxdDialog-con-title" }, [_vm._t("conTop", null, { "current": _vm.currentIndex })], 2), _vm.visible ? _c("div", { staticClass: "ZhxdDialog-con-swiper" }, [_c("div", { staticClass: "ZhxdDialog-con-swiper-top" }, [_vm.swiperOption ? _c("swiper", { ref: "swiperTop", attrs: { "options": _vm.swiperOption }, on: { "ready": _vm.readySwiperTop }, scopedSlots: _vm._u([{ key: "button-next", fn: function() {
    return [_c("div", { staticClass: "swiper-button-next swiper-button-white" })];
  }, proxy: true }, { key: "button-prev", fn: function() {
    return [_c("div", { staticClass: "swiper-button-prev swiper-button-white" })];
  }, proxy: true }], null, false, 2142516041) }, [_vm._l(_vm.imageList, function(item, index2) {
    return _c("swiper-slide", { key: index2 }, [_c("div", { staticClass: "peview-img-con" }, [_c("el-image", { attrs: { "fit": "contain", "src": item.isMinoImg ? item.imgUrl : _vm.$getFileUrl(item.imgUrl), "preview-src-list": [item.isMinoImg ? item.imgUrl : _vm.$getFileUrl(item.imgUrl)] } }), item.msg ? _c("div", { staticClass: "peview-img-con-msg" }, [_vm._v(_vm._s(item.msg))]) : _vm._e()], 1)]);
  }), _vm._t("slideTopEnd")], 2) : _vm._e()], 1), _c("div", { staticClass: "ZhxdDialog-con-swiper-bottom" }, [_c("swiper", { ref: "swiperBottom", attrs: { "options": _vm.swiperOption1 }, on: { "ready": _vm.readySwiper } }, [_vm._l(_vm.imageList, function(item, index2) {
    return _c("swiper-slide", { key: index2 }, [_c("div", { staticClass: "peview-img-con", class: _vm.currentIndex == index2 ? "swiper-slide-thumb-active" : "" }, [_c("el-image", { attrs: { "fit": "contain", "src": item.isMinoImg ? item.imgUrl : _vm.$getFileUrl(item.imgUrl) } })], 1)]);
  }), _vm._t("slideBottomEnd")], 2)], 1)]) : _vm._e()])]);
};
var _sfc_staticRenderFns$c = [];
var __component__$c = /* @__PURE__ */ normalizeComponent(
  _sfc_main$c,
  _sfc_render$c,
  _sfc_staticRenderFns$c,
  false,
  null,
  "6e29164c",
  null,
  null
);
const RtzhImageListDialog = __component__$c.exports;
const _sfc_main$b = {
  name: "vis_confirm",
  props: {
    "vis_title": {
      type: String,
      default: "温馨提示"
    },
    "vis_msg": {
      type: String,
      default: "确定要删除吗?"
    },
    "vis_cancel": {
      type: String,
      default: "取消"
    },
    "vis_true": {
      type: String,
      default: "确定"
    },
    "vis_icon_class": {
      type: String,
      default: ""
    },
    "vis_show": {
      type: Boolean,
      default: false
    }
  },
  methods: {
    cancel() {
      this.$emit("cancel");
    },
    confirm() {
      this.$emit("confirm");
    },
    bgClick() {
      this.$emit("bgClick");
    }
  }
};
var _sfc_render$b = function render24() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.vis_show, expression: "vis_show" }], staticClass: "vis_confirm" }, [_c("div", { staticClass: "vis_confirm_main center" }, [_c("p", { staticClass: "confirm_title" }, [_vm._v(_vm._s(_vm.vis_title))]), _c("div", { staticClass: "confirm_body center" }, [_vm._t("default", function() {
    return [_c("i", { class: _vm.vis_icon_class }), _c("span", [_vm._v(_vm._s(_vm.vis_msg))])];
  })], 2), _c("div", { staticClass: "confirm_foot center" }, [_c("div", { staticClass: "cancel", on: { "click": _vm.cancel } }, [_vm._v(_vm._s(_vm.vis_cancel))]), _c("div", { staticClass: "sure", on: { "click": _vm.confirm } }, [_vm._v(_vm._s(_vm.vis_true))])])]), _c("div", { staticClass: "cover_bg", on: { "click": _vm.bgClick } })]);
};
var _sfc_staticRenderFns$b = [];
var __component__$b = /* @__PURE__ */ normalizeComponent(
  _sfc_main$b,
  _sfc_render$b,
  _sfc_staticRenderFns$b,
  false,
  null,
  null,
  null,
  null
);
const VisConfirm = __component__$b.exports;
const index_vue_vue_type_style_index_0_scoped_58396272_lang = "";
const _sfc_main$a = {
  name: "vis_files_self",
  components: {
    VisBttton: RtzhButton
  },
  props: {
    iptFiles: {},
    acceptStr: {
      type: String
    },
    size: {
      type: String
    },
    isShowImg: {
      type: Boolean,
      default: false
    },
    empty: {
      type: Boolean,
      default: false
    },
    fileVal: {
      type: String
    }
  },
  data() {
    return {
      fileName: "当前未选择任何文件!",
      userImg: "",
      fontWhite: ""
    };
  },
  watch: {
    empty(newValue, oldValue) {
      if (newValue) {
        this.fileName = "当前未选择任何文件";
        this.$refs.file.value = null;
        this.$emit("update:iptFiles", null);
        this.fontWhite = "";
      } else {
        this.fontWhite = "fontWhite";
      }
    }
  },
  methods: {
    chooseFile() {
      this.$refs.file.click();
    },
    changeFile() {
      const _this = this;
      let files = _this.$refs.file.files[0];
      var allowMaxSize = _this.size * 1024;
      if (allowMaxSize !== 0 && allowMaxSize < files.size) {
        $common.showMsg("文件不能大于" + (Number(allowMaxSize) / 1e3).toFixed(0) + "K");
        return;
      }
      this.$emit("update:empty", false);
      this.fontWhite = "fontWhite";
      _this.$emit("update:iptFiles", files);
      _this.fileName = this.$refs.file.files[0].name;
      if (!this.isShowImg) {
        return;
      }
      if (typeof FileReader === "undefined") {
        $common.showMsg("您的浏览器不支持图片上传,请升级您的浏览器!");
        return false;
      }
      var imgFile = new FileReader();
      var isImg = false;
      var formatArr = ["png", "jpeg", "jpg"];
      var imgFormat = _this.fileName.split(".");
      imgFormat = imgFormat[imgFormat.length - 1];
      for (var i2 = 0; i2 < formatArr.length; i2++) {
        if (imgFormat === formatArr[i2]) {
          isImg = true;
          break;
        }
      }
      if (!isImg) {
        $common.showMsg("文件格式必须为:" + formatArr.toString());
        return;
      }
      imgFile.readAsDataURL(files);
      imgFile.onload = function() {
        var imgData;
        imgData = this.result;
        imgData.length;
        _this.userImg = imgData;
      };
    }
  }
};
var _sfc_render$a = function render25() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "vis_files vis_files_self" }, [_c("div", { on: { "click": _vm.chooseFile } }, [_c("div", { staticClass: "file_name", class: _vm.fontWhite }, [_vm._v(_vm._s(_vm.fileName))]), _c("vis-bttton", { staticClass: "fileChooseBtn", attrs: { "vis_text": "选择文件" } }), _c("input", { directives: [{ name: "show", rawName: "v-show", value: 0, expression: "0" }], ref: "file", attrs: { "type": "file", "accept": _vm.acceptStr }, on: { "change": _vm.changeFile } })], 1)]);
};
var _sfc_staticRenderFns$a = [];
var __component__$a = /* @__PURE__ */ normalizeComponent(
  _sfc_main$a,
  _sfc_render$a,
  _sfc_staticRenderFns$a,
  false,
  null,
  "58396272",
  null,
  null
);
const fileDiv = __component__$a.exports;
const index_vue_vue_type_style_index_0_scoped_3308422b_lang = "";
const _sfc_main$9 = {
  name: "vis_confirm_upload",
  components: {
    fileDiv,
    VisBttton: RtzhButton
  },
  props: {
    "vis_title": {
      type: String,
      default: "温馨提示"
    },
    "vis_msg": {
      type: String,
      default: "导入文件大小不能超过5M,支持‘xls’或 'xlsx'格式!"
    },
    "vis_ture": {
      type: String,
      default: "导入"
    },
    "vis_icon_class": {
      type: String,
      default: ""
    },
    "vis_show": {
      type: Boolean,
      default: false
    },
    importUrl: {
      type: String,
      default: ""
    },
    downloadUrl: {
      type: String,
      default: ""
    },
    importData: {
      type: Object
    },
    downloadFileName: {
      type: String,
      default: "模板.xls"
    },
    acceptStr: {
      type: String,
      default: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
    },
    fileSize: {
      type: String,
      default: "5120"
    }
  },
  data() {
    return {
      fileName: "当前未选择任何文件!",
      fontWhite: "",
      emptyText: false,
      userInput: {
        userName: "",
        loginName: "",
        mima: "",
        remarks: ""
      }
    };
  },
  methods: {
    cancel() {
      this.$emit("cancel");
    },
    chooseFile() {
      this.$refs.file.click();
    },
    changeFile() {
      this.fontWhite = this.$refs.file.value ? "fontWhite" : "";
    },
    uploadXLS() {
      var _this = this;
      if (!this.userInput.imgFile) {
        $common.showMsg("请选择导入的文件!");
        return;
      }
      let formData = new FormData();
      formData.append("file", this.userInput.imgFile);
      if (JSON.stringify(this.importData) != "{}") {
        if (this.importData) {
          let keys = Object.keys(this.importData);
          for (let i2 = 0; i2 < keys.length; i2++) {
            formData.append(keys[i2], this.importData[keys[i2]]);
          }
        }
      }
      ajaxFile({
        method: "post",
        responseType: "json",
        contenType: "",
        url: _this.importUrl,
        data: formData
      }).then((res) => {
        if (res.status === "SUCCEED") {
          _this.emptyText = true;
          _this.userInput.imgFile = null;
          _this.fontWhite = "";
          _this.$msgbox({
            title: "消息",
            message: res.result,
            showCancelButton: true,
            confirmButtonText: "确定",
            cancelButtonText: "取消",
            dangerouslyUseHTMLString: true,
            beforeClose: (action, instance, done) => {
              done();
            }
          });
          _this.$emit("importSuccessFun", res);
        } else {
          _this.fileName = "当前未选择任何文件!";
          _this.emptyText = true;
          _this.fontWhite = "";
        }
      }).catch(() => {
        _this.fileName = "当前未选择任何文件!";
        _this.emptyText = true;
        _this.fontWhite = "";
      });
    },
    exportModel() {
      var _this = this;
      ajaxFile({ url: _this.downloadUrl }).then((res) => {
        const content = res;
        const blob = new Blob([content]);
        const fileName = this.downloadFileName;
        if ("download" in document.createElement("a")) {
          const elink = document.createElement("a");
          elink.download = fileName;
          elink.style.display = "none";
          elink.href = URL.createObjectURL(blob);
          document.body.appendChild(elink);
          elink.click();
          URL.revokeObjectURL(elink.href);
          document.body.removeChild(elink);
        } else {
          navigator.msSaveBlob(blob, fileName);
        }
      });
    },
    closeModel() {
      this.cancel();
      this.fileName = "当前未选择任何文件!";
      this.emptyText = true;
      this.fontWhite = "";
    }
  }
};
var _sfc_render$9 = function render26() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.vis_show, expression: "vis_show" }], staticClass: "vis_confirm_upload" }, [_c("div", { staticClass: "vis_confirm_main center" }, [_c("p", { staticClass: "confirm_title" }, [_vm._v(_vm._s(_vm.vis_title) + " "), _c("i", { staticClass: "el-icon-close closeModel", on: { "click": _vm.closeModel } })]), _c("div", { staticClass: "confirm_body center" }, [_c("div", { staticClass: "cho" }, [_c("div", { staticClass: "vis_input_box" }, [_c("fileDiv", { attrs: { "iptFiles": _vm.userInput.imgFile, "acceptStr": _vm.acceptStr, "empty": _vm.emptyText, "size": _vm.fileSize }, on: { "update:iptFiles": function($event) {
    return _vm.$set(_vm.userInput, "imgFile", $event);
  }, "update:ipt-files": function($event) {
    return _vm.$set(_vm.userInput, "imgFile", $event);
  }, "update:empty": function($event) {
    _vm.emptyText = $event;
  } } })], 1)]), _c("div", { staticClass: "msg" }, [_vm._v(_vm._s(_vm.vis_msg))]), _vm.downloadUrl ? _c("div", { staticClass: "model_upload" }, [_c("vis-bttton", { staticClass: "rightBtn", attrs: { "vis_text": "模板下载" }, on: { "click": _vm.exportModel } })], 1) : _vm._e()]), _c("div", { staticClass: "confirm_foot center" }, [_c("vis-bttton", { staticClass: "upload_XLS", attrs: { "vis_text": _vm.vis_ture || "导入" }, on: { "click": _vm.uploadXLS } })], 1)]), _c("div", { staticClass: "cover_bg" })]);
};
var _sfc_staticRenderFns$9 = [];
var __component__$9 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$9,
  _sfc_render$9,
  _sfc_staticRenderFns$9,
  false,
  null,
  "3308422b",
  null,
  null
);
const index$4 = __component__$9.exports;
const ListItemSelectCanAllSelect_vue_vue_type_style_index_0_lang = "";
const _sfc_main$8 = {
  name: "ListItemRadioSelect",
  props: {
    /*支持全选*/
    haveSelectAll: {
      default: true
    },
    isClearable: {
      default: true
    },
    isShowAlll: {
      default: true
    },
    collapseTags: {
      default: false
    },
    divClassName: {
      default: "list-item"
    },
    formData: {
      default: () => {
      }
    },
    labelName: {
      default: "label"
    },
    placeholder: {
      default: "请选择"
    },
    validatorObj: {
      default: () => ({})
    },
    keyAttr: {
      default: ""
    },
    detailAttr: {
      default: ""
    },
    type: {
      default: 1
    },
    isMultiple: {
      default: true
    },
    hasDetail: {
      default: false
    },
    disabled: {
      default: false
    },
    listProps: {
      type: Object,
      default: () => ({
        label: "label",
        value: "value"
      })
    },
    // 字典
    list: {
      default: () => []
    },
    isAllowCreate: {
      default: false
    },
    isAppendToBody: {
      default: false
    }
  },
  watch: {},
  computed: {
    handleTranslate() {
      return (value) => {
        let result = "";
        if (Array.isArray(this.list)) {
          let option = this.list.find((item) => {
            if (typeof item == "object") {
              return JSON.stringify(item.value) == JSON.stringify(value);
            } else {
              return item.value === value;
            }
          });
          result = option && option.label ? option.label : value;
        } else {
          result = this.list[value] ? this.list[value] : value;
        }
        return result;
      };
    }
  },
  data: function() {
    return {
      inputFlag: null,
      isSelectAll: false
    };
  },
  methods: {
    radioClick(val) {
    },
    checkAll() {
      if (this.isSelectAll) {
        const arr = this.list.map((item) => item[this.listProps.value]);
        this.formData[this.keyAttr] = arr;
      } else {
        this.formData[this.keyAttr] = [];
      }
    },
    changeSelect(val) {
      if (this.isMultiple)
        this.isSelectAll = this.list.length == val.length ? true : false;
      this.$emit("onChange", val, this.keyAttr);
    },
    focusFun() {
      if (this.inputFlag) {
        this.$refs.listItemSelectIpt.blur();
      }
    },
    blurFun() {
    },
    visibleChange(val) {
      setTimeout(() => {
        this.inputFlag = val;
      }, 0);
    }
  },
  mounted() {
  }
};
var _sfc_render$8 = function render27() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: ["ListItemSelect", _vm.divClassName] }, [_c("div", { staticClass: "vis_input vis_input_more_sel" }, [_vm.labelName ? _c("label", [_vm._v(_vm._s(_vm.labelName) + ":")]) : _vm._e(), _vm.type !== 2 ? _c("div", { staticClass: "vis_input_box", class: _vm.type !== 2 && _vm.validatorObj[_vm.keyAttr] && _vm.validatorObj[_vm.keyAttr].required && "vis_input_icon_require" }, [_c("el-select", _vm._g(_vm._b({ ref: "listItemSelectIpt", attrs: { "size": "small", "disabled": _vm.disabled, "popper-append-to-body": _vm.isAppendToBody, "placeholder": _vm.placeholder, "filterable": "", "clearable": _vm.isClearable, "multiple": _vm.isMultiple, "collapse-tags": _vm.collapseTags, "allow-create": _vm.isAllowCreate }, on: { "change": _vm.changeSelect, "blur": _vm.blurFun, "focus": _vm.focusFun }, model: { value: _vm.formData[_vm.keyAttr], callback: function($$v) {
    _vm.$set(_vm.formData, _vm.keyAttr, $$v);
  }, expression: "formData[keyAttr]" } }, "el-select", _vm.$attrs, false), _vm.$listeners), [_vm.divClassName == "search-item" && _vm.isShowAlll ? _c("el-option", { attrs: { "label": "全部", "value": "" } }) : _vm._e(), _vm.haveSelectAll && _vm.isMultiple ? _c("li", { staticClass: "el-select-dropdown__item" }, [_c("div", { staticStyle: { "display": "flex", "align-items": "center", "justify-content": "flex-start" } }, [_c("el-checkbox", { on: { "change": _vm.checkAll }, model: { value: _vm.isSelectAll, callback: function($$v) {
    _vm.isSelectAll = $$v;
  }, expression: "isSelectAll" } }, [_vm._v("全选")])], 1)]) : _vm._e(), _vm._l(_vm.list, function(item, index2) {
    return _c("el-option", _vm._g(_vm._b({ key: "part" + index2, attrs: { "label": item[_vm.listProps.label], "value": item[_vm.listProps.value] } }, "el-option", _vm.$attrs, false), _vm.$listeners));
  })], 2)], 1) : _vm._e(), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.type === 2, expression: "type === 2" }], staticClass: "vis_input_box vis_input_box_detail" }, [!_vm.isMultiple ? [_vm._v(" " + _vm._s(_vm.hasDetail ? _vm.formData[_vm.detailAttr] : _vm.handleTranslate(_vm.formData[_vm.keyAttr])) + " ")] : _vm._l(_vm.formData[_vm.keyAttr], function(item, index2) {
    return _c("span", { key: index2 }, [_vm._v(_vm._s(index2 == 0 ? _vm.handleTranslate(item) : `, ${_vm.handleTranslate(item)}`))]);
  })], 2)])]);
};
var _sfc_staticRenderFns$8 = [];
var __component__$8 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$8,
  _sfc_render$8,
  _sfc_staticRenderFns$8,
  false,
  null,
  null,
  null,
  null
);
const ListItemSelectCanAllSelect = __component__$8.exports;
const index_vue_vue_type_style_index_0_lang$1 = "";
const _sfc_main$7 = {
  name: "zhxdForm",
  components: {
    ListItemInput,
    ListItemNumber,
    ListItemSelect: ListItemSelect$1,
    ListItemDate,
    ListItemFilesMultiple,
    ListItemFiles,
    ListItemImgs,
    ListItemSelectCanAllSelect
  },
  data() {
    return {
      dateType: ["year", "month", "date", "dates", "week", "datetime", "datetimerange", "daterange", "monthrange"]
    };
  },
  computed: {
    showConfigData() {
      return this.configData.map((item, index2) => {
        const prevItem = index2 > 0 ? this.configData[index2 - 1] : null;
        if (!("row" in item) && (item.actionType || item.slot) && prevItem?.row !== 2) {
          return { ...item, row: 1 };
        }
        return item;
      });
    }
  },
  props: {
    formData: {
      default: () => ({})
    },
    validatorObj: {
      default: () => ({})
    },
    configData: {
      type: Array,
      default: () => []
    },
    /**
     * 该字典集合用于渲染select的options, 也可以处理转义,但执行效率比较低
     * example: {
     *  demo: [{label, value}]
     * }
     *  */
    dictArr: {
      type: Object,
      default: () => ({})
    },
    /**
     * 该字典集合用于处理详情字段value转义
     * example: {
     *  demo: {value: label}
     * }
     *  */
    dictObj: {
      type: Object,
      default: () => ({})
    },
    type: {
      default: 1
    }
  },
  methods: {
    back() {
      this.$emit("goBack");
    },
    save() {
      if (this.checkFormData()) {
        this.$emit("goBack", this.formData);
      }
    },
    checkFormData() {
      return $common.formDataValidator(this.formData, this.validatorObj);
    }
  },
  mounted() {
  }
};
var _sfc_render$7 = function render28() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "tab-add-edit tab-add-edit-hasdouble tab-add-edit-two ZhxdForm" }, [_c("div", { staticClass: "zhxd-form" }, [_vm._l(_vm.showConfigData, function(item, index2) {
    return [item.actionType === "title" ? [_c("p", { staticClass: "liebiaoTitle" }, [_vm._v(_vm._s(item.label))])] : item.row ? _c("div", { key: `two${item.prop || item.slot}`, class: item.row == 2 ? "list-item-double" : "list-item-one" }, [_vm.configData[index2].slot ? [_c("div", { staticClass: "list-item" }, [_vm._t(_vm.configData[index2].slot, null, { "option": _vm.configData[index2], "type": _vm.type })], 2)] : _vm.configData[index2].actionType && (_vm.configData[index2].actionType === "input" || _vm.configData[index2].actionType === "textarea") ? [_c("ListItemInput", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "keyAttr": _vm.configData[index2].prop, "formatter": _vm.configData[index2].formatter, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "disabled": _vm.configData[index2].disabled || false, "placeholder": _vm.configData[index2].placeholder, "defineClick": _vm.configData[index2].defineClick, "maxLength": _vm.configData[index2].maxLength, "autosize": _vm.configData[index2].autosize || {
      minRows: 2,
      maxRows: 6
    }, "isTextarea": _vm.configData[index2].actionType === "textarea", "rows": _vm.configData[index2].rows, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemInput", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "number" ? [_c("ListItemInput", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "keyAttr": _vm.configData[index2].prop, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "disabled": _vm.configData[index2].disabled || false, "placeholder": _vm.configData[index2].placeholder, "defineClick": _vm.configData[index2].defineClick, "maxLength": _vm.configData[index2].maxLength, "actionType": _vm.configData[index2].actionType, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemInput", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "select" ? [_c("ListItemSelect", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "hasDetail": _vm.configData[index2].hasDetail, "keyAttr": _vm.configData[index2].prop, "listProps": _vm.configData[index2].listProps, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "isMultiple": _vm.configData[index2].isMultiple || _vm.configData[index2].multiple || false, "limitNum": _vm.configData[index2].multipleLimit || 0, "isAllowCreate": _vm.configData[index2].isAllowCreate || false, "disabled": _vm.configData[index2].disabled || false, "labelValue": _vm.configData[index2].labelValue || "", "list": _vm.$attrs.type != 2 ? _vm.dictArr[_vm.configData[index2].prop] : _vm.dictObj[_vm.configData[index2].prop] || _vm.dictArr[_vm.configData[index2].prop], "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemSelect", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "radio" ? [_c("ListItemRadio", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "formData": _vm.formData, "keyAttr": _vm.configData[index2].prop, "groupArr": _vm.$attrs.type != 2 ? _vm.dictArr[_vm.configData[index2].prop] : _vm.dictObj[_vm.configData[index2].prop] || _vm.dictArr[_vm.configData[index2].prop], "validatorObj": _vm.validatorObj } }, "ListItemRadio", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "selectAll" ? [_c("ListItemSelectCanAllSelect", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "value-key": _vm.configData[index2].valueKey, "hasDetail": _vm.configData[index2].hasDetail, "keyAttr": _vm.configData[index2].prop, "listProps": _vm.configData[index2].listProps, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "isMultiple": _vm.configData[index2].isMultiple || false, "limitNum": _vm.configData[index2].multipleLimit || 0, "isAllowCreate": _vm.configData[index2].isAllowCreate || false, "disabled": _vm.configData[index2].disabled || false, "labelValue": _vm.configData[index2].labelValue || "", "list": _vm.$attrs.type != 2 ? _vm.dictArr[_vm.configData[index2].prop] : _vm.dictObj[_vm.configData[index2].prop] || _vm.dictArr[_vm.configData[index2].prop], "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemSelectCanAllSelect", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.dateType.includes(_vm.configData[index2].actionType) ? [!_vm.configData[index2].actionType.includes("range") ? _c("ListItemDate", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "dataType": _vm.configData[index2].actionType, "keyAttr": _vm.configData[index2].prop, "format": _vm.configData[index2].format, "valueFormat": _vm.configData[index2].valueFormat, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "detaildFormat": _vm.configData[index2].detaildFormat || "y-m-d", "disabled": _vm.configData[index2].disabled || false, "picker-options": _vm.configData[index2].pickerOptions, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemDate", _vm.configData[index2], false), _vm.$listeners)) : _c("ListItemDate", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "dataType": _vm.configData[index2].actionType, "format": _vm.configData[index2].format || "yyyy-MM-dd HH:mm:ss", "keyAttr": _vm.configData[index2].prop, "valueFormat": _vm.configData[index2].valueFormat, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "disabled": _vm.configData[index2].disabled || false, "picker-options": _vm.configData[index2].pickerOptions, "startPlaceholder": "请选择", "endPlaceholder": "请选择", "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemDate", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "file" || _vm.configData[index2].actionType === "image" ? [_c("ListItemFiles", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "keyAttr": _vm.configData[index2].prop, "detailAttr": _vm.configData[index2].detailAttr || _vm.configData[index2].prop, "fileType": _vm.configData[index2].actionType, "size": _vm.configData[index2].fileSize || "5000", "acceptType": _vm.configData[index2].actionType === "image" ? ".jpg,.jpeg,.png" : ".xlsx,.xls,.pdf,.docx,.doc", "acceptStr": _vm.configData[index2].actionType === "image" ? "image/jpg,image/png,image/jpeg" : "application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain, application/pdf", "useDefine": _vm.configData[index2].useDefine, "vis_text": _vm.configData[index2].visText, "data-type": [0, 1], "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemFiles", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "moreImgs" ? [_c("ListItemImgs", _vm._g(_vm._b({ attrs: { "isShowAddImg": true, "type": _vm.type, "labelName": _vm.configData[index2].label, "imgLen": _vm.configData[index2].imgLen || 10, "keyAttr": _vm.configData[index2].prop || "imgList", "delAttr": _vm.configData[index2].delAttr || "delAttr", "size": _vm.configData[index2].fileSize || "5000", "notDefineFileName": _vm.configData[index2].notDefineFileName, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemImgs", _vm.configData[index2], false), _vm.$listeners))] : _vm.configData[index2].actionType && _vm.configData[index2].actionType === "moreFiles" ? [_c("ListItemFilesMultiple", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2].label, "fileUrlProp": _vm.configData[index2].fileUrlProp || "fileUrl", "fileSize": _vm.configData[index2].fileSize || "20000", "keyAttr": _vm.configData[index2].prop, "acceptType": _vm.configData[index2].acceptType, "acceptStr": _vm.configData[index2].acceptStr, "submitKeyAttr": _vm.configData[index2].submitKeyAttr || _vm.configData[index2].prop, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemFilesMultiple", _vm.configData[index2], false), _vm.$listeners))] : _vm._e(), item.row == 2 ? [!_vm.configData[index2 + 1].actionType || _vm.configData[index2 + 1].slot ? [_vm._t(item.prop, function() {
      return [_c("div", { staticClass: "list-item" })];
    })] : _vm.configData[index2 + 1].actionType && (_vm.configData[index2 + 1].actionType === "input" || _vm.configData[index2 + 1].actionType === "textarea") ? [_c("ListItemInput", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "keyAttr": _vm.configData[index2 + 1].prop, "formatter": _vm.configData[index2 + 1].formatter, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "disabled": _vm.configData[index2 + 1].disabled || false, "placeholder": _vm.configData[index2 + 1].placeholder, "defineClick": _vm.configData[index2 + 1].defineClick, "autosize": _vm.configData[index2 + 1].autosize || {
      minRows: 2,
      maxRows: 6
    }, "maxLength": _vm.configData[index2 + 1].maxLength, "isTextarea": _vm.configData[index2 + 1].actionType === "textarea", "rows": _vm.configData[index2 + 1].rows, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemInput", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "input" ? [_c("ListItemInput", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "keyAttr": _vm.configData[index2 + 1].prop, "formatter": _vm.configData[index2 + 1].formatter, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "disabled": _vm.configData[index2 + 1].disabled || false, "placeholder": _vm.configData[index2 + 1].placeholder, "defineClick": _vm.configData[index2 + 1].defineClick, "maxLength": _vm.configData[index2 + 1].maxLength, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemInput", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "number" ? [_c("ListItemInput", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "keyAttr": _vm.configData[index2 + 1].prop, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "disabled": _vm.configData[index2 + 1].disabled || false, "placeholder": _vm.configData[index2 + 1].placeholder, "defineClick": _vm.configData[index2 + 1].defineClick, "maxLength": _vm.configData[index2 + 1].maxLength, "actionType": _vm.configData[index2 + 1].actionType, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemInput", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "select" ? [_c("ListItemSelect", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "hasDetail": _vm.configData[index2 + 1].hasDetail, "keyAttr": _vm.configData[index2 + 1].prop, "listProps": _vm.configData[index2 + 1].listProps, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "isMultiple": _vm.configData[index2 + 1].isMultiple || false, "limitNum": _vm.configData[index2 + 1].multipleLimit || 0, "isAllowCreate": _vm.configData[index2 + 1].isAllowCreate || false, "disabled": _vm.configData[index2 + 1].disabled || false, "labelValue": _vm.configData[index2 + 1].labelValue || "", "list": _vm.$attrs.type != 2 ? _vm.dictArr[_vm.configData[index2 + 1].prop] : _vm.dictObj[_vm.configData[index2 + 1].prop] || _vm.dictArr[_vm.configData[index2 + 1].prop], "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemSelect", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "radio" ? [_c("ListItemRadio", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "formData": _vm.formData, "keyAttr": _vm.configData[index2 + 1].prop, "groupArr": _vm.$attrs.type != 2 ? _vm.dictArr[_vm.configData[index2 + 1].prop] : _vm.dictObj[_vm.configData[index2 + 1].prop] || _vm.dictArr[_vm.configData[index2 + 1].prop], "validatorObj": _vm.validatorObj } }, "ListItemRadio", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "selectAll" ? [_c("ListItemSelectCanAllSelect", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "value-key": _vm.configData[index2 + 1].valueKey, "hasDetail": _vm.configData[index2 + 1].hasDetail, "keyAttr": _vm.configData[index2 + 1].prop, "listProps": _vm.configData[index2 + 1].listProps, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "isMultiple": _vm.configData[index2 + 1].isMultiple || false, "limitNum": _vm.configData[index2 + 1].multipleLimit || 0, "isAllowCreate": _vm.configData[index2 + 1].isAllowCreate || false, "disabled": _vm.configData[index2 + 1].disabled || false, "labelValue": _vm.configData[index2 + 1].labelValue || "", "list": _vm.$attrs.type != 2 ? _vm.dictArr[_vm.configData[index2 + 1].prop] : _vm.dictObj[_vm.configData[index2 + 1].prop] || _vm.dictArr[_vm.configData[index2 + 1].prop], "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemSelectCanAllSelect", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.dateType.includes(_vm.configData[index2 + 1].actionType) ? [!_vm.configData[index2 + 1].actionType.includes("range") ? _c("ListItemDate", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "dataType": _vm.configData[index2 + 1].actionType, "keyAttr": _vm.configData[index2 + 1].prop, "format": _vm.configData[index2 + 1].format, "valueFormat": _vm.configData[index2 + 1].valueFormat, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "detaildFormat": _vm.configData[index2 + 1].detaildFormat || "y-m-d", "disabled": _vm.configData[index2 + 1].disabled || false, "picker-options": _vm.configData[index2 + 1].pickerOptions, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemDate", _vm.configData[index2 + 1], false), _vm.$listeners)) : _c("ListItemDate", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "dataType": _vm.configData[index2 + 1].actionType, "valueFormat": _vm.configData[index2 + 1].valueFormat || "yyyy-MM-dd HH:mm:ss", "format": _vm.configData[index2 + 1].format || "yyyy-MM-dd HH:mm:ss", "keyAttr": _vm.configData[index2 + 1].prop, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "picker-options": _vm.configData[index2 + 1].pickerOptions, "startPlaceholder": "请选择", "endPlaceholder": "请选择", "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemDate", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "file" || _vm.configData[index2 + 1].actionType === "image" ? [_c("ListItemFiles", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "keyAttr": _vm.configData[index2 + 1].prop, "detailAttr": _vm.configData[index2 + 1].detailAttr || _vm.configData[index2 + 1].prop, "fileType": _vm.configData[index2 + 1].actionType, "size": _vm.configData[index2 + 1].fileSize || "5000", "acceptType": _vm.configData[index2 + 1].acceptType || _vm.configData[index2 + 1].actionType === "image" ? ".jpg,.jpeg,.png" : ".xlsx,.xls,.pdf,.docx,.doc", "acceptStr": _vm.configData[index2 + 1].acceptStr || _vm.configData[index2 + 1].actionType === "image" ? "image/jpg,image/png,image/jpeg" : "application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain, application/pdf", "useDefine": _vm.configData[index2 + 1].useDefine, "vis_text": _vm.configData[index2 + 1].visText, "data-type": [0, 1], "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemFiles", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "moreImgs" ? [_c("ListItemImgs", _vm._g(_vm._b({ attrs: { "isShowAddImg": true, "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "imgLen": _vm.configData[index2 + 1].imgLen || 10, "keyAttr": _vm.configData[index2 + 1].prop || "imgList", "delAttr": _vm.configData[index2 + 1].delAttr || "delAttr", "size": _vm.configData[index2 + 1].fileSize || "5000", "notDefineFileName": _vm.configData[index2 + 1].notDefineFileName, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemImgs", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm.configData[index2 + 1].actionType && _vm.configData[index2 + 1].actionType === "moreFiles" ? [_c("ListItemFilesMultiple", _vm._g(_vm._b({ attrs: { "type": _vm.type, "labelName": _vm.configData[index2 + 1].label, "fileUrlProp": _vm.configData[index2 + 1].fileUrlProp || "fileUrl", "fileSize": _vm.configData[index2 + 1].fileSize || "20000", "keyAttr": _vm.configData[index2 + 1].prop, "acceptType": _vm.configData[index2 + 1].acceptType, "acceptStr": _vm.configData[index2 + 1].acceptStr, "submitKeyAttr": _vm.configData[index2 + 1].submitKeyAttr || _vm.configData[index2 + 1].prop, "formData": _vm.formData, "validatorObj": _vm.validatorObj } }, "ListItemFilesMultiple", _vm.configData[index2 + 1], false), _vm.$listeners))] : _vm._e()] : _vm._e()], 2) : _vm._e()];
  })], 2), _c("div", { staticClass: "floatRight flot" }, [_c("RtzhButton", { staticClass: "reset", staticStyle: { "padding": "5px 30px", "margin": "0 30px" }, attrs: { "vis_text": "返回" }, on: { "click": _vm.back } }), _vm.type != 2 ? _c("RtzhButton", { staticClass: "search", staticStyle: { "padding": "5px 30px", "margin": "0 30px" }, attrs: { "vis_text": "保存" }, on: { "click": _vm.save } }) : _vm._e()], 1)]);
};
var _sfc_staticRenderFns$7 = [];
var __component__$7 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$7,
  _sfc_render$7,
  _sfc_staticRenderFns$7,
  false,
  null,
  null,
  null,
  null
);
const index$3 = __component__$7.exports;
const index_vue_vue_type_style_index_0_scoped_7017bf93_lang = "";
const _sfc_main$6 = {
  name: "Level3Tree",
  props: {
    treeSelectVal: {},
    defaultCheckedKeys: {
      default: function() {
        return [];
      }
    },
    treeSelectOpt: {
      default: function() {
        return [];
      }
    },
    isShowAll: {
      type: Boolean,
      default: true
    },
    checkOnClickNode: {
      type: Boolean,
      default: true
    },
    showCheckbox: {
      type: Boolean,
      default: false
    },
    checkStrictly: {
      type: Boolean,
      default: false
    },
    showSearch: {
      type: Boolean,
      default: true
    },
    showSelect: {
      type: Boolean,
      default: false
    },
    treeData: {
      type: Array,
      default: null
    },
    defaultProps: {
      default: function() {
        return {
          children: "children",
          label: "name"
        };
      }
    },
    nodeKey: {
      type: String,
      default: "id"
    },
    isfujiedian: {
      type: Boolean,
      default: false
    },
    levelIcon: {
      type: Boolean,
      default: true
    }
  },
  watch: {
    filterTreeText(val) {
      this.$refs.companyTree.filter(val);
    },
    treeSelectVal(val) {
      this.searchOpts = this.treeSelectVal || "";
    },
    treeData(val) {
      this.init(val);
    },
    defaultCheckedKeys(val) {
      this.setKey();
    }
  },
  data() {
    return {
      searchOpts: "",
      filterTreeText: "",
      main_aside_left: "main_aside_left_show",
      treeDataNow: null
    };
  },
  created() {
    this.treeDataNow = this.treeData;
  },
  methods: {
    // getIconClass({ type }) {
    //   if (type == 1) {
    //     return "";
    //   } else if (type == 2) {
    //     return "stairThree";
    //   } else if (type == 3) {
    //     return "secondThree";
    //   } else if (type == 4) {
    //     return "sanjiThreeLevel";
    //   } else if (type == 5) {
    //     return "foreThree";
    //   }
    // },
    visibleParentNode(value, data, node) {
      if (Array.isArray(data)) {
        data = data[0];
      }
      let key = this.defaultProps.label;
      let result = data[key].indexOf(value) !== -1;
      if (result) {
        return true;
      } else {
        if (node.parent && typeof node.parent.data == "object") {
          return this.visibleParentNode(value, node.parent.data, node.parent);
        }
      }
      return false;
    },
    // filterQuyuNode(value, data, node) {
    //   console.log(value, data, node);
    //   if (!value) {
    //     return true;
    //   }
    //   let key = this.defaultProps.label;
    //   setTimeout(() => {
    //     // this.visibleParentNode(value, data, node)
    //   }, 300);
    //   return data[key].indexOf(value) !== -1;
    // },
    // mainAsideHide(sta) {
    //   this.main_aside_left = !sta ? "main_aside_left_show" : "main_aside_left_hide";
    // },
    treeMenuSelect(data, obj) {
      this.$emit("treeMenuSelect", obj);
    },
    setKey() {
      this.$nextTick(() => {
        this.$refs.companyTree.setCurrentKey(...this.defaultCheckedKeys);
      });
    },
    setCheckedKeys() {
      this.$refs.companyTree.setCheckedKeys(["00002"]);
    },
    treeNodeClickFun(val, node, dom) {
      console.log("treeDataNow:", this.treeDataNow);
      let clickData = this.getTreeDataByCode(val);
      this.$emit("treeNodeClick", clickData, val, node, dom);
    },
    getTreeDataByCode(currentNode) {
      let result = [];
      let treeData = this.treeDataNow;
      let currentCode = currentNode.parentId;
      function findNode(node, level) {
        if (node.parentId === currentCode) {
          result.push(node);
          return true;
        }
        if (node.children && node.children.some((child) => findNode(child, level + 1))) {
          result.splice(level, 0, node);
          return true;
        }
        return false;
      }
      treeData.some((node) => findNode(node, 0));
      return result;
    },
    // 下拉框选择设备
    selEquip(val) {
      this.$emit("treeSelectVal", val);
    },
    init(val) {
      this.treeDataNow = val;
      this.$nextTick(() => {
        console.log(this.defaultCheckedKeys);
        this.$refs.companyTree.setCurrentKey(...this.defaultCheckedKeys);
      });
    }
  },
  mounted() {
    this.searchOpts = this.treeSelectVal || "";
    this.init(this.treeData);
  }
};
var _sfc_render$6 = function render29() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { class: [
    "thirdListBox",
    "Level3Tree",
    _vm.main_aside_left,
    { has_search: _vm.showSearch },
    { has_select: _vm.showSelect },
    { has_search_select: _vm.showSelect && _vm.showSearch }
  ] }, [_vm.showSelect && _vm.treeSelectOpt.length != 0 ? _c("div", { staticClass: "l3t_search l3t_select" }, [_c("div", { staticClass: "vis_input" }, [_c("div", { staticClass: "vis_input_box" }, [_c("el-select", { attrs: { "popper-append-to-body": false, "filterable": "", "placeholder": "请选择" }, on: { "change": _vm.selEquip }, model: { value: _vm.searchOpts, callback: function($$v) {
    _vm.searchOpts = $$v;
  }, expression: "searchOpts" } }, [_c("el-option-group", _vm._l(_vm.treeSelectOpt, function(item, index2) {
    return _c("el-option", { key: "sel" + index2, attrs: { "label": item.label, "value": item.value } });
  }), 1)], 1)], 1)])]) : _vm._e(), _vm.showSearch ? _c("div", { staticClass: "l3t_search", style: { paddingTop: _vm.showSelect ? "56px" : 0 } }, [_c("div", { staticClass: "vis_input" }, [_c("div", { staticClass: "vis_input_box dataInput" }, [_c("el-input", { attrs: { "placeholder": "搜索", "clearable": "", "prefix-icon": "el-icon-search" }, model: { value: _vm.filterTreeText, callback: function($$v) {
    _vm.filterTreeText = $$v;
  }, expression: "filterTreeText" } })], 1)])]) : _vm._e(), _c("div", { class: ["bgTB"] }, [_c("div", { staticClass: "scrollBox" }, [_c("div", { class: { checkout: _vm.isfujiedian, vis_tree: true } }, [_c("el-tree", _vm._b({ ref: "companyTree", attrs: { "data": _vm.treeDataNow, "default-expand-all": _vm.isShowAll, "show-checkbox": _vm.showCheckbox, "indent": _vm.showCheckbox ? 25 : 25, "node-key": _vm.nodeKey, "render-after-expand": true, "accordion": "", "expand-on-click-node": false, "highlight-current": "", "props": _vm.defaultProps, "check-on-click-node": _vm.checkOnClickNode, "default-expanded-keys": _vm.defaultCheckedKeys, "check-strictly": _vm.checkStrictly, "filter-node-method": _vm.visibleParentNode }, on: { "check": _vm.treeMenuSelect, "node-click": _vm.treeNodeClickFun } }, "el-tree", _vm.$attrs, false))], 1)])])]);
};
var _sfc_staticRenderFns$6 = [];
var __component__$6 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$6,
  _sfc_render$6,
  _sfc_staticRenderFns$6,
  false,
  null,
  "7017bf93",
  null,
  null
);
const RtzhTree = __component__$6.exports;
const index_vue_vue_type_style_index_0_scoped_94c71f65_lang = "";
const _sfc_main$5 = {
  props: {
    score: {
      type: Number | String,
      default: 0
    },
    max: {
      type: Number,
      default: null
    }
    // piece: {
    //   type: Number,
    //   default: 2
    // }
  },
  data() {
    return {
      maxLi: 0,
      scoreList: []
    };
  },
  created() {
    this.maxLi = Math.ceil(this.max / 2);
    if (this.maxLi > 5)
      this.maxLi = 5;
    for (let i2 = 0; i2 < Math.floor(this.score / 2); i2++) {
      this.scoreList.push("star-full");
    }
  }
};
var _sfc_render$5 = function render30() {
  var _vm = this, _c = _vm._self._c;
  return _c("ul", _vm._l(_vm.maxLi, function(item) {
    return _c("li", { key: item, staticClass: "star-item", class: _vm.scoreList[item - 1] });
  }), 0);
};
var _sfc_staticRenderFns$5 = [];
var __component__$5 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$5,
  _sfc_render$5,
  _sfc_staticRenderFns$5,
  false,
  null,
  "94c71f65",
  null,
  null
);
const scoreStar = __component__$5.exports;
const FixedTable_vue_vue_type_style_index_0_lang = "";
const _sfc_main$4 = {
  name: "FixedTable",
  props: {
    height: {
      default: "100%"
    },
    piliang: {
      default: false
    },
    changeval: {
      default: 1
    },
    faultDict: {
      default: () => []
    },
    changeTableData: {
      default: false
    },
    zdy: {
      default: false
    },
    caozuo: {
      default: true
    },
    highlightCurrentRow: {
      default: false
    },
    fixed: {
      default: false
    },
    fixedRight: {
      default: false
    },
    fixedWidth: {
      default: 0
    },
    fixedWidthright: {
      default: 0
    },
    tableData: {
      default: () => []
    },
    tableList: {
      default: () => []
    },
    tablePage: {
      default: null
    },
    selection: {
      default: false
    },
    hasselection: {
      default: false
    },
    isSingleSelect: {
      // 是否为单选
      default: false
    },
    keyId: {
      default: "id"
    },
    rowKey: {
      default: "id"
    },
    isSelectValidate: {
      type: Boolean,
      default: true
    },
    columnIndex: {
      default: () => []
    }
  },
  data: function() {
    return {
      hashengx: false,
      previewer: false,
      imgUrl: "",
      modalAppendToBody: true
    };
  },
  components: {
    scoreStar,
    ZhxdDialog: RtzhDialog
  },
  computed: {
    widthNow() {
      return window.innerWidth;
    }
  },
  watch: {
    changeval() {
      this.$refs.tabelMain.bodyWrapper.scrollTop = 0;
      this.$refs.fixedTabel.bodyWrapper.scrollTop = 0;
      this.$refs.fixedTabe2.bodyWrapper.scrollTop = 0;
    },
    changeTableData() {
      this.$refs.tabelMain.doLayout();
      this.$refs.tabelMain.bodyWrapper.scrollLeft = 0;
      this.$refs.fixedTabel.doLayout();
      this.$refs.fixedTabel.bodyWrapper.scrollLeft = 0;
      this.$refs.fixedTabe2.doLayout();
      this.$refs.fixedTabe2.bodyWrapper.scrollLeft = 0;
    }
  },
  methods: {
    defaultSeleList(row) {
      console.log(row, 9999);
      this.$refs.tabelMain.toggleRowSelection(row, true);
    },
    ispreviewer(url) {
      this.imgUrl = url;
      this.previewer = true;
    },
    selectdata(selection) {
      if (this.piliang) {
        for (let i2 = 0; i2 < selection.length; i2++) {
          let val = selection[i2];
          if (this.isSelectValidate && val.orderStateName && !(val.orderStateName == "归档" || val.orderStateName == "已归档")) {
            this.$message.info("包含不可导出项,请取消勾选!");
          }
        }
        this.$emit("getselectDataArr", selection);
      } else {
        let len = selection.length;
        if (len > 1) {
          selection.forEach((v, i2) => {
            if (i2 < len - 1) {
              this.$refs.tabelMain.toggleRowSelection(v, false);
            }
          });
          return;
        }
        this.$emit("getselectDataArr", selection);
      }
    },
    // selectdata1(selection){
    //   for(let i = 0; i < selection.length; i++){
    //     let val = selection[i];
    //     // if(!(val.orderState == 70)){
    //     //   this.$message.info("包含不可导出项,请取消勾选!")
    //     // }
    //     if(val.orderStateName == "归档"){
    //       this.$message.info("包含不可导出项,请取消勾选!")
    //     }
    //   }
    //   this.$emit('getselectDataArr',selection)
    // },
    formatterDict(row, column, cellValue) {
      let prop = column.property;
      let dict = this.faultDict[prop];
      if (dict) {
        let label = dict[cellValue];
        if (label)
          return label;
      }
      return "";
    },
    formatterDict1() {
    },
    tableCellClassName({ row, column, rowIndex, columnIndex }) {
      let s = "";
      if (this.hasselection) {
        s = "el-table-column--selection height-49";
        return s;
      }
    },
    tableCellClassName2({ row, column, rowIndex, columnIndex }) {
      let s = "";
      if (this.hasselection) {
        s = "el-table-column--selection height-49";
        if (this.isSingleSelect) {
          if (columnIndex == 0) {
            s += " disabledSelection";
          }
        }
      }
      return s;
    },
    tableRowClassName: function({ row, rowIndex }) {
      let str = "";
      if (row.showHover) {
        str = "row-show-hover ";
      }
      if (rowIndex % 2 == 1) {
        return str + "lightColor";
      } else {
        return str + "darkColor";
      }
    },
    cellClick(row, column, cell, event) {
      this.$emit("cellClick", row, column, cell, event);
    },
    rowClick(row, column, cell, event) {
      this.$emit("rowClick", row, column, cell, event);
    },
    cellMouseEnter(row) {
      this.$set(row, "showHover", true);
    },
    cellMouseLeave(row) {
      this.$set(row, "showHover", false);
    },
    //计算tablemain的宽度与内容宽度比较
    hashengxiang() {
      let countWidth = this.$refs.tabelMain.bodyWidth;
      let boxWidth = this.$refs.tabelMain.$el.parentNode.offsetWidth;
      let centerWidth = Number(countWidth.slice(0, -2));
      if (centerWidth < boxWidth) {
        this.hashengx = true;
      } else {
        this.hashengx = false;
      }
    }
  },
  mounted() {
    this.$nextTick(function() {
      this.hashengxiang();
    });
    const _this = this;
    let divName = "";
    this.$refs.tabelMain.bodyWrapper.addEventListener(
      "mouseover",
      function(e) {
        divName = "tabelMain";
      },
      false
    );
    this.$refs.tabelMain.bodyWrapper.addEventListener(
      "scroll",
      function(e) {
        if (divName == "tabelMain") {
          let scrollTop1 = _this.$refs.fixedTabel.bodyWrapper.scrollHeight - _this.$refs.fixedTabel.bodyWrapper.clientHeight;
          let scrollTop2 = _this.$refs.fixedTabe2.bodyWrapper.scrollHeight - _this.$refs.fixedTabe2.bodyWrapper.clientHeight;
          !scrollTop1 && (scrollTop1 = this.scrollTop);
          !scrollTop2 && (scrollTop2 = this.scrollTop);
          let scrollTop = Math.min(this.scrollTop, scrollTop1, scrollTop2);
          _this.$refs.fixedTabel.bodyWrapper.scrollTop = scrollTop;
          _this.$refs.fixedTabe2.bodyWrapper.scrollTop = scrollTop;
          if (scrollTop < this.scrollTop) {
            this.scrollTop = scrollTop;
          }
        }
      },
      false
    );
    this.$refs.fixedTabel.bodyWrapper.addEventListener(
      "mouseover",
      function() {
        divName = "fixedTabel";
      },
      false
    );
    this.$refs.fixedTabel.bodyWrapper.addEventListener(
      "scroll",
      function() {
        if (divName == "fixedTabel") {
          let scrollTop1 = _this.$refs.tabelMain.bodyWrapper.scrollHeight - _this.$refs.tabelMain.bodyWrapper.clientHeight;
          let scrollTop2 = _this.$refs.fixedTabe2.bodyWrapper.scrollHeight - _this.$refs.fixedTabe2.bodyWrapper.clientHeight;
          !scrollTop1 && (scrollTop1 = this.scrollTop);
          !scrollTop2 && (scrollTop2 = this.scrollTop);
          let scrollTop = Math.min(this.scrollTop, scrollTop1, scrollTop2);
          _this.$refs.tabelMain.bodyWrapper.scrollTop = scrollTop;
          _this.$refs.fixedTabe2.bodyWrapper.scrollTop = scrollTop;
          if (scrollTop < this.scrollTop) {
            this.scrollTop = scrollTop;
          }
        }
      },
      false
    );
    this.$refs.fixedTabe2.bodyWrapper.addEventListener(
      "mouseover",
      function() {
        divName = "fixedTabe2";
      },
      false
    );
    this.$refs.fixedTabe2.bodyWrapper.addEventListener(
      "scroll",
      function() {
        if (divName == "fixedTabe2") {
          let scrollTop1 = _this.$refs.tabelMain.bodyWrapper.scrollHeight - _this.$refs.tabelMain.bodyWrapper.clientHeight;
          let scrollTop2 = _this.$refs.fixedTabel.bodyWrapper.scrollHeight - _this.$refs.fixedTabel.bodyWrapper.clientHeight;
          !scrollTop1 && (scrollTop1 = this.scrollTop);
          !scrollTop2 && (scrollTop2 = this.scrollTop);
          let scrollTop = Math.min(this.scrollTop, scrollTop1, scrollTop2);
          _this.$refs.tabelMain.bodyWrapper.scrollTop = scrollTop;
          _this.$refs.fixedTabel.bodyWrapper.scrollTop = scrollTop;
          if (scrollTop < this.scrollTop) {
            this.scrollTop = scrollTop;
          }
        }
      },
      false
    );
  }
};
var _sfc_render$4 = function render31() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "FixedTable" }, [_c("div", { staticClass: "vis_table vis_table_1", style: { width: _vm.fixedWidth } }, [_c("el-table", { key: "tab1" + _vm.keyId, ref: "fixedTabel", staticClass: "tableFix", attrs: { "size": "small", "data": _vm.tableData, "border": "", "height": _vm.height, "width": "100%", "header-cell-style": { "text-align": "left" }, "cell-style": { "text-align": "left" }, "empty-text": " ", "cell-class-name": _vm.tableCellClassName, "header-cell-class-name": _vm.tableCellClassName2, "row-class-name": _vm.tableRowClassName, "row-key": _vm.rowKey }, on: { "cell-click": _vm.cellClick, "row-click": _vm.rowClick, "selection-change": _vm.selectdata, "cell-mouse-enter": function($event) {
    return _vm.cellMouseEnter($event);
  }, "cell-mouse-leave": function($event) {
    return _vm.cellMouseLeave($event);
  } } }, [_vm._t("selection"), _vm._t("xuhao"), _vm._l(_vm.tableList || [], function(item) {
    return [item.fixed ? _c("el-table-column", { key: item.props, attrs: { "prop": item.props, "class-name": item.className || "", "min-width": item.width ? _vm.widthNow > 3e3 ? Number(item.width) + 60 + "px" : item.width : _vm.widthNow > 3e3 ? "120px" : "80px", "show-overflow-tooltip": "", "label": item.label }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [item.filter ? _c("span", [_vm._v(_vm._s(_vm._f("needFilter")(scope.row[item.props], item.filter)))]) : _c("span", [_vm._v(_vm._s(scope.row[item.props]))])];
    } }], null, true) }) : _vm._e()];
  })], 2)], 1), _c("div", { staticClass: "vis_table vis_table_2", class: { vis_table_3: _vm.fixedWidthright, vis_table_5: _vm.hashengx }, style: {
    width: `calc(100%${_vm.fixedWidthright ? " - " + _vm.fixedWidthright : ""}${_vm.fixedWidth ? " - " + _vm.fixedWidth : ""}`
  } }, [_c("el-table", { key: "tab2" + _vm.keyId, ref: "tabelMain", staticClass: "tableFix", attrs: { "size": "small", "data": _vm.tableData, "border": "", "height": _vm.height, "width": "100%", "highlight-current-row": _vm.highlightCurrentRow, "header-cell-style": { "text-align": "left" }, "cell-style": { "text-align": "left" }, "cell-class-name": _vm.tableCellClassName, "header-cell-class-name": _vm.tableCellClassName2, "row-class-name": _vm.tableRowClassName, "row-key": _vm.rowKey }, on: { "cell-click": _vm.cellClick, "row-click": _vm.rowClick, "selection-change": _vm.selectdata, "cell-mouse-enter": function($event) {
    return _vm.cellMouseEnter($event);
  }, "cell-mouse-leave": function($event) {
    return _vm.cellMouseLeave($event);
  } } }, [!_vm.fixedWidth ? _vm._t("xuhao") : _vm._e(), _vm._l(_vm.tableList || [], function(item) {
    return [item.slot ? [_vm._t(item.slot, null, { "data": item })] : !item.fixed && !item.fixedRight ? [item.label === "考勤照片1" ? _c("el-table-column", { key: item.props, attrs: { "prop": "attendancePi", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "考勤照片1" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.attendancePic != null ? _c("img", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": scope.row.attendancePic, "alt": "" }, on: { "click": function($event) {
        return _vm.ispreviewer(scope.row.attendancePic);
      } } }) : _vm._e()];
    } }], null, true) }) : item.label === "人脸原图" ? _c("el-table-column", { key: item.props, attrs: { "prop": "bkImage", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "人脸原图" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.bkImage != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.bkImage), "preview-src-list": [_vm.$getFileUrl(scope.row.bkImage)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "人脸照片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "photos", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "进场照片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.photos != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.photos), "preview-src-list": [_vm.$getFileUrl(scope.row.photos)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "进场图片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "inImg", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "进场图片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.inImg != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.inImg), "preview-src-list": [_vm.$getFileUrl(scope.row.inImg)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "出场图片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "outImg", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "出场图片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.outImg != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.outImg), "preview-src-list": [_vm.$getFileUrl(scope.row.outImg)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "入场照片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "gobigpic", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "入场照片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.gobigpic ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.gobigpic), "preview-src-list": [_vm.$getFileUrl(scope.row.gobigpic)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "出场照片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "enbigpic", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "出场照片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [_c("el-image", { directives: [{ name: "show", rawName: "v-show", value: scope.row.enbigpic, expression: "scope.row.enbigpic" }], staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": scope.row.enbigpic, "preview-src-list": [scope.row.enbigpic] } })];
    } }], null, true) }) : item.label === "存留图片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "userPhoto", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "存留图片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.userPhoto != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.userPhoto), "preview-src-list": [_vm.$getFileUrl(scope.row.userPhoto)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "温度" ? _c("el-table-column", { key: item.props, attrs: { "prop": "temp", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "温度" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [_c("span", { style: scope.row.temp >= 37.2 ? "color:red" : "" }, [_vm._v(_vm._s(scope.row.temp))])];
    } }], null, true) }) : item.label === "进场照片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "gobigpic", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "进场照片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.gobigpic ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.gobigpic), "preview-src-list": [_vm.$getFileUrl(scope.row.gobigpic)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "进场图片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "scenePhoto", "width": _vm.widthNow > 3e3 ? 210 : 150, "label": "进场图片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.scenePhoto != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px" }, attrs: { "src": _vm.$getFileUrl(scope.row.scenePhoto), "preview-src-list": [_vm.$getFileUrl(scope.row.scenePhoto)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "首次打卡照片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "beginClockInPic", "width": _vm.widthNow > 3e3 ? 210 : 110, "label": "首次打卡照片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.beginClockInPic != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px", "margin-top": "5px", "box-sizing": "border-box" }, attrs: { "src": _vm.$getFileUrl(scope.row.beginClockInPic), "preview-src-list": [
        _vm.$getFileUrl(scope.row.beginClockInPic)
      ] } }) : _vm._e()];
    } }], null, true) }) : item.label === "末次打卡照片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "endClockInPic", "width": _vm.widthNow > 3e3 ? 210 : 110, "label": "末次打卡照片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.endClockInPic != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px", "margin-top": "5px", "box-sizing": "border-box" }, attrs: { "src": _vm.$getFileUrl(scope.row.endClockInPic), "preview-src-list": [_vm.$getFileUrl(scope.row.endClockInPic)] } }) : _vm._e()];
    } }], null, true) }) : item.label === "图片" ? _c("el-table-column", { key: item.props, attrs: { "prop": "pic", "width": _vm.widthNow > 3e3 ? 210 : 110, "label": "图片" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [scope.row.pic != null ? _c("el-image", { staticStyle: { "width": "25px", "height": "25px", "margin-top": "5px", "box-sizing": "border-box" }, attrs: { "src": _vm.$getFileUrl(scope.row.pic), "preview-src-list": [_vm.$getFileUrl(scope.row.pic)] } }) : _vm._e()];
    } }], null, true) }) : item.props == "RTKOnlineStatus" ? _c("el-table-column", { key: item.props, attrs: { "prop": "RTKOnlineStatus", "width": _vm.widthNow > 3e3 ? 210 : 110, "label": "状态" }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [_c("span", { style: {
        color: scope.row.RTKOnlineStatus == 0 ? "#539fff" : "#f79800"
      } }, [_vm._v(_vm._s(scope.row.RTKOnlineStatus == 0 ? "在线" : "离线"))])];
    } }], null, true) }) : !item.hasformatterDict ? _c("el-table-column", { key: item.props, attrs: { "prop": item.props, "class-name": item.className || "", "min-width": item.width ? _vm.widthNow > 3e3 ? Number(item.width) + 60 + "px" : item.width : _vm.widthNow > 3e3 ? "120px" : "80px", "show-overflow-tooltip": "", "label": item.label }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return !item.hasformatterDict ? [item.filter && !item.zdy ? _c("span", { class: item.className == "cur" && scope.row["usedStatus"] != "未绑定" ? "textPointer tdu" : "" }, [_vm._v(_vm._s(_vm._f("needFilter")(scope.row[item.props], item.filter)))]) : !item.filter && !item.zdy ? _c("span", { class: item.className == "cur" && scope.row["usedStatus"] != "未绑定" ? "textPointer tdu" : "" }, [_vm._v(_vm._s(scope.row[item.props]))]) : _vm._t("default")] : void 0;
    } }], null, true) }) : _c("el-table-column", { key: item.props, attrs: { "prop": item.props, "class-name": item.className || "", "min-width": item.width ? _vm.widthNow > 3e3 ? Number(item.width) + 60 + "px" : item.width : _vm.widthNow > 3e3 ? "120px" : "80px", "show-overflow-tooltip": "", "formatter": item.hasformatterDict ? _vm.formatterDict : _vm.formatterDict1, "label": item.label } })] : _vm._e()];
  }), !_vm.fixedWidthright ? _vm._t("caozuo1") : _vm._e(), _vm._t("img")], 2)], 1), _c("div", { staticClass: "vis_table vis_table_4", style: { width: _vm.fixedWidthright } }, [_c("el-table", { key: "tab6" + _vm.keyId, ref: "fixedTabe2", staticClass: "tableFix", attrs: { "size": "small", "data": _vm.tableData, "border": "", "height": _vm.height, "header-cell-style": { "text-align": "left" }, "cell-style": { "text-align": "left" }, "width": "100%", "empty-text": " ", "cell-class-name": _vm.tableCellClassName, "header-cell-class-name": _vm.tableCellClassName, "row-class-name": _vm.tableRowClassName, "row-key": _vm.rowKey }, on: { "cell-click": _vm.cellClick, "row-click": _vm.rowClick, "cell-mouse-enter": function($event) {
    return _vm.cellMouseEnter($event);
  }, "cell-mouse-leave": function($event) {
    return _vm.cellMouseLeave($event);
  } } }, [_vm._l(_vm.tableList || [], function(item) {
    return [item.fixedRight ? _c("el-table-column", { key: item.props, attrs: { "prop": item.props, "class-name": item.className || "", "min-width": item.width ? _vm.widthNow > 3e3 ? Number(item.width) + 60 + "px" : item.width : _vm.widthNow > 3e3 ? "120px" : "80px", "show-overflow-tooltip": "", "label": item.label }, scopedSlots: _vm._u([{ key: "default", fn: function(scope) {
      return [item.filter ? _c("span", [_vm._v(_vm._s(_vm._f("needFilter")(scope.row[item.props], item.filter)))]) : _c("span", [_vm._v(_vm._s(scope.row[item.props]))])];
    } }], null, true) }) : _vm._e()];
  }), _vm._t("caozuo")], 2)], 1), _c("ZhxdDialog", { attrs: { "close-on-click-modal": false, "close-on-press-escape": false, "show-close": true, "visible": _vm.previewer, "width": "60%", "custom-class": "dxjx-dialog bidPrjInfoPage-dialog", "title": "图片查看", "modalAppendToBody": _vm.modalAppendToBody }, on: { "update:visible": function($event) {
    _vm.previewer = $event;
  } } }, [_c("img", { staticStyle: { "width": "100%", "height": "99%" }, attrs: { "src": _vm.imgUrl, "alt": "" } })])], 1);
};
var _sfc_staticRenderFns$4 = [];
var __component__$4 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$4,
  _sfc_render$4,
  _sfc_staticRenderFns$4,
  false,
  null,
  null,
  null,
  null
);
const FixedTable = __component__$4.exports;
var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {};
function getAugmentedNamespace(n) {
  if (n.__esModule)
    return n;
  var f = n.default;
  if (typeof f == "function") {
    var a = function a2() {
      if (this instanceof a2) {
        return Reflect.construct(f, arguments, this.constructor);
      }
      return f.apply(this, arguments);
    };
    a.prototype = f.prototype;
  } else
    a = {};
  Object.defineProperty(a, "__esModule", { value: true });
  Object.keys(n).forEach(function(k) {
    var d = Object.getOwnPropertyDescriptor(n, k);
    Object.defineProperty(a, k, d.get ? d : {
      enumerable: true,
      get: function() {
        return n[k];
      }
    });
  });
  return a;
}
function commonjsRequire(path) {
  throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
}
var xlsx = { exports: {} };
var cpexcel = { exports: {} };
var hasRequiredCpexcel;
function requireCpexcel() {
  if (hasRequiredCpexcel)
    return cpexcel.exports;
  hasRequiredCpexcel = 1;
  (function(module) {
    var cptable2 = { version: "1.14.0" };
    cptable2[437] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[620] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàąçêëèïîćÄĄĘęłôöĆûùŚÖܢ٥śƒŹŻóÓńŃźż¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[737] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρσςτυφχψ░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀ωάέήϊίόύϋώΆΈΉΊΌΎΏ±≥≤ΪΫ÷≈°∙·√ⁿ²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[850] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñѪº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýݯ´­±‗¾¶§÷¸°¨·¹³²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[852] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäůćçłëŐőîŹÄĆÉĹĺôöĽľŚśÖÜŤťŁ×čáíóúĄąŽžĘ꬟Ⱥ«»░▒▓│┤ÁÂĚŞ╣║╗╝Żż┐└┴┬├─┼Ăă╚╔╩╦╠═╬¤đĐĎËďŇÍÎě┘┌█▄ŢŮ▀ÓßÔŃńňŠšŔÚŕŰýÝţ´­˝˛ˇ˘§÷¸°¨˙űŘř■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[857] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîıÄÅÉæÆôöòûùİÖÜø£ØŞşáíóúñÑĞ𿮬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ºªÊËÈ�ÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµ�×ÚÛÙìÿ¯´­±�¾¶§÷¸°¨·¹³²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[861] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèÐðÞÄÅÉæÆôöþûÝýÖÜø£Ø₧ƒáíóúÁÍÓÚ¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[865] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø₧ƒáíóúñѪº¿⌐¬½¼¡«¤░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[866] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀рстуфхцчшщъыьэюяЁёЄєЇїЎў°∙·√№¤■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[874] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€����…�����������‘’“”•–—�������� กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู����฿เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛����", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[895] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ČüéďäĎŤčěĚĹÍľǪÄÁÉžŽôöÓůÚýÖÜŠĽÝŘťáíóúňŇŮÔšřŕŔ¼§«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[932] = function() {
      var d = [], e = {}, D = [], j2;
      D[0] = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚��������������������������������".split("");
      for (j2 = 0; j2 != D[0].length; ++j2)
        if (D[0][j2].charCodeAt(0) !== 65533) {
          e[D[0][j2]] = 0 + j2;
          d[0 + j2] = D[0][j2];
        }
      D[129] = "���������������������������������������������������������������� 、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー―‐/\~∥|…‥‘’“”()〔〕[]{}〈〉《》「」『』【】+-±×�÷=≠<>≦≧∞∴♂♀°′″℃¥$¢£%#&*@§☆★○●◎◇◆□■△▲▽▼※〒→←↑↓〓�����������∈∋⊆⊇⊂⊃∪∩��������∧∨¬⇒⇔∀∃�����������∠⊥⌒∂∇≡≒≪≫√∽∝∵∫∬�������ʼn♯♭♪†‡¶����◯���".split("");
      for (j2 = 0; j2 != D[129].length; ++j2)
        if (D[129][j2].charCodeAt(0) !== 65533) {
          e[D[129][j2]] = 33024 + j2;
          d[33024 + j2] = D[129][j2];
        }
      D[130] = "�������������������������������������������������������������������������������0123456789�������ABCDEFGHIJKLMNOPQRSTUVWXYZ�������abcdefghijklmnopqrstuvwxyz����ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん��������������".split("");
      for (j2 = 0; j2 != D[130].length; ++j2)
        if (D[130][j2].charCodeAt(0) !== 65533) {
          e[D[130][j2]] = 33280 + j2;
          d[33280 + j2] = D[130][j2];
        }
      D[131] = "����������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ�ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ��������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�����������������������������������������".split("");
      for (j2 = 0; j2 != D[131].length; ++j2)
        if (D[131][j2].charCodeAt(0) !== 65533) {
          e[D[131][j2]] = 33536 + j2;
          d[33536 + j2] = D[131][j2];
        }
      D[132] = "����������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмн�опрстуфхцчшщъыьэюя�������������─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂�����������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[132].length; ++j2)
        if (D[132][j2].charCodeAt(0) !== 65533) {
          e[D[132][j2]] = 33792 + j2;
          d[33792 + j2] = D[132][j2];
        }
      D[135] = "����������������������������������������������������������������①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�㍉㌔㌢㍍㌘㌧㌃㌶㍑㍗㌍㌦㌣㌫㍊㌻㎜㎝㎞㎎㎏㏄㎡��������㍻�〝〟№㏍℡㊤㊥㊦㊧㊨㈱㈲㈹㍾㍽㍼≒≡∫∮∑√⊥∠∟⊿∵∩∪���������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[135].length; ++j2)
        if (D[135][j2].charCodeAt(0) !== 65533) {
          e[D[135][j2]] = 34560 + j2;
          d[34560 + j2] = D[135][j2];
        }
      D[136] = "���������������������������������������������������������������������������������������������������������������������������������������������������������������亜唖娃阿哀愛挨姶逢葵茜穐悪握渥旭葦芦鯵梓圧斡扱宛姐虻飴絢綾鮎或粟袷安庵按暗案闇鞍杏以伊位依偉囲夷委威尉惟意慰易椅為畏異移維緯胃萎衣謂違遺医井亥域育郁磯一壱溢逸稲茨芋鰯允印咽員因姻引飲淫胤蔭���".split("");
      for (j2 = 0; j2 != D[136].length; ++j2)
        if (D[136][j2].charCodeAt(0) !== 65533) {
          e[D[136][j2]] = 34816 + j2;
          d[34816 + j2] = D[136][j2];
        }
      D[137] = "����������������������������������������������������������������院陰隠韻吋右宇烏羽迂雨卯鵜窺丑碓臼渦嘘唄欝蔚鰻姥厩浦瓜閏噂云運雲荏餌叡営嬰影映曳栄永泳洩瑛盈穎頴英衛詠鋭液疫益駅悦謁越閲榎厭円�園堰奄宴延怨掩援沿演炎焔煙燕猿縁艶苑薗遠鉛鴛塩於汚甥凹央奥往応押旺横欧殴王翁襖鴬鴎黄岡沖荻億屋憶臆桶牡乙俺卸恩温穏音下化仮何伽価佳加可嘉夏嫁家寡科暇果架歌河火珂禍禾稼箇花苛茄荷華菓蝦課嘩貨迦過霞蚊俄峨我牙画臥芽蛾賀雅餓駕介会解回塊壊廻快怪悔恢懐戒拐改���".split("");
      for (j2 = 0; j2 != D[137].length; ++j2)
        if (D[137][j2].charCodeAt(0) !== 65533) {
          e[D[137][j2]] = 35072 + j2;
          d[35072 + j2] = D[137][j2];
        }
      D[138] = "����������������������������������������������������������������魁晦械海灰界皆絵芥蟹開階貝凱劾外咳害崖慨概涯碍蓋街該鎧骸浬馨蛙垣柿蛎鈎劃嚇各廓拡撹格核殻獲確穫覚角赫較郭閣隔革学岳楽額顎掛笠樫�橿梶鰍潟割喝恰括活渇滑葛褐轄且鰹叶椛樺鞄株兜竃蒲釜鎌噛鴨栢茅萱粥刈苅瓦乾侃冠寒刊勘勧巻喚堪姦完官寛干幹患感慣憾換敢柑桓棺款歓汗漢澗潅環甘監看竿管簡緩缶翰肝艦莞観諌貫還鑑間閑関陥韓館舘丸含岸巌玩癌眼岩翫贋雁頑顔願企伎危喜器基奇嬉寄岐希幾忌揮机旗既期棋棄���".split("");
      for (j2 = 0; j2 != D[138].length; ++j2)
        if (D[138][j2].charCodeAt(0) !== 65533) {
          e[D[138][j2]] = 35328 + j2;
          d[35328 + j2] = D[138][j2];
        }
      D[139] = "����������������������������������������������������������������機帰毅気汽畿祈季稀紀徽規記貴起軌輝飢騎鬼亀偽儀妓宜戯技擬欺犠疑祇義蟻誼議掬菊鞠吉吃喫桔橘詰砧杵黍却客脚虐逆丘久仇休及吸宮弓急救�朽求汲泣灸球究窮笈級糾給旧牛去居巨拒拠挙渠虚許距鋸漁禦魚亨享京供侠僑兇競共凶協匡卿叫喬境峡強彊怯恐恭挟教橋況狂狭矯胸脅興蕎郷鏡響饗驚仰凝尭暁業局曲極玉桐粁僅勤均巾錦斤欣欽琴禁禽筋緊芹菌衿襟謹近金吟銀九倶句区狗玖矩苦躯駆駈駒具愚虞喰空偶寓遇隅串櫛釧屑屈���".split("");
      for (j2 = 0; j2 != D[139].length; ++j2)
        if (D[139][j2].charCodeAt(0) !== 65533) {
          e[D[139][j2]] = 35584 + j2;
          d[35584 + j2] = D[139][j2];
        }
      D[140] = "����������������������������������������������������������������掘窟沓靴轡窪熊隈粂栗繰桑鍬勲君薫訓群軍郡卦袈祁係傾刑兄啓圭珪型契形径恵慶慧憩掲携敬景桂渓畦稽系経継繋罫茎荊蛍計詣警軽頚鶏芸迎鯨�劇戟撃激隙桁傑欠決潔穴結血訣月件倹倦健兼券剣喧圏堅嫌建憲懸拳捲検権牽犬献研硯絹県肩見謙賢軒遣鍵険顕験鹸元原厳幻弦減源玄現絃舷言諺限乎個古呼固姑孤己庫弧戸故枯湖狐糊袴股胡菰虎誇跨鈷雇顧鼓五互伍午呉吾娯後御悟梧檎瑚碁語誤護醐乞鯉交佼侯候倖光公功効勾厚口向���".split("");
      for (j2 = 0; j2 != D[140].length; ++j2)
        if (D[140][j2].charCodeAt(0) !== 65533) {
          e[D[140][j2]] = 35840 + j2;
          d[35840 + j2] = D[140][j2];
        }
      D[141] = "����������������������������������������������������������������后喉坑垢好孔孝宏工巧巷幸広庚康弘恒慌抗拘控攻昂晃更杭校梗構江洪浩港溝甲皇硬稿糠紅紘絞綱耕考肯肱腔膏航荒行衡講貢購郊酵鉱砿鋼閤降�項香高鴻剛劫号合壕拷濠豪轟麹克刻告国穀酷鵠黒獄漉腰甑忽惚骨狛込此頃今困坤墾婚恨懇昏昆根梱混痕紺艮魂些佐叉唆嵯左差査沙瑳砂詐鎖裟坐座挫債催再最哉塞妻宰彩才採栽歳済災采犀砕砦祭斎細菜裁載際剤在材罪財冴坂阪堺榊肴咲崎埼碕鷺作削咋搾昨朔柵窄策索錯桜鮭笹匙冊刷���".split("");
      for (j2 = 0; j2 != D[141].length; ++j2)
        if (D[141][j2].charCodeAt(0) !== 65533) {
          e[D[141][j2]] = 36096 + j2;
          d[36096 + j2] = D[141][j2];
        }
      D[142] = "����������������������������������������������������������������察拶撮擦札殺薩雑皐鯖捌錆鮫皿晒三傘参山惨撒散桟燦珊産算纂蚕讃賛酸餐斬暫残仕仔伺使刺司史嗣四士始姉姿子屍市師志思指支孜斯施旨枝止�死氏獅祉私糸紙紫肢脂至視詞詩試誌諮資賜雌飼歯事似侍児字寺慈持時次滋治爾璽痔磁示而耳自蒔辞汐鹿式識鴫竺軸宍雫七叱執失嫉室悉湿漆疾質実蔀篠偲柴芝屡蕊縞舎写射捨赦斜煮社紗者謝車遮蛇邪借勺尺杓灼爵酌釈錫若寂弱惹主取守手朱殊狩珠種腫趣酒首儒受呪寿授樹綬需囚収周���".split("");
      for (j2 = 0; j2 != D[142].length; ++j2)
        if (D[142][j2].charCodeAt(0) !== 65533) {
          e[D[142][j2]] = 36352 + j2;
          d[36352 + j2] = D[142][j2];
        }
      D[143] = "����������������������������������������������������������������宗就州修愁拾洲秀秋終繍習臭舟蒐衆襲讐蹴輯週酋酬集醜什住充十従戎柔汁渋獣縦重銃叔夙宿淑祝縮粛塾熟出術述俊峻春瞬竣舜駿准循旬楯殉淳�準潤盾純巡遵醇順処初所暑曙渚庶緒署書薯藷諸助叙女序徐恕鋤除傷償勝匠升召哨商唱嘗奨妾娼宵将小少尚庄床廠彰承抄招掌捷昇昌昭晶松梢樟樵沼消渉湘焼焦照症省硝礁祥称章笑粧紹肖菖蒋蕉衝裳訟証詔詳象賞醤鉦鍾鐘障鞘上丈丞乗冗剰城場壌嬢常情擾条杖浄状畳穣蒸譲醸錠嘱埴飾���".split("");
      for (j2 = 0; j2 != D[143].length; ++j2)
        if (D[143][j2].charCodeAt(0) !== 65533) {
          e[D[143][j2]] = 36608 + j2;
          d[36608 + j2] = D[143][j2];
        }
      D[144] = "����������������������������������������������������������������拭植殖燭織職色触食蝕辱尻伸信侵唇娠寝審心慎振新晋森榛浸深申疹真神秦紳臣芯薪親診身辛進針震人仁刃塵壬尋甚尽腎訊迅陣靭笥諏須酢図厨�逗吹垂帥推水炊睡粋翠衰遂酔錐錘随瑞髄崇嵩数枢趨雛据杉椙菅頗雀裾澄摺寸世瀬畝是凄制勢姓征性成政整星晴棲栖正清牲生盛精聖声製西誠誓請逝醒青静斉税脆隻席惜戚斥昔析石積籍績脊責赤跡蹟碩切拙接摂折設窃節説雪絶舌蝉仙先千占宣専尖川戦扇撰栓栴泉浅洗染潜煎煽旋穿箭線���".split("");
      for (j2 = 0; j2 != D[144].length; ++j2)
        if (D[144][j2].charCodeAt(0) !== 65533) {
          e[D[144][j2]] = 36864 + j2;
          d[36864 + j2] = D[144][j2];
        }
      D[145] = "����������������������������������������������������������������繊羨腺舛船薦詮賎践選遷銭銑閃鮮前善漸然全禅繕膳糎噌塑岨措曾曽楚狙疏疎礎祖租粗素組蘇訴阻遡鼠僧創双叢倉喪壮奏爽宋層匝惣想捜掃挿掻�操早曹巣槍槽漕燥争痩相窓糟総綜聡草荘葬蒼藻装走送遭鎗霜騒像増憎臓蔵贈造促側則即息捉束測足速俗属賊族続卒袖其揃存孫尊損村遜他多太汰詑唾堕妥惰打柁舵楕陀駄騨体堆対耐岱帯待怠態戴替泰滞胎腿苔袋貸退逮隊黛鯛代台大第醍題鷹滝瀧卓啄宅托択拓沢濯琢託鐸濁諾茸凧蛸只���".split("");
      for (j2 = 0; j2 != D[145].length; ++j2)
        if (D[145][j2].charCodeAt(0) !== 65533) {
          e[D[145][j2]] = 37120 + j2;
          d[37120 + j2] = D[145][j2];
        }
      D[146] = "����������������������������������������������������������������叩但達辰奪脱巽竪辿棚谷狸鱈樽誰丹単嘆坦担探旦歎淡湛炭短端箪綻耽胆蛋誕鍛団壇弾断暖檀段男談値知地弛恥智池痴稚置致蜘遅馳築畜竹筑蓄�逐秩窒茶嫡着中仲宙忠抽昼柱注虫衷註酎鋳駐樗瀦猪苧著貯丁兆凋喋寵帖帳庁弔張彫徴懲挑暢朝潮牒町眺聴脹腸蝶調諜超跳銚長頂鳥勅捗直朕沈珍賃鎮陳津墜椎槌追鎚痛通塚栂掴槻佃漬柘辻蔦綴鍔椿潰坪壷嬬紬爪吊釣鶴亭低停偵剃貞呈堤定帝底庭廷弟悌抵挺提梯汀碇禎程締艇訂諦蹄逓���".split("");
      for (j2 = 0; j2 != D[146].length; ++j2)
        if (D[146][j2].charCodeAt(0) !== 65533) {
          e[D[146][j2]] = 37376 + j2;
          d[37376 + j2] = D[146][j2];
        }
      D[147] = "����������������������������������������������������������������邸鄭釘鼎泥摘擢敵滴的笛適鏑溺哲徹撤轍迭鉄典填天展店添纏甜貼転顛点伝殿澱田電兎吐堵塗妬屠徒斗杜渡登菟賭途都鍍砥砺努度土奴怒倒党冬�凍刀唐塔塘套宕島嶋悼投搭東桃梼棟盗淘湯涛灯燈当痘祷等答筒糖統到董蕩藤討謄豆踏逃透鐙陶頭騰闘働動同堂導憧撞洞瞳童胴萄道銅峠鴇匿得徳涜特督禿篤毒独読栃橡凸突椴届鳶苫寅酉瀞噸屯惇敦沌豚遁頓呑曇鈍奈那内乍凪薙謎灘捺鍋楢馴縄畷南楠軟難汝二尼弐迩匂賑肉虹廿日乳入���".split("");
      for (j2 = 0; j2 != D[147].length; ++j2)
        if (D[147][j2].charCodeAt(0) !== 65533) {
          e[D[147][j2]] = 37632 + j2;
          d[37632 + j2] = D[147][j2];
        }
      D[148] = "����������������������������������������������������������������如尿韮任妊忍認濡禰祢寧葱猫熱年念捻撚燃粘乃廼之埜嚢悩濃納能脳膿農覗蚤巴把播覇杷波派琶破婆罵芭馬俳廃拝排敗杯盃牌背肺輩配倍培媒梅�楳煤狽買売賠陪這蝿秤矧萩伯剥博拍柏泊白箔粕舶薄迫曝漠爆縛莫駁麦函箱硲箸肇筈櫨幡肌畑畠八鉢溌発醗髪伐罰抜筏閥鳩噺塙蛤隼伴判半反叛帆搬斑板氾汎版犯班畔繁般藩販範釆煩頒飯挽晩番盤磐蕃蛮匪卑否妃庇彼悲扉批披斐比泌疲皮碑秘緋罷肥被誹費避非飛樋簸備尾微枇毘琵眉美���".split("");
      for (j2 = 0; j2 != D[148].length; ++j2)
        if (D[148][j2].charCodeAt(0) !== 65533) {
          e[D[148][j2]] = 37888 + j2;
          d[37888 + j2] = D[148][j2];
        }
      D[149] = "����������������������������������������������������������������鼻柊稗匹疋髭彦膝菱肘弼必畢筆逼桧姫媛紐百謬俵彪標氷漂瓢票表評豹廟描病秒苗錨鋲蒜蛭鰭品彬斌浜瀕貧賓頻敏瓶不付埠夫婦富冨布府怖扶敷�斧普浮父符腐膚芙譜負賦赴阜附侮撫武舞葡蕪部封楓風葺蕗伏副復幅服福腹複覆淵弗払沸仏物鮒分吻噴墳憤扮焚奮粉糞紛雰文聞丙併兵塀幣平弊柄並蔽閉陛米頁僻壁癖碧別瞥蔑箆偏変片篇編辺返遍便勉娩弁鞭保舗鋪圃捕歩甫補輔穂募墓慕戊暮母簿菩倣俸包呆報奉宝峰峯崩庖抱捧放方朋���".split("");
      for (j2 = 0; j2 != D[149].length; ++j2)
        if (D[149][j2].charCodeAt(0) !== 65533) {
          e[D[149][j2]] = 38144 + j2;
          d[38144 + j2] = D[149][j2];
        }
      D[150] = "����������������������������������������������������������������法泡烹砲縫胞芳萌蓬蜂褒訪豊邦鋒飽鳳鵬乏亡傍剖坊妨帽忘忙房暴望某棒冒紡肪膨謀貌貿鉾防吠頬北僕卜墨撲朴牧睦穆釦勃没殆堀幌奔本翻凡盆�摩磨魔麻埋妹昧枚毎哩槙幕膜枕鮪柾鱒桝亦俣又抹末沫迄侭繭麿万慢満漫蔓味未魅巳箕岬密蜜湊蓑稔脈妙粍民眠務夢無牟矛霧鵡椋婿娘冥名命明盟迷銘鳴姪牝滅免棉綿緬面麺摸模茂妄孟毛猛盲網耗蒙儲木黙目杢勿餅尤戻籾貰問悶紋門匁也冶夜爺耶野弥矢厄役約薬訳躍靖柳薮鑓愉愈油癒���".split("");
      for (j2 = 0; j2 != D[150].length; ++j2)
        if (D[150][j2].charCodeAt(0) !== 65533) {
          e[D[150][j2]] = 38400 + j2;
          d[38400 + j2] = D[150][j2];
        }
      D[151] = "����������������������������������������������������������������諭輸唯佑優勇友宥幽悠憂揖有柚湧涌猶猷由祐裕誘遊邑郵雄融夕予余与誉輿預傭幼妖容庸揚揺擁曜楊様洋溶熔用窯羊耀葉蓉要謡踊遥陽養慾抑欲�沃浴翌翼淀羅螺裸来莱頼雷洛絡落酪乱卵嵐欄濫藍蘭覧利吏履李梨理璃痢裏裡里離陸律率立葎掠略劉流溜琉留硫粒隆竜龍侶慮旅虜了亮僚両凌寮料梁涼猟療瞭稜糧良諒遼量陵領力緑倫厘林淋燐琳臨輪隣鱗麟瑠塁涙累類令伶例冷励嶺怜玲礼苓鈴隷零霊麗齢暦歴列劣烈裂廉恋憐漣煉簾練聯���".split("");
      for (j2 = 0; j2 != D[151].length; ++j2)
        if (D[151][j2].charCodeAt(0) !== 65533) {
          e[D[151][j2]] = 38656 + j2;
          d[38656 + j2] = D[151][j2];
        }
      D[152] = "����������������������������������������������������������������蓮連錬呂魯櫓炉賂路露労婁廊弄朗楼榔浪漏牢狼篭老聾蝋郎六麓禄肋録論倭和話歪賄脇惑枠鷲亙亘鰐詫藁蕨椀湾碗腕��������������������������������������������弌丐丕个丱丶丼丿乂乖乘亂亅豫亊舒弍于亞亟亠亢亰亳亶从仍仄仆仂仗仞仭仟价伉佚估佛佝佗佇佶侈侏侘佻佩佰侑佯來侖儘俔俟俎俘俛俑俚俐俤俥倚倨倔倪倥倅伜俶倡倩倬俾俯們倆偃假會偕偐偈做偖偬偸傀傚傅傴傲���".split("");
      for (j2 = 0; j2 != D[152].length; ++j2)
        if (D[152][j2].charCodeAt(0) !== 65533) {
          e[D[152][j2]] = 38912 + j2;
          d[38912 + j2] = D[152][j2];
        }
      D[153] = "����������������������������������������������������������������僉僊傳僂僖僞僥僭僣僮價僵儉儁儂儖儕儔儚儡儺儷儼儻儿兀兒兌兔兢竸兩兪兮冀冂囘册冉冏冑冓冕冖冤冦冢冩冪冫决冱冲冰况冽凅凉凛几處凩凭�凰凵凾刄刋刔刎刧刪刮刳刹剏剄剋剌剞剔剪剴剩剳剿剽劍劔劒剱劈劑辨辧劬劭劼劵勁勍勗勞勣勦飭勠勳勵勸勹匆匈甸匍匐匏匕匚匣匯匱匳匸區卆卅丗卉卍凖卞卩卮夘卻卷厂厖厠厦厥厮厰厶參簒雙叟曼燮叮叨叭叺吁吽呀听吭吼吮吶吩吝呎咏呵咎呟呱呷呰咒呻咀呶咄咐咆哇咢咸咥咬哄哈咨���".split("");
      for (j2 = 0; j2 != D[153].length; ++j2)
        if (D[153][j2].charCodeAt(0) !== 65533) {
          e[D[153][j2]] = 39168 + j2;
          d[39168 + j2] = D[153][j2];
        }
      D[154] = "����������������������������������������������������������������咫哂咤咾咼哘哥哦唏唔哽哮哭哺哢唹啀啣啌售啜啅啖啗唸唳啝喙喀咯喊喟啻啾喘喞單啼喃喩喇喨嗚嗅嗟嗄嗜嗤嗔嘔嗷嘖嗾嗽嘛嗹噎噐營嘴嘶嘲嘸�噫噤嘯噬噪嚆嚀嚊嚠嚔嚏嚥嚮嚶嚴囂嚼囁囃囀囈囎囑囓囗囮囹圀囿圄圉圈國圍圓團圖嗇圜圦圷圸坎圻址坏坩埀垈坡坿垉垓垠垳垤垪垰埃埆埔埒埓堊埖埣堋堙堝塲堡塢塋塰毀塒堽塹墅墹墟墫墺壞墻墸墮壅壓壑壗壙壘壥壜壤壟壯壺壹壻壼壽夂夊夐夛梦夥夬夭夲夸夾竒奕奐奎奚奘奢奠奧奬奩���".split("");
      for (j2 = 0; j2 != D[154].length; ++j2)
        if (D[154][j2].charCodeAt(0) !== 65533) {
          e[D[154][j2]] = 39424 + j2;
          d[39424 + j2] = D[154][j2];
        }
      D[155] = "����������������������������������������������������������������奸妁妝佞侫妣妲姆姨姜妍姙姚娥娟娑娜娉娚婀婬婉娵娶婢婪媚媼媾嫋嫂媽嫣嫗嫦嫩嫖嫺嫻嬌嬋嬖嬲嫐嬪嬶嬾孃孅孀孑孕孚孛孥孩孰孳孵學斈孺宀�它宦宸寃寇寉寔寐寤實寢寞寥寫寰寶寳尅將專對尓尠尢尨尸尹屁屆屎屓屐屏孱屬屮乢屶屹岌岑岔妛岫岻岶岼岷峅岾峇峙峩峽峺峭嶌峪崋崕崗嵜崟崛崑崔崢崚崙崘嵌嵒嵎嵋嵬嵳嵶嶇嶄嶂嶢嶝嶬嶮嶽嶐嶷嶼巉巍巓巒巖巛巫已巵帋帚帙帑帛帶帷幄幃幀幎幗幔幟幢幤幇幵并幺麼广庠廁廂廈廐廏���".split("");
      for (j2 = 0; j2 != D[155].length; ++j2)
        if (D[155][j2].charCodeAt(0) !== 65533) {
          e[D[155][j2]] = 39680 + j2;
          d[39680 + j2] = D[155][j2];
        }
      D[156] = "����������������������������������������������������������������廖廣廝廚廛廢廡廨廩廬廱廳廰廴廸廾弃弉彝彜弋弑弖弩弭弸彁彈彌彎弯彑彖彗彙彡彭彳彷徃徂彿徊很徑徇從徙徘徠徨徭徼忖忻忤忸忱忝悳忿怡恠�怙怐怩怎怱怛怕怫怦怏怺恚恁恪恷恟恊恆恍恣恃恤恂恬恫恙悁悍惧悃悚悄悛悖悗悒悧悋惡悸惠惓悴忰悽惆悵惘慍愕愆惶惷愀惴惺愃愡惻惱愍愎慇愾愨愧慊愿愼愬愴愽慂慄慳慷慘慙慚慫慴慯慥慱慟慝慓慵憙憖憇憬憔憚憊憑憫憮懌懊應懷懈懃懆憺懋罹懍懦懣懶懺懴懿懽懼懾戀戈戉戍戌戔戛���".split("");
      for (j2 = 0; j2 != D[156].length; ++j2)
        if (D[156][j2].charCodeAt(0) !== 65533) {
          e[D[156][j2]] = 39936 + j2;
          d[39936 + j2] = D[156][j2];
        }
      D[157] = "����������������������������������������������������������������戞戡截戮戰戲戳扁扎扞扣扛扠扨扼抂抉找抒抓抖拔抃抔拗拑抻拏拿拆擔拈拜拌拊拂拇抛拉挌拮拱挧挂挈拯拵捐挾捍搜捏掖掎掀掫捶掣掏掉掟掵捫�捩掾揩揀揆揣揉插揶揄搖搴搆搓搦搶攝搗搨搏摧摯摶摎攪撕撓撥撩撈撼據擒擅擇撻擘擂擱擧舉擠擡抬擣擯攬擶擴擲擺攀擽攘攜攅攤攣攫攴攵攷收攸畋效敖敕敍敘敞敝敲數斂斃變斛斟斫斷旃旆旁旄旌旒旛旙无旡旱杲昊昃旻杳昵昶昴昜晏晄晉晁晞晝晤晧晨晟晢晰暃暈暎暉暄暘暝曁暹曉暾暼���".split("");
      for (j2 = 0; j2 != D[157].length; ++j2)
        if (D[157][j2].charCodeAt(0) !== 65533) {
          e[D[157][j2]] = 40192 + j2;
          d[40192 + j2] = D[157][j2];
        }
      D[158] = "����������������������������������������������������������������曄暸曖曚曠昿曦曩曰曵曷朏朖朞朦朧霸朮朿朶杁朸朷杆杞杠杙杣杤枉杰枩杼杪枌枋枦枡枅枷柯枴柬枳柩枸柤柞柝柢柮枹柎柆柧檜栞框栩桀桍栲桎�梳栫桙档桷桿梟梏梭梔條梛梃檮梹桴梵梠梺椏梍桾椁棊椈棘椢椦棡椌棍棔棧棕椶椒椄棗棣椥棹棠棯椨椪椚椣椡棆楹楷楜楸楫楔楾楮椹楴椽楙椰楡楞楝榁楪榲榮槐榿槁槓榾槎寨槊槝榻槃榧樮榑榠榜榕榴槞槨樂樛槿權槹槲槧樅榱樞槭樔槫樊樒櫁樣樓橄樌橲樶橸橇橢橙橦橈樸樢檐檍檠檄檢檣���".split("");
      for (j2 = 0; j2 != D[158].length; ++j2)
        if (D[158][j2].charCodeAt(0) !== 65533) {
          e[D[158][j2]] = 40448 + j2;
          d[40448 + j2] = D[158][j2];
        }
      D[159] = "����������������������������������������������������������������檗蘗檻櫃櫂檸檳檬櫞櫑櫟檪櫚櫪櫻欅蘖櫺欒欖鬱欟欸欷盜欹飮歇歃歉歐歙歔歛歟歡歸歹歿殀殄殃殍殘殕殞殤殪殫殯殲殱殳殷殼毆毋毓毟毬毫毳毯�麾氈氓气氛氤氣汞汕汢汪沂沍沚沁沛汾汨汳沒沐泄泱泓沽泗泅泝沮沱沾沺泛泯泙泪洟衍洶洫洽洸洙洵洳洒洌浣涓浤浚浹浙涎涕濤涅淹渕渊涵淇淦涸淆淬淞淌淨淒淅淺淙淤淕淪淮渭湮渮渙湲湟渾渣湫渫湶湍渟湃渺湎渤滿渝游溂溪溘滉溷滓溽溯滄溲滔滕溏溥滂溟潁漑灌滬滸滾漿滲漱滯漲滌���".split("");
      for (j2 = 0; j2 != D[159].length; ++j2)
        if (D[159][j2].charCodeAt(0) !== 65533) {
          e[D[159][j2]] = 40704 + j2;
          d[40704 + j2] = D[159][j2];
        }
      D[224] = "����������������������������������������������������������������漾漓滷澆潺潸澁澀潯潛濳潭澂潼潘澎澑濂潦澳澣澡澤澹濆澪濟濕濬濔濘濱濮濛瀉瀋濺瀑瀁瀏濾瀛瀚潴瀝瀘瀟瀰瀾瀲灑灣炙炒炯烱炬炸炳炮烟烋烝�烙焉烽焜焙煥煕熈煦煢煌煖煬熏燻熄熕熨熬燗熹熾燒燉燔燎燠燬燧燵燼燹燿爍爐爛爨爭爬爰爲爻爼爿牀牆牋牘牴牾犂犁犇犒犖犢犧犹犲狃狆狄狎狒狢狠狡狹狷倏猗猊猜猖猝猴猯猩猥猾獎獏默獗獪獨獰獸獵獻獺珈玳珎玻珀珥珮珞璢琅瑯琥珸琲琺瑕琿瑟瑙瑁瑜瑩瑰瑣瑪瑶瑾璋璞璧瓊瓏瓔珱���".split("");
      for (j2 = 0; j2 != D[224].length; ++j2)
        if (D[224][j2].charCodeAt(0) !== 65533) {
          e[D[224][j2]] = 57344 + j2;
          d[57344 + j2] = D[224][j2];
        }
      D[225] = "����������������������������������������������������������������瓠瓣瓧瓩瓮瓲瓰瓱瓸瓷甄甃甅甌甎甍甕甓甞甦甬甼畄畍畊畉畛畆畚畩畤畧畫畭畸當疆疇畴疊疉疂疔疚疝疥疣痂疳痃疵疽疸疼疱痍痊痒痙痣痞痾痿�痼瘁痰痺痲痳瘋瘍瘉瘟瘧瘠瘡瘢瘤瘴瘰瘻癇癈癆癜癘癡癢癨癩癪癧癬癰癲癶癸發皀皃皈皋皎皖皓皙皚皰皴皸皹皺盂盍盖盒盞盡盥盧盪蘯盻眈眇眄眩眤眞眥眦眛眷眸睇睚睨睫睛睥睿睾睹瞎瞋瞑瞠瞞瞰瞶瞹瞿瞼瞽瞻矇矍矗矚矜矣矮矼砌砒礦砠礪硅碎硴碆硼碚碌碣碵碪碯磑磆磋磔碾碼磅磊磬���".split("");
      for (j2 = 0; j2 != D[225].length; ++j2)
        if (D[225][j2].charCodeAt(0) !== 65533) {
          e[D[225][j2]] = 57600 + j2;
          d[57600 + j2] = D[225][j2];
        }
      D[226] = "����������������������������������������������������������������磧磚磽磴礇礒礑礙礬礫祀祠祗祟祚祕祓祺祿禊禝禧齋禪禮禳禹禺秉秕秧秬秡秣稈稍稘稙稠稟禀稱稻稾稷穃穗穉穡穢穩龝穰穹穽窈窗窕窘窖窩竈窰�窶竅竄窿邃竇竊竍竏竕竓站竚竝竡竢竦竭竰笂笏笊笆笳笘笙笞笵笨笶筐筺笄筍笋筌筅筵筥筴筧筰筱筬筮箝箘箟箍箜箚箋箒箏筝箙篋篁篌篏箴篆篝篩簑簔篦篥籠簀簇簓篳篷簗簍篶簣簧簪簟簷簫簽籌籃籔籏籀籐籘籟籤籖籥籬籵粃粐粤粭粢粫粡粨粳粲粱粮粹粽糀糅糂糘糒糜糢鬻糯糲糴糶糺紆���".split("");
      for (j2 = 0; j2 != D[226].length; ++j2)
        if (D[226][j2].charCodeAt(0) !== 65533) {
          e[D[226][j2]] = 57856 + j2;
          d[57856 + j2] = D[226][j2];
        }
      D[227] = "����������������������������������������������������������������紂紜紕紊絅絋紮紲紿紵絆絳絖絎絲絨絮絏絣經綉絛綏絽綛綺綮綣綵緇綽綫總綢綯緜綸綟綰緘緝緤緞緻緲緡縅縊縣縡縒縱縟縉縋縢繆繦縻縵縹繃縷�縲縺繧繝繖繞繙繚繹繪繩繼繻纃緕繽辮繿纈纉續纒纐纓纔纖纎纛纜缸缺罅罌罍罎罐网罕罔罘罟罠罨罩罧罸羂羆羃羈羇羌羔羞羝羚羣羯羲羹羮羶羸譱翅翆翊翕翔翡翦翩翳翹飜耆耄耋耒耘耙耜耡耨耿耻聊聆聒聘聚聟聢聨聳聲聰聶聹聽聿肄肆肅肛肓肚肭冐肬胛胥胙胝胄胚胖脉胯胱脛脩脣脯腋���".split("");
      for (j2 = 0; j2 != D[227].length; ++j2)
        if (D[227][j2].charCodeAt(0) !== 65533) {
          e[D[227][j2]] = 58112 + j2;
          d[58112 + j2] = D[227][j2];
        }
      D[228] = "����������������������������������������������������������������隋腆脾腓腑胼腱腮腥腦腴膃膈膊膀膂膠膕膤膣腟膓膩膰膵膾膸膽臀臂膺臉臍臑臙臘臈臚臟臠臧臺臻臾舁舂舅與舊舍舐舖舩舫舸舳艀艙艘艝艚艟艤�艢艨艪艫舮艱艷艸艾芍芒芫芟芻芬苡苣苟苒苴苳苺莓范苻苹苞茆苜茉苙茵茴茖茲茱荀茹荐荅茯茫茗茘莅莚莪莟莢莖茣莎莇莊荼莵荳荵莠莉莨菴萓菫菎菽萃菘萋菁菷萇菠菲萍萢萠莽萸蔆菻葭萪萼蕚蒄葷葫蒭葮蒂葩葆萬葯葹萵蓊葢蒹蒿蒟蓙蓍蒻蓚蓐蓁蓆蓖蒡蔡蓿蓴蔗蔘蔬蔟蔕蔔蓼蕀蕣蕘蕈���".split("");
      for (j2 = 0; j2 != D[228].length; ++j2)
        if (D[228][j2].charCodeAt(0) !== 65533) {
          e[D[228][j2]] = 58368 + j2;
          d[58368 + j2] = D[228][j2];
        }
      D[229] = "����������������������������������������������������������������蕁蘂蕋蕕薀薤薈薑薊薨蕭薔薛藪薇薜蕷蕾薐藉薺藏薹藐藕藝藥藜藹蘊蘓蘋藾藺蘆蘢蘚蘰蘿虍乕虔號虧虱蚓蚣蚩蚪蚋蚌蚶蚯蛄蛆蚰蛉蠣蚫蛔蛞蛩蛬�蛟蛛蛯蜒蜆蜈蜀蜃蛻蜑蜉蜍蛹蜊蜴蜿蜷蜻蜥蜩蜚蝠蝟蝸蝌蝎蝴蝗蝨蝮蝙蝓蝣蝪蠅螢螟螂螯蟋螽蟀蟐雖螫蟄螳蟇蟆螻蟯蟲蟠蠏蠍蟾蟶蟷蠎蟒蠑蠖蠕蠢蠡蠱蠶蠹蠧蠻衄衂衒衙衞衢衫袁衾袞衵衽袵衲袂袗袒袮袙袢袍袤袰袿袱裃裄裔裘裙裝裹褂裼裴裨裲褄褌褊褓襃褞褥褪褫襁襄褻褶褸襌褝襠襞���".split("");
      for (j2 = 0; j2 != D[229].length; ++j2)
        if (D[229][j2].charCodeAt(0) !== 65533) {
          e[D[229][j2]] = 58624 + j2;
          d[58624 + j2] = D[229][j2];
        }
      D[230] = "����������������������������������������������������������������襦襤襭襪襯襴襷襾覃覈覊覓覘覡覩覦覬覯覲覺覽覿觀觚觜觝觧觴觸訃訖訐訌訛訝訥訶詁詛詒詆詈詼詭詬詢誅誂誄誨誡誑誥誦誚誣諄諍諂諚諫諳諧�諤諱謔諠諢諷諞諛謌謇謚諡謖謐謗謠謳鞫謦謫謾謨譁譌譏譎證譖譛譚譫譟譬譯譴譽讀讌讎讒讓讖讙讚谺豁谿豈豌豎豐豕豢豬豸豺貂貉貅貊貍貎貔豼貘戝貭貪貽貲貳貮貶賈賁賤賣賚賽賺賻贄贅贊贇贏贍贐齎贓賍贔贖赧赭赱赳趁趙跂趾趺跏跚跖跌跛跋跪跫跟跣跼踈踉跿踝踞踐踟蹂踵踰踴蹊���".split("");
      for (j2 = 0; j2 != D[230].length; ++j2)
        if (D[230][j2].charCodeAt(0) !== 65533) {
          e[D[230][j2]] = 58880 + j2;
          d[58880 + j2] = D[230][j2];
        }
      D[231] = "����������������������������������������������������������������蹇蹉蹌蹐蹈蹙蹤蹠踪蹣蹕蹶蹲蹼躁躇躅躄躋躊躓躑躔躙躪躡躬躰軆躱躾軅軈軋軛軣軼軻軫軾輊輅輕輒輙輓輜輟輛輌輦輳輻輹轅轂輾轌轉轆轎轗轜�轢轣轤辜辟辣辭辯辷迚迥迢迪迯邇迴逅迹迺逑逕逡逍逞逖逋逧逶逵逹迸遏遐遑遒逎遉逾遖遘遞遨遯遶隨遲邂遽邁邀邊邉邏邨邯邱邵郢郤扈郛鄂鄒鄙鄲鄰酊酖酘酣酥酩酳酲醋醉醂醢醫醯醪醵醴醺釀釁釉釋釐釖釟釡釛釼釵釶鈞釿鈔鈬鈕鈑鉞鉗鉅鉉鉤鉈銕鈿鉋鉐銜銖銓銛鉚鋏銹銷鋩錏鋺鍄錮���".split("");
      for (j2 = 0; j2 != D[231].length; ++j2)
        if (D[231][j2].charCodeAt(0) !== 65533) {
          e[D[231][j2]] = 59136 + j2;
          d[59136 + j2] = D[231][j2];
        }
      D[232] = "����������������������������������������������������������������錙錢錚錣錺錵錻鍜鍠鍼鍮鍖鎰鎬鎭鎔鎹鏖鏗鏨鏥鏘鏃鏝鏐鏈鏤鐚鐔鐓鐃鐇鐐鐶鐫鐵鐡鐺鑁鑒鑄鑛鑠鑢鑞鑪鈩鑰鑵鑷鑽鑚鑼鑾钁鑿閂閇閊閔閖閘閙�閠閨閧閭閼閻閹閾闊濶闃闍闌闕闔闖關闡闥闢阡阨阮阯陂陌陏陋陷陜陞陝陟陦陲陬隍隘隕隗險隧隱隲隰隴隶隸隹雎雋雉雍襍雜霍雕雹霄霆霈霓霎霑霏霖霙霤霪霰霹霽霾靄靆靈靂靉靜靠靤靦靨勒靫靱靹鞅靼鞁靺鞆鞋鞏鞐鞜鞨鞦鞣鞳鞴韃韆韈韋韜韭齏韲竟韶韵頏頌頸頤頡頷頽顆顏顋顫顯顰���".split("");
      for (j2 = 0; j2 != D[232].length; ++j2)
        if (D[232][j2].charCodeAt(0) !== 65533) {
          e[D[232][j2]] = 59392 + j2;
          d[59392 + j2] = D[232][j2];
        }
      D[233] = "����������������������������������������������������������������顱顴顳颪颯颱颶飄飃飆飩飫餃餉餒餔餘餡餝餞餤餠餬餮餽餾饂饉饅饐饋饑饒饌饕馗馘馥馭馮馼駟駛駝駘駑駭駮駱駲駻駸騁騏騅駢騙騫騷驅驂驀驃�騾驕驍驛驗驟驢驥驤驩驫驪骭骰骼髀髏髑髓體髞髟髢髣髦髯髫髮髴髱髷髻鬆鬘鬚鬟鬢鬣鬥鬧鬨鬩鬪鬮鬯鬲魄魃魏魍魎魑魘魴鮓鮃鮑鮖鮗鮟鮠鮨鮴鯀鯊鮹鯆鯏鯑鯒鯣鯢鯤鯔鯡鰺鯲鯱鯰鰕鰔鰉鰓鰌鰆鰈鰒鰊鰄鰮鰛鰥鰤鰡鰰鱇鰲鱆鰾鱚鱠鱧鱶鱸鳧鳬鳰鴉鴈鳫鴃鴆鴪鴦鶯鴣鴟鵄鴕鴒鵁鴿鴾鵆鵈���".split("");
      for (j2 = 0; j2 != D[233].length; ++j2)
        if (D[233][j2].charCodeAt(0) !== 65533) {
          e[D[233][j2]] = 59648 + j2;
          d[59648 + j2] = D[233][j2];
        }
      D[234] = "����������������������������������������������������������������鵝鵞鵤鵑鵐鵙鵲鶉鶇鶫鵯鵺鶚鶤鶩鶲鷄鷁鶻鶸鶺鷆鷏鷂鷙鷓鷸鷦鷭鷯鷽鸚鸛鸞鹵鹹鹽麁麈麋麌麒麕麑麝麥麩麸麪麭靡黌黎黏黐黔黜點黝黠黥黨黯�黴黶黷黹黻黼黽鼇鼈皷鼕鼡鼬鼾齊齒齔齣齟齠齡齦齧齬齪齷齲齶龕龜龠堯槇遙瑤凜熙�������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[234].length; ++j2)
        if (D[234][j2].charCodeAt(0) !== 65533) {
          e[D[234][j2]] = 59904 + j2;
          d[59904 + j2] = D[234][j2];
        }
      D[237] = "����������������������������������������������������������������纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏�塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱���".split("");
      for (j2 = 0; j2 != D[237].length; ++j2)
        if (D[237][j2].charCodeAt(0) !== 65533) {
          e[D[237][j2]] = 60672 + j2;
          d[60672 + j2] = D[237][j2];
        }
      D[238] = "����������������������������������������������������������������犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙�蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑��ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ¬¦'"���".split("");
      for (j2 = 0; j2 != D[238].length; ++j2)
        if (D[238][j2].charCodeAt(0) !== 65533) {
          e[D[238][j2]] = 60928 + j2;
          d[60928 + j2] = D[238][j2];
        }
      D[250] = "����������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ¬¦'"㈱№℡∵纊褜鍈銈蓜俉炻昱棈鋹曻彅丨仡仼伀伃伹佖侒侊侚侔俍偀倢俿倞偆偰偂傔僴僘兊�兤冝冾凬刕劜劦勀勛匀匇匤卲厓厲叝﨎咜咊咩哿喆坙坥垬埈埇﨏塚增墲夋奓奛奝奣妤妺孖寀甯寘寬尞岦岺峵崧嵓﨑嵂嵭嶸嶹巐弡弴彧德忞恝悅悊惞惕愠惲愑愷愰憘戓抦揵摠撝擎敎昀昕昻昉昮昞昤晥晗晙晴晳暙暠暲暿曺朎朗杦枻桒柀栁桄棏﨓楨﨔榘槢樰橫橆橳橾櫢櫤毖氿汜沆汯泚洄涇浯���".split("");
      for (j2 = 0; j2 != D[250].length; ++j2)
        if (D[250][j2].charCodeAt(0) !== 65533) {
          e[D[250][j2]] = 64e3 + j2;
          d[64e3 + j2] = D[250][j2];
        }
      D[251] = "����������������������������������������������������������������涖涬淏淸淲淼渹湜渧渼溿澈澵濵瀅瀇瀨炅炫焏焄煜煆煇凞燁燾犱犾猤猪獷玽珉珖珣珒琇珵琦琪琩琮瑢璉璟甁畯皂皜皞皛皦益睆劯砡硎硤硺礰礼神�祥禔福禛竑竧靖竫箞精絈絜綷綠緖繒罇羡羽茁荢荿菇菶葈蒴蕓蕙蕫﨟薰蘒﨡蠇裵訒訷詹誧誾諟諸諶譓譿賰賴贒赶﨣軏﨤逸遧郞都鄕鄧釚釗釞釭釮釤釥鈆鈐鈊鈺鉀鈼鉎鉙鉑鈹鉧銧鉷鉸鋧鋗鋙鋐﨧鋕鋠鋓錥錡鋻﨨錞鋿錝錂鍰鍗鎤鏆鏞鏸鐱鑅鑈閒隆﨩隝隯霳霻靃靍靏靑靕顗顥飯飼餧館馞驎髙���".split("");
      for (j2 = 0; j2 != D[251].length; ++j2)
        if (D[251][j2].charCodeAt(0) !== 65533) {
          e[D[251][j2]] = 64256 + j2;
          d[64256 + j2] = D[251][j2];
        }
      D[252] = "����������������������������������������������������������������髜魵魲鮏鮱鮻鰀鵰鵫鶴鸙黑������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[252].length; ++j2)
        if (D[252][j2].charCodeAt(0) !== 65533) {
          e[D[252][j2]] = 64512 + j2;
          d[64512 + j2] = D[252][j2];
        }
      return { "enc": e, "dec": d };
    }();
    cptable2[936] = function() {
      var d = [], e = {}, D = [], j2;
      D[0] = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�������������������������������������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[0].length; ++j2)
        if (D[0][j2].charCodeAt(0) !== 65533) {
          e[D[0][j2]] = 0 + j2;
          d[0 + j2] = D[0][j2];
        }
      D[129] = "����������������������������������������������������������������丂丄丅丆丏丒丗丟丠両丣並丩丮丯丱丳丵丷丼乀乁乂乄乆乊乑乕乗乚乛乢乣乤乥乧乨乪乫乬乭乮乯乲乴乵乶乷乸乹乺乻乼乽乿亀亁亂亃亄亅亇亊�亐亖亗亙亜亝亞亣亪亯亰亱亴亶亷亸亹亼亽亾仈仌仏仐仒仚仛仜仠仢仦仧仩仭仮仯仱仴仸仹仺仼仾伀伂伃伄伅伆伇伈伋伌伒伓伔伕伖伜伝伡伣伨伩伬伭伮伱伳伵伷伹伻伾伿佀佁佂佄佅佇佈佉佊佋佌佒佔佖佡佢佦佨佪佫佭佮佱佲併佷佸佹佺佽侀侁侂侅來侇侊侌侎侐侒侓侕侖侘侙侚侜侞侟価侢�".split("");
      for (j2 = 0; j2 != D[129].length; ++j2)
        if (D[129][j2].charCodeAt(0) !== 65533) {
          e[D[129][j2]] = 33024 + j2;
          d[33024 + j2] = D[129][j2];
        }
      D[130] = "����������������������������������������������������������������侤侫侭侰侱侲侳侴侶侷侸侹侺侻侼侽侾俀俁係俆俇俈俉俋俌俍俒俓俔俕俖俙俛俠俢俤俥俧俫俬俰俲俴俵俶俷俹俻俼俽俿倀倁倂倃倄倅倆倇倈倉倊�個倎倐們倓倕倖倗倛倝倞倠倢倣値倧倫倯倰倱倲倳倴倵倶倷倸倹倻倽倿偀偁偂偄偅偆偉偊偋偍偐偑偒偓偔偖偗偘偙偛偝偞偟偠偡偢偣偤偦偧偨偩偪偫偭偮偯偰偱偲偳側偵偸偹偺偼偽傁傂傃傄傆傇傉傊傋傌傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟傠傡傢傤傦傪傫傭傮傯傰傱傳傴債傶傷傸傹傼�".split("");
      for (j2 = 0; j2 != D[130].length; ++j2)
        if (D[130][j2].charCodeAt(0) !== 65533) {
          e[D[130][j2]] = 33280 + j2;
          d[33280 + j2] = D[130][j2];
        }
      D[131] = "����������������������������������������������������������������傽傾傿僀僁僂僃僄僅僆僇僈僉僊僋僌働僎僐僑僒僓僔僕僗僘僙僛僜僝僞僟僠僡僢僣僤僥僨僩僪僫僯僰僱僲僴僶僷僸價僺僼僽僾僿儀儁儂儃億儅儈�儉儊儌儍儎儏儐儑儓儔儕儖儗儘儙儚儛儜儝儞償儠儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾兂兇兊兌兎兏児兒兓兗兘兙兛兝兞兟兠兡兣兤兦內兩兪兯兲兺兾兿冃冄円冇冊冋冎冏冐冑冓冔冘冚冝冞冟冡冣冦冧冨冩冪冭冮冴冸冹冺冾冿凁凂凃凅凈凊凍凎凐凒凓凔凕凖凗�".split("");
      for (j2 = 0; j2 != D[131].length; ++j2)
        if (D[131][j2].charCodeAt(0) !== 65533) {
          e[D[131][j2]] = 33536 + j2;
          d[33536 + j2] = D[131][j2];
        }
      D[132] = "����������������������������������������������������������������凘凙凚凜凞凟凢凣凥処凧凨凩凪凬凮凱凲凴凷凾刄刅刉刋刌刏刐刓刔刕刜刞刟刡刢刣別刦刧刪刬刯刱刲刴刵刼刾剄剅剆則剈剉剋剎剏剒剓剕剗剘�剙剚剛剝剟剠剢剣剤剦剨剫剬剭剮剰剱剳剴創剶剷剸剹剺剻剼剾劀劃劄劅劆劇劉劊劋劌劍劎劏劑劒劔劕劖劗劘劙劚劜劤劥劦劧劮劯劰労劵劶劷劸効劺劻劼劽勀勁勂勄勅勆勈勊勌勍勎勏勑勓勔動勗務勚勛勜勝勞勠勡勢勣勥勦勧勨勩勪勫勬勭勮勯勱勲勳勴勵勶勷勸勻勼勽匁匂匃匄匇匉匊匋匌匎�".split("");
      for (j2 = 0; j2 != D[132].length; ++j2)
        if (D[132][j2].charCodeAt(0) !== 65533) {
          e[D[132][j2]] = 33792 + j2;
          d[33792 + j2] = D[132][j2];
        }
      D[133] = "����������������������������������������������������������������匑匒匓匔匘匛匜匞匟匢匤匥匧匨匩匫匬匭匯匰匱匲匳匴匵匶匷匸匼匽區卂卄卆卋卌卍卐協単卙卛卝卥卨卪卬卭卲卶卹卻卼卽卾厀厁厃厇厈厊厎厏�厐厑厒厓厔厖厗厙厛厜厞厠厡厤厧厪厫厬厭厯厰厱厲厳厴厵厷厸厹厺厼厽厾叀參叄叅叆叇収叏叐叒叓叕叚叜叝叞叡叢叧叴叺叾叿吀吂吅吇吋吔吘吙吚吜吢吤吥吪吰吳吶吷吺吽吿呁呂呄呅呇呉呌呍呎呏呑呚呝呞呟呠呡呣呥呧呩呪呫呬呭呮呯呰呴呹呺呾呿咁咃咅咇咈咉咊咍咑咓咗咘咜咞咟咠咡�".split("");
      for (j2 = 0; j2 != D[133].length; ++j2)
        if (D[133][j2].charCodeAt(0) !== 65533) {
          e[D[133][j2]] = 34048 + j2;
          d[34048 + j2] = D[133][j2];
        }
      D[134] = "����������������������������������������������������������������咢咥咮咰咲咵咶咷咹咺咼咾哃哅哊哋哖哘哛哠員哢哣哤哫哬哯哰哱哴哵哶哷哸哹哻哾唀唂唃唄唅唈唊唋唌唍唎唒唓唕唖唗唘唙唚唜唝唞唟唡唥唦�唨唩唫唭唲唴唵唶唸唹唺唻唽啀啂啅啇啈啋啌啍啎問啑啒啓啔啗啘啙啚啛啝啞啟啠啢啣啨啩啫啯啰啱啲啳啴啹啺啽啿喅喆喌喍喎喐喒喓喕喖喗喚喛喞喠喡喢喣喤喥喦喨喩喪喫喬喭單喯喰喲喴営喸喺喼喿嗀嗁嗂嗃嗆嗇嗈嗊嗋嗎嗏嗐嗕嗗嗘嗙嗚嗛嗞嗠嗢嗧嗩嗭嗮嗰嗱嗴嗶嗸嗹嗺嗻嗼嗿嘂嘃嘄嘅�".split("");
      for (j2 = 0; j2 != D[134].length; ++j2)
        if (D[134][j2].charCodeAt(0) !== 65533) {
          e[D[134][j2]] = 34304 + j2;
          d[34304 + j2] = D[134][j2];
        }
      D[135] = "����������������������������������������������������������������嘆嘇嘊嘋嘍嘐嘑嘒嘓嘔嘕嘖嘗嘙嘚嘜嘝嘠嘡嘢嘥嘦嘨嘩嘪嘫嘮嘯嘰嘳嘵嘷嘸嘺嘼嘽嘾噀噁噂噃噄噅噆噇噈噉噊噋噏噐噑噒噓噕噖噚噛噝噞噟噠噡�噣噥噦噧噭噮噯噰噲噳噴噵噷噸噹噺噽噾噿嚀嚁嚂嚃嚄嚇嚈嚉嚊嚋嚌嚍嚐嚑嚒嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟嚠嚡嚢嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚰嚱嚲嚳嚴嚵嚶嚸嚹嚺嚻嚽嚾嚿囀囁囂囃囄囅囆囇囈囉囋囌囍囎囏囐囑囒囓囕囖囘囙囜団囥囦囧囨囩囪囬囮囯囲図囶囷囸囻囼圀圁圂圅圇國圌圍圎圏圐圑�".split("");
      for (j2 = 0; j2 != D[135].length; ++j2)
        if (D[135][j2].charCodeAt(0) !== 65533) {
          e[D[135][j2]] = 34560 + j2;
          d[34560 + j2] = D[135][j2];
        }
      D[136] = "����������������������������������������������������������������園圓圔圕圖圗團圙圚圛圝圞圠圡圢圤圥圦圧圫圱圲圴圵圶圷圸圼圽圿坁坃坄坅坆坈坉坋坒坓坔坕坖坘坙坢坣坥坧坬坮坰坱坲坴坵坸坹坺坽坾坿垀�垁垇垈垉垊垍垎垏垐垑垔垕垖垗垘垙垚垜垝垞垟垥垨垪垬垯垰垱垳垵垶垷垹垺垻垼垽垾垿埀埁埄埅埆埇埈埉埊埌埍埐埑埓埖埗埛埜埞埡埢埣埥埦埧埨埩埪埫埬埮埰埱埲埳埵埶執埻埼埾埿堁堃堄堅堈堉堊堌堎堏堐堒堓堔堖堗堘堚堛堜堝堟堢堣堥堦堧堨堩堫堬堭堮堯報堲堳場堶堷堸堹堺堻堼堽�".split("");
      for (j2 = 0; j2 != D[136].length; ++j2)
        if (D[136][j2].charCodeAt(0) !== 65533) {
          e[D[136][j2]] = 34816 + j2;
          d[34816 + j2] = D[136][j2];
        }
      D[137] = "����������������������������������������������������������������堾堿塀塁塂塃塅塆塇塈塉塊塋塎塏塐塒塓塕塖塗塙塚塛塜塝塟塠塡塢塣塤塦塧塨塩塪塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塿墂墄墆墇墈墊墋墌�墍墎墏墐墑墔墕墖増墘墛墜墝墠墡墢墣墤墥墦墧墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墽墾墿壀壂壃壄壆壇壈壉壊壋壌壍壎壏壐壒壓壔壖壗壘壙壚壛壜壝壞壟壠壡壢壣壥壦壧壨壩壪壭壯壱売壴壵壷壸壺壻壼壽壾壿夀夁夃夅夆夈変夊夋夌夎夐夑夒夓夗夘夛夝夞夠夡夢夣夦夨夬夰夲夳夵夶夻�".split("");
      for (j2 = 0; j2 != D[137].length; ++j2)
        if (D[137][j2].charCodeAt(0) !== 65533) {
          e[D[137][j2]] = 35072 + j2;
          d[35072 + j2] = D[137][j2];
        }
      D[138] = "����������������������������������������������������������������夽夾夿奀奃奅奆奊奌奍奐奒奓奙奛奜奝奞奟奡奣奤奦奧奨奩奪奫奬奭奮奯奰奱奲奵奷奺奻奼奾奿妀妅妉妋妌妎妏妐妑妔妕妘妚妛妜妝妟妠妡妢妦�妧妬妭妰妱妳妴妵妶妷妸妺妼妽妿姀姁姂姃姄姅姇姈姉姌姍姎姏姕姖姙姛姞姟姠姡姢姤姦姧姩姪姫姭姮姯姰姱姲姳姴姵姶姷姸姺姼姽姾娀娂娊娋娍娎娏娐娒娔娕娖娗娙娚娛娝娞娡娢娤娦娧娨娪娫娬娭娮娯娰娳娵娷娸娹娺娻娽娾娿婁婂婃婄婅婇婈婋婌婍婎婏婐婑婒婓婔婖婗婘婙婛婜婝婞婟婠�".split("");
      for (j2 = 0; j2 != D[138].length; ++j2)
        if (D[138][j2].charCodeAt(0) !== 65533) {
          e[D[138][j2]] = 35328 + j2;
          d[35328 + j2] = D[138][j2];
        }
      D[139] = "����������������������������������������������������������������婡婣婤婥婦婨婩婫婬婭婮婯婰婱婲婳婸婹婻婼婽婾媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媓媔媕媖媗媘媙媜媝媞媟媠媡媢媣媤媥媦媧媨媩媫媬�媭媮媯媰媱媴媶媷媹媺媻媼媽媿嫀嫃嫄嫅嫆嫇嫈嫊嫋嫍嫎嫏嫐嫑嫓嫕嫗嫙嫚嫛嫝嫞嫟嫢嫤嫥嫧嫨嫪嫬嫭嫮嫯嫰嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿嬀嬁嬂嬃嬄嬅嬆嬇嬈嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬘嬙嬚嬛嬜嬝嬞嬟嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬳嬵嬶嬸嬹嬺嬻嬼嬽嬾嬿孁孂孃孄孅孆孇�".split("");
      for (j2 = 0; j2 != D[139].length; ++j2)
        if (D[139][j2].charCodeAt(0) !== 65533) {
          e[D[139][j2]] = 35584 + j2;
          d[35584 + j2] = D[139][j2];
        }
      D[140] = "����������������������������������������������������������������孈孉孊孋孌孍孎孏孒孖孞孠孡孧孨孫孭孮孯孲孴孶孷學孹孻孼孾孿宂宆宊宍宎宐宑宒宔宖実宧宨宩宬宭宮宯宱宲宷宺宻宼寀寁寃寈寉寊寋寍寎寏�寑寔寕寖寗寘寙寚寛寜寠寢寣實寧審寪寫寬寭寯寱寲寳寴寵寶寷寽対尀専尃尅將專尋尌對導尐尒尓尗尙尛尞尟尠尡尣尦尨尩尪尫尭尮尯尰尲尳尵尶尷屃屄屆屇屌屍屒屓屔屖屗屘屚屛屜屝屟屢層屧屨屩屪屫屬屭屰屲屳屴屵屶屷屸屻屼屽屾岀岃岄岅岆岇岉岊岋岎岏岒岓岕岝岞岟岠岡岤岥岦岧岨�".split("");
      for (j2 = 0; j2 != D[140].length; ++j2)
        if (D[140][j2].charCodeAt(0) !== 65533) {
          e[D[140][j2]] = 35840 + j2;
          d[35840 + j2] = D[140][j2];
        }
      D[141] = "����������������������������������������������������������������岪岮岯岰岲岴岶岹岺岻岼岾峀峂峃峅峆峇峈峉峊峌峍峎峏峐峑峓峔峕峖峗峘峚峛峜峝峞峟峠峢峣峧峩峫峬峮峯峱峲峳峴峵島峷峸峹峺峼峽峾峿崀�崁崄崅崈崉崊崋崌崍崏崐崑崒崓崕崗崘崙崚崜崝崟崠崡崢崣崥崨崪崫崬崯崰崱崲崳崵崶崷崸崹崺崻崼崿嵀嵁嵂嵃嵄嵅嵆嵈嵉嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵙嵚嵜嵞嵟嵠嵡嵢嵣嵤嵥嵦嵧嵨嵪嵭嵮嵰嵱嵲嵳嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿嶀嶁嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶚嶛嶜嶞嶟嶠�".split("");
      for (j2 = 0; j2 != D[141].length; ++j2)
        if (D[141][j2].charCodeAt(0) !== 65533) {
          e[D[141][j2]] = 36096 + j2;
          d[36096 + j2] = D[141][j2];
        }
      D[142] = "����������������������������������������������������������������嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶸嶹嶺嶻嶼嶽嶾嶿巀巁巂巃巄巆巇巈巉巊巋巌巎巏巐巑巒巓巔巕巖巗巘巙巚巜巟巠巣巤巪巬巭�巰巵巶巸巹巺巻巼巿帀帄帇帉帊帋帍帎帒帓帗帞帟帠帡帢帣帤帥帨帩帪師帬帯帰帲帳帴帵帶帹帺帾帿幀幁幃幆幇幈幉幊幋幍幎幏幐幑幒幓幖幗幘幙幚幜幝幟幠幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱幵幷幹幾庁庂広庅庈庉庌庍庎庒庘庛庝庡庢庣庤庨庩庪庫庬庮庯庰庱庲庴庺庻庼庽庿廀廁廂廃廄廅�".split("");
      for (j2 = 0; j2 != D[142].length; ++j2)
        if (D[142][j2].charCodeAt(0) !== 65533) {
          e[D[142][j2]] = 36352 + j2;
          d[36352 + j2] = D[142][j2];
        }
      D[143] = "����������������������������������������������������������������廆廇廈廋廌廍廎廏廐廔廕廗廘廙廚廜廝廞廟廠廡廢廣廤廥廦廧廩廫廬廭廮廯廰廱廲廳廵廸廹廻廼廽弅弆弇弉弌弍弎弐弒弔弖弙弚弜弝弞弡弢弣弤�弨弫弬弮弰弲弳弴張弶強弸弻弽弾弿彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彑彔彙彚彛彜彞彟彠彣彥彧彨彫彮彯彲彴彵彶彸彺彽彾彿徃徆徍徎徏徑従徔徖徚徛徝從徟徠徢徣徤徥徦徧復徫徬徯徰徱徲徳徴徶徸徹徺徻徾徿忀忁忂忇忈忊忋忎忓忔忕忚忛応忞忟忢忣忥忦忨忩忬忯忰忲忳忴忶忷忹忺忼怇�".split("");
      for (j2 = 0; j2 != D[143].length; ++j2)
        if (D[143][j2].charCodeAt(0) !== 65533) {
          e[D[143][j2]] = 36608 + j2;
          d[36608 + j2] = D[143][j2];
        }
      D[144] = "����������������������������������������������������������������怈怉怋怌怐怑怓怗怘怚怞怟怢怣怤怬怭怮怰怱怲怳怴怶怷怸怹怺怽怾恀恄恅恆恇恈恉恊恌恎恏恑恓恔恖恗恘恛恜恞恟恠恡恥恦恮恱恲恴恵恷恾悀�悁悂悅悆悇悈悊悋悎悏悐悑悓悕悗悘悙悜悞悡悢悤悥悧悩悪悮悰悳悵悶悷悹悺悽悾悿惀惁惂惃惄惇惈惉惌惍惎惏惐惒惓惔惖惗惙惛惞惡惢惣惤惥惪惱惲惵惷惸惻惼惽惾惿愂愃愄愅愇愊愋愌愐愑愒愓愔愖愗愘愙愛愜愝愞愡愢愥愨愩愪愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾慀慁慂慃慄慅慆�".split("");
      for (j2 = 0; j2 != D[144].length; ++j2)
        if (D[144][j2].charCodeAt(0) !== 65533) {
          e[D[144][j2]] = 36864 + j2;
          d[36864 + j2] = D[144][j2];
        }
      D[145] = "����������������������������������������������������������������慇慉態慍慏慐慒慓慔慖慗慘慙慚慛慜慞慟慠慡慣慤慥慦慩慪慫慬慭慮慯慱慲慳慴慶慸慹慺慻慼慽慾慿憀憁憂憃憄憅憆憇憈憉憊憌憍憏憐憑憒憓憕�憖憗憘憙憚憛憜憞憟憠憡憢憣憤憥憦憪憫憭憮憯憰憱憲憳憴憵憶憸憹憺憻憼憽憿懀懁懃懄懅懆懇應懌懍懎懏懐懓懕懖懗懘懙懚懛懜懝懞懟懠懡懢懣懤懥懧懨懩懪懫懬懭懮懯懰懱懲懳懴懶懷懸懹懺懻懼懽懾戀戁戂戃戄戅戇戉戓戔戙戜戝戞戠戣戦戧戨戩戫戭戯戰戱戲戵戶戸戹戺戻戼扂扄扅扆扊�".split("");
      for (j2 = 0; j2 != D[145].length; ++j2)
        if (D[145][j2].charCodeAt(0) !== 65533) {
          e[D[145][j2]] = 37120 + j2;
          d[37120 + j2] = D[145][j2];
        }
      D[146] = "����������������������������������������������������������������扏扐払扖扗扙扚扜扝扞扟扠扡扢扤扥扨扱扲扴扵扷扸扺扻扽抁抂抃抅抆抇抈抋抌抍抎抏抐抔抙抜抝択抣抦抧抩抪抭抮抯抰抲抳抴抶抷抸抺抾拀拁�拃拋拏拑拕拝拞拠拡拤拪拫拰拲拵拸拹拺拻挀挃挄挅挆挊挋挌挍挏挐挒挓挔挕挗挘挙挜挦挧挩挬挭挮挰挱挳挴挵挶挷挸挻挼挾挿捀捁捄捇捈捊捑捒捓捔捖捗捘捙捚捛捜捝捠捤捥捦捨捪捫捬捯捰捲捳捴捵捸捹捼捽捾捿掁掃掄掅掆掋掍掑掓掔掕掗掙掚掛掜掝掞掟採掤掦掫掯掱掲掵掶掹掻掽掿揀�".split("");
      for (j2 = 0; j2 != D[146].length; ++j2)
        if (D[146][j2].charCodeAt(0) !== 65533) {
          e[D[146][j2]] = 37376 + j2;
          d[37376 + j2] = D[146][j2];
        }
      D[147] = "����������������������������������������������������������������揁揂揃揅揇揈揊揋揌揑揓揔揕揗揘揙揚換揜揝揟揢揤揥揦揧揨揫揬揮揯揰揱揳揵揷揹揺揻揼揾搃搄搆搇搈搉搊損搎搑搒搕搖搗搘搙搚搝搟搢搣搤�搥搧搨搩搫搮搯搰搱搲搳搵搶搷搸搹搻搼搾摀摂摃摉摋摌摍摎摏摐摑摓摕摖摗摙摚摛摜摝摟摠摡摢摣摤摥摦摨摪摫摬摮摯摰摱摲摳摴摵摶摷摻摼摽摾摿撀撁撃撆撈撉撊撋撌撍撎撏撐撓撔撗撘撚撛撜撝撟撠撡撢撣撥撦撧撨撪撫撯撱撲撳撴撶撹撻撽撾撿擁擃擄擆擇擈擉擊擋擌擏擑擓擔擕擖擙據�".split("");
      for (j2 = 0; j2 != D[147].length; ++j2)
        if (D[147][j2].charCodeAt(0) !== 65533) {
          e[D[147][j2]] = 37632 + j2;
          d[37632 + j2] = D[147][j2];
        }
      D[148] = "����������������������������������������������������������������擛擜擝擟擠擡擣擥擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿攁攂攃攄攅攆攇攈攊攋攌攍攎攏攐攑攓攔攕攖攗攙攚攛攜攝攞攟攠攡�攢攣攤攦攧攨攩攪攬攭攰攱攲攳攷攺攼攽敀敁敂敃敄敆敇敊敋敍敎敐敒敓敔敗敘敚敜敟敠敡敤敥敧敨敩敪敭敮敯敱敳敵敶數敹敺敻敼敽敾敿斀斁斂斃斄斅斆斈斉斊斍斎斏斒斔斕斖斘斚斝斞斠斢斣斦斨斪斬斮斱斲斳斴斵斶斷斸斺斻斾斿旀旂旇旈旉旊旍旐旑旓旔旕旘旙旚旛旜旝旞旟旡旣旤旪旫�".split("");
      for (j2 = 0; j2 != D[148].length; ++j2)
        if (D[148][j2].charCodeAt(0) !== 65533) {
          e[D[148][j2]] = 37888 + j2;
          d[37888 + j2] = D[148][j2];
        }
      D[149] = "����������������������������������������������������������������旲旳旴旵旸旹旻旼旽旾旿昁昄昅昇昈昉昋昍昐昑昒昖昗昘昚昛昜昞昡昢昣昤昦昩昪昫昬昮昰昲昳昷昸昹昺昻昽昿晀時晄晅晆晇晈晉晊晍晎晐晑晘�晙晛晜晝晞晠晢晣晥晧晩晪晫晬晭晱晲晳晵晸晹晻晼晽晿暀暁暃暅暆暈暉暊暋暍暎暏暐暒暓暔暕暘暙暚暛暜暞暟暠暡暢暣暤暥暦暩暪暫暬暭暯暰暱暲暳暵暶暷暸暺暻暼暽暿曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曚曞曟曠曡曢曣曤曥曧曨曪曫曬曭曮曯曱曵曶書曺曻曽朁朂會�".split("");
      for (j2 = 0; j2 != D[149].length; ++j2)
        if (D[149][j2].charCodeAt(0) !== 65533) {
          e[D[149][j2]] = 38144 + j2;
          d[38144 + j2] = D[149][j2];
        }
      D[150] = "����������������������������������������������������������������朄朅朆朇朌朎朏朑朒朓朖朘朙朚朜朞朠朡朢朣朤朥朧朩朮朰朲朳朶朷朸朹朻朼朾朿杁杄杅杇杊杋杍杒杔杕杗杘杙杚杛杝杢杣杤杦杧杫杬杮東杴杶�杸杹杺杻杽枀枂枃枅枆枈枊枌枍枎枏枑枒枓枔枖枙枛枟枠枡枤枦枩枬枮枱枲枴枹枺枻枼枽枾枿柀柂柅柆柇柈柉柊柋柌柍柎柕柖柗柛柟柡柣柤柦柧柨柪柫柭柮柲柵柶柷柸柹柺査柼柾栁栂栃栄栆栍栐栒栔栕栘栙栚栛栜栞栟栠栢栣栤栥栦栧栨栫栬栭栮栯栰栱栴栵栶栺栻栿桇桋桍桏桒桖桗桘桙桚桛�".split("");
      for (j2 = 0; j2 != D[150].length; ++j2)
        if (D[150][j2].charCodeAt(0) !== 65533) {
          e[D[150][j2]] = 38400 + j2;
          d[38400 + j2] = D[150][j2];
        }
      D[151] = "����������������������������������������������������������������桜桝桞桟桪桬桭桮桯桰桱桲桳桵桸桹桺桻桼桽桾桿梀梂梄梇梈梉梊梋梌梍梎梐梑梒梔梕梖梘梙梚梛梜條梞梟梠梡梣梤梥梩梪梫梬梮梱梲梴梶梷梸�梹梺梻梼梽梾梿棁棃棄棅棆棇棈棊棌棎棏棐棑棓棔棖棗棙棛棜棝棞棟棡棢棤棥棦棧棨棩棪棫棬棭棯棲棳棴棶棷棸棻棽棾棿椀椂椃椄椆椇椈椉椊椌椏椑椓椔椕椖椗椘椙椚椛検椝椞椡椢椣椥椦椧椨椩椪椫椬椮椯椱椲椳椵椶椷椸椺椻椼椾楀楁楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楕楖楘楙楛楜楟�".split("");
      for (j2 = 0; j2 != D[151].length; ++j2)
        if (D[151][j2].charCodeAt(0) !== 65533) {
          e[D[151][j2]] = 38656 + j2;
          d[38656 + j2] = D[151][j2];
        }
      D[152] = "����������������������������������������������������������������楡楢楤楥楧楨楩楪楬業楯楰楲楳楴極楶楺楻楽楾楿榁榃榅榊榋榌榎榏榐榑榒榓榖榗榙榚榝榞榟榠榡榢榣榤榥榦榩榪榬榮榯榰榲榳榵榶榸榹榺榼榽�榾榿槀槂槃槄槅槆槇槈槉構槍槏槑槒槓槕槖槗様槙槚槜槝槞槡槢槣槤槥槦槧槨槩槪槫槬槮槯槰槱槳槴槵槶槷槸槹槺槻槼槾樀樁樂樃樄樅樆樇樈樉樋樌樍樎樏樐樑樒樓樔樕樖標樚樛樜樝樞樠樢樣樤樥樦樧権樫樬樭樮樰樲樳樴樶樷樸樹樺樻樼樿橀橁橂橃橅橆橈橉橊橋橌橍橎橏橑橒橓橔橕橖橗橚�".split("");
      for (j2 = 0; j2 != D[152].length; ++j2)
        if (D[152][j2].charCodeAt(0) !== 65533) {
          e[D[152][j2]] = 38912 + j2;
          d[38912 + j2] = D[152][j2];
        }
      D[153] = "����������������������������������������������������������������橜橝橞機橠橢橣橤橦橧橨橩橪橫橬橭橮橯橰橲橳橴橵橶橷橸橺橻橽橾橿檁檂檃檅檆檇檈檉檊檋檌檍檏檒檓檔檕檖檘檙檚檛檜檝檞檟檡檢檣檤檥檦�檧檨檪檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟欥欦欨欩欪欫欬欭欮�".split("");
      for (j2 = 0; j2 != D[153].length; ++j2)
        if (D[153][j2].charCodeAt(0) !== 65533) {
          e[D[153][j2]] = 39168 + j2;
          d[39168 + j2] = D[153][j2];
        }
      D[154] = "����������������������������������������������������������������欯欰欱欳欴欵欶欸欻欼欽欿歀歁歂歄歅歈歊歋歍歎歏歐歑歒歓歔歕歖歗歘歚歛歜歝歞歟歠歡歨歩歫歬歭歮歯歰歱歲歳歴歵歶歷歸歺歽歾歿殀殅殈�殌殎殏殐殑殔殕殗殘殙殜殝殞殟殠殢殣殤殥殦殧殨殩殫殬殭殮殯殰殱殲殶殸殹殺殻殼殽殾毀毃毄毆毇毈毉毊毌毎毐毑毘毚毜毝毞毟毠毢毣毤毥毦毧毨毩毬毭毮毰毱毲毴毶毷毸毺毻毼毾毿氀氁氂氃氄氈氉氊氋氌氎氒気氜氝氞氠氣氥氫氬氭氱氳氶氷氹氺氻氼氾氿汃汄汅汈汋汌汍汎汏汑汒汓汖汘�".split("");
      for (j2 = 0; j2 != D[154].length; ++j2)
        if (D[154][j2].charCodeAt(0) !== 65533) {
          e[D[154][j2]] = 39424 + j2;
          d[39424 + j2] = D[154][j2];
        }
      D[155] = "����������������������������������������������������������������汙汚汢汣汥汦汧汫汬汭汮汯汱汳汵汷汸決汻汼汿沀沄沇沊沋沍沎沑沒沕沖沗沘沚沜沝沞沠沢沨沬沯沰沴沵沶沷沺泀況泂泃泆泇泈泋泍泎泏泑泒泘�泙泚泜泝泟泤泦泧泩泬泭泲泴泹泿洀洂洃洅洆洈洉洊洍洏洐洑洓洔洕洖洘洜洝洟洠洡洢洣洤洦洨洩洬洭洯洰洴洶洷洸洺洿浀浂浄浉浌浐浕浖浗浘浛浝浟浡浢浤浥浧浨浫浬浭浰浱浲浳浵浶浹浺浻浽浾浿涀涁涃涄涆涇涊涋涍涏涐涒涖涗涘涙涚涜涢涥涬涭涰涱涳涴涶涷涹涺涻涼涽涾淁淂淃淈淉淊�".split("");
      for (j2 = 0; j2 != D[155].length; ++j2)
        if (D[155][j2].charCodeAt(0) !== 65533) {
          e[D[155][j2]] = 39680 + j2;
          d[39680 + j2] = D[155][j2];
        }
      D[156] = "����������������������������������������������������������������淍淎淏淐淒淓淔淕淗淚淛淜淟淢淣淥淧淨淩淪淭淯淰淲淴淵淶淸淺淽淾淿渀渁渂渃渄渆渇済渉渋渏渒渓渕渘渙減渜渞渟渢渦渧渨渪測渮渰渱渳渵�渶渷渹渻渼渽渾渿湀湁湂湅湆湇湈湉湊湋湌湏湐湑湒湕湗湙湚湜湝湞湠湡湢湣湤湥湦湧湨湩湪湬湭湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽満溁溂溄溇溈溊溋溌溍溎溑溒溓溔溕準溗溙溚溛溝溞溠溡溣溤溦溨溩溫溬溭溮溰溳溵溸溹溼溾溿滀滃滄滅滆滈滉滊滌滍滎滐滒滖滘滙滛滜滝滣滧滪滫滬滭滮滯�".split("");
      for (j2 = 0; j2 != D[156].length; ++j2)
        if (D[156][j2].charCodeAt(0) !== 65533) {
          e[D[156][j2]] = 39936 + j2;
          d[39936 + j2] = D[156][j2];
        }
      D[157] = "����������������������������������������������������������������滰滱滲滳滵滶滷滸滺滻滼滽滾滿漀漁漃漄漅漇漈漊漋漌漍漎漐漑漒漖漗漘漙漚漛漜漝漞漟漡漢漣漥漦漧漨漬漮漰漲漴漵漷漸漹漺漻漼漽漿潀潁潂�潃潄潅潈潉潊潌潎潏潐潑潒潓潔潕潖潗潙潚潛潝潟潠潡潣潤潥潧潨潩潪潫潬潯潰潱潳潵潶潷潹潻潽潾潿澀澁澂澃澅澆澇澊澋澏澐澑澒澓澔澕澖澗澘澙澚澛澝澞澟澠澢澣澤澥澦澨澩澪澫澬澭澮澯澰澱澲澴澵澷澸澺澻澼澽澾澿濁濃濄濅濆濇濈濊濋濌濍濎濏濐濓濔濕濖濗濘濙濚濛濜濝濟濢濣濤濥�".split("");
      for (j2 = 0; j2 != D[157].length; ++j2)
        if (D[157][j2].charCodeAt(0) !== 65533) {
          e[D[157][j2]] = 40192 + j2;
          d[40192 + j2] = D[157][j2];
        }
      D[158] = "����������������������������������������������������������������濦濧濨濩濪濫濬濭濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀒瀓瀔瀕瀖瀗瀘瀙瀜瀝瀞瀟瀠瀡瀢瀤瀥瀦瀧瀨瀩瀪�瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀶瀷瀸瀺瀻瀼瀽瀾瀿灀灁灂灃灄灅灆灇灈灉灊灋灍灎灐灑灒灓灔灕灖灗灘灙灚灛灜灝灟灠灡灢灣灤灥灦灧灨灩灪灮灱灲灳灴灷灹灺灻災炁炂炃炄炆炇炈炋炌炍炏炐炑炓炗炘炚炛炞炟炠炡炢炣炤炥炦炧炨炩炪炰炲炴炵炶為炾炿烄烅烆烇烉烋烌烍烎烏烐烑烒烓烔烕烖烗烚�".split("");
      for (j2 = 0; j2 != D[158].length; ++j2)
        if (D[158][j2].charCodeAt(0) !== 65533) {
          e[D[158][j2]] = 40448 + j2;
          d[40448 + j2] = D[158][j2];
        }
      D[159] = "����������������������������������������������������������������烜烝烞烠烡烢烣烥烪烮烰烱烲烳烴烵烶烸烺烻烼烾烿焀焁焂焃焄焅焆焇焈焋焌焍焎焏焑焒焔焗焛焜焝焞焟焠無焢焣焤焥焧焨焩焪焫焬焭焮焲焳焴�焵焷焸焹焺焻焼焽焾焿煀煁煂煃煄煆煇煈煉煋煍煏煐煑煒煓煔煕煖煗煘煙煚煛煝煟煠煡煢煣煥煩煪煫煬煭煯煰煱煴煵煶煷煹煻煼煾煿熀熁熂熃熅熆熇熈熉熋熌熍熎熐熑熒熓熕熖熗熚熛熜熝熞熡熢熣熤熥熦熧熩熪熫熭熮熯熰熱熲熴熶熷熸熺熻熼熽熾熿燀燁燂燄燅燆燇燈燉燊燋燌燍燏燐燑燒燓�".split("");
      for (j2 = 0; j2 != D[159].length; ++j2)
        if (D[159][j2].charCodeAt(0) !== 65533) {
          e[D[159][j2]] = 40704 + j2;
          d[40704 + j2] = D[159][j2];
        }
      D[160] = "����������������������������������������������������������������燖燗燘燙燚燛燜燝燞營燡燢燣燤燦燨燩燪燫燬燭燯燰燱燲燳燴燵燶燷燸燺燻燼燽燾燿爀爁爂爃爄爅爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚�爛爜爞爟爠爡爢爣爤爥爦爧爩爫爭爮爯爲爳爴爺爼爾牀牁牂牃牄牅牆牉牊牋牎牏牐牑牓牔牕牗牘牚牜牞牠牣牤牥牨牪牫牬牭牰牱牳牴牶牷牸牻牼牽犂犃犅犆犇犈犉犌犎犐犑犓犔犕犖犗犘犙犚犛犜犝犞犠犡犢犣犤犥犦犧犨犩犪犫犮犱犲犳犵犺犻犼犽犾犿狀狅狆狇狉狊狋狌狏狑狓狔狕狖狘狚狛�".split("");
      for (j2 = 0; j2 != D[160].length; ++j2)
        if (D[160][j2].charCodeAt(0) !== 65533) {
          e[D[160][j2]] = 40960 + j2;
          d[40960 + j2] = D[160][j2];
        }
      D[161] = "����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。·ˉˇ¨〃々—~‖…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split("");
      for (j2 = 0; j2 != D[161].length; ++j2)
        if (D[161][j2].charCodeAt(0) !== 65533) {
          e[D[161][j2]] = 41216 + j2;
          d[41216 + j2] = D[161][j2];
        }
      D[162] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split("");
      for (j2 = 0; j2 != D[162].length; ++j2)
        if (D[162][j2].charCodeAt(0) !== 65533) {
          e[D[162][j2]] = 41472 + j2;
          d[41472 + j2] = D[162][j2];
        }
      D[163] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
      for (j2 = 0; j2 != D[163].length; ++j2)
        if (D[163][j2].charCodeAt(0) !== 65533) {
          e[D[163][j2]] = 41728 + j2;
          d[41728 + j2] = D[163][j2];
        }
      D[164] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
      for (j2 = 0; j2 != D[164].length; ++j2)
        if (D[164][j2].charCodeAt(0) !== 65533) {
          e[D[164][j2]] = 41984 + j2;
          d[41984 + j2] = D[164][j2];
        }
      D[165] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
      for (j2 = 0; j2 != D[165].length; ++j2)
        if (D[165][j2].charCodeAt(0) !== 65533) {
          e[D[165][j2]] = 42240 + j2;
          d[42240 + j2] = D[165][j2];
        }
      D[166] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������︵︶︹︺︿﹀︽︾﹁﹂﹃﹄��︻︼︷︸︱�︳︴����������".split("");
      for (j2 = 0; j2 != D[166].length; ++j2)
        if (D[166][j2].charCodeAt(0) !== 65533) {
          e[D[166][j2]] = 42496 + j2;
          d[42496 + j2] = D[166][j2];
        }
      D[167] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
      for (j2 = 0; j2 != D[167].length; ++j2)
        if (D[167][j2].charCodeAt(0) !== 65533) {
          e[D[167][j2]] = 42752 + j2;
          d[42752 + j2] = D[167][j2];
        }
      D[168] = "����������������������������������������������������������������ˊˋ˙–―‥‵℅℉↖↗↘↙∕∟∣≒≦≧⊿═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳▁▂▃▄▅▆▇�█▉▊▋▌▍▎▏▓▔▕▼▽◢◣◤◥☉⊕〒〝〞�����������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüêɑ�ńň�ɡ����ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split("");
      for (j2 = 0; j2 != D[168].length; ++j2)
        if (D[168][j2].charCodeAt(0) !== 65533) {
          e[D[168][j2]] = 43008 + j2;
          d[43008 + j2] = D[168][j2];
        }
      D[169] = "����������������������������������������������������������������〡〢〣〤〥〦〧〨〩㊣㎎㎏㎜㎝㎞㎡㏄㏎㏑㏒㏕︰¬¦�℡㈱�‐���ー゛゜ヽヾ〆ゝゞ﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹔﹕﹖﹗﹙﹚﹛﹜﹝﹞﹟﹠﹡�﹢﹣﹤﹥﹦﹨﹩﹪﹫�������������〇�������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split("");
      for (j2 = 0; j2 != D[169].length; ++j2)
        if (D[169][j2].charCodeAt(0) !== 65533) {
          e[D[169][j2]] = 43264 + j2;
          d[43264 + j2] = D[169][j2];
        }
      D[170] = "����������������������������������������������������������������狜狝狟狢狣狤狥狦狧狪狫狵狶狹狽狾狿猀猂猄猅猆猇猈猉猋猌猍猏猐猑猒猔猘猙猚猟猠猣猤猦猧猨猭猯猰猲猳猵猶猺猻猼猽獀獁獂獃獄獅獆獇獈�獉獊獋獌獎獏獑獓獔獕獖獘獙獚獛獜獝獞獟獡獢獣獤獥獦獧獨獩獪獫獮獰獱�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[170].length; ++j2)
        if (D[170][j2].charCodeAt(0) !== 65533) {
          e[D[170][j2]] = 43520 + j2;
          d[43520 + j2] = D[170][j2];
        }
      D[171] = "����������������������������������������������������������������獲獳獴獵獶獷獸獹獺獻獼獽獿玀玁玂玃玅玆玈玊玌玍玏玐玒玓玔玕玗玘玙玚玜玝玞玠玡玣玤玥玦玧玨玪玬玭玱玴玵玶玸玹玼玽玾玿珁珃珄珅珆珇�珋珌珎珒珓珔珕珖珗珘珚珛珜珝珟珡珢珣珤珦珨珪珫珬珮珯珰珱珳珴珵珶珷�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[171].length; ++j2)
        if (D[171][j2].charCodeAt(0) !== 65533) {
          e[D[171][j2]] = 43776 + j2;
          d[43776 + j2] = D[171][j2];
        }
      D[172] = "����������������������������������������������������������������珸珹珺珻珼珽現珿琀琁琂琄琇琈琋琌琍琎琑琒琓琔琕琖琗琘琙琜琝琞琟琠琡琣琤琧琩琫琭琯琱琲琷琸琹琺琻琽琾琿瑀瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍�瑎瑏瑐瑑瑒瑓瑔瑖瑘瑝瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑮瑯瑱瑲瑳瑴瑵瑸瑹瑺�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[172].length; ++j2)
        if (D[172][j2].charCodeAt(0) !== 65533) {
          e[D[172][j2]] = 44032 + j2;
          d[44032 + j2] = D[172][j2];
        }
      D[173] = "����������������������������������������������������������������瑻瑼瑽瑿璂璄璅璆璈璉璊璌璍璏璑璒璓璔璕璖璗璘璙璚璛璝璟璠璡璢璣璤璥璦璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璻璼璽璾璿瓀瓁瓂瓃瓄瓅瓆瓇�瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓓瓔瓕瓖瓗瓘瓙瓚瓛瓝瓟瓡瓥瓧瓨瓩瓪瓫瓬瓭瓰瓱瓲�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[173].length; ++j2)
        if (D[173][j2].charCodeAt(0) !== 65533) {
          e[D[173][j2]] = 44288 + j2;
          d[44288 + j2] = D[173][j2];
        }
      D[174] = "����������������������������������������������������������������瓳瓵瓸瓹瓺瓻瓼瓽瓾甀甁甂甃甅甆甇甈甉甊甋甌甎甐甒甔甕甖甗甛甝甞甠甡產産甤甦甧甪甮甴甶甹甼甽甿畁畂畃畄畆畇畉畊畍畐畑畒畓畕畖畗畘�畝畞畟畠畡畢畣畤畧畨畩畫畬畭畮畯異畱畳畵當畷畺畻畼畽畾疀疁疂疄疅疇�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[174].length; ++j2)
        if (D[174][j2].charCodeAt(0) !== 65533) {
          e[D[174][j2]] = 44544 + j2;
          d[44544 + j2] = D[174][j2];
        }
      D[175] = "����������������������������������������������������������������疈疉疊疌疍疎疐疓疕疘疛疜疞疢疦疧疨疩疪疭疶疷疺疻疿痀痁痆痋痌痎痏痐痑痓痗痙痚痜痝痟痠痡痥痩痬痭痮痯痲痳痵痶痷痸痺痻痽痾瘂瘄瘆瘇�瘈瘉瘋瘍瘎瘏瘑瘒瘓瘔瘖瘚瘜瘝瘞瘡瘣瘧瘨瘬瘮瘯瘱瘲瘶瘷瘹瘺瘻瘽癁療癄�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[175].length; ++j2)
        if (D[175][j2].charCodeAt(0) !== 65533) {
          e[D[175][j2]] = 44800 + j2;
          d[44800 + j2] = D[175][j2];
        }
      D[176] = "����������������������������������������������������������������癅癆癇癈癉癊癋癎癏癐癑癒癓癕癗癘癙癚癛癝癟癠癡癢癤癥癦癧癨癩癪癬癭癮癰癱癲癳癴癵癶癷癹発發癿皀皁皃皅皉皊皌皍皏皐皒皔皕皗皘皚皛�皜皝皞皟皠皡皢皣皥皦皧皨皩皪皫皬皭皯皰皳皵皶皷皸皹皺皻皼皽皾盀盁盃啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split("");
      for (j2 = 0; j2 != D[176].length; ++j2)
        if (D[176][j2].charCodeAt(0) !== 65533) {
          e[D[176][j2]] = 45056 + j2;
          d[45056 + j2] = D[176][j2];
        }
      D[177] = "����������������������������������������������������������������盄盇盉盋盌盓盕盙盚盜盝盞盠盡盢監盤盦盧盨盩盪盫盬盭盰盳盵盶盷盺盻盽盿眀眂眃眅眆眊県眎眏眐眑眒眓眔眕眖眗眘眛眜眝眞眡眣眤眥眧眪眫�眬眮眰眱眲眳眴眹眻眽眾眿睂睄睅睆睈睉睊睋睌睍睎睏睒睓睔睕睖睗睘睙睜薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split("");
      for (j2 = 0; j2 != D[177].length; ++j2)
        if (D[177][j2].charCodeAt(0) !== 65533) {
          e[D[177][j2]] = 45312 + j2;
          d[45312 + j2] = D[177][j2];
        }
      D[178] = "����������������������������������������������������������������睝睞睟睠睤睧睩睪睭睮睯睰睱睲睳睴睵睶睷睸睺睻睼瞁瞂瞃瞆瞇瞈瞉瞊瞋瞏瞐瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞡瞣瞤瞦瞨瞫瞭瞮瞯瞱瞲瞴瞶瞷瞸瞹瞺�瞼瞾矀矁矂矃矄矅矆矇矈矉矊矋矌矎矏矐矑矒矓矔矕矖矘矙矚矝矞矟矠矡矤病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split("");
      for (j2 = 0; j2 != D[178].length; ++j2)
        if (D[178][j2].charCodeAt(0) !== 65533) {
          e[D[178][j2]] = 45568 + j2;
          d[45568 + j2] = D[178][j2];
        }
      D[179] = "����������������������������������������������������������������矦矨矪矯矰矱矲矴矵矷矹矺矻矼砃砄砅砆砇砈砊砋砎砏砐砓砕砙砛砞砠砡砢砤砨砪砫砮砯砱砲砳砵砶砽砿硁硂硃硄硆硈硉硊硋硍硏硑硓硔硘硙硚�硛硜硞硟硠硡硢硣硤硥硦硧硨硩硯硰硱硲硳硴硵硶硸硹硺硻硽硾硿碀碁碂碃场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split("");
      for (j2 = 0; j2 != D[179].length; ++j2)
        if (D[179][j2].charCodeAt(0) !== 65533) {
          e[D[179][j2]] = 45824 + j2;
          d[45824 + j2] = D[179][j2];
        }
      D[180] = "����������������������������������������������������������������碄碅碆碈碊碋碏碐碒碔碕碖碙碝碞碠碢碤碦碨碩碪碫碬碭碮碯碵碶碷碸確碻碼碽碿磀磂磃磄磆磇磈磌磍磎磏磑磒磓磖磗磘磚磛磜磝磞磟磠磡磢磣�磤磥磦磧磩磪磫磭磮磯磰磱磳磵磶磸磹磻磼磽磾磿礀礂礃礄礆礇礈礉礊礋礌础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split("");
      for (j2 = 0; j2 != D[180].length; ++j2)
        if (D[180][j2].charCodeAt(0) !== 65533) {
          e[D[180][j2]] = 46080 + j2;
          d[46080 + j2] = D[180][j2];
        }
      D[181] = "����������������������������������������������������������������礍礎礏礐礑礒礔礕礖礗礘礙礚礛礜礝礟礠礡礢礣礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礵礶礷礸礹礽礿祂祃祄祅祇祊祋祌祍祎祏祐祑祒祔祕祘祙祡祣�祤祦祩祪祫祬祮祰祱祲祳祴祵祶祹祻祼祽祾祿禂禃禆禇禈禉禋禌禍禎禐禑禒怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split("");
      for (j2 = 0; j2 != D[181].length; ++j2)
        if (D[181][j2].charCodeAt(0) !== 65533) {
          e[D[181][j2]] = 46336 + j2;
          d[46336 + j2] = D[181][j2];
        }
      D[182] = "����������������������������������������������������������������禓禔禕禖禗禘禙禛禜禝禞禟禠禡禢禣禤禥禦禨禩禪禫禬禭禮禯禰禱禲禴禵禶禷禸禼禿秂秄秅秇秈秊秌秎秏秐秓秔秖秗秙秚秛秜秝秞秠秡秢秥秨秪�秬秮秱秲秳秴秵秶秷秹秺秼秾秿稁稄稅稇稈稉稊稌稏稐稑稒稓稕稖稘稙稛稜丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split("");
      for (j2 = 0; j2 != D[182].length; ++j2)
        if (D[182][j2].charCodeAt(0) !== 65533) {
          e[D[182][j2]] = 46592 + j2;
          d[46592 + j2] = D[182][j2];
        }
      D[183] = "����������������������������������������������������������������稝稟稡稢稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稴稵稶稸稺稾穀穁穂穃穄穅穇穈穉穊穋穌積穎穏穐穒穓穔穕穖穘穙穚穛穜穝穞穟穠穡穢穣穤穥穦穧穨�穩穪穫穬穭穮穯穱穲穳穵穻穼穽穾窂窅窇窉窊窋窌窎窏窐窓窔窙窚窛窞窡窢贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split("");
      for (j2 = 0; j2 != D[183].length; ++j2)
        if (D[183][j2].charCodeAt(0) !== 65533) {
          e[D[183][j2]] = 46848 + j2;
          d[46848 + j2] = D[183][j2];
        }
      D[184] = "����������������������������������������������������������������窣窤窧窩窪窫窮窯窰窱窲窴窵窶窷窸窹窺窻窼窽窾竀竁竂竃竄竅竆竇竈竉竊竌竍竎竏竐竑竒竓竔竕竗竘竚竛竜竝竡竢竤竧竨竩竪竫竬竮竰竱竲竳�竴竵競竷竸竻竼竾笀笁笂笅笇笉笌笍笎笐笒笓笖笗笘笚笜笝笟笡笢笣笧笩笭浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split("");
      for (j2 = 0; j2 != D[184].length; ++j2)
        if (D[184][j2].charCodeAt(0) !== 65533) {
          e[D[184][j2]] = 47104 + j2;
          d[47104 + j2] = D[184][j2];
        }
      D[185] = "����������������������������������������������������������������笯笰笲笴笵笶笷笹笻笽笿筀筁筂筃筄筆筈筊筍筎筓筕筗筙筜筞筟筡筣筤筥筦筧筨筩筪筫筬筭筯筰筳筴筶筸筺筼筽筿箁箂箃箄箆箇箈箉箊箋箌箎箏�箑箒箓箖箘箙箚箛箞箟箠箣箤箥箮箯箰箲箳箵箶箷箹箺箻箼箽箾箿節篂篃範埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split("");
      for (j2 = 0; j2 != D[185].length; ++j2)
        if (D[185][j2].charCodeAt(0) !== 65533) {
          e[D[185][j2]] = 47360 + j2;
          d[47360 + j2] = D[185][j2];
        }
      D[186] = "����������������������������������������������������������������篅篈築篊篋篍篎篏篐篒篔篕篖篗篘篛篜篞篟篠篢篣篤篧篨篩篫篬篭篯篰篲篳篴篵篶篸篹篺篻篽篿簀簁簂簃簄簅簆簈簉簊簍簎簐簑簒簓簔簕簗簘簙�簚簛簜簝簞簠簡簢簣簤簥簨簩簫簬簭簮簯簰簱簲簳簴簵簶簷簹簺簻簼簽簾籂骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split("");
      for (j2 = 0; j2 != D[186].length; ++j2)
        if (D[186][j2].charCodeAt(0) !== 65533) {
          e[D[186][j2]] = 47616 + j2;
          d[47616 + j2] = D[186][j2];
        }
      D[187] = "����������������������������������������������������������������籃籄籅籆籇籈籉籊籋籌籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲籵籶籷籸籹籺籾籿粀粁粂粃粄粅粆粇�粈粊粋粌粍粎粏粐粓粔粖粙粚粛粠粡粣粦粧粨粩粫粬粭粯粰粴粵粶粷粸粺粻弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split("");
      for (j2 = 0; j2 != D[187].length; ++j2)
        if (D[187][j2].charCodeAt(0) !== 65533) {
          e[D[187][j2]] = 47872 + j2;
          d[47872 + j2] = D[187][j2];
        }
      D[188] = "����������������������������������������������������������������粿糀糂糃糄糆糉糋糎糏糐糑糒糓糔糘糚糛糝糞糡糢糣糤糥糦糧糩糪糫糬糭糮糰糱糲糳糴糵糶糷糹糺糼糽糾糿紀紁紂紃約紅紆紇紈紉紋紌納紎紏紐�紑紒紓純紕紖紗紘紙級紛紜紝紞紟紡紣紤紥紦紨紩紪紬紭紮細紱紲紳紴紵紶肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split("");
      for (j2 = 0; j2 != D[188].length; ++j2)
        if (D[188][j2].charCodeAt(0) !== 65533) {
          e[D[188][j2]] = 48128 + j2;
          d[48128 + j2] = D[188][j2];
        }
      D[189] = "����������������������������������������������������������������紷紸紹紺紻紼紽紾紿絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟絠絡絢絣絤絥給絧絨絩絪絫絬絭絯絰統絲絳絴絵絶�絸絹絺絻絼絽絾絿綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split("");
      for (j2 = 0; j2 != D[189].length; ++j2)
        if (D[189][j2].charCodeAt(0) !== 65533) {
          e[D[189][j2]] = 48384 + j2;
          d[48384 + j2] = D[189][j2];
        }
      D[190] = "����������������������������������������������������������������継続綛綜綝綞綟綠綡綢綣綤綥綧綨綩綪綫綬維綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙�線緛緜緝緞緟締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split("");
      for (j2 = 0; j2 != D[190].length; ++j2)
        if (D[190][j2].charCodeAt(0) !== 65533) {
          e[D[190][j2]] = 48640 + j2;
          d[48640 + j2] = D[190][j2];
        }
      D[191] = "����������������������������������������������������������������緻緼緽緾緿縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹�縺縼總績縿繀繂繃繄繅繆繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split("");
      for (j2 = 0; j2 != D[191].length; ++j2)
        if (D[191][j2].charCodeAt(0) !== 65533) {
          e[D[191][j2]] = 48896 + j2;
          d[48896 + j2] = D[191][j2];
        }
      D[192] = "����������������������������������������������������������������繞繟繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿纀纁纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纜纝纞�纮纴纻纼绖绤绬绹缊缐缞缷缹缻缼缽缾缿罀罁罃罆罇罈罉罊罋罌罍罎罏罒罓馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split("");
      for (j2 = 0; j2 != D[192].length; ++j2)
        if (D[192][j2].charCodeAt(0) !== 65533) {
          e[D[192][j2]] = 49152 + j2;
          d[49152 + j2] = D[192][j2];
        }
      D[193] = "����������������������������������������������������������������罖罙罛罜罝罞罠罣罤罥罦罧罫罬罭罯罰罳罵罶罷罸罺罻罼罽罿羀羂羃羄羅羆羇羈羉羋羍羏羐羑羒羓羕羖羗羘羙羛羜羠羢羣羥羦羨義羪羫羬羭羮羱�羳羴羵羶羷羺羻羾翀翂翃翄翆翇翈翉翋翍翏翐翑習翓翖翗翙翚翛翜翝翞翢翣痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split("");
      for (j2 = 0; j2 != D[193].length; ++j2)
        if (D[193][j2].charCodeAt(0) !== 65533) {
          e[D[193][j2]] = 49408 + j2;
          d[49408 + j2] = D[193][j2];
        }
      D[194] = "����������������������������������������������������������������翤翧翨翪翫翬翭翯翲翴翵翶翷翸翹翺翽翾翿耂耇耈耉耊耎耏耑耓耚耛耝耞耟耡耣耤耫耬耭耮耯耰耲耴耹耺耼耾聀聁聄聅聇聈聉聎聏聐聑聓聕聖聗�聙聛聜聝聞聟聠聡聢聣聤聥聦聧聨聫聬聭聮聯聰聲聳聴聵聶職聸聹聺聻聼聽隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split("");
      for (j2 = 0; j2 != D[194].length; ++j2)
        if (D[194][j2].charCodeAt(0) !== 65533) {
          e[D[194][j2]] = 49664 + j2;
          d[49664 + j2] = D[194][j2];
        }
      D[195] = "����������������������������������������������������������������聾肁肂肅肈肊肍肎肏肐肑肒肔肕肗肙肞肣肦肧肨肬肰肳肵肶肸肹肻胅胇胈胉胊胋胏胐胑胒胓胔胕胘胟胠胢胣胦胮胵胷胹胻胾胿脀脁脃脄脅脇脈脋�脌脕脗脙脛脜脝脟脠脡脢脣脤脥脦脧脨脩脪脫脭脮脰脳脴脵脷脹脺脻脼脽脿谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split("");
      for (j2 = 0; j2 != D[195].length; ++j2)
        if (D[195][j2].charCodeAt(0) !== 65533) {
          e[D[195][j2]] = 49920 + j2;
          d[49920 + j2] = D[195][j2];
        }
      D[196] = "����������������������������������������������������������������腀腁腂腃腄腅腇腉腍腎腏腒腖腗腘腛腜腝腞腟腡腢腣腤腦腨腪腫腬腯腲腳腵腶腷腸膁膃膄膅膆膇膉膋膌膍膎膐膒膓膔膕膖膗膙膚膞膟膠膡膢膤膥�膧膩膫膬膭膮膯膰膱膲膴膵膶膷膸膹膼膽膾膿臄臅臇臈臉臋臍臎臏臐臑臒臓摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split("");
      for (j2 = 0; j2 != D[196].length; ++j2)
        if (D[196][j2].charCodeAt(0) !== 65533) {
          e[D[196][j2]] = 50176 + j2;
          d[50176 + j2] = D[196][j2];
        }
      D[197] = "����������������������������������������������������������������臔臕臖臗臘臙臚臛臜臝臞臟臠臡臢臤臥臦臨臩臫臮臯臰臱臲臵臶臷臸臹臺臽臿舃與興舉舊舋舎舏舑舓舕舖舗舘舙舚舝舠舤舥舦舧舩舮舲舺舼舽舿�艀艁艂艃艅艆艈艊艌艍艎艐艑艒艓艔艕艖艗艙艛艜艝艞艠艡艢艣艤艥艦艧艩拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split("");
      for (j2 = 0; j2 != D[197].length; ++j2)
        if (D[197][j2].charCodeAt(0) !== 65533) {
          e[D[197][j2]] = 50432 + j2;
          d[50432 + j2] = D[197][j2];
        }
      D[198] = "����������������������������������������������������������������艪艫艬艭艱艵艶艷艸艻艼芀芁芃芅芆芇芉芌芐芓芔芕芖芚芛芞芠芢芣芧芲芵芶芺芻芼芿苀苂苃苅苆苉苐苖苙苚苝苢苧苨苩苪苬苭苮苰苲苳苵苶苸�苺苼苽苾苿茀茊茋茍茐茒茓茖茘茙茝茞茟茠茡茢茣茤茥茦茩茪茮茰茲茷茻茽啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split("");
      for (j2 = 0; j2 != D[198].length; ++j2)
        if (D[198][j2].charCodeAt(0) !== 65533) {
          e[D[198][j2]] = 50688 + j2;
          d[50688 + j2] = D[198][j2];
        }
      D[199] = "����������������������������������������������������������������茾茿荁荂荄荅荈荊荋荌荍荎荓荕荖荗荘荙荝荢荰荱荲荳荴荵荶荹荺荾荿莀莁莂莃莄莇莈莊莋莌莍莏莐莑莔莕莖莗莙莚莝莟莡莢莣莤莥莦莧莬莭莮�莯莵莻莾莿菂菃菄菆菈菉菋菍菎菐菑菒菓菕菗菙菚菛菞菢菣菤菦菧菨菫菬菭恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split("");
      for (j2 = 0; j2 != D[199].length; ++j2)
        if (D[199][j2].charCodeAt(0) !== 65533) {
          e[D[199][j2]] = 50944 + j2;
          d[50944 + j2] = D[199][j2];
        }
      D[200] = "����������������������������������������������������������������菮華菳菴菵菶菷菺菻菼菾菿萀萂萅萇萈萉萊萐萒萓萔萕萖萗萙萚萛萞萟萠萡萢萣萩萪萫萬萭萮萯萰萲萳萴萵萶萷萹萺萻萾萿葀葁葂葃葄葅葇葈葉�葊葋葌葍葎葏葐葒葓葔葕葖葘葝葞葟葠葢葤葥葦葧葨葪葮葯葰葲葴葷葹葻葼取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split("");
      for (j2 = 0; j2 != D[200].length; ++j2)
        if (D[200][j2].charCodeAt(0) !== 65533) {
          e[D[200][j2]] = 51200 + j2;
          d[51200 + j2] = D[200][j2];
        }
      D[201] = "����������������������������������������������������������������葽葾葿蒀蒁蒃蒄蒅蒆蒊蒍蒏蒐蒑蒒蒓蒔蒕蒖蒘蒚蒛蒝蒞蒟蒠蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒰蒱蒳蒵蒶蒷蒻蒼蒾蓀蓂蓃蓅蓆蓇蓈蓋蓌蓎蓏蓒蓔蓕蓗�蓘蓙蓚蓛蓜蓞蓡蓢蓤蓧蓨蓩蓪蓫蓭蓮蓯蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓽蓾蔀蔁蔂伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split("");
      for (j2 = 0; j2 != D[201].length; ++j2)
        if (D[201][j2].charCodeAt(0) !== 65533) {
          e[D[201][j2]] = 51456 + j2;
          d[51456 + j2] = D[201][j2];
        }
      D[202] = "����������������������������������������������������������������蔃蔄蔅蔆蔇蔈蔉蔊蔋蔍蔎蔏蔐蔒蔔蔕蔖蔘蔙蔛蔜蔝蔞蔠蔢蔣蔤蔥蔦蔧蔨蔩蔪蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔾蔿蕀蕁蕂蕄蕅蕆蕇蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕�蕗蕘蕚蕛蕜蕝蕟蕠蕡蕢蕣蕥蕦蕧蕩蕪蕫蕬蕭蕮蕯蕰蕱蕳蕵蕶蕷蕸蕼蕽蕿薀薁省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split("");
      for (j2 = 0; j2 != D[202].length; ++j2)
        if (D[202][j2].charCodeAt(0) !== 65533) {
          e[D[202][j2]] = 51712 + j2;
          d[51712 + j2] = D[202][j2];
        }
      D[203] = "����������������������������������������������������������������薂薃薆薈薉薊薋薌薍薎薐薑薒薓薔薕薖薗薘薙薚薝薞薟薠薡薢薣薥薦薧薩薫薬薭薱薲薳薴薵薶薸薺薻薼薽薾薿藀藂藃藄藅藆藇藈藊藋藌藍藎藑藒�藔藖藗藘藙藚藛藝藞藟藠藡藢藣藥藦藧藨藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split("");
      for (j2 = 0; j2 != D[203].length; ++j2)
        if (D[203][j2].charCodeAt(0) !== 65533) {
          e[D[203][j2]] = 51968 + j2;
          d[51968 + j2] = D[203][j2];
        }
      D[204] = "����������������������������������������������������������������藹藺藼藽藾蘀蘁蘂蘃蘄蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘒蘓蘔蘕蘗蘘蘙蘚蘛蘜蘝蘞蘟蘠蘡蘢蘣蘤蘥蘦蘨蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘹蘺蘻蘽蘾蘿虀�虁虂虃虄虅虆虇虈虉虊虋虌虒虓處虖虗虘虙虛虜虝號虠虡虣虤虥虦虧虨虩虪獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split("");
      for (j2 = 0; j2 != D[204].length; ++j2)
        if (D[204][j2].charCodeAt(0) !== 65533) {
          e[D[204][j2]] = 52224 + j2;
          d[52224 + j2] = D[204][j2];
        }
      D[205] = "����������������������������������������������������������������虭虯虰虲虳虴虵虶虷虸蚃蚄蚅蚆蚇蚈蚉蚎蚏蚐蚑蚒蚔蚖蚗蚘蚙蚚蚛蚞蚟蚠蚡蚢蚥蚦蚫蚭蚮蚲蚳蚷蚸蚹蚻蚼蚽蚾蚿蛁蛂蛃蛅蛈蛌蛍蛒蛓蛕蛖蛗蛚蛜�蛝蛠蛡蛢蛣蛥蛦蛧蛨蛪蛫蛬蛯蛵蛶蛷蛺蛻蛼蛽蛿蜁蜄蜅蜆蜋蜌蜎蜏蜐蜑蜔蜖汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split("");
      for (j2 = 0; j2 != D[205].length; ++j2)
        if (D[205][j2].charCodeAt(0) !== 65533) {
          e[D[205][j2]] = 52480 + j2;
          d[52480 + j2] = D[205][j2];
        }
      D[206] = "����������������������������������������������������������������蜙蜛蜝蜟蜠蜤蜦蜧蜨蜪蜫蜬蜭蜯蜰蜲蜳蜵蜶蜸蜹蜺蜼蜽蝀蝁蝂蝃蝄蝅蝆蝊蝋蝍蝏蝐蝑蝒蝔蝕蝖蝘蝚蝛蝜蝝蝞蝟蝡蝢蝦蝧蝨蝩蝪蝫蝬蝭蝯蝱蝲蝳蝵�蝷蝸蝹蝺蝿螀螁螄螆螇螉螊螌螎螏螐螑螒螔螕螖螘螙螚螛螜螝螞螠螡螢螣螤巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split("");
      for (j2 = 0; j2 != D[206].length; ++j2)
        if (D[206][j2].charCodeAt(0) !== 65533) {
          e[D[206][j2]] = 52736 + j2;
          d[52736 + j2] = D[206][j2];
        }
      D[207] = "����������������������������������������������������������������螥螦螧螩螪螮螰螱螲螴螶螷螸螹螻螼螾螿蟁蟂蟃蟄蟅蟇蟈蟉蟌蟍蟎蟏蟐蟔蟕蟖蟗蟘蟙蟚蟜蟝蟞蟟蟡蟢蟣蟤蟦蟧蟨蟩蟫蟬蟭蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸�蟺蟻蟼蟽蟿蠀蠁蠂蠄蠅蠆蠇蠈蠉蠋蠌蠍蠎蠏蠐蠑蠒蠔蠗蠘蠙蠚蠜蠝蠞蠟蠠蠣稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split("");
      for (j2 = 0; j2 != D[207].length; ++j2)
        if (D[207][j2].charCodeAt(0) !== 65533) {
          e[D[207][j2]] = 52992 + j2;
          d[52992 + j2] = D[207][j2];
        }
      D[208] = "����������������������������������������������������������������蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠳蠴蠵蠶蠷蠸蠺蠻蠽蠾蠿衁衂衃衆衇衈衉衊衋衎衏衐衑衒術衕衖衘衚衛衜衝衞衟衠衦衧衪衭衯衱衳衴衵衶衸衹衺�衻衼袀袃袆袇袉袊袌袎袏袐袑袓袔袕袗袘袙袚袛袝袞袟袠袡袣袥袦袧袨袩袪小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split("");
      for (j2 = 0; j2 != D[208].length; ++j2)
        if (D[208][j2].charCodeAt(0) !== 65533) {
          e[D[208][j2]] = 53248 + j2;
          d[53248 + j2] = D[208][j2];
        }
      D[209] = "����������������������������������������������������������������袬袮袯袰袲袳袴袵袶袸袹袺袻袽袾袿裀裃裄裇裈裊裋裌裍裏裐裑裓裖裗裚裛補裝裞裠裡裦裧裩裪裫裬裭裮裯裲裵裶裷裺裻製裿褀褁褃褄褅褆複褈�褉褋褌褍褎褏褑褔褕褖褗褘褜褝褞褟褠褢褣褤褦褧褨褩褬褭褮褯褱褲褳褵褷选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split("");
      for (j2 = 0; j2 != D[209].length; ++j2)
        if (D[209][j2].charCodeAt(0) !== 65533) {
          e[D[209][j2]] = 53504 + j2;
          d[53504 + j2] = D[209][j2];
        }
      D[210] = "����������������������������������������������������������������褸褹褺褻褼褽褾褿襀襂襃襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襠襡襢襣襤襥襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襼�襽襾覀覂覄覅覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟覠覡摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split("");
      for (j2 = 0; j2 != D[210].length; ++j2)
        if (D[210][j2].charCodeAt(0) !== 65533) {
          e[D[210][j2]] = 53760 + j2;
          d[53760 + j2] = D[210][j2];
        }
      D[211] = "����������������������������������������������������������������覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿觀觃觍觓觔觕觗觘觙觛觝觟觠觡觢觤觧觨觩觪觬觭觮觰觱觲觴觵觶觷觸觹觺�觻觼觽觾觿訁訂訃訄訅訆計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split("");
      for (j2 = 0; j2 != D[211].length; ++j2)
        if (D[211][j2].charCodeAt(0) !== 65533) {
          e[D[211][j2]] = 54016 + j2;
          d[54016 + j2] = D[211][j2];
        }
      D[212] = "����������������������������������������������������������������訞訟訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訿詀詁詂詃詄詅詆詇詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞�詟詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詺詻詼詽詾詿誀浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split("");
      for (j2 = 0; j2 != D[212].length; ++j2)
        if (D[212][j2].charCodeAt(0) !== 65533) {
          e[D[212][j2]] = 54272 + j2;
          d[54272 + j2] = D[212][j2];
        }
      D[213] = "����������������������������������������������������������������誁誂誃誄誅誆誇誈誋誌認誎誏誐誑誒誔誕誖誗誘誙誚誛誜誝語誟誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調諀諁諂�諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟諠諡諢諣铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split("");
      for (j2 = 0; j2 != D[213].length; ++j2)
        if (D[213][j2].charCodeAt(0) !== 65533) {
          e[D[213][j2]] = 54528 + j2;
          d[54528 + j2] = D[213][j2];
        }
      D[214] = "����������������������������������������������������������������諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿謀謁謂謃謄謅謆謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟謠謡謢謣�謤謥謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿譀譁譂譃譄譅帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split("");
      for (j2 = 0; j2 != D[214].length; ++j2)
        if (D[214][j2].charCodeAt(0) !== 65533) {
          e[D[214][j2]] = 54784 + j2;
          d[54784 + j2] = D[214][j2];
        }
      D[215] = "����������������������������������������������������������������譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟譠譡譢譣譤譥譧譨譩譪譫譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿讀讁讂讃讄讅讆�讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟讬讱讻诇诐诪谉谞住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split("");
      for (j2 = 0; j2 != D[215].length; ++j2)
        if (D[215][j2].charCodeAt(0) !== 65533) {
          e[D[215][j2]] = 55040 + j2;
          d[55040 + j2] = D[215][j2];
        }
      D[216] = "����������������������������������������������������������������谸谹谺谻谼谽谾谿豀豂豃豄豅豈豊豋豍豎豏豐豑豒豓豔豖豗豘豙豛豜豝豞豟豠豣豤豥豦豧豨豩豬豭豮豯豰豱豲豴豵豶豷豻豼豽豾豿貀貁貃貄貆貇�貈貋貍貎貏貐貑貒貓貕貖貗貙貚貛貜貝貞貟負財貢貣貤貥貦貧貨販貪貫責貭亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split("");
      for (j2 = 0; j2 != D[216].length; ++j2)
        if (D[216][j2].charCodeAt(0) !== 65533) {
          e[D[216][j2]] = 55296 + j2;
          d[55296 + j2] = D[216][j2];
        }
      D[217] = "����������������������������������������������������������������貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟賠賡賢賣賤賥賦賧賨賩質賫賬�賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿贀贁贂贃贄贅贆贇贈贉贊贋贌贍佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split("");
      for (j2 = 0; j2 != D[217].length; ++j2)
        if (D[217][j2].charCodeAt(0) !== 65533) {
          e[D[217][j2]] = 55552 + j2;
          d[55552 + j2] = D[217][j2];
        }
      D[218] = "����������������������������������������������������������������贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贠赑赒赗赟赥赨赩赪赬赮赯赱赲赸赹赺赻赼赽赾赿趀趂趃趆趇趈趉趌趍趎趏趐趒趓趕趖趗趘趙趚趛趜趝趞趠趡�趢趤趥趦趧趨趩趪趫趬趭趮趯趰趲趶趷趹趻趽跀跁跂跅跇跈跉跊跍跐跒跓跔凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split("");
      for (j2 = 0; j2 != D[218].length; ++j2)
        if (D[218][j2].charCodeAt(0) !== 65533) {
          e[D[218][j2]] = 55808 + j2;
          d[55808 + j2] = D[218][j2];
        }
      D[219] = "����������������������������������������������������������������跕跘跙跜跠跡跢跥跦跧跩跭跮跰跱跲跴跶跼跾跿踀踁踂踃踄踆踇踈踋踍踎踐踑踒踓踕踖踗踘踙踚踛踜踠踡踤踥踦踧踨踫踭踰踲踳踴踶踷踸踻踼踾�踿蹃蹅蹆蹌蹍蹎蹏蹐蹓蹔蹕蹖蹗蹘蹚蹛蹜蹝蹞蹟蹠蹡蹢蹣蹤蹥蹧蹨蹪蹫蹮蹱邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split("");
      for (j2 = 0; j2 != D[219].length; ++j2)
        if (D[219][j2].charCodeAt(0) !== 65533) {
          e[D[219][j2]] = 56064 + j2;
          d[56064 + j2] = D[219][j2];
        }
      D[220] = "����������������������������������������������������������������蹳蹵蹷蹸蹹蹺蹻蹽蹾躀躂躃躄躆躈躉躊躋躌躍躎躑躒躓躕躖躗躘躙躚躛躝躟躠躡躢躣躤躥躦躧躨躩躪躭躮躰躱躳躴躵躶躷躸躹躻躼躽躾躿軀軁軂�軃軄軅軆軇軈軉車軋軌軍軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟軠軡転軣軤堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split("");
      for (j2 = 0; j2 != D[220].length; ++j2)
        if (D[220][j2].charCodeAt(0) !== 65533) {
          e[D[220][j2]] = 56320 + j2;
          d[56320 + j2] = D[220][j2];
        }
      D[221] = "����������������������������������������������������������������軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟輠輡輢輣�輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿轀轁轂轃轄荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split("");
      for (j2 = 0; j2 != D[221].length; ++j2)
        if (D[221][j2].charCodeAt(0) !== 65533) {
          e[D[221][j2]] = 56576 + j2;
          d[56576 + j2] = D[221][j2];
        }
      D[222] = "����������������������������������������������������������������轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟轠轡轢轣轤轥轪辀辌辒辝辠辡辢辤辥辦辧辪辬辭辮辯農辳辴辵辷辸辺辻込辿迀迃迆�迉迊迋迌迍迏迒迖迗迚迠迡迣迧迬迯迱迲迴迵迶迺迻迼迾迿逇逈逌逎逓逕逘蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split("");
      for (j2 = 0; j2 != D[222].length; ++j2)
        if (D[222][j2].charCodeAt(0) !== 65533) {
          e[D[222][j2]] = 56832 + j2;
          d[56832 + j2] = D[222][j2];
        }
      D[223] = "����������������������������������������������������������������這逜連逤逥逧逨逩逪逫逬逰週進逳逴逷逹逺逽逿遀遃遅遆遈遉遊運遌過達違遖遙遚遜遝遞遟遠遡遤遦遧適遪遫遬遯遰遱遲遳遶遷選遹遺遻遼遾邁�還邅邆邇邉邊邌邍邎邏邐邒邔邖邘邚邜邞邟邠邤邥邧邨邩邫邭邲邷邼邽邿郀摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split("");
      for (j2 = 0; j2 != D[223].length; ++j2)
        if (D[223][j2].charCodeAt(0) !== 65533) {
          e[D[223][j2]] = 57088 + j2;
          d[57088 + j2] = D[223][j2];
        }
      D[224] = "����������������������������������������������������������������郂郃郆郈郉郋郌郍郒郔郕郖郘郙郚郞郟郠郣郤郥郩郪郬郮郰郱郲郳郵郶郷郹郺郻郼郿鄀鄁鄃鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄚鄛鄜�鄝鄟鄠鄡鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄰鄲鄳鄴鄵鄶鄷鄸鄺鄻鄼鄽鄾鄿酀酁酂酄唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split("");
      for (j2 = 0; j2 != D[224].length; ++j2)
        if (D[224][j2].charCodeAt(0) !== 65533) {
          e[D[224][j2]] = 57344 + j2;
          d[57344 + j2] = D[224][j2];
        }
      D[225] = "����������������������������������������������������������������酅酇酈酑酓酔酕酖酘酙酛酜酟酠酦酧酨酫酭酳酺酻酼醀醁醂醃醄醆醈醊醎醏醓醔醕醖醗醘醙醜醝醞醟醠醡醤醥醦醧醨醩醫醬醰醱醲醳醶醷醸醹醻�醼醽醾醿釀釁釂釃釄釅釆釈釋釐釒釓釔釕釖釗釘釙釚釛針釞釟釠釡釢釣釤釥帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split("");
      for (j2 = 0; j2 != D[225].length; ++j2)
        if (D[225][j2].charCodeAt(0) !== 65533) {
          e[D[225][j2]] = 57600 + j2;
          d[57600 + j2] = D[225][j2];
        }
      D[226] = "����������������������������������������������������������������釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟鈠鈡鈢鈣鈤�鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿鉀鉁鉂鉃鉄鉅狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split("");
      for (j2 = 0; j2 != D[226].length; ++j2)
        if (D[226][j2].charCodeAt(0) !== 65533) {
          e[D[226][j2]] = 57856 + j2;
          d[57856 + j2] = D[226][j2];
        }
      D[227] = "����������������������������������������������������������������鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿銀銁銂銃銄銅�銆銇銈銉銊銋銌銍銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟銠銡銢銣銤銥銦銧恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split("");
      for (j2 = 0; j2 != D[227].length; ++j2)
        if (D[227][j2].charCodeAt(0) !== 65533) {
          e[D[227][j2]] = 58112 + j2;
          d[58112 + j2] = D[227][j2];
        }
      D[228] = "����������������������������������������������������������������銨銩銪銫銬銭銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿鋀鋁鋂鋃鋄鋅鋆鋇鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟鋠鋡鋢鋣鋤鋥鋦鋧鋨�鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿錀錁錂錃錄錅錆錇錈錉洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split("");
      for (j2 = 0; j2 != D[228].length; ++j2)
        if (D[228][j2].charCodeAt(0) !== 65533) {
          e[D[228][j2]] = 58368 + j2;
          d[58368 + j2] = D[228][j2];
        }
      D[229] = "����������������������������������������������������������������錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錿鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉�鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍫濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split("");
      for (j2 = 0; j2 != D[229].length; ++j2)
        if (D[229][j2].charCodeAt(0) !== 65533) {
          e[D[229][j2]] = 58624 + j2;
          d[58624 + j2] = D[229][j2];
        }
      D[230] = "����������������������������������������������������������������鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫�鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏋鏌鏍妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split("");
      for (j2 = 0; j2 != D[230].length; ++j2)
        if (D[230][j2].charCodeAt(0) !== 65533) {
          e[D[230][j2]] = 58880 + j2;
          d[58880 + j2] = D[230][j2];
        }
      D[231] = "����������������������������������������������������������������鏎鏏鏐鏑鏒鏓鏔鏕鏗鏘鏙鏚鏛鏜鏝鏞鏟鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍�鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split("");
      for (j2 = 0; j2 != D[231].length; ++j2)
        if (D[231][j2].charCodeAt(0) !== 65533) {
          e[D[231][j2]] = 59136 + j2;
          d[59136 + j2] = D[231][j2];
        }
      D[232] = "����������������������������������������������������������������鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐿鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑬鑭鑮鑯�鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿钀钁钂钃钄钑钖钘铇铏铓铔铚铦铻锜锠琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split("");
      for (j2 = 0; j2 != D[232].length; ++j2)
        if (D[232][j2].charCodeAt(0) !== 65533) {
          e[D[232][j2]] = 59392 + j2;
          d[59392 + j2] = D[232][j2];
        }
      D[233] = "����������������������������������������������������������������锧锳锽镃镈镋镕镚镠镮镴镵長镸镹镺镻镼镽镾門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟閠閡関閣閤閥閦閧閨閩閪�閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿闀闁闂闃闄闅闆闇闈闉闊闋椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split("");
      for (j2 = 0; j2 != D[233].length; ++j2)
        if (D[233][j2].charCodeAt(0) !== 65533) {
          e[D[233][j2]] = 59648 + j2;
          d[59648 + j2] = D[233][j2];
        }
      D[234] = "����������������������������������������������������������������闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟闠闡闢闣闤闥闦闧闬闿阇阓阘阛阞阠阣阤阥阦阧阨阩阫阬阭阯阰阷阸阹阺阾陁陃陊陎陏陑陒陓陖陗�陘陙陚陜陝陞陠陣陥陦陫陭陮陯陰陱陳陸陹険陻陼陽陾陿隀隁隂隃隄隇隉隊辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split("");
      for (j2 = 0; j2 != D[234].length; ++j2)
        if (D[234][j2].charCodeAt(0) !== 65533) {
          e[D[234][j2]] = 59904 + j2;
          d[59904 + j2] = D[234][j2];
        }
      D[235] = "����������������������������������������������������������������隌階隑隒隓隕隖隚際隝隞隟隠隡隢隣隤隥隦隨隩險隫隬隭隮隯隱隲隴隵隷隸隺隻隿雂雃雈雊雋雐雑雓雔雖雗雘雙雚雛雜雝雞雟雡離難雤雥雦雧雫�雬雭雮雰雱雲雴雵雸雺電雼雽雿霂霃霅霊霋霌霐霑霒霔霕霗霘霙霚霛霝霟霠搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split("");
      for (j2 = 0; j2 != D[235].length; ++j2)
        if (D[235][j2].charCodeAt(0) !== 65533) {
          e[D[235][j2]] = 60160 + j2;
          d[60160 + j2] = D[235][j2];
        }
      D[236] = "����������������������������������������������������������������霡霢霣霤霥霦霧霨霩霫霬霮霯霱霳霴霵霶霷霺霻霼霽霿靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑靔靕靗靘靚靜靝靟靣靤靦靧靨靪靫靬靭靮靯靰靱�靲靵靷靸靹靺靻靽靾靿鞀鞁鞂鞃鞄鞆鞇鞈鞉鞊鞌鞎鞏鞐鞓鞕鞖鞗鞙鞚鞛鞜鞝臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split("");
      for (j2 = 0; j2 != D[236].length; ++j2)
        if (D[236][j2].charCodeAt(0) !== 65533) {
          e[D[236][j2]] = 60416 + j2;
          d[60416 + j2] = D[236][j2];
        }
      D[237] = "����������������������������������������������������������������鞞鞟鞡鞢鞤鞥鞦鞧鞨鞩鞪鞬鞮鞰鞱鞳鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟韠韡韢韣�韤韥韨韮韯韰韱韲韴韷韸韹韺韻韼韽韾響頀頁頂頃頄項順頇須頉頊頋頌頍頎怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split("");
      for (j2 = 0; j2 != D[237].length; ++j2)
        if (D[237][j2].charCodeAt(0) !== 65533) {
          e[D[237][j2]] = 60672 + j2;
          d[60672 + j2] = D[237][j2];
        }
      D[238] = "����������������������������������������������������������������頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿顀顁顂顃顄顅顆顇顈顉顊顋題額�顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split("");
      for (j2 = 0; j2 != D[238].length; ++j2)
        if (D[238][j2].charCodeAt(0) !== 65533) {
          e[D[238][j2]] = 60928 + j2;
          d[60928 + j2] = D[238][j2];
        }
      D[239] = "����������������������������������������������������������������顯顰顱顲顳顴颋颎颒颕颙颣風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿飀飁飂飃飄飅飆飇飈飉飊飋飌飍飏飐飔飖飗飛飜飝飠飡飢飣飤�飥飦飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿餀餁餂餃餄餅餆餇铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split("");
      for (j2 = 0; j2 != D[239].length; ++j2)
        if (D[239][j2].charCodeAt(0) !== 65533) {
          e[D[239][j2]] = 61184 + j2;
          d[61184 + j2] = D[239][j2];
        }
      D[240] = "����������������������������������������������������������������餈餉養餋餌餎餏餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟餠餡餢餣餤餥餦餧館餩餪餫餬餭餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿饀饁饂饃饄饅饆饇饈饉�饊饋饌饍饎饏饐饑饒饓饖饗饘饙饚饛饜饝饞饟饠饡饢饤饦饳饸饹饻饾馂馃馉稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split("");
      for (j2 = 0; j2 != D[240].length; ++j2)
        if (D[240][j2].charCodeAt(0) !== 65533) {
          e[D[240][j2]] = 61440 + j2;
          d[61440 + j2] = D[240][j2];
        }
      D[241] = "����������������������������������������������������������������馌馎馚馛馜馝馞馟馠馡馢馣馤馦馧馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘�駙駚駛駜駝駞駟駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split("");
      for (j2 = 0; j2 != D[241].length; ++j2)
        if (D[241][j2].charCodeAt(0) !== 65533) {
          e[D[241][j2]] = 61696 + j2;
          d[61696 + j2] = D[241][j2];
        }
      D[242] = "����������������������������������������������������������������駺駻駼駽駾駿騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸�騹騺騻騼騽騾騿驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split("");
      for (j2 = 0; j2 != D[242].length; ++j2)
        if (D[242][j2].charCodeAt(0) !== 65533) {
          e[D[242][j2]] = 61952 + j2;
          d[61952 + j2] = D[242][j2];
        }
      D[243] = "����������������������������������������������������������������驚驛驜驝驞驟驠驡驢驣驤驥驦驧驨驩驪驫驲骃骉骍骎骔骕骙骦骩骪骫骬骭骮骯骲骳骴骵骹骻骽骾骿髃髄髆髇髈髉髊髍髎髏髐髒體髕髖髗髙髚髛髜�髝髞髠髢髣髤髥髧髨髩髪髬髮髰髱髲髳髴髵髶髷髸髺髼髽髾髿鬀鬁鬂鬄鬅鬆蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split("");
      for (j2 = 0; j2 != D[243].length; ++j2)
        if (D[243][j2].charCodeAt(0) !== 65533) {
          e[D[243][j2]] = 62208 + j2;
          d[62208 + j2] = D[243][j2];
        }
      D[244] = "����������������������������������������������������������������鬇鬉鬊鬋鬌鬍鬎鬐鬑鬒鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬠鬡鬢鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬰鬱鬳鬴鬵鬶鬷鬸鬹鬺鬽鬾鬿魀魆魊魋魌魎魐魒魓魕魖魗魘魙魚�魛魜魝魞魟魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split("");
      for (j2 = 0; j2 != D[244].length; ++j2)
        if (D[244][j2].charCodeAt(0) !== 65533) {
          e[D[244][j2]] = 62464 + j2;
          d[62464 + j2] = D[244][j2];
        }
      D[245] = "����������������������������������������������������������������魼魽魾魿鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺�鮻鮼鮽鮾鮿鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split("");
      for (j2 = 0; j2 != D[245].length; ++j2)
        if (D[245][j2].charCodeAt(0) !== 65533) {
          e[D[245][j2]] = 62720 + j2;
          d[62720 + j2] = D[245][j2];
        }
      D[246] = "����������������������������������������������������������������鯜鯝鯞鯟鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚�鰛鰜鰝鰞鰟鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split("");
      for (j2 = 0; j2 != D[246].length; ++j2)
        if (D[246][j2].charCodeAt(0) !== 65533) {
          e[D[246][j2]] = 62976 + j2;
          d[62976 + j2] = D[246][j2];
        }
      D[247] = "����������������������������������������������������������������鰼鰽鰾鰿鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺�鱻鱽鱾鲀鲃鲄鲉鲊鲌鲏鲓鲖鲗鲘鲙鲝鲪鲬鲯鲹鲾鲿鳀鳁鳂鳈鳉鳑鳒鳚鳛鳠鳡鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split("");
      for (j2 = 0; j2 != D[247].length; ++j2)
        if (D[247][j2].charCodeAt(0) !== 65533) {
          e[D[247][j2]] = 63232 + j2;
          d[63232 + j2] = D[247][j2];
        }
      D[248] = "����������������������������������������������������������������鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟鴠鴡�鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[248].length; ++j2)
        if (D[248][j2].charCodeAt(0) !== 65533) {
          e[D[248][j2]] = 63488 + j2;
          d[63488 + j2] = D[248][j2];
        }
      D[249] = "����������������������������������������������������������������鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿鶀鶁�鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟鶠鶡鶢�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[249].length; ++j2)
        if (D[249][j2].charCodeAt(0) !== 65533) {
          e[D[249][j2]] = 63744 + j2;
          d[63744 + j2] = D[249][j2];
        }
      D[250] = "����������������������������������������������������������������鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟鷠鷡�鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿鸀鸁鸂�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[250].length; ++j2)
        if (D[250][j2].charCodeAt(0) !== 65533) {
          e[D[250][j2]] = 64e3 + j2;
          d[64e3 + j2] = D[250][j2];
        }
      D[251] = "����������������������������������������������������������������鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸤鸧鸮鸰鸴鸻鸼鹀鹍鹐鹒鹓鹔鹖鹙鹝鹟鹠鹡鹢鹥鹮鹯鹲鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽麀�麁麃麄麅麆麉麊麌麍麎麏麐麑麔麕麖麗麘麙麚麛麜麞麠麡麢麣麤麥麧麨麩麪�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[251].length; ++j2)
        if (D[251][j2].charCodeAt(0) !== 65533) {
          e[D[251][j2]] = 64256 + j2;
          d[64256 + j2] = D[251][j2];
        }
      D[252] = "����������������������������������������������������������������麫麬麭麮麯麰麱麲麳麵麶麷麹麺麼麿黀黁黂黃黅黆黇黈黊黋黌黐黒黓黕黖黗黙黚點黡黣黤黦黨黫黬黭黮黰黱黲黳黴黵黶黷黸黺黽黿鼀鼁鼂鼃鼄鼅�鼆鼇鼈鼉鼊鼌鼏鼑鼒鼔鼕鼖鼘鼚鼛鼜鼝鼞鼟鼡鼣鼤鼥鼦鼧鼨鼩鼪鼫鼭鼮鼰鼱�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[252].length; ++j2)
        if (D[252][j2].charCodeAt(0) !== 65533) {
          e[D[252][j2]] = 64512 + j2;
          d[64512 + j2] = D[252][j2];
        }
      D[253] = "����������������������������������������������������������������鼲鼳鼴鼵鼶鼸鼺鼼鼿齀齁齂齃齅齆齇齈齉齊齋齌齍齎齏齒齓齔齕齖齗齘齙齚齛齜齝齞齟齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸�齹齺齻齼齽齾龁龂龍龎龏龐龑龒龓龔龕龖龗龘龜龝龞龡龢龣龤龥郎凉秊裏隣�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[253].length; ++j2)
        if (D[253][j2].charCodeAt(0) !== 65533) {
          e[D[253][j2]] = 64768 + j2;
          d[64768 + j2] = D[253][j2];
        }
      D[254] = "����������������������������������������������������������������兀嗀﨎﨏﨑﨓﨔礼﨟蘒﨡﨣﨤﨧﨨﨩��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[254].length; ++j2)
        if (D[254][j2].charCodeAt(0) !== 65533) {
          e[D[254][j2]] = 65024 + j2;
          d[65024 + j2] = D[254][j2];
        }
      return { "enc": e, "dec": d };
    }();
    cptable2[949] = function() {
      var d = [], e = {}, D = [], j2;
      D[0] = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[0].length; ++j2)
        if (D[0][j2].charCodeAt(0) !== 65533) {
          e[D[0][j2]] = 0 + j2;
          d[0 + j2] = D[0][j2];
        }
      D[129] = "�����������������������������������������������������������������갂갃갅갆갋갌갍갎갏갘갞갟갡갢갣갥갦갧갨갩갪갫갮갲갳갴������갵갶갷갺갻갽갾갿걁걂걃걄걅걆걇걈걉걊걌걎걏걐걑걒걓걕������걖걗걙걚걛걝걞걟걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯걲걳걵걶걹걻걼걽걾걿겂겇겈겍겎겏겑겒겓겕겖겗겘겙겚겛겞겢겣겤겥겦겧겫겭겮겱겲겳겴겵겶겷겺겾겿곀곂곃곅곆곇곉곊곋곍곎곏곐곑곒곓곔곖곘곙곚곛곜곝곞곟곢곣곥곦곩곫곭곮곲곴곷곸곹곺곻곾곿괁괂괃괅괇괈괉괊괋괎괐괒괓�".split("");
      for (j2 = 0; j2 != D[129].length; ++j2)
        if (D[129][j2].charCodeAt(0) !== 65533) {
          e[D[129][j2]] = 33024 + j2;
          d[33024 + j2] = D[129][j2];
        }
      D[130] = "�����������������������������������������������������������������괔괕괖괗괙괚괛괝괞괟괡괢괣괤괥괦괧괨괪괫괮괯괰괱괲괳������괶괷괹괺괻괽괾괿굀굁굂굃굆굈굊굋굌굍굎굏굑굒굓굕굖굗������굙굚굛굜굝굞굟굠굢굤굥굦굧굨굩굪굫굮굯굱굲굷굸굹굺굾궀궃궄궅궆궇궊궋궍궎궏궑궒궓궔궕궖궗궘궙궚궛궞궟궠궡궢궣궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궸궹궺궻궼궽궾궿귂귃귅귆귇귉귊귋귌귍귎귏귒귔귕귖귗귘귙귚귛귝귞귟귡귢귣귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷�".split("");
      for (j2 = 0; j2 != D[130].length; ++j2)
        if (D[130][j2].charCodeAt(0) !== 65533) {
          e[D[130][j2]] = 33280 + j2;
          d[33280 + j2] = D[130][j2];
        }
      D[131] = "�����������������������������������������������������������������귺귻귽귾긂긃긄긅긆긇긊긌긎긏긐긑긒긓긕긖긗긘긙긚긛긜������긝긞긟긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯긲긳긵긶긹긻긼������긽긾긿깂깄깇깈깉깋깏깑깒깓깕깗깘깙깚깛깞깢깣깤깦깧깪깫깭깮깯깱깲깳깴깵깶깷깺깾깿꺀꺁꺂꺃꺆꺇꺈꺉꺊꺋꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺿껁껂껃껅껆껇껈껉껊껋껎껒껓껔껕껖껗껚껛껝껞껟껠껡껢껣껤껥�".split("");
      for (j2 = 0; j2 != D[131].length; ++j2)
        if (D[131][j2].charCodeAt(0) !== 65533) {
          e[D[131][j2]] = 33536 + j2;
          d[33536 + j2] = D[131][j2];
        }
      D[132] = "�����������������������������������������������������������������껦껧껩껪껬껮껯껰껱껲껳껵껶껷껹껺껻껽껾껿꼀꼁꼂꼃꼄꼅������꼆꼉꼊꼋꼌꼎꼏꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟꼠꼡꼢꼣������꼤꼥꼦꼧꼨꼩꼪꼫꼮꼯꼱꼳꼵꼶꼷꼸꼹꼺꼻꼾꽀꽄꽅꽆꽇꽊꽋꽌꽍꽎꽏꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽞꽟꽠꽡꽢꽣꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽺꽻꽼꽽꽾꽿꾁꾂꾃꾅꾆꾇꾉꾊꾋꾌꾍꾎꾏꾒꾓꾔꾖꾗꾘꾙꾚꾛꾝꾞꾟꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾺꾻꾽꾾�".split("");
      for (j2 = 0; j2 != D[132].length; ++j2)
        if (D[132][j2].charCodeAt(0) !== 65533) {
          e[D[132][j2]] = 33792 + j2;
          d[33792 + j2] = D[132][j2];
        }
      D[133] = "�����������������������������������������������������������������꾿꿁꿂꿃꿄꿅꿆꿊꿌꿏꿐꿑꿒꿓꿕꿖꿗꿘꿙꿚꿛꿝꿞꿟꿠꿡������꿢꿣꿤꿥꿦꿧꿪꿫꿬꿭꿮꿯꿲꿳꿵꿶꿷꿹꿺꿻꿼꿽꿾꿿뀂뀃������뀅뀆뀇뀈뀉뀊뀋뀍뀎뀏뀑뀒뀓뀕뀖뀗뀘뀙뀚뀛뀞뀟뀠뀡뀢뀣뀤뀥뀦뀧뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿끀끁끂끃끆끇끉끋끍끏끐끑끒끖끘끚끛끜끞끟끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끾끿낁낂낃낅낆낇낈낉낊낋낎낐낒낓낔낕낖낗낛낝낞낣낤�".split("");
      for (j2 = 0; j2 != D[133].length; ++j2)
        if (D[133][j2].charCodeAt(0) !== 65533) {
          e[D[133][j2]] = 34048 + j2;
          d[34048 + j2] = D[133][j2];
        }
      D[134] = "�����������������������������������������������������������������낥낦낧낪낰낲낶낷낹낺낻낽낾낿냀냁냂냃냆냊냋냌냍냎냏냒������냓냕냖냗냙냚냛냜냝냞냟냡냢냣냤냦냧냨냩냪냫냬냭냮냯냰������냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿넀넁넂넃넄넅넆넇넊넍넎넏넑넔넕넖넗넚넞넟넠넡넢넦넧넩넪넫넭넮넯넰넱넲넳넶넺넻넼넽넾넿녂녃녅녆녇녉녊녋녌녍녎녏녒녓녖녗녙녚녛녝녞녟녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷녺녻녽녾녿놁놃놄놅놆놇놊놌놎놏놐놑놕놖놗놙놚놛놝�".split("");
      for (j2 = 0; j2 != D[134].length; ++j2)
        if (D[134][j2].charCodeAt(0) !== 65533) {
          e[D[134][j2]] = 34304 + j2;
          d[34304 + j2] = D[134][j2];
        }
      D[135] = "�����������������������������������������������������������������놞놟놠놡놢놣놤놥놦놧놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸������놹놺놻놼놽놾놿뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇍뇎뇏뇑뇒뇓뇕������뇖뇗뇘뇙뇚뇛뇞뇠뇡뇢뇣뇤뇥뇦뇧뇪뇫뇭뇮뇯뇱뇲뇳뇴뇵뇶뇷뇸뇺뇼뇾뇿눀눁눂눃눆눇눉눊눍눎눏눐눑눒눓눖눘눚눛눜눝눞눟눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눵눶눷눸눹눺눻눽눾눿뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉙뉚뉛뉝뉞뉟뉡뉢뉣뉤뉥뉦뉧뉪뉫뉬뉭뉮�".split("");
      for (j2 = 0; j2 != D[135].length; ++j2)
        if (D[135][j2].charCodeAt(0) !== 65533) {
          e[D[135][j2]] = 34560 + j2;
          d[34560 + j2] = D[135][j2];
        }
      D[136] = "�����������������������������������������������������������������뉯뉰뉱뉲뉳뉶뉷뉸뉹뉺뉻뉽뉾뉿늀늁늂늃늆늇늈늊늋늌늍늎������늏늒늓늕늖늗늛늜늝늞늟늢늤늧늨늩늫늭늮늯늱늲늳늵늶늷������늸늹늺늻늼늽늾늿닀닁닂닃닄닅닆닇닊닋닍닎닏닑닓닔닕닖닗닚닜닞닟닠닡닣닧닩닪닰닱닲닶닼닽닾댂댃댅댆댇댉댊댋댌댍댎댏댒댖댗댘댙댚댛댝댞댟댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓덗덙덚덝덠덡덢덣�".split("");
      for (j2 = 0; j2 != D[136].length; ++j2)
        if (D[136][j2].charCodeAt(0) !== 65533) {
          e[D[136][j2]] = 34816 + j2;
          d[34816 + j2] = D[136][j2];
        }
      D[137] = "�����������������������������������������������������������������덦덨덪덬덭덯덲덳덵덶덷덹덺덻덼덽덾덿뎂뎆뎇뎈뎉뎊뎋뎍������뎎뎏뎑뎒뎓뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟뎢뎣뎤뎥뎦뎧뎩뎪뎫뎭������뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿돀돁돂돃돆돇돉돊돍돏돑돒돓돖돘돚돜돞돟돡돢돣돥돦돧돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돽돾돿됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됑됒됓됔됕됖됗됙됚됛됝됞됟됡됢됣됤됥됦됧됪됬됭됮됯됰됱됲됳됵됶됷됸됹됺됻됼됽됾됿둀둁둂둃둄�".split("");
      for (j2 = 0; j2 != D[137].length; ++j2)
        if (D[137][j2].charCodeAt(0) !== 65533) {
          e[D[137][j2]] = 35072 + j2;
          d[35072 + j2] = D[137][j2];
        }
      D[138] = "�����������������������������������������������������������������둅둆둇둈둉둊둋둌둍둎둏둒둓둕둖둗둙둚둛둜둝둞둟둢둤둦������둧둨둩둪둫둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿뒁뒂������뒃뒄뒅뒆뒇뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒞뒟뒠뒡뒢뒣뒥뒦뒧뒩뒪뒫뒭뒮뒯뒰뒱뒲뒳뒴뒶뒸뒺뒻뒼뒽뒾뒿듁듂듃듅듆듇듉듊듋듌듍듎듏듑듒듓듔듖듗듘듙듚듛듞듟듡듢듥듧듨듩듪듫듮듰듲듳듴듵듶듷듹듺듻듼듽듾듿딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓딖딗딙딚딝�".split("");
      for (j2 = 0; j2 != D[138].length; ++j2)
        if (D[138][j2].charCodeAt(0) !== 65533) {
          e[D[138][j2]] = 35328 + j2;
          d[35328 + j2] = D[138][j2];
        }
      D[139] = "�����������������������������������������������������������������딞딟딠딡딢딣딦딫딬딭딮딯딲딳딵딶딷딹딺딻딼딽딾딿땂땆������땇땈땉땊땎땏땑땒땓땕땖땗땘땙땚땛땞땢땣땤땥땦땧땨땩땪������땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟떢떣떥떦떧떩떬떭떮떯떲떶떷떸떹떺떾떿뗁뗂뗃뗅뗆뗇뗈뗉뗊뗋뗎뗒뗓뗔뗕뗖뗗뗙뗚뗛뗜뗝뗞뗟뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿�".split("");
      for (j2 = 0; j2 != D[139].length; ++j2)
        if (D[139][j2].charCodeAt(0) !== 65533) {
          e[D[139][j2]] = 35584 + j2;
          d[35584 + j2] = D[139][j2];
        }
      D[140] = "�����������������������������������������������������������������똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏똒똓똕똖똗똙똚똛똜똝������똞똟똠똡똢똣똤똦똧똨똩똪똫똭똮똯똰똱똲똳똵똶똷똸똹똺������똻똼똽똾똿뙀뙁뙂뙃뙄뙅뙆뙇뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟뙠뙡뙢뙣뙥뙦뙧뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚞뚟뚡뚢뚣뚥뚦뚧뚨뚩뚪뚭뚮뚯뚰뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿뛀뛁뛂�".split("");
      for (j2 = 0; j2 != D[140].length; ++j2)
        if (D[140][j2].charCodeAt(0) !== 65533) {
          e[D[140][j2]] = 35840 + j2;
          d[35840 + j2] = D[140][j2];
        }
      D[141] = "�����������������������������������������������������������������뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛕뛖뛗뛘뛙뛚뛛뛜뛝������뛞뛟뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛱뛲뛳뛵뛶뛷뛹뛺������뛻뛼뛽뛾뛿뜂뜃뜄뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟뜠뜡뜢뜣뜤뜥뜦뜧뜪뜫뜭뜮뜱뜲뜳뜴뜵뜶뜷뜺뜼뜽뜾뜿띀띁띂띃띅띆띇띉띊띋띍띎띏띐띑띒띓띖띗띘띙띚띛띜띝띞띟띡띢띣띥띦띧띩띪띫띬띭띮띯띲띴띶띷띸띹띺띻띾띿랁랂랃랅랆랇랈랉랊랋랎랓랔랕랚랛랝랞�".split("");
      for (j2 = 0; j2 != D[141].length; ++j2)
        if (D[141][j2].charCodeAt(0) !== 65533) {
          e[D[141][j2]] = 36096 + j2;
          d[36096 + j2] = D[141][j2];
        }
      D[142] = "�����������������������������������������������������������������랟랡랢랣랤랥랦랧랪랮랯랰랱랲랳랶랷랹랺랻랼랽랾랿럀럁������럂럃럄럅럆럈럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝������럞럟럠럡럢럣럤럥럦럧럨럩럪럫럮럯럱럲럳럵럶럷럸럹럺럻럾렂렃렄렅렆렊렋렍렎렏렑렒렓렔렕렖렗렚렜렞렟렠렡렢렣렦렧렩렪렫렭렮렯렰렱렲렳렶렺렻렼렽렾렿롁롂롃롅롆롇롈롉롊롋롌롍롎롏롐롒롔롕롖롗롘롙롚롛롞롟롡롢롣롥롦롧롨롩롪롫롮롰롲롳롴롵롶롷롹롺롻롽롾롿뢀뢁뢂뢃뢄�".split("");
      for (j2 = 0; j2 != D[142].length; ++j2)
        if (D[142][j2].charCodeAt(0) !== 65533) {
          e[D[142][j2]] = 36352 + j2;
          d[36352 + j2] = D[142][j2];
        }
      D[143] = "�����������������������������������������������������������������뢅뢆뢇뢈뢉뢊뢋뢌뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟������뢠뢡뢢뢣뢤뢥뢦뢧뢩뢪뢫뢬뢭뢮뢯뢱뢲뢳뢵뢶뢷뢹뢺뢻뢼뢽������뢾뢿룂룄룆룇룈룉룊룋룍룎룏룑룒룓룕룖룗룘룙룚룛룜룞룠룢룣룤룥룦룧룪룫룭룮룯룱룲룳룴룵룶룷룺룼룾룿뤀뤁뤂뤃뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤙뤚뤛뤜뤝뤞뤟뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤾뤿륁륂륃륅륆륇륈륉륊륋륍륎륐륒륓륔륕륖륗�".split("");
      for (j2 = 0; j2 != D[143].length; ++j2)
        if (D[143][j2].charCodeAt(0) !== 65533) {
          e[D[143][j2]] = 36608 + j2;
          d[36608 + j2] = D[143][j2];
        }
      D[144] = "�����������������������������������������������������������������륚륛륝륞륟륡륢륣륤륥륦륧륪륬륮륯륰륱륲륳륶륷륹륺륻륽������륾륿릀릁릂릃릆릈릋릌릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞������릟릠릡릢릣릤릥릦릧릨릩릪릫릮릯릱릲릳릵릶릷릸릹릺릻릾맀맂맃맄맅맆맇맊맋맍맓맔맕맖맗맚맜맟맠맢맦맧맩맪맫맭맮맯맰맱맲맳맶맻맼맽맾맿먂먃먄먅먆먇먉먊먋먌먍먎먏먐먑먒먓먔먖먗먘먙먚먛먜먝먞먟먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷먺먻먽먾먿멁멃멄멅멆�".split("");
      for (j2 = 0; j2 != D[144].length; ++j2)
        if (D[144][j2].charCodeAt(0) !== 65533) {
          e[D[144][j2]] = 36864 + j2;
          d[36864 + j2] = D[144][j2];
        }
      D[145] = "�����������������������������������������������������������������멇멊멌멏멐멑멒멖멗멙멚멛멝멞멟멠멡멢멣멦멪멫멬멭멮멯������멲멳멵멶멷멹멺멻멼멽멾멿몀몁몂몆몈몉몊몋몍몎몏몐몑몒������몓몔몕몖몗몘몙몚몛몜몝몞몟몠몡몢몣몤몥몦몧몪몭몮몯몱몳몴몵몶몷몺몼몾몿뫀뫁뫂뫃뫅뫆뫇뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫚뫛뫜뫝뫞뫟뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫽뫾뫿묁묂묃묅묆묇묈묉묊묋묌묎묐묒묓묔묕묖묗묙묚묛묝묞묟묡묢묣묤묥묦묧�".split("");
      for (j2 = 0; j2 != D[145].length; ++j2)
        if (D[145][j2].charCodeAt(0) !== 65533) {
          e[D[145][j2]] = 37120 + j2;
          d[37120 + j2] = D[145][j2];
        }
      D[146] = "�����������������������������������������������������������������묨묪묬묭묮묯묰묱묲묳묷묹묺묿뭀뭁뭂뭃뭆뭈뭊뭋뭌뭎뭑뭒������뭓뭕뭖뭗뭙뭚뭛뭜뭝뭞뭟뭠뭢뭤뭥뭦뭧뭨뭩뭪뭫뭭뭮뭯뭰뭱������뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿뮀뮁뮂뮃뮄뮅뮆뮇뮉뮊뮋뮍뮎뮏뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟뮠뮡뮢뮣뮥뮦뮧뮩뮪뮫뮭뮮뮯뮰뮱뮲뮳뮵뮶뮸뮹뮺뮻뮼뮽뮾뮿믁믂믃믅믆믇믉믊믋믌믍믎믏믑믒믔믕믖믗믘믙믚믛믜믝믞믟믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷믺믻믽믾밁�".split("");
      for (j2 = 0; j2 != D[146].length; ++j2)
        if (D[146][j2].charCodeAt(0) !== 65533) {
          e[D[146][j2]] = 37376 + j2;
          d[37376 + j2] = D[146][j2];
        }
      D[147] = "�����������������������������������������������������������������밃밄밅밆밇밊밎밐밒밓밙밚밠밡밢밣밦밨밪밫밬밮밯밲밳밵������밶밷밹밺밻밼밽밾밿뱂뱆뱇뱈뱊뱋뱎뱏뱑뱒뱓뱔뱕뱖뱗뱘뱙������뱚뱛뱜뱞뱟뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿벀벁벂벃벆벇벉벊벍벏벐벑벒벓벖벘벛벜벝벞벟벢벣벥벦벩벪벫벬벭벮벯벲벶벷벸벹벺벻벾벿볁볂볃볅볆볇볈볉볊볋볌볎볒볓볔볖볗볙볚볛볝볞볟볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳볷볹볺볻볽�".split("");
      for (j2 = 0; j2 != D[147].length; ++j2)
        if (D[147][j2].charCodeAt(0) !== 65533) {
          e[D[147][j2]] = 37632 + j2;
          d[37632 + j2] = D[147][j2];
        }
      D[148] = "�����������������������������������������������������������������볾볿봀봁봂봃봆봈봊봋봌봍봎봏봑봒봓봕봖봗봘봙봚봛봜봝������봞봟봠봡봢봣봥봦봧봨봩봪봫봭봮봯봰봱봲봳봴봵봶봷봸봹������봺봻봼봽봾봿뵁뵂뵃뵄뵅뵆뵇뵊뵋뵍뵎뵏뵑뵒뵓뵔뵕뵖뵗뵚뵛뵜뵝뵞뵟뵠뵡뵢뵣뵥뵦뵧뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿붂붃붅붆붋붌붍붎붏붒붔붖붗붘붛붝붞붟붠붡붢붣붥붦붧붨붩붪붫붬붭붮붯붱붲붳붴붵붶붷붹붺붻붼붽붾붿뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑�".split("");
      for (j2 = 0; j2 != D[148].length; ++j2)
        if (D[148][j2].charCodeAt(0) !== 65533) {
          e[D[148][j2]] = 37888 + j2;
          d[37888 + j2] = D[148][j2];
        }
      D[149] = "�����������������������������������������������������������������뷒뷓뷖뷗뷙뷚뷛뷝뷞뷟뷠뷡뷢뷣뷤뷥뷦뷧뷨뷪뷫뷬뷭뷮뷯뷱������뷲뷳뷵뷶뷷뷹뷺뷻뷼뷽뷾뷿븁븂븄븆븇븈븉븊븋븎븏븑븒븓������븕븖븗븘븙븚븛븞븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿빀빁빂빃빆빇빉빊빋빍빏빐빑빒빓빖빘빜빝빞빟빢빣빥빦빧빩빫빬빭빮빯빲빶빷빸빹빺빾빿뺁뺂뺃뺅뺆뺇뺈뺉뺊뺋뺎뺒뺓뺔뺕뺖뺗뺚뺛뺜뺝뺞뺟뺠뺡뺢뺣뺤뺥뺦뺧뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷�".split("");
      for (j2 = 0; j2 != D[149].length; ++j2)
        if (D[149][j2].charCodeAt(0) !== 65533) {
          e[D[149][j2]] = 38144 + j2;
          d[38144 + j2] = D[149][j2];
        }
      D[150] = "�����������������������������������������������������������������뺸뺹뺺뺻뺼뺽뺾뺿뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻒뻓������뻕뻖뻙뻚뻛뻜뻝뻞뻟뻡뻢뻦뻧뻨뻩뻪뻫뻭뻮뻯뻰뻱뻲뻳뻴뻵������뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿뼀뼂뼃뼄뼅뼆뼇뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼚뼞뼟뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿뽂뽃뽅뽆뽇뽉뽊뽋뽌뽍뽎뽏뽒뽓뽔뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿뾀뾁뾂�".split("");
      for (j2 = 0; j2 != D[150].length; ++j2)
        if (D[150][j2].charCodeAt(0) !== 65533) {
          e[D[150][j2]] = 38400 + j2;
          d[38400 + j2] = D[150][j2];
        }
      D[151] = "�����������������������������������������������������������������뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾕뾖뾗뾘뾙뾚뾛뾜뾝������뾞뾟뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾱뾲뾳뾴뾵뾶뾷뾸������뾹뾺뾻뾼뾽뾾뾿뿀뿁뿂뿃뿄뿆뿇뿈뿉뿊뿋뿎뿏뿑뿒뿓뿕뿖뿗뿘뿙뿚뿛뿝뿞뿠뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀽쀾쀿�".split("");
      for (j2 = 0; j2 != D[151].length; ++j2)
        if (D[151][j2].charCodeAt(0) !== 65533) {
          e[D[151][j2]] = 38656 + j2;
          d[38656 + j2] = D[151][j2];
        }
      D[152] = "�����������������������������������������������������������������쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁒쁓쁔쁕쁖쁗쁙쁚쁛������쁝쁞쁟쁡쁢쁣쁤쁥쁦쁧쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹������쁺쁻쁼쁽쁾쁿삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삒삓삕삖삗삙삚삛삜삝삞삟삢삤삦삧삨삩삪삫삮삱삲삷삸삹삺삻삾샂샃샄샆샇샊샋샍샎샏샑샒샓샔샕샖샗샚샞샟샠샡샢샣샦샧샩샪샫샭샮샯샰샱샲샳샶샸샺샻샼샽샾샿섁섂섃섅섆섇섉섊섋섌섍섎섏섑섒섓섔섖섗섘섙섚섛섡섢섥섨섩섪섫섮�".split("");
      for (j2 = 0; j2 != D[152].length; ++j2)
        if (D[152][j2].charCodeAt(0) !== 65533) {
          e[D[152][j2]] = 38912 + j2;
          d[38912 + j2] = D[152][j2];
        }
      D[153] = "�����������������������������������������������������������������섲섳섴섵섷섺섻섽섾섿셁셂셃셄셅셆셇셊셎셏셐셑셒셓셖셗������셙셚셛셝셞셟셠셡셢셣셦셪셫셬셭셮셯셱셲셳셵셶셷셹셺셻������셼셽셾셿솀솁솂솃솄솆솇솈솉솊솋솏솑솒솓솕솗솘솙솚솛솞솠솢솣솤솦솧솪솫솭솮솯솱솲솳솴솵솶솷솸솹솺솻솼솾솿쇀쇁쇂쇃쇅쇆쇇쇉쇊쇋쇍쇎쇏쇐쇑쇒쇓쇕쇖쇙쇚쇛쇜쇝쇞쇟쇡쇢쇣쇥쇦쇧쇩쇪쇫쇬쇭쇮쇯쇲쇴쇵쇶쇷쇸쇹쇺쇻쇾쇿숁숂숃숅숆숇숈숉숊숋숎숐숒숓숔숕숖숗숚숛숝숞숡숢숣�".split("");
      for (j2 = 0; j2 != D[153].length; ++j2)
        if (D[153][j2].charCodeAt(0) !== 65533) {
          e[D[153][j2]] = 39168 + j2;
          d[39168 + j2] = D[153][j2];
        }
      D[154] = "�����������������������������������������������������������������숤숥숦숧숪숬숮숰숳숵숶숷숸숹숺숻숼숽숾숿쉀쉁쉂쉃쉄쉅������쉆쉇쉉쉊쉋쉌쉍쉎쉏쉒쉓쉕쉖쉗쉙쉚쉛쉜쉝쉞쉟쉡쉢쉣쉤쉦������쉧쉨쉩쉪쉫쉮쉯쉱쉲쉳쉵쉶쉷쉸쉹쉺쉻쉾슀슂슃슄슅슆슇슊슋슌슍슎슏슑슒슓슔슕슖슗슙슚슜슞슟슠슡슢슣슦슧슩슪슫슮슯슰슱슲슳슶슸슺슻슼슽슾슿싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛싞싟싡싢싥싦싧싨싩싪싮싰싲싳싴싵싷싺싽싾싿쌁쌂쌃쌄쌅쌆쌇쌊쌋쌎쌏�".split("");
      for (j2 = 0; j2 != D[154].length; ++j2)
        if (D[154][j2].charCodeAt(0) !== 65533) {
          e[D[154][j2]] = 39424 + j2;
          d[39424 + j2] = D[154][j2];
        }
      D[155] = "�����������������������������������������������������������������쌐쌑쌒쌖쌗쌙쌚쌛쌝쌞쌟쌠쌡쌢쌣쌦쌧쌪쌫쌬쌭쌮쌯쌰쌱쌲������쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿썀썁썂썃썄썆썇썈썉썊썋썌썍������썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟썠썡썢썣썤썥썦썧썪썫썭썮썯썱썳썴썵썶썷썺썻썾썿쎀쎁쎂쎃쎅쎆쎇쎉쎊쎋쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏚�".split("");
      for (j2 = 0; j2 != D[155].length; ++j2)
        if (D[155][j2].charCodeAt(0) !== 65533) {
          e[D[155][j2]] = 39680 + j2;
          d[39680 + j2] = D[155][j2];
        }
      D[156] = "�����������������������������������������������������������������쏛쏝쏞쏡쏣쏤쏥쏦쏧쏪쏫쏬쏮쏯쏰쏱쏲쏳쏶쏷쏹쏺쏻쏼쏽쏾������쏿쐀쐁쐂쐃쐄쐅쐆쐇쐉쐊쐋쐌쐍쐎쐏쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚������쐛쐜쐝쐞쐟쐠쐡쐢쐣쐥쐦쐧쐨쐩쐪쐫쐭쐮쐯쐱쐲쐳쐵쐶쐷쐸쐹쐺쐻쐾쐿쑀쑁쑂쑃쑄쑅쑆쑇쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟쑠쑡쑢쑣쑦쑧쑩쑪쑫쑭쑮쑯쑰쑱쑲쑳쑶쑷쑸쑺쑻쑼쑽쑾쑿쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒕쒖쒗쒘쒙쒚쒛쒝쒞쒟쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩�".split("");
      for (j2 = 0; j2 != D[156].length; ++j2)
        if (D[156][j2].charCodeAt(0) !== 65533) {
          e[D[156][j2]] = 39936 + j2;
          d[39936 + j2] = D[156][j2];
        }
      D[157] = "�����������������������������������������������������������������쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒹쒺쒻쒽쒾쒿쓀쓁쓂쓃쓄쓅������쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟������쓠쓡쓢쓣쓤쓥쓦쓧쓨쓪쓫쓬쓭쓮쓯쓲쓳쓵쓶쓷쓹쓻쓼쓽쓾씂씃씄씅씆씇씈씉씊씋씍씎씏씑씒씓씕씖씗씘씙씚씛씝씞씟씠씡씢씣씤씥씦씧씪씫씭씮씯씱씲씳씴씵씶씷씺씼씾씿앀앁앂앃앆앇앋앏앐앑앒앖앚앛앜앟앢앣앥앦앧앩앪앫앬앭앮앯앲앶앷앸앹앺앻앾앿얁얂얃얅얆얈얉얊얋얎얐얒얓얔�".split("");
      for (j2 = 0; j2 != D[157].length; ++j2)
        if (D[157][j2].charCodeAt(0) !== 65533) {
          e[D[157][j2]] = 40192 + j2;
          d[40192 + j2] = D[157][j2];
        }
      D[158] = "�����������������������������������������������������������������얖얙얚얛얝얞얟얡얢얣얤얥얦얧얨얪얫얬얭얮얯얰얱얲얳얶������얷얺얿엀엁엂엃엋엍엏엒엓엕엖엗엙엚엛엜엝엞엟엢엤엦엧������엨엩엪엫엯엱엲엳엵엸엹엺엻옂옃옄옉옊옋옍옎옏옑옒옓옔옕옖옗옚옝옞옟옠옡옢옣옦옧옩옪옫옯옱옲옶옸옺옼옽옾옿왂왃왅왆왇왉왊왋왌왍왎왏왒왖왗왘왙왚왛왞왟왡왢왣왤왥왦왧왨왩왪왫왭왮왰왲왳왴왵왶왷왺왻왽왾왿욁욂욃욄욅욆욇욊욌욎욏욐욑욒욓욖욗욙욚욛욝욞욟욠욡욢욣욦�".split("");
      for (j2 = 0; j2 != D[158].length; ++j2)
        if (D[158][j2].charCodeAt(0) !== 65533) {
          e[D[158][j2]] = 40448 + j2;
          d[40448 + j2] = D[158][j2];
        }
      D[159] = "�����������������������������������������������������������������욨욪욫욬욭욮욯욲욳욵욶욷욻욼욽욾욿웂웄웆웇웈웉웊웋웎������웏웑웒웓웕웖웗웘웙웚웛웞웟웢웣웤웥웦웧웪웫웭웮웯웱웲������웳웴웵웶웷웺웻웼웾웿윀윁윂윃윆윇윉윊윋윍윎윏윐윑윒윓윖윘윚윛윜윝윞윟윢윣윥윦윧윩윪윫윬윭윮윯윲윴윶윸윹윺윻윾윿읁읂읃읅읆읇읈읉읋읎읐읙읚읛읝읞읟읡읢읣읤읥읦읧읩읪읬읭읮읯읰읱읲읳읶읷읹읺읻읿잀잁잂잆잋잌잍잏잒잓잕잙잛잜잝잞잟잢잧잨잩잪잫잮잯잱잲잳잵잶잷�".split("");
      for (j2 = 0; j2 != D[159].length; ++j2)
        if (D[159][j2].charCodeAt(0) !== 65533) {
          e[D[159][j2]] = 40704 + j2;
          d[40704 + j2] = D[159][j2];
        }
      D[160] = "�����������������������������������������������������������������잸잹잺잻잾쟂쟃쟄쟅쟆쟇쟊쟋쟍쟏쟑쟒쟓쟔쟕쟖쟗쟙쟚쟛쟜������쟞쟟쟠쟡쟢쟣쟥쟦쟧쟩쟪쟫쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺������쟻쟼쟽쟾쟿젂젃젅젆젇젉젋젌젍젎젏젒젔젗젘젙젚젛젞젟젡젢젣젥젦젧젨젩젪젫젮젰젲젳젴젵젶젷젹젺젻젽젾젿졁졂졃졄졅졆졇졊졋졎졏졐졑졒졓졕졖졗졘졙졚졛졜졝졞졟졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯졲졳졵졶졷졹졻졼졽졾졿좂좄좈좉좊좎좏좐좑좒좓좕좖좗좘좙좚좛좜좞좠좢좣좤�".split("");
      for (j2 = 0; j2 != D[160].length; ++j2)
        if (D[160][j2].charCodeAt(0) !== 65533) {
          e[D[160][j2]] = 40960 + j2;
          d[40960 + j2] = D[160][j2];
        }
      D[161] = "�����������������������������������������������������������������좥좦좧좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좾좿죀죁������죂죃죅죆죇죉죊죋죍죎죏죐죑죒죓죖죘죚죛죜죝죞죟죢죣죥������죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죶죷죸죹죺죻죾죿줁줂줃줇줈줉줊줋줎 、。·‥…¨〃­―∥\∼‘’“”〔〕〈〉《》「」『』【】±×÷≠≤≥∞∴°′″℃Å¢£¥♂♀∠⊥⌒∂∇≡≒§※☆★○●◎◇◆□■△▲▽▼→←↑↓↔〓≪≫√∽∝∵∫∬∈∋⊆⊇⊂⊃∪∩∧∨¬�".split("");
      for (j2 = 0; j2 != D[161].length; ++j2)
        if (D[161][j2].charCodeAt(0) !== 65533) {
          e[D[161][j2]] = 41216 + j2;
          d[41216 + j2] = D[161][j2];
        }
      D[162] = "�����������������������������������������������������������������줐줒줓줔줕줖줗줙줚줛줜줝줞줟줠줡줢줣줤줥줦줧줨줩줪줫������줭줮줯줰줱줲줳줵줶줷줸줹줺줻줼줽줾줿쥀쥁쥂쥃쥄쥅쥆쥇������쥈쥉쥊쥋쥌쥍쥎쥏쥒쥓쥕쥖쥗쥙쥚쥛쥜쥝쥞쥟쥢쥤쥥쥦쥧쥨쥩쥪쥫쥭쥮쥯⇒⇔∀∃´~ˇ˘˝˚˙¸˛¡¿ː∮∑∏¤℉‰◁◀▷▶♤♠♡♥♧♣⊙◈▣◐◑▒▤▥▨▧▦▩♨☏☎☜☞¶†‡↕↗↙↖↘♭♩♪♬㉿㈜№㏇™㏂㏘℡€®������������������������".split("");
      for (j2 = 0; j2 != D[162].length; ++j2)
        if (D[162][j2].charCodeAt(0) !== 65533) {
          e[D[162][j2]] = 41472 + j2;
          d[41472 + j2] = D[162][j2];
        }
      D[163] = "�����������������������������������������������������������������쥱쥲쥳쥵쥶쥷쥸쥹쥺쥻쥽쥾쥿즀즁즂즃즄즅즆즇즊즋즍즎즏������즑즒즓즔즕즖즗즚즜즞즟즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮������즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿짂짃짅짆짉짋짌짍짎짏짒짔짗짘짛!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[₩]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
      for (j2 = 0; j2 != D[163].length; ++j2)
        if (D[163][j2].charCodeAt(0) !== 65533) {
          e[D[163][j2]] = 41728 + j2;
          d[41728 + j2] = D[163][j2];
        }
      D[164] = "�����������������������������������������������������������������짞짟짡짣짥짦짨짩짪짫짮짲짳짴짵짶짷짺짻짽짾짿쨁쨂쨃쨄������쨅쨆쨇쨊쨎쨏쨐쨑쨒쨓쨕쨖쨗쨙쨚쨛쨜쨝쨞쨟쨠쨡쨢쨣쨤쨥������쨦쨧쨨쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿쩀쩁쩂쩃쩄쩅쩆ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ�".split("");
      for (j2 = 0; j2 != D[164].length; ++j2)
        if (D[164][j2].charCodeAt(0) !== 65533) {
          e[D[164][j2]] = 41984 + j2;
          d[41984 + j2] = D[164][j2];
        }
      D[165] = "�����������������������������������������������������������������쩇쩈쩉쩊쩋쩎쩏쩑쩒쩓쩕쩖쩗쩘쩙쩚쩛쩞쩢쩣쩤쩥쩦쩧쩩쩪������쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩾쩿쪀쪁쪂쪃쪅쪆������쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪙쪚쪛쪜쪝쪞쪟쪠쪡쪢쪣쪤쪥쪦쪧ⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹ�����ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ�������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω�������".split("");
      for (j2 = 0; j2 != D[165].length; ++j2)
        if (D[165][j2].charCodeAt(0) !== 65533) {
          e[D[165][j2]] = 42240 + j2;
          d[42240 + j2] = D[165][j2];
        }
      D[166] = "�����������������������������������������������������������������쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪾쪿쫁쫂쫃쫅������쫆쫇쫈쫉쫊쫋쫎쫐쫒쫔쫕쫖쫗쫚쫛쫜쫝쫞쫟쫡쫢쫣쫤쫥쫦쫧������쫨쫩쫪쫫쫭쫮쫯쫰쫱쫲쫳쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿쬀쬁쬂쬃쬄쬅쬆쬇쬉쬊─│┌┐┘└├┬┤┴┼━┃┏┓┛┗┣┳┫┻╋┠┯┨┷┿┝┰┥┸╂┒┑┚┙┖┕┎┍┞┟┡┢┦┧┩┪┭┮┱┲┵┶┹┺┽┾╀╁╃╄╅╆╇╈╉╊���������������������������".split("");
      for (j2 = 0; j2 != D[166].length; ++j2)
        if (D[166][j2].charCodeAt(0) !== 65533) {
          e[D[166][j2]] = 42496 + j2;
          d[42496 + j2] = D[166][j2];
        }
      D[167] = "�����������������������������������������������������������������쬋쬌쬍쬎쬏쬑쬒쬓쬕쬖쬗쬙쬚쬛쬜쬝쬞쬟쬢쬣쬤쬥쬦쬧쬨쬩������쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿쭀쭂쭃쭄������쭅쭆쭇쭊쭋쭍쭎쭏쭑쭒쭓쭔쭕쭖쭗쭚쭛쭜쭞쭟쭠쭡쭢쭣쭥쭦쭧쭨쭩쭪쭫쭬㎕㎖㎗ℓ㎘㏄㎣㎤㎥㎦㎙㎚㎛㎜㎝㎞㎟㎠㎡㎢㏊㎍㎎㎏㏏㎈㎉㏈㎧㎨㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎀㎁㎂㎃㎄㎺㎻㎼㎽㎾㎿㎐㎑㎒㎓㎔Ω㏀㏁㎊㎋㎌㏖㏅㎭㎮㎯㏛㎩㎪㎫㎬㏝㏐㏓㏃㏉㏜㏆����������������".split("");
      for (j2 = 0; j2 != D[167].length; ++j2)
        if (D[167][j2].charCodeAt(0) !== 65533) {
          e[D[167][j2]] = 42752 + j2;
          d[42752 + j2] = D[167][j2];
        }
      D[168] = "�����������������������������������������������������������������쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭺쭻쭼쭽쭾쭿쮀쮁쮂쮃쮄쮅쮆쮇쮈������쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮝쮞쮟쮠쮡쮢쮣������쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮹쮺쮻쮼쮽쮾쮿쯀쯁쯂쯃쯄ÆÐªĦ�IJ�ĿŁØŒºÞŦŊ�㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮½⅓⅔¼¾⅛⅜⅝⅞�".split("");
      for (j2 = 0; j2 != D[168].length; ++j2)
        if (D[168][j2].charCodeAt(0) !== 65533) {
          e[D[168][j2]] = 43008 + j2;
          d[43008 + j2] = D[168][j2];
        }
      D[169] = "�����������������������������������������������������������������쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟������쯠쯡쯢쯣쯥쯦쯨쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼������쯽쯾쯿찀찁찂찃찄찅찆찇찈찉찊찋찎찏찑찒찓찕찖찗찘찙찚찛찞찟찠찣찤æđðħıijĸŀłøœßþŧŋʼn㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂¹²³⁴ⁿ₁₂₃₄�".split("");
      for (j2 = 0; j2 != D[169].length; ++j2)
        if (D[169][j2].charCodeAt(0) !== 65533) {
          e[D[169][j2]] = 43264 + j2;
          d[43264 + j2] = D[169][j2];
        }
      D[170] = "�����������������������������������������������������������������찥찦찪찫찭찯찱찲찳찴찵찶찷찺찿챀챁챂챃챆챇챉챊챋챍챎������챏챐챑챒챓챖챚챛챜챝챞챟챡챢챣챥챧챩챪챫챬챭챮챯챱챲������챳챴챶챷챸챹챺챻챼챽챾챿첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
      for (j2 = 0; j2 != D[170].length; ++j2)
        if (D[170][j2].charCodeAt(0) !== 65533) {
          e[D[170][j2]] = 43520 + j2;
          d[43520 + j2] = D[170][j2];
        }
      D[171] = "�����������������������������������������������������������������첔첕첖첗첚첛첝첞첟첡첢첣첤첥첦첧첪첮첯첰첱첲첳첶첷첹������첺첻첽첾첿쳀쳁쳂쳃쳆쳈쳊쳋쳌쳍쳎쳏쳑쳒쳓쳕쳖쳗쳘쳙쳚������쳛쳜쳝쳞쳟쳠쳡쳢쳣쳥쳦쳧쳨쳩쳪쳫쳭쳮쳯쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
      for (j2 = 0; j2 != D[171].length; ++j2)
        if (D[171][j2].charCodeAt(0) !== 65533) {
          e[D[171][j2]] = 43776 + j2;
          d[43776 + j2] = D[171][j2];
        }
      D[172] = "�����������������������������������������������������������������쳾쳿촀촂촃촄촅촆촇촊촋촍촎촏촑촒촓촔촕촖촗촚촜촞촟촠������촡촢촣촥촦촧촩촪촫촭촮촯촰촱촲촳촴촵촶촷촸촺촻촼촽촾������촿쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛쵝쵞쵟АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
      for (j2 = 0; j2 != D[172].length; ++j2)
        if (D[172][j2].charCodeAt(0) !== 65533) {
          e[D[172][j2]] = 44032 + j2;
          d[44032 + j2] = D[172][j2];
        }
      D[173] = "�����������������������������������������������������������������쵡쵢쵣쵥쵦쵧쵨쵩쵪쵫쵮쵰쵲쵳쵴쵵쵶쵷쵹쵺쵻쵼쵽쵾쵿춀������춁춂춃춄춅춆춇춉춊춋춌춍춎춏춐춑춒춓춖춗춙춚춛춝춞춟������춠춡춢춣춦춨춪춫춬춭춮춯춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿췀췁췂췃췅�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[173].length; ++j2)
        if (D[173][j2].charCodeAt(0) !== 65533) {
          e[D[173][j2]] = 44288 + j2;
          d[44288 + j2] = D[173][j2];
        }
      D[174] = "�����������������������������������������������������������������췆췇췈췉췊췋췍췎췏췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟췠췡������췢췣췤췥췦췧췩췪췫췭췮췯췱췲췳췴췵췶췷췺췼췾췿츀츁츂������츃츅츆츇츉츊츋츍츎츏츐츑츒츓츕츖츗츘츚츛츜츝츞츟츢츣츥츦츧츩츪츫�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[174].length; ++j2)
        if (D[174][j2].charCodeAt(0) !== 65533) {
          e[D[174][j2]] = 44544 + j2;
          d[44544 + j2] = D[174][j2];
        }
      D[175] = "�����������������������������������������������������������������츬츭츮츯츲츴츶츷츸츹츺츻츼츽츾츿칀칁칂칃칄칅칆칇칈칉������칊칋칌칍칎칏칐칑칒칓칔칕칖칗칚칛칝칞칢칣칤칥칦칧칪칬������칮칯칰칱칲칳칶칷칹칺칻칽칾칿캀캁캂캃캆캈캊캋캌캍캎캏캒캓캕캖캗캙�����������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[175].length; ++j2)
        if (D[175][j2].charCodeAt(0) !== 65533) {
          e[D[175][j2]] = 44800 + j2;
          d[44800 + j2] = D[175][j2];
        }
      D[176] = "�����������������������������������������������������������������캚캛캜캝캞캟캢캦캧캨캩캪캫캮캯캰캱캲캳캴캵캶캷캸캹캺������캻캼캽캾캿컀컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕������컖컗컘컙컚컛컜컝컞컟컠컡컢컣컦컧컩컪컭컮컯컰컱컲컳컶컺컻컼컽컾컿가각간갇갈갉갊감갑값갓갔강갖갗같갚갛개객갠갤갬갭갯갰갱갸갹갼걀걋걍걔걘걜거걱건걷걸걺검겁것겄겅겆겉겊겋게겐겔겜겝겟겠겡겨격겪견겯결겸겹겻겼경곁계곈곌곕곗고곡곤곧골곪곬곯곰곱곳공곶과곽관괄괆�".split("");
      for (j2 = 0; j2 != D[176].length; ++j2)
        if (D[176][j2].charCodeAt(0) !== 65533) {
          e[D[176][j2]] = 45056 + j2;
          d[45056 + j2] = D[176][j2];
        }
      D[177] = "�����������������������������������������������������������������켂켃켅켆켇켉켊켋켌켍켎켏켒켔켖켗켘켙켚켛켝켞켟켡켢켣������켥켦켧켨켩켪켫켮켲켳켴켵켶켷켹켺켻켼켽켾켿콀콁콂콃콄������콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓콖콗콙콚콛콝콞콟콠콡콢콣콦콨콪콫콬괌괍괏광괘괜괠괩괬괭괴괵괸괼굄굅굇굉교굔굘굡굣구국군굳굴굵굶굻굼굽굿궁궂궈궉권궐궜궝궤궷귀귁귄귈귐귑귓규균귤그극근귿글긁금급긋긍긔기긱긴긷길긺김깁깃깅깆깊까깍깎깐깔깖깜깝깟깠깡깥깨깩깬깰깸�".split("");
      for (j2 = 0; j2 != D[177].length; ++j2)
        if (D[177][j2].charCodeAt(0) !== 65533) {
          e[D[177][j2]] = 45312 + j2;
          d[45312 + j2] = D[177][j2];
        }
      D[178] = "�����������������������������������������������������������������콭콮콯콲콳콵콶콷콹콺콻콼콽콾콿쾁쾂쾃쾄쾆쾇쾈쾉쾊쾋쾍������쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟쾠쾢쾣쾤쾥쾦쾧쾩������쾪쾫쾬쾭쾮쾯쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿쿀쿁쿂쿃쿅쿆쿇쿈쿉쿊쿋깹깻깼깽꺄꺅꺌꺼꺽꺾껀껄껌껍껏껐껑께껙껜껨껫껭껴껸껼꼇꼈꼍꼐꼬꼭꼰꼲꼴꼼꼽꼿꽁꽂꽃꽈꽉꽐꽜꽝꽤꽥꽹꾀꾄꾈꾐꾑꾕꾜꾸꾹꾼꿀꿇꿈꿉꿋꿍꿎꿔꿜꿨꿩꿰꿱꿴꿸뀀뀁뀄뀌뀐뀔뀜뀝뀨끄끅끈끊끌끎끓끔끕끗끙�".split("");
      for (j2 = 0; j2 != D[178].length; ++j2)
        if (D[178][j2].charCodeAt(0) !== 65533) {
          e[D[178][j2]] = 45568 + j2;
          d[45568 + j2] = D[178][j2];
        }
      D[179] = "�����������������������������������������������������������������쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟쿢쿣쿥쿦쿧쿩������쿪쿫쿬쿭쿮쿯쿲쿴쿶쿷쿸쿹쿺쿻쿽쿾쿿퀁퀂퀃퀅퀆퀇퀈퀉퀊������퀋퀌퀍퀎퀏퀐퀒퀓퀔퀕퀖퀗퀙퀚퀛퀜퀝퀞퀟퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬끝끼끽낀낄낌낍낏낑나낙낚난낟날낡낢남납낫났낭낮낯낱낳내낵낸낼냄냅냇냈냉냐냑냔냘냠냥너넉넋넌널넒넓넘넙넛넜넝넣네넥넨넬넴넵넷넸넹녀녁년녈념녑녔녕녘녜녠노녹논놀놂놈놉놋농높놓놔놘놜놨뇌뇐뇔뇜뇝�".split("");
      for (j2 = 0; j2 != D[179].length; ++j2)
        if (D[179][j2].charCodeAt(0) !== 65533) {
          e[D[179][j2]] = 45824 + j2;
          d[45824 + j2] = D[179][j2];
        }
      D[180] = "�����������������������������������������������������������������퀮퀯퀰퀱퀲퀳퀶퀷퀹퀺퀻퀽퀾퀿큀큁큂큃큆큈큊큋큌큍큎큏������큑큒큓큕큖큗큙큚큛큜큝큞큟큡큢큣큤큥큦큧큨큩큪큫큮큯������큱큲큳큵큶큷큸큹큺큻큾큿킀킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔뇟뇨뇩뇬뇰뇹뇻뇽누눅눈눋눌눔눕눗눙눠눴눼뉘뉜뉠뉨뉩뉴뉵뉼늄늅늉느늑는늘늙늚늠늡늣능늦늪늬늰늴니닉닌닐닒님닙닛닝닢다닥닦단닫달닭닮닯닳담답닷닸당닺닻닿대댁댄댈댐댑댓댔댕댜더덕덖던덛덜덞덟덤덥�".split("");
      for (j2 = 0; j2 != D[180].length; ++j2)
        if (D[180][j2].charCodeAt(0) !== 65533) {
          e[D[180][j2]] = 46080 + j2;
          d[46080 + j2] = D[180][j2];
        }
      D[181] = "�����������������������������������������������������������������킕킖킗킘킙킚킛킜킝킞킟킠킡킢킣킦킧킩킪킫킭킮킯킰킱킲������킳킶킸킺킻킼킽킾킿탂탃탅탆탇탊탋탌탍탎탏탒탖탗탘탙탚������탛탞탟탡탢탣탥탦탧탨탩탪탫탮탲탳탴탵탶탷탹탺탻탼탽탾탿턀턁턂턃턄덧덩덫덮데덱덴델뎀뎁뎃뎄뎅뎌뎐뎔뎠뎡뎨뎬도독돈돋돌돎돐돔돕돗동돛돝돠돤돨돼됐되된될됨됩됫됴두둑둔둘둠둡둣둥둬뒀뒈뒝뒤뒨뒬뒵뒷뒹듀듄듈듐듕드득든듣들듦듬듭듯등듸디딕딘딛딜딤딥딧딨딩딪따딱딴딸�".split("");
      for (j2 = 0; j2 != D[181].length; ++j2)
        if (D[181][j2].charCodeAt(0) !== 65533) {
          e[D[181][j2]] = 46336 + j2;
          d[46336 + j2] = D[181][j2];
        }
      D[182] = "�����������������������������������������������������������������턅턆턇턈턉턊턋턌턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟������턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯턲턳턵턶턷턹턻턼턽턾������턿텂텆텇텈텉텊텋텎텏텑텒텓텕텖텗텘텙텚텛텞텠텢텣텤텥텦텧텩텪텫텭땀땁땃땄땅땋때땍땐땔땜땝땟땠땡떠떡떤떨떪떫떰떱떳떴떵떻떼떽뗀뗄뗌뗍뗏뗐뗑뗘뗬또똑똔똘똥똬똴뙈뙤뙨뚜뚝뚠뚤뚫뚬뚱뛔뛰뛴뛸뜀뜁뜅뜨뜩뜬뜯뜰뜸뜹뜻띄띈띌띔띕띠띤띨띰띱띳띵라락란랄람랍랏랐랑랒랖랗�".split("");
      for (j2 = 0; j2 != D[182].length; ++j2)
        if (D[182][j2].charCodeAt(0) !== 65533) {
          e[D[182][j2]] = 46592 + j2;
          d[46592 + j2] = D[182][j2];
        }
      D[183] = "�����������������������������������������������������������������텮텯텰텱텲텳텴텵텶텷텸텹텺텻텽텾텿톀톁톂톃톅톆톇톉톊������톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟톢톣톥톦톧������톩톪톫톬톭톮톯톲톴톶톷톸톹톻톽톾톿퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏래랙랜랠램랩랫랬랭랴략랸럇량러럭런럴럼럽럿렀렁렇레렉렌렐렘렙렛렝려력련렬렴렵렷렸령례롄롑롓로록론롤롬롭롯롱롸롼뢍뢨뢰뢴뢸룀룁룃룅료룐룔룝룟룡루룩룬룰룸룹룻룽뤄뤘뤠뤼뤽륀륄륌륏륑류륙륜률륨륩�".split("");
      for (j2 = 0; j2 != D[183].length; ++j2)
        if (D[183][j2].charCodeAt(0) !== 65533) {
          e[D[183][j2]] = 46848 + j2;
          d[46848 + j2] = D[183][j2];
        }
      D[184] = "�����������������������������������������������������������������퇐퇑퇒퇓퇔퇕퇖퇗퇙퇚퇛퇜퇝퇞퇟퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪������퇫퇬퇭퇮퇯퇰퇱퇲퇳퇵퇶퇷퇹퇺퇻퇼퇽퇾퇿툀툁툂툃툄툅툆������툈툊툋툌툍툎툏툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟툠툡툢툣툤툥툦툧툨툩륫륭르륵른를름릅릇릉릊릍릎리릭린릴림립릿링마막만많맏말맑맒맘맙맛망맞맡맣매맥맨맬맴맵맷맸맹맺먀먁먈먕머먹먼멀멂멈멉멋멍멎멓메멕멘멜멤멥멧멨멩며멱면멸몃몄명몇몌모목몫몬몰몲몸몹못몽뫄뫈뫘뫙뫼�".split("");
      for (j2 = 0; j2 != D[184].length; ++j2)
        if (D[184][j2].charCodeAt(0) !== 65533) {
          e[D[184][j2]] = 47104 + j2;
          d[47104 + j2] = D[184][j2];
        }
      D[185] = "�����������������������������������������������������������������툪툫툮툯툱툲툳툵툶툷툸툹툺툻툾퉀퉂퉃퉄퉅퉆퉇퉉퉊퉋퉌������퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉝퉞퉟퉠퉡퉢퉣퉥퉦퉧퉨������퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿튂튃튅튆튇튉튊튋튌묀묄묍묏묑묘묜묠묩묫무묵묶문묻물묽묾뭄뭅뭇뭉뭍뭏뭐뭔뭘뭡뭣뭬뮈뮌뮐뮤뮨뮬뮴뮷므믄믈믐믓미믹민믿밀밂밈밉밋밌밍및밑바박밖밗반받발밝밞밟밤밥밧방밭배백밴밸뱀뱁뱃뱄뱅뱉뱌뱍뱐뱝버벅번벋벌벎범법벗�".split("");
      for (j2 = 0; j2 != D[185].length; ++j2)
        if (D[185][j2].charCodeAt(0) !== 65533) {
          e[D[185][j2]] = 47360 + j2;
          d[47360 + j2] = D[185][j2];
        }
      D[186] = "�����������������������������������������������������������������튍튎튏튒튓튔튖튗튘튙튚튛튝튞튟튡튢튣튥튦튧튨튩튪튫튭������튮튯튰튲튳튴튵튶튷튺튻튽튾틁틃틄틅틆틇틊틌틍틎틏틐틑������틒틓틕틖틗틙틚틛틝틞틟틠틡틢틣틦틧틨틩틪틫틬틭틮틯틲틳틵틶틷틹틺벙벚베벡벤벧벨벰벱벳벴벵벼벽변별볍볏볐병볕볘볜보복볶본볼봄봅봇봉봐봔봤봬뵀뵈뵉뵌뵐뵘뵙뵤뵨부북분붇불붉붊붐붑붓붕붙붚붜붤붰붸뷔뷕뷘뷜뷩뷰뷴뷸븀븃븅브븍븐블븜븝븟비빅빈빌빎빔빕빗빙빚빛빠빡빤�".split("");
      for (j2 = 0; j2 != D[186].length; ++j2)
        if (D[186][j2].charCodeAt(0) !== 65533) {
          e[D[186][j2]] = 47616 + j2;
          d[47616 + j2] = D[186][j2];
        }
      D[187] = "�����������������������������������������������������������������틻틼틽틾틿팂팄팆팇팈팉팊팋팏팑팒팓팕팗팘팙팚팛팞팢팣������팤팦팧팪팫팭팮팯팱팲팳팴팵팶팷팺팾팿퍀퍁퍂퍃퍆퍇퍈퍉������퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩빨빪빰빱빳빴빵빻빼빽뺀뺄뺌뺍뺏뺐뺑뺘뺙뺨뻐뻑뻔뻗뻘뻠뻣뻤뻥뻬뼁뼈뼉뼘뼙뼛뼜뼝뽀뽁뽄뽈뽐뽑뽕뾔뾰뿅뿌뿍뿐뿔뿜뿟뿡쀼쁑쁘쁜쁠쁨쁩삐삑삔삘삠삡삣삥사삭삯산삳살삵삶삼삽삿샀상샅새색샌샐샘샙샛샜생샤�".split("");
      for (j2 = 0; j2 != D[187].length; ++j2)
        if (D[187][j2].charCodeAt(0) !== 65533) {
          e[D[187][j2]] = 47872 + j2;
          d[47872 + j2] = D[187][j2];
        }
      D[188] = "�����������������������������������������������������������������퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍾퍿펁펂펃펅펆펇������펈펉펊펋펎펒펓펔펕펖펗펚펛펝펞펟펡펢펣펤펥펦펧펪펬펮������펯펰펱펲펳펵펶펷펹펺펻펽펾펿폀폁폂폃폆폇폊폋폌폍폎폏폑폒폓폔폕폖샥샨샬샴샵샷샹섀섄섈섐섕서석섞섟선섣설섦섧섬섭섯섰성섶세섹센셀셈셉셋셌셍셔셕션셜셤셥셧셨셩셰셴셸솅소속솎손솔솖솜솝솟송솥솨솩솬솰솽쇄쇈쇌쇔쇗쇘쇠쇤쇨쇰쇱쇳쇼쇽숀숄숌숍숏숑수숙순숟술숨숩숫숭�".split("");
      for (j2 = 0; j2 != D[188].length; ++j2)
        if (D[188][j2].charCodeAt(0) !== 65533) {
          e[D[188][j2]] = 48128 + j2;
          d[48128 + j2] = D[188][j2];
        }
      D[189] = "�����������������������������������������������������������������폗폙폚폛폜폝폞폟폠폢폤폥폦폧폨폩폪폫폮폯폱폲폳폵폶폷������폸폹폺폻폾퐀퐂퐃퐄퐅퐆퐇퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖������퐗퐘퐙퐚퐛퐜퐞퐟퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷숯숱숲숴쉈쉐쉑쉔쉘쉠쉥쉬쉭쉰쉴쉼쉽쉿슁슈슉슐슘슛슝스슥슨슬슭슴습슷승시식신싣실싫심십싯싱싶싸싹싻싼쌀쌈쌉쌌쌍쌓쌔쌕쌘쌜쌤쌥쌨쌩썅써썩썬썰썲썸썹썼썽쎄쎈쎌쏀쏘쏙쏜쏟쏠쏢쏨쏩쏭쏴쏵쏸쐈쐐쐤쐬쐰�".split("");
      for (j2 = 0; j2 != D[189].length; ++j2)
        if (D[189][j2].charCodeAt(0) !== 65533) {
          e[D[189][j2]] = 48384 + j2;
          d[48384 + j2] = D[189][j2];
        }
      D[190] = "�����������������������������������������������������������������퐸퐹퐺퐻퐼퐽퐾퐿푁푂푃푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓������푔푕푖푗푘푙푚푛푝푞푟푡푢푣푥푦푧푨푩푪푫푬푮푰푱푲������푳푴푵푶푷푺푻푽푾풁풃풄풅풆풇풊풌풎풏풐풑풒풓풕풖풗풘풙풚풛풜풝쐴쐼쐽쑈쑤쑥쑨쑬쑴쑵쑹쒀쒔쒜쒸쒼쓩쓰쓱쓴쓸쓺쓿씀씁씌씐씔씜씨씩씬씰씸씹씻씽아악안앉않알앍앎앓암압앗았앙앝앞애액앤앨앰앱앳앴앵야약얀얄얇얌얍얏양얕얗얘얜얠얩어억언얹얻얼얽얾엄업없엇었엉엊엌엎�".split("");
      for (j2 = 0; j2 != D[190].length; ++j2)
        if (D[190][j2].charCodeAt(0) !== 65533) {
          e[D[190][j2]] = 48640 + j2;
          d[48640 + j2] = D[190][j2];
        }
      D[191] = "�����������������������������������������������������������������풞풟풠풡풢풣풤풥풦풧풨풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸������풹풺풻풼풽풾풿퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓍퓎퓏퓑퓒퓓퓕������퓖퓗퓘퓙퓚퓛퓝퓞퓠퓡퓢퓣퓤퓥퓦퓧퓩퓪퓫퓭퓮퓯퓱퓲퓳퓴퓵퓶퓷퓹퓺퓼에엑엔엘엠엡엣엥여역엮연열엶엷염엽엾엿였영옅옆옇예옌옐옘옙옛옜오옥온올옭옮옰옳옴옵옷옹옻와왁완왈왐왑왓왔왕왜왝왠왬왯왱외왹왼욀욈욉욋욍요욕욘욜욤욥욧용우욱운울욹욺움웁웃웅워웍원월웜웝웠웡웨�".split("");
      for (j2 = 0; j2 != D[191].length; ++j2)
        if (D[191][j2].charCodeAt(0) !== 65533) {
          e[D[191][j2]] = 48896 + j2;
          d[48896 + j2] = D[191][j2];
        }
      D[192] = "�����������������������������������������������������������������퓾퓿픀픁픂픃픅픆픇픉픊픋픍픎픏픐픑픒픓픖픘픙픚픛픜픝������픞픟픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷������픸픹픺픻픾픿핁핂핃핅핆핇핈핉핊핋핎핐핒핓핔핕핖핗핚핛핝핞핟핡핢핣웩웬웰웸웹웽위윅윈윌윔윕윗윙유육윤율윰윱윳융윷으윽은을읊음읍읏응읒읓읔읕읖읗의읜읠읨읫이익인일읽읾잃임입잇있잉잊잎자작잔잖잗잘잚잠잡잣잤장잦재잭잰잴잼잽잿쟀쟁쟈쟉쟌쟎쟐쟘쟝쟤쟨쟬저적전절젊�".split("");
      for (j2 = 0; j2 != D[192].length; ++j2)
        if (D[192][j2].charCodeAt(0) !== 65533) {
          e[D[192][j2]] = 49152 + j2;
          d[49152 + j2] = D[192][j2];
        }
      D[193] = "�����������������������������������������������������������������핤핦핧핪핬핮핯핰핱핲핳핶핷핹핺핻핽핾핿햀햁햂햃햆햊햋������햌햍햎햏햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟햠햡햢햣햤햦햧������햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿헀헁헂헃헄헅헆헇점접젓정젖제젝젠젤젬젭젯젱져젼졀졈졉졌졍졔조족존졸졺좀좁좃종좆좇좋좌좍좔좝좟좡좨좼좽죄죈죌죔죕죗죙죠죡죤죵주죽준줄줅줆줌줍줏중줘줬줴쥐쥑쥔쥘쥠쥡쥣쥬쥰쥴쥼즈즉즌즐즘즙즛증지직진짇질짊짐집짓�".split("");
      for (j2 = 0; j2 != D[193].length; ++j2)
        if (D[193][j2].charCodeAt(0) !== 65533) {
          e[D[193][j2]] = 49408 + j2;
          d[49408 + j2] = D[193][j2];
        }
      D[194] = "�����������������������������������������������������������������헊헋헍헎헏헑헓헔헕헖헗헚헜헞헟헠헡헢헣헦헧헩헪헫헭헮������헯헰헱헲헳헶헸헺헻헼헽헾헿혂혃혅혆혇혉혊혋혌혍혎혏혒������혖혗혘혙혚혛혝혞혟혡혢혣혥혦혧혨혩혪혫혬혮혯혰혱혲혳혴혵혶혷혺혻징짖짙짚짜짝짠짢짤짧짬짭짯짰짱째짹짼쨀쨈쨉쨋쨌쨍쨔쨘쨩쩌쩍쩐쩔쩜쩝쩟쩠쩡쩨쩽쪄쪘쪼쪽쫀쫄쫌쫍쫏쫑쫓쫘쫙쫠쫬쫴쬈쬐쬔쬘쬠쬡쭁쭈쭉쭌쭐쭘쭙쭝쭤쭸쭹쮜쮸쯔쯤쯧쯩찌찍찐찔찜찝찡찢찧차착찬찮찰참찹찻�".split("");
      for (j2 = 0; j2 != D[194].length; ++j2)
        if (D[194][j2].charCodeAt(0) !== 65533) {
          e[D[194][j2]] = 49664 + j2;
          d[49664 + j2] = D[194][j2];
        }
      D[195] = "�����������������������������������������������������������������혽혾혿홁홂홃홄홆홇홊홌홎홏홐홒홓홖홗홙홚홛홝홞홟홠홡������홢홣홤홥홦홨홪홫홬홭홮홯홲홳홵홶홷홸홹홺홻홼홽홾홿횀������횁횂횄횆횇횈횉횊횋횎횏횑횒횓횕횖횗횘횙횚횛횜횞횠횢횣횤횥횦횧횩횪찼창찾채책챈챌챔챕챗챘챙챠챤챦챨챰챵처척천철첨첩첫첬청체첵첸첼쳄쳅쳇쳉쳐쳔쳤쳬쳰촁초촉촌촐촘촙촛총촤촨촬촹최쵠쵤쵬쵭쵯쵱쵸춈추축춘출춤춥춧충춰췄췌췐취췬췰췸췹췻췽츄츈츌츔츙츠측츤츨츰츱츳층�".split("");
      for (j2 = 0; j2 != D[195].length; ++j2)
        if (D[195][j2].charCodeAt(0) !== 65533) {
          e[D[195][j2]] = 49920 + j2;
          d[49920 + j2] = D[195][j2];
        }
      D[196] = "�����������������������������������������������������������������횫횭횮횯횱횲횳횴횵횶횷횸횺횼횽횾횿훀훁훂훃훆훇훉훊훋������훍훎훏훐훒훓훕훖훘훚훛훜훝훞훟훡훢훣훥훦훧훩훪훫훬훭������훮훯훱훲훳훴훶훷훸훹훺훻훾훿휁휂휃휅휆휇휈휉휊휋휌휍휎휏휐휒휓휔치칙친칟칠칡침칩칫칭카칵칸칼캄캅캇캉캐캑캔캘캠캡캣캤캥캬캭컁커컥컨컫컬컴컵컷컸컹케켁켄켈켐켑켓켕켜켠켤켬켭켯켰켱켸코콕콘콜콤콥콧콩콰콱콴콸쾀쾅쾌쾡쾨쾰쿄쿠쿡쿤쿨쿰쿱쿳쿵쿼퀀퀄퀑퀘퀭퀴퀵퀸퀼�".split("");
      for (j2 = 0; j2 != D[196].length; ++j2)
        if (D[196][j2].charCodeAt(0) !== 65533) {
          e[D[196][j2]] = 50176 + j2;
          d[50176 + j2] = D[196][j2];
        }
      D[197] = "�����������������������������������������������������������������휕휖휗휚휛휝휞휟휡휢휣휤휥휦휧휪휬휮휯휰휱휲휳휶휷휹������휺휻휽휾휿흀흁흂흃흅흆흈흊흋흌흍흎흏흒흓흕흚흛흜흝흞������흟흢흤흦흧흨흪흫흭흮흯흱흲흳흵흶흷흸흹흺흻흾흿힀힂힃힄힅힆힇힊힋큄큅큇큉큐큔큘큠크큭큰클큼큽킁키킥킨킬킴킵킷킹타탁탄탈탉탐탑탓탔탕태택탠탤탬탭탯탰탱탸턍터턱턴털턺텀텁텃텄텅테텍텐텔템텝텟텡텨텬텼톄톈토톡톤톨톰톱톳통톺톼퇀퇘퇴퇸툇툉툐투툭툰툴툼툽툿퉁퉈퉜�".split("");
      for (j2 = 0; j2 != D[197].length; ++j2)
        if (D[197][j2].charCodeAt(0) !== 65533) {
          e[D[197][j2]] = 50432 + j2;
          d[50432 + j2] = D[197][j2];
        }
      D[198] = "�����������������������������������������������������������������힍힎힏힑힒힓힔힕힖힗힚힜힞힟힠힡힢힣������������������������������������������������������������������������������퉤튀튁튄튈튐튑튕튜튠튤튬튱트특튼튿틀틂틈틉틋틔틘틜틤틥티틱틴틸팀팁팃팅파팍팎판팔팖팜팝팟팠팡팥패팩팬팰팸팹팻팼팽퍄퍅퍼퍽펀펄펌펍펏펐펑페펙펜펠펨펩펫펭펴편펼폄폅폈평폐폘폡폣포폭폰폴폼폽폿퐁�".split("");
      for (j2 = 0; j2 != D[198].length; ++j2)
        if (D[198][j2].charCodeAt(0) !== 65533) {
          e[D[198][j2]] = 50688 + j2;
          d[50688 + j2] = D[198][j2];
        }
      D[199] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������퐈퐝푀푄표푠푤푭푯푸푹푼푿풀풂품풉풋풍풔풩퓌퓐퓔퓜퓟퓨퓬퓰퓸퓻퓽프픈플픔픕픗피픽핀필핌핍핏핑하학한할핥함합핫항해핵핸핼햄햅햇했행햐향허헉헌헐헒험헙헛헝헤헥헨헬헴헵헷헹혀혁현혈혐협혓혔형혜혠�".split("");
      for (j2 = 0; j2 != D[199].length; ++j2)
        if (D[199][j2].charCodeAt(0) !== 65533) {
          e[D[199][j2]] = 50944 + j2;
          d[50944 + j2] = D[199][j2];
        }
      D[200] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������혤혭호혹혼홀홅홈홉홋홍홑화확환활홧황홰홱홴횃횅회획횐횔횝횟횡효횬횰횹횻후훅훈훌훑훔훗훙훠훤훨훰훵훼훽휀휄휑휘휙휜휠휨휩휫휭휴휵휸휼흄흇흉흐흑흔흖흗흘흙흠흡흣흥흩희흰흴흼흽힁히힉힌힐힘힙힛힝�".split("");
      for (j2 = 0; j2 != D[200].length; ++j2)
        if (D[200][j2].charCodeAt(0) !== 65533) {
          e[D[200][j2]] = 51200 + j2;
          d[51200 + j2] = D[200][j2];
        }
      D[202] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������伽佳假價加可呵哥嘉嫁家暇架枷柯歌珂痂稼苛茄街袈訶賈跏軻迦駕刻却各恪慤殼珏脚覺角閣侃刊墾奸姦干幹懇揀杆柬桿澗癎看磵稈竿簡肝艮艱諫間乫喝曷渴碣竭葛褐蝎鞨勘坎堪嵌感憾戡敢柑橄減甘疳監瞰紺邯鑑鑒龕�".split("");
      for (j2 = 0; j2 != D[202].length; ++j2)
        if (D[202][j2].charCodeAt(0) !== 65533) {
          e[D[202][j2]] = 51712 + j2;
          d[51712 + j2] = D[202][j2];
        }
      D[203] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������匣岬甲胛鉀閘剛堈姜岡崗康强彊慷江畺疆糠絳綱羌腔舡薑襁講鋼降鱇介价個凱塏愷愾慨改槪漑疥皆盖箇芥蓋豈鎧開喀客坑更粳羹醵倨去居巨拒据據擧渠炬祛距踞車遽鉅鋸乾件健巾建愆楗腱虔蹇鍵騫乞傑杰桀儉劍劒檢�".split("");
      for (j2 = 0; j2 != D[203].length; ++j2)
        if (D[203][j2].charCodeAt(0) !== 65533) {
          e[D[203][j2]] = 51968 + j2;
          d[51968 + j2] = D[203][j2];
        }
      D[204] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������瞼鈐黔劫怯迲偈憩揭擊格檄激膈覡隔堅牽犬甄絹繭肩見譴遣鵑抉決潔結缺訣兼慊箝謙鉗鎌京俓倞傾儆勁勍卿坰境庚徑慶憬擎敬景暻更梗涇炅烱璟璥瓊痙硬磬竟競絅經耕耿脛莖警輕逕鏡頃頸驚鯨係啓堺契季屆悸戒桂械�".split("");
      for (j2 = 0; j2 != D[204].length; ++j2)
        if (D[204][j2].charCodeAt(0) !== 65533) {
          e[D[204][j2]] = 52224 + j2;
          d[52224 + j2] = D[204][j2];
        }
      D[205] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������棨溪界癸磎稽系繫繼計誡谿階鷄古叩告呱固姑孤尻庫拷攷故敲暠枯槁沽痼皐睾稿羔考股膏苦苽菰藁蠱袴誥賈辜錮雇顧高鼓哭斛曲梏穀谷鵠困坤崑昆梱棍滾琨袞鯤汨滑骨供公共功孔工恐恭拱控攻珙空蚣貢鞏串寡戈果瓜�".split("");
      for (j2 = 0; j2 != D[205].length; ++j2)
        if (D[205][j2].charCodeAt(0) !== 65533) {
          e[D[205][j2]] = 52480 + j2;
          d[52480 + j2] = D[205][j2];
        }
      D[206] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������科菓誇課跨過鍋顆廓槨藿郭串冠官寬慣棺款灌琯瓘管罐菅觀貫關館刮恝括适侊光匡壙廣曠洸炚狂珖筐胱鑛卦掛罫乖傀塊壞怪愧拐槐魁宏紘肱轟交僑咬喬嬌嶠巧攪敎校橋狡皎矯絞翹膠蕎蛟較轎郊餃驕鮫丘久九仇俱具勾�".split("");
      for (j2 = 0; j2 != D[206].length; ++j2)
        if (D[206][j2].charCodeAt(0) !== 65533) {
          e[D[206][j2]] = 52736 + j2;
          d[52736 + j2] = D[206][j2];
        }
      D[207] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������區口句咎嘔坵垢寇嶇廐懼拘救枸柩構歐毆毬求溝灸狗玖球瞿矩究絿耉臼舅舊苟衢謳購軀逑邱鉤銶駒驅鳩鷗龜國局菊鞠鞫麴君窘群裙軍郡堀屈掘窟宮弓穹窮芎躬倦券勸卷圈拳捲權淃眷厥獗蕨蹶闕机櫃潰詭軌饋句晷歸貴�".split("");
      for (j2 = 0; j2 != D[207].length; ++j2)
        if (D[207][j2].charCodeAt(0) !== 65533) {
          e[D[207][j2]] = 52992 + j2;
          d[52992 + j2] = D[207][j2];
        }
      D[208] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鬼龜叫圭奎揆槻珪硅窺竅糾葵規赳逵閨勻均畇筠菌鈞龜橘克剋劇戟棘極隙僅劤勤懃斤根槿瑾筋芹菫覲謹近饉契今妗擒昑檎琴禁禽芩衾衿襟金錦伋及急扱汲級給亘兢矜肯企伎其冀嗜器圻基埼夔奇妓寄岐崎己幾忌技旗旣�".split("");
      for (j2 = 0; j2 != D[208].length; ++j2)
        if (D[208][j2].charCodeAt(0) !== 65533) {
          e[D[208][j2]] = 53248 + j2;
          d[53248 + j2] = D[208][j2];
        }
      D[209] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������朞期杞棋棄機欺氣汽沂淇玘琦琪璂璣畸畿碁磯祁祇祈祺箕紀綺羈耆耭肌記譏豈起錡錤飢饑騎騏驥麒緊佶吉拮桔金喫儺喇奈娜懦懶拏拿癩羅蘿螺裸邏那樂洛烙珞落諾酪駱亂卵暖欄煖爛蘭難鸞捏捺南嵐枏楠湳濫男藍襤拉�".split("");
      for (j2 = 0; j2 != D[209].length; ++j2)
        if (D[209][j2].charCodeAt(0) !== 65533) {
          e[D[209][j2]] = 53504 + j2;
          d[53504 + j2] = D[209][j2];
        }
      D[210] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������納臘蠟衲囊娘廊朗浪狼郎乃來內奈柰耐冷女年撚秊念恬拈捻寧寗努勞奴弩怒擄櫓爐瑙盧老蘆虜路露駑魯鷺碌祿綠菉錄鹿論壟弄濃籠聾膿農惱牢磊腦賂雷尿壘屢樓淚漏累縷陋嫩訥杻紐勒肋凜凌稜綾能菱陵尼泥匿溺多茶�".split("");
      for (j2 = 0; j2 != D[210].length; ++j2)
        if (D[210][j2].charCodeAt(0) !== 65533) {
          e[D[210][j2]] = 53760 + j2;
          d[53760 + j2] = D[210][j2];
        }
      D[211] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������丹亶但單團壇彖斷旦檀段湍短端簞緞蛋袒鄲鍛撻澾獺疸達啖坍憺擔曇淡湛潭澹痰聃膽蕁覃談譚錟沓畓答踏遝唐堂塘幢戇撞棠當糖螳黨代垈坮大對岱帶待戴擡玳臺袋貸隊黛宅德悳倒刀到圖堵塗導屠島嶋度徒悼挑掉搗桃�".split("");
      for (j2 = 0; j2 != D[211].length; ++j2)
        if (D[211][j2].charCodeAt(0) !== 65533) {
          e[D[211][j2]] = 54016 + j2;
          d[54016 + j2] = D[211][j2];
        }
      D[212] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������棹櫂淘渡滔濤燾盜睹禱稻萄覩賭跳蹈逃途道都鍍陶韜毒瀆牘犢獨督禿篤纛讀墩惇敦旽暾沌焞燉豚頓乭突仝冬凍動同憧東桐棟洞潼疼瞳童胴董銅兜斗杜枓痘竇荳讀豆逗頭屯臀芚遁遯鈍得嶝橙燈登等藤謄鄧騰喇懶拏癩羅�".split("");
      for (j2 = 0; j2 != D[212].length; ++j2)
        if (D[212][j2].charCodeAt(0) !== 65533) {
          e[D[212][j2]] = 54272 + j2;
          d[54272 + j2] = D[212][j2];
        }
      D[213] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蘿螺裸邏樂洛烙珞絡落諾酪駱丹亂卵欄欒瀾爛蘭鸞剌辣嵐擥攬欖濫籃纜藍襤覽拉臘蠟廊朗浪狼琅瑯螂郞來崍徠萊冷掠略亮倆兩凉梁樑粮粱糧良諒輛量侶儷勵呂廬慮戾旅櫚濾礪藜蠣閭驢驪麗黎力曆歷瀝礫轢靂憐戀攣漣�".split("");
      for (j2 = 0; j2 != D[213].length; ++j2)
        if (D[213][j2].charCodeAt(0) !== 65533) {
          e[D[213][j2]] = 54528 + j2;
          d[54528 + j2] = D[213][j2];
        }
      D[214] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������煉璉練聯蓮輦連鍊冽列劣洌烈裂廉斂殮濂簾獵令伶囹寧岺嶺怜玲笭羚翎聆逞鈴零靈領齡例澧禮醴隷勞怒撈擄櫓潞瀘爐盧老蘆虜路輅露魯鷺鹵碌祿綠菉錄鹿麓論壟弄朧瀧瓏籠聾儡瀨牢磊賂賚賴雷了僚寮廖料燎療瞭聊蓼�".split("");
      for (j2 = 0; j2 != D[214].length; ++j2)
        if (D[214][j2].charCodeAt(0) !== 65533) {
          e[D[214][j2]] = 54784 + j2;
          d[54784 + j2] = D[214][j2];
        }
      D[215] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������遼鬧龍壘婁屢樓淚漏瘻累縷蔞褸鏤陋劉旒柳榴流溜瀏琉瑠留瘤硫謬類六戮陸侖倫崙淪綸輪律慄栗率隆勒肋凜凌楞稜綾菱陵俚利厘吏唎履悧李梨浬犁狸理璃異痢籬罹羸莉裏裡里釐離鯉吝潾燐璘藺躪隣鱗麟林淋琳臨霖砬�".split("");
      for (j2 = 0; j2 != D[215].length; ++j2)
        if (D[215][j2].charCodeAt(0) !== 65533) {
          e[D[215][j2]] = 55040 + j2;
          d[55040 + j2] = D[215][j2];
        }
      D[216] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒摩瑪痲碼磨馬魔麻寞幕漠膜莫邈万卍娩巒彎慢挽晩曼滿漫灣瞞萬蔓蠻輓饅鰻唜抹末沫茉襪靺亡妄忘忙望網罔芒茫莽輞邙埋妹媒寐昧枚梅每煤罵買賣邁魅脈貊陌驀麥孟氓猛盲盟萌冪覓免冕勉棉沔眄眠綿緬面麵滅�".split("");
      for (j2 = 0; j2 != D[216].length; ++j2)
        if (D[216][j2].charCodeAt(0) !== 65533) {
          e[D[216][j2]] = 55296 + j2;
          d[55296 + j2] = D[216][j2];
        }
      D[217] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蔑冥名命明暝椧溟皿瞑茗蓂螟酩銘鳴袂侮冒募姆帽慕摸摹暮某模母毛牟牡瑁眸矛耗芼茅謀謨貌木沐牧目睦穆鶩歿沒夢朦蒙卯墓妙廟描昴杳渺猫竗苗錨務巫憮懋戊拇撫无楙武毋無珷畝繆舞茂蕪誣貿霧鵡墨默們刎吻問文�".split("");
      for (j2 = 0; j2 != D[217].length; ++j2)
        if (D[217][j2].charCodeAt(0) !== 65533) {
          e[D[217][j2]] = 55552 + j2;
          d[55552 + j2] = D[217][j2];
        }
      D[218] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������汶紊紋聞蚊門雯勿沕物味媚尾嵋彌微未梶楣渼湄眉米美薇謎迷靡黴岷悶愍憫敏旻旼民泯玟珉緡閔密蜜謐剝博拍搏撲朴樸泊珀璞箔粕縛膊舶薄迫雹駁伴半反叛拌搬攀斑槃泮潘班畔瘢盤盼磐磻礬絆般蟠返頒飯勃拔撥渤潑�".split("");
      for (j2 = 0; j2 != D[218].length; ++j2)
        if (D[218][j2].charCodeAt(0) !== 65533) {
          e[D[218][j2]] = 55808 + j2;
          d[55808 + j2] = D[218][j2];
        }
      D[219] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������發跋醱鉢髮魃倣傍坊妨尨幇彷房放方旁昉枋榜滂磅紡肪膀舫芳蒡蚌訪謗邦防龐倍俳北培徘拜排杯湃焙盃背胚裴裵褙賠輩配陪伯佰帛柏栢白百魄幡樊煩燔番磻繁蕃藩飜伐筏罰閥凡帆梵氾汎泛犯範范法琺僻劈壁擘檗璧癖�".split("");
      for (j2 = 0; j2 != D[219].length; ++j2)
        if (D[219][j2].charCodeAt(0) !== 65533) {
          e[D[219][j2]] = 56064 + j2;
          d[56064 + j2] = D[219][j2];
        }
      D[220] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������碧蘗闢霹便卞弁變辨辯邊別瞥鱉鼈丙倂兵屛幷昞昺柄棅炳甁病秉竝輧餠騈保堡報寶普步洑湺潽珤甫菩補褓譜輔伏僕匐卜宓復服福腹茯蔔複覆輹輻馥鰒本乶俸奉封峯峰捧棒烽熢琫縫蓬蜂逢鋒鳳不付俯傅剖副否咐埠夫婦�".split("");
      for (j2 = 0; j2 != D[220].length; ++j2)
        if (D[220][j2].charCodeAt(0) !== 65533) {
          e[D[220][j2]] = 56320 + j2;
          d[56320 + j2] = D[220][j2];
        }
      D[221] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������孚孵富府復扶敷斧浮溥父符簿缶腐腑膚艀芙莩訃負賦賻赴趺部釜阜附駙鳧北分吩噴墳奔奮忿憤扮昐汾焚盆粉糞紛芬賁雰不佛弗彿拂崩朋棚硼繃鵬丕備匕匪卑妃婢庇悲憊扉批斐枇榧比毖毗毘沸泌琵痺砒碑秕秘粃緋翡肥�".split("");
      for (j2 = 0; j2 != D[221].length; ++j2)
        if (D[221][j2].charCodeAt(0) !== 65533) {
          e[D[221][j2]] = 56576 + j2;
          d[56576 + j2] = D[221][j2];
        }
      D[222] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������脾臂菲蜚裨誹譬費鄙非飛鼻嚬嬪彬斌檳殯浜濱瀕牝玭貧賓頻憑氷聘騁乍事些仕伺似使俟僿史司唆嗣四士奢娑寫寺射巳師徙思捨斜斯柶査梭死沙泗渣瀉獅砂社祀祠私篩紗絲肆舍莎蓑蛇裟詐詞謝賜赦辭邪飼駟麝削數朔索�".split("");
      for (j2 = 0; j2 != D[222].length; ++j2)
        if (D[222][j2].charCodeAt(0) !== 65533) {
          e[D[222][j2]] = 56832 + j2;
          d[56832 + j2] = D[222][j2];
        }
      D[223] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������傘刪山散汕珊産疝算蒜酸霰乷撒殺煞薩三參杉森渗芟蔘衫揷澁鈒颯上傷像償商喪嘗孀尙峠常床庠廂想桑橡湘爽牀狀相祥箱翔裳觴詳象賞霜塞璽賽嗇塞穡索色牲生甥省笙墅壻嶼序庶徐恕抒捿敍暑曙書栖棲犀瑞筮絮緖署�".split("");
      for (j2 = 0; j2 != D[223].length; ++j2)
        if (D[223][j2].charCodeAt(0) !== 65533) {
          e[D[223][j2]] = 57088 + j2;
          d[57088 + j2] = D[223][j2];
        }
      D[224] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������胥舒薯西誓逝鋤黍鼠夕奭席惜昔晳析汐淅潟石碩蓆釋錫仙僊先善嬋宣扇敾旋渲煽琁瑄璇璿癬禪線繕羨腺膳船蘚蟬詵跣選銑鐥饍鮮卨屑楔泄洩渫舌薛褻設說雪齧剡暹殲纖蟾贍閃陝攝涉燮葉城姓宬性惺成星晟猩珹盛省筬�".split("");
      for (j2 = 0; j2 != D[224].length; ++j2)
        if (D[224][j2].charCodeAt(0) !== 65533) {
          e[D[224][j2]] = 57344 + j2;
          d[57344 + j2] = D[224][j2];
        }
      D[225] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������聖聲腥誠醒世勢歲洗稅笹細說貰召嘯塑宵小少巢所掃搔昭梳沼消溯瀟炤燒甦疏疎瘙笑篠簫素紹蔬蕭蘇訴逍遡邵銷韶騷俗屬束涑粟續謖贖速孫巽損蓀遜飡率宋悚松淞訟誦送頌刷殺灑碎鎖衰釗修受嗽囚垂壽嫂守岫峀帥愁�".split("");
      for (j2 = 0; j2 != D[225].length; ++j2)
        if (D[225][j2].charCodeAt(0) !== 65533) {
          e[D[225][j2]] = 57600 + j2;
          d[57600 + j2] = D[225][j2];
        }
      D[226] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������戍手授搜收數樹殊水洙漱燧狩獸琇璲瘦睡秀穗竪粹綏綬繡羞脩茱蒐蓚藪袖誰讐輸遂邃酬銖銹隋隧隨雖需須首髓鬚叔塾夙孰宿淑潚熟琡璹肅菽巡徇循恂旬栒楯橓殉洵淳珣盾瞬筍純脣舜荀蓴蕣詢諄醇錞順馴戌術述鉥崇崧�".split("");
      for (j2 = 0; j2 != D[226].length; ++j2)
        if (D[226][j2].charCodeAt(0) !== 65533) {
          e[D[226][j2]] = 57856 + j2;
          d[57856 + j2] = D[226][j2];
        }
      D[227] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������嵩瑟膝蝨濕拾習褶襲丞乘僧勝升承昇繩蠅陞侍匙嘶始媤尸屎屍市弑恃施是時枾柴猜矢示翅蒔蓍視試詩諡豕豺埴寔式息拭植殖湜熄篒蝕識軾食飾伸侁信呻娠宸愼新晨燼申神紳腎臣莘薪藎蜃訊身辛辰迅失室實悉審尋心沁�".split("");
      for (j2 = 0; j2 != D[227].length; ++j2)
        if (D[227][j2].charCodeAt(0) !== 65533) {
          e[D[227][j2]] = 58112 + j2;
          d[58112 + j2] = D[227][j2];
        }
      D[228] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������沈深瀋甚芯諶什十拾雙氏亞俄兒啞娥峨我牙芽莪蛾衙訝阿雅餓鴉鵝堊岳嶽幄惡愕握樂渥鄂鍔顎鰐齷安岸按晏案眼雁鞍顔鮟斡謁軋閼唵岩巖庵暗癌菴闇壓押狎鴨仰央怏昻殃秧鴦厓哀埃崖愛曖涯碍艾隘靄厄扼掖液縊腋額�".split("");
      for (j2 = 0; j2 != D[228].length; ++j2)
        if (D[228][j2].charCodeAt(0) !== 65533) {
          e[D[228][j2]] = 58368 + j2;
          d[58368 + j2] = D[228][j2];
        }
      D[229] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������櫻罌鶯鸚也倻冶夜惹揶椰爺耶若野弱掠略約若葯蒻藥躍亮佯兩凉壤孃恙揚攘敭暘梁楊樣洋瀁煬痒瘍禳穰糧羊良襄諒讓釀陽量養圄御於漁瘀禦語馭魚齬億憶抑檍臆偃堰彦焉言諺孼蘖俺儼嚴奄掩淹嶪業円予余勵呂女如廬�".split("");
      for (j2 = 0; j2 != D[229].length; ++j2)
        if (D[229][j2].charCodeAt(0) !== 65533) {
          e[D[229][j2]] = 58624 + j2;
          d[58624 + j2] = D[229][j2];
        }
      D[230] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������旅歟汝濾璵礖礪與艅茹輿轝閭餘驪麗黎亦力域役易曆歷疫繹譯轢逆驛嚥堧姸娟宴年延憐戀捐挻撚椽沇沿涎涓淵演漣烟然煙煉燃燕璉硏硯秊筵緣練縯聯衍軟輦蓮連鉛鍊鳶列劣咽悅涅烈熱裂說閱厭廉念捻染殮炎焰琰艶苒�".split("");
      for (j2 = 0; j2 != D[230].length; ++j2)
        if (D[230][j2].charCodeAt(0) !== 65533) {
          e[D[230][j2]] = 58880 + j2;
          d[58880 + j2] = D[230][j2];
        }
      D[231] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������簾閻髥鹽曄獵燁葉令囹塋寧嶺嶸影怜映暎楹榮永泳渶潁濚瀛瀯煐營獰玲瑛瑩瓔盈穎纓羚聆英詠迎鈴鍈零霙靈領乂倪例刈叡曳汭濊猊睿穢芮藝蘂禮裔詣譽豫醴銳隸霓預五伍俉傲午吾吳嗚塢墺奧娛寤悟惡懊敖旿晤梧汚澳�".split("");
      for (j2 = 0; j2 != D[231].length; ++j2)
        if (D[231][j2].charCodeAt(0) !== 65533) {
          e[D[231][j2]] = 59136 + j2;
          d[59136 + j2] = D[231][j2];
        }
      D[232] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������烏熬獒筽蜈誤鰲鼇屋沃獄玉鈺溫瑥瘟穩縕蘊兀壅擁瓮甕癰翁邕雍饔渦瓦窩窪臥蛙蝸訛婉完宛梡椀浣玩琓琬碗緩翫脘腕莞豌阮頑曰往旺枉汪王倭娃歪矮外嵬巍猥畏了僚僥凹堯夭妖姚寥寮尿嶢拗搖撓擾料曜樂橈燎燿瑤療�".split("");
      for (j2 = 0; j2 != D[232].length; ++j2)
        if (D[232][j2].charCodeAt(0) !== 65533) {
          e[D[232][j2]] = 59392 + j2;
          d[59392 + j2] = D[232][j2];
        }
      D[233] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������窈窯繇繞耀腰蓼蟯要謠遙遼邀饒慾欲浴縟褥辱俑傭冗勇埇墉容庸慂榕涌湧溶熔瑢用甬聳茸蓉踊鎔鏞龍于佑偶優又友右宇寓尤愚憂旴牛玗瑀盂祐禑禹紆羽芋藕虞迂遇郵釪隅雨雩勖彧旭昱栯煜稶郁頊云暈橒殞澐熉耘芸蕓�".split("");
      for (j2 = 0; j2 != D[233].length; ++j2)
        if (D[233][j2].charCodeAt(0) !== 65533) {
          e[D[233][j2]] = 59648 + j2;
          d[59648 + j2] = D[233][j2];
        }
      D[234] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������運隕雲韻蔚鬱亐熊雄元原員圓園垣媛嫄寃怨愿援沅洹湲源爰猿瑗苑袁轅遠阮院願鴛月越鉞位偉僞危圍委威尉慰暐渭爲瑋緯胃萎葦蔿蝟衛褘謂違韋魏乳侑儒兪劉唯喩孺宥幼幽庾悠惟愈愉揄攸有杻柔柚柳楡楢油洧流游溜�".split("");
      for (j2 = 0; j2 != D[234].length; ++j2)
        if (D[234][j2].charCodeAt(0) !== 65533) {
          e[D[234][j2]] = 59904 + j2;
          d[59904 + j2] = D[234][j2];
        }
      D[235] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������濡猶猷琉瑜由留癒硫紐維臾萸裕誘諛諭踰蹂遊逾遺酉釉鍮類六堉戮毓肉育陸倫允奫尹崙淪潤玧胤贇輪鈗閏律慄栗率聿戎瀜絨融隆垠恩慇殷誾銀隱乙吟淫蔭陰音飮揖泣邑凝應膺鷹依倚儀宜意懿擬椅毅疑矣義艤薏蟻衣誼�".split("");
      for (j2 = 0; j2 != D[235].length; ++j2)
        if (D[235][j2].charCodeAt(0) !== 65533) {
          e[D[235][j2]] = 60160 + j2;
          d[60160 + j2] = D[235][j2];
        }
      D[236] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������議醫二以伊利吏夷姨履已弛彛怡易李梨泥爾珥理異痍痢移罹而耳肄苡荑裏裡貽貳邇里離飴餌匿溺瀷益翊翌翼謚人仁刃印吝咽因姻寅引忍湮燐璘絪茵藺蚓認隣靭靷鱗麟一佚佾壹日溢逸鎰馹任壬妊姙恁林淋稔臨荏賃入卄�".split("");
      for (j2 = 0; j2 != D[236].length; ++j2)
        if (D[236][j2].charCodeAt(0) !== 65533) {
          e[D[236][j2]] = 60416 + j2;
          d[60416 + j2] = D[236][j2];
        }
      D[237] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������立笠粒仍剩孕芿仔刺咨姉姿子字孜恣慈滋炙煮玆瓷疵磁紫者自茨蔗藉諮資雌作勺嚼斫昨灼炸爵綽芍酌雀鵲孱棧殘潺盞岑暫潛箴簪蠶雜丈仗匠場墻壯奬將帳庄張掌暲杖樟檣欌漿牆狀獐璋章粧腸臟臧莊葬蔣薔藏裝贓醬長�".split("");
      for (j2 = 0; j2 != D[237].length; ++j2)
        if (D[237][j2].charCodeAt(0) !== 65533) {
          e[D[237][j2]] = 60672 + j2;
          d[60672 + j2] = D[237][j2];
        }
      D[238] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������障再哉在宰才材栽梓渽滓災縡裁財載齋齎爭箏諍錚佇低儲咀姐底抵杵楮樗沮渚狙猪疽箸紵苧菹著藷詛貯躇這邸雎齟勣吊嫡寂摘敵滴狄炙的積笛籍績翟荻謫賊赤跡蹟迪迹適鏑佃佺傳全典前剪塡塼奠專展廛悛戰栓殿氈澱�".split("");
      for (j2 = 0; j2 != D[238].length; ++j2)
        if (D[238][j2].charCodeAt(0) !== 65533) {
          e[D[238][j2]] = 60928 + j2;
          d[60928 + j2] = D[238][j2];
        }
      D[239] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������煎琠田甸畑癲筌箋箭篆纏詮輾轉鈿銓錢鐫電顚顫餞切截折浙癤竊節絶占岾店漸点粘霑鮎點接摺蝶丁井亭停偵呈姃定幀庭廷征情挺政整旌晶晸柾楨檉正汀淀淨渟湞瀞炡玎珽町睛碇禎程穽精綎艇訂諪貞鄭酊釘鉦鋌錠霆靖�".split("");
      for (j2 = 0; j2 != D[239].length; ++j2)
        if (D[239][j2].charCodeAt(0) !== 65533) {
          e[D[239][j2]] = 61184 + j2;
          d[61184 + j2] = D[239][j2];
        }
      D[240] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������靜頂鼎制劑啼堤帝弟悌提梯濟祭第臍薺製諸蹄醍除際霽題齊俎兆凋助嘲弔彫措操早晁曺曹朝條棗槽漕潮照燥爪璪眺祖祚租稠窕粗糟組繰肇藻蚤詔調趙躁造遭釣阻雕鳥族簇足鏃存尊卒拙猝倧宗從悰慫棕淙琮種終綜縱腫�".split("");
      for (j2 = 0; j2 != D[240].length; ++j2)
        if (D[240][j2].charCodeAt(0) !== 65533) {
          e[D[240][j2]] = 61440 + j2;
          d[61440 + j2] = D[240][j2];
        }
      D[241] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������踪踵鍾鐘佐坐左座挫罪主住侏做姝胄呪周嗾奏宙州廚晝朱柱株注洲湊澍炷珠疇籌紂紬綢舟蛛註誅走躊輳週酎酒鑄駐竹粥俊儁准埈寯峻晙樽浚準濬焌畯竣蠢逡遵雋駿茁中仲衆重卽櫛楫汁葺增憎曾拯烝甑症繒蒸證贈之只�".split("");
      for (j2 = 0; j2 != D[241].length; ++j2)
        if (D[241][j2].charCodeAt(0) !== 65533) {
          e[D[241][j2]] = 61696 + j2;
          d[61696 + j2] = D[241][j2];
        }
      D[242] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������咫地址志持指摯支旨智枝枳止池沚漬知砥祉祗紙肢脂至芝芷蜘誌識贄趾遲直稙稷織職唇嗔塵振搢晉晋桭榛殄津溱珍瑨璡畛疹盡眞瞋秦縉縝臻蔯袗診賑軫辰進鎭陣陳震侄叱姪嫉帙桎瓆疾秩窒膣蛭質跌迭斟朕什執潗緝輯�".split("");
      for (j2 = 0; j2 != D[242].length; ++j2)
        if (D[242][j2].charCodeAt(0) !== 65533) {
          e[D[242][j2]] = 61952 + j2;
          d[61952 + j2] = D[242][j2];
        }
      D[243] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鏶集徵懲澄且侘借叉嗟嵯差次此磋箚茶蹉車遮捉搾着窄錯鑿齪撰澯燦璨瓚竄簒纂粲纘讚贊鑽餐饌刹察擦札紮僭參塹慘慙懺斬站讒讖倉倡創唱娼廠彰愴敞昌昶暢槍滄漲猖瘡窓脹艙菖蒼債埰寀寨彩採砦綵菜蔡采釵冊柵策�".split("");
      for (j2 = 0; j2 != D[243].length; ++j2)
        if (D[243][j2].charCodeAt(0) !== 65533) {
          e[D[243][j2]] = 62208 + j2;
          d[62208 + j2] = D[243][j2];
        }
      D[244] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������責凄妻悽處倜刺剔尺慽戚拓擲斥滌瘠脊蹠陟隻仟千喘天川擅泉淺玔穿舛薦賤踐遷釧闡阡韆凸哲喆徹撤澈綴輟轍鐵僉尖沾添甛瞻簽籤詹諂堞妾帖捷牒疊睫諜貼輒廳晴淸聽菁請靑鯖切剃替涕滯締諦逮遞體初剿哨憔抄招梢�".split("");
      for (j2 = 0; j2 != D[244].length; ++j2)
        if (D[244][j2].charCodeAt(0) !== 65533) {
          e[D[244][j2]] = 62464 + j2;
          d[62464 + j2] = D[244][j2];
        }
      D[245] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������椒楚樵炒焦硝礁礎秒稍肖艸苕草蕉貂超酢醋醮促囑燭矗蜀觸寸忖村邨叢塚寵悤憁摠總聰蔥銃撮催崔最墜抽推椎楸樞湫皺秋芻萩諏趨追鄒酋醜錐錘鎚雛騶鰍丑畜祝竺筑築縮蓄蹙蹴軸逐春椿瑃出朮黜充忠沖蟲衝衷悴膵萃�".split("");
      for (j2 = 0; j2 != D[245].length; ++j2)
        if (D[245][j2].charCodeAt(0) !== 65533) {
          e[D[245][j2]] = 62720 + j2;
          d[62720 + j2] = D[245][j2];
        }
      D[246] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������贅取吹嘴娶就炊翠聚脆臭趣醉驟鷲側仄厠惻測層侈値嗤峙幟恥梔治淄熾痔痴癡稚穉緇緻置致蚩輜雉馳齒則勅飭親七柒漆侵寢枕沈浸琛砧針鍼蟄秤稱快他咤唾墮妥惰打拖朶楕舵陀馱駝倬卓啄坼度托拓擢晫柝濁濯琢琸託�".split("");
      for (j2 = 0; j2 != D[246].length; ++j2)
        if (D[246][j2].charCodeAt(0) !== 65533) {
          e[D[246][j2]] = 62976 + j2;
          d[62976 + j2] = D[246][j2];
        }
      D[247] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鐸呑嘆坦彈憚歎灘炭綻誕奪脫探眈耽貪塔搭榻宕帑湯糖蕩兌台太怠態殆汰泰笞胎苔跆邰颱宅擇澤撑攄兎吐土討慟桶洞痛筒統通堆槌腿褪退頹偸套妬投透鬪慝特闖坡婆巴把播擺杷波派爬琶破罷芭跛頗判坂板版瓣販辦鈑�".split("");
      for (j2 = 0; j2 != D[247].length; ++j2)
        if (D[247][j2].charCodeAt(0) !== 65533) {
          e[D[247][j2]] = 63232 + j2;
          d[63232 + j2] = D[247][j2];
        }
      D[248] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������阪八叭捌佩唄悖敗沛浿牌狽稗覇貝彭澎烹膨愎便偏扁片篇編翩遍鞭騙貶坪平枰萍評吠嬖幣廢弊斃肺蔽閉陛佈包匍匏咆哺圃布怖抛抱捕暴泡浦疱砲胞脯苞葡蒲袍褒逋鋪飽鮑幅暴曝瀑爆輻俵剽彪慓杓標漂瓢票表豹飇飄驃�".split("");
      for (j2 = 0; j2 != D[248].length; ++j2)
        if (D[248][j2].charCodeAt(0) !== 65533) {
          e[D[248][j2]] = 63488 + j2;
          d[63488 + j2] = D[248][j2];
        }
      D[249] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������品稟楓諷豊風馮彼披疲皮被避陂匹弼必泌珌畢疋筆苾馝乏逼下何厦夏廈昰河瑕荷蝦賀遐霞鰕壑學虐謔鶴寒恨悍旱汗漢澣瀚罕翰閑閒限韓割轄函含咸啣喊檻涵緘艦銜陷鹹合哈盒蛤閤闔陜亢伉姮嫦巷恒抗杭桁沆港缸肛航�".split("");
      for (j2 = 0; j2 != D[249].length; ++j2)
        if (D[249][j2].charCodeAt(0) !== 65533) {
          e[D[249][j2]] = 63744 + j2;
          d[63744 + j2] = D[249][j2];
        }
      D[250] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������行降項亥偕咳垓奚孩害懈楷海瀣蟹解該諧邂駭骸劾核倖幸杏荇行享向嚮珦鄕響餉饗香噓墟虛許憲櫶獻軒歇險驗奕爀赫革俔峴弦懸晛泫炫玄玹現眩睍絃絢縣舷衒見賢鉉顯孑穴血頁嫌俠協夾峽挾浹狹脅脇莢鋏頰亨兄刑型�".split("");
      for (j2 = 0; j2 != D[250].length; ++j2)
        if (D[250][j2].charCodeAt(0) !== 65533) {
          e[D[250][j2]] = 64e3 + j2;
          d[64e3 + j2] = D[250][j2];
        }
      D[251] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������形泂滎瀅灐炯熒珩瑩荊螢衡逈邢鎣馨兮彗惠慧暳蕙蹊醯鞋乎互呼壕壺好岵弧戶扈昊晧毫浩淏湖滸澔濠濩灝狐琥瑚瓠皓祜糊縞胡芦葫蒿虎號蝴護豪鎬頀顥惑或酷婚昏混渾琿魂忽惚笏哄弘汞泓洪烘紅虹訌鴻化和嬅樺火畵�".split("");
      for (j2 = 0; j2 != D[251].length; ++j2)
        if (D[251][j2].charCodeAt(0) !== 65533) {
          e[D[251][j2]] = 64256 + j2;
          d[64256 + j2] = D[251][j2];
        }
      D[252] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������禍禾花華話譁貨靴廓擴攫確碻穫丸喚奐宦幻患換歡晥桓渙煥環紈還驩鰥活滑猾豁闊凰幌徨恍惶愰慌晃晄榥況湟滉潢煌璜皇篁簧荒蝗遑隍黃匯回廻徊恢悔懷晦會檜淮澮灰獪繪膾茴蛔誨賄劃獲宖橫鐄哮嚆孝效斅曉梟涍淆�".split("");
      for (j2 = 0; j2 != D[252].length; ++j2)
        if (D[252][j2].charCodeAt(0) !== 65533) {
          e[D[252][j2]] = 64512 + j2;
          d[64512 + j2] = D[252][j2];
        }
      D[253] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������爻肴酵驍侯候厚后吼喉嗅帿後朽煦珝逅勛勳塤壎焄熏燻薰訓暈薨喧暄煊萱卉喙毁彙徽揮暉煇諱輝麾休携烋畦虧恤譎鷸兇凶匈洶胸黑昕欣炘痕吃屹紇訖欠欽歆吸恰洽翕興僖凞喜噫囍姬嬉希憙憘戱晞曦熙熹熺犧禧稀羲詰�".split("");
      for (j2 = 0; j2 != D[253].length; ++j2)
        if (D[253][j2].charCodeAt(0) !== 65533) {
          e[D[253][j2]] = 64768 + j2;
          d[64768 + j2] = D[253][j2];
        }
      return { "enc": e, "dec": d };
    }();
    cptable2[950] = function() {
      var d = [], e = {}, D = [], j2;
      D[0] = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~��������������������������������������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[0].length; ++j2)
        if (D[0][j2].charCodeAt(0) !== 65533) {
          e[D[0][j2]] = 0 + j2;
          d[0 + j2] = D[0][j2];
        }
      D[161] = "���������������������������������������������������������������� ,、。.‧;:?!︰…‥﹐﹑﹒·﹔﹕﹖﹗|–︱—︳╴︴﹏()︵︶{}︷︸〔〕︹︺【】︻︼《》︽︾〈〉︿﹀「」﹁﹂『』﹃﹄﹙﹚����������������������������������﹛﹜﹝﹞‘’“”〝〞‵′#&*※§〃○●△▲◎☆★◇◆□■▽▼㊣℅¯ ̄_ˍ﹉﹊﹍﹎﹋﹌﹟﹠﹡+-×÷±√<>=≦≧≠∞≒≡﹢﹣﹤﹥﹦~∩∪⊥∠∟⊿㏒㏑∫∮∵∴♀♂⊕⊙↑↓←→↖↗↙↘∥∣/�".split("");
      for (j2 = 0; j2 != D[161].length; ++j2)
        if (D[161][j2].charCodeAt(0) !== 65533) {
          e[D[161][j2]] = 41216 + j2;
          d[41216 + j2] = D[161][j2];
        }
      D[162] = "����������������������������������������������������������������\∕﹨$¥〒¢£%@℃℉﹩﹪﹫㏕㎜㎝㎞㏎㎡㎎㎏㏄°兙兛兞兝兡兣嗧瓩糎▁▂▃▄▅▆▇█▏▎▍▌▋▊▉┼┴┬┤├▔─│▕┌┐└┘╭����������������������������������╮╰╯═╞╪╡◢◣◥◤╱╲╳0123456789ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ〡〢〣〤〥〦〧〨〩十卄卅ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv�".split("");
      for (j2 = 0; j2 != D[162].length; ++j2)
        if (D[162][j2].charCodeAt(0) !== 65533) {
          e[D[162][j2]] = 41472 + j2;
          d[41472 + j2] = D[162][j2];
        }
      D[163] = "����������������������������������������������������������������wxyzΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζηθικλμνξοπρστυφχψωㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏ����������������������������������ㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ˙ˉˊˇˋ���������������������������������€������������������������������".split("");
      for (j2 = 0; j2 != D[163].length; ++j2)
        if (D[163][j2].charCodeAt(0) !== 65533) {
          e[D[163][j2]] = 41728 + j2;
          d[41728 + j2] = D[163][j2];
        }
      D[164] = "����������������������������������������������������������������一乙丁七乃九了二人儿入八几刀刁力匕十卜又三下丈上丫丸凡久么也乞于亡兀刃勺千叉口土士夕大女子孑孓寸小尢尸山川工己已巳巾干廾弋弓才����������������������������������丑丐不中丰丹之尹予云井互五亢仁什仃仆仇仍今介仄元允內六兮公冗凶分切刈勻勾勿化匹午升卅卞厄友及反壬天夫太夭孔少尤尺屯巴幻廿弔引心戈戶手扎支文斗斤方日曰月木欠止歹毋比毛氏水火爪父爻片牙牛犬王丙�".split("");
      for (j2 = 0; j2 != D[164].length; ++j2)
        if (D[164][j2].charCodeAt(0) !== 65533) {
          e[D[164][j2]] = 41984 + j2;
          d[41984 + j2] = D[164][j2];
        }
      D[165] = "����������������������������������������������������������������世丕且丘主乍乏乎以付仔仕他仗代令仙仞充兄冉冊冬凹出凸刊加功包匆北匝仟半卉卡占卯卮去可古右召叮叩叨叼司叵叫另只史叱台句叭叻四囚外����������������������������������央失奴奶孕它尼巨巧左市布平幼弁弘弗必戊打扔扒扑斥旦朮本未末札正母民氐永汁汀氾犯玄玉瓜瓦甘生用甩田由甲申疋白皮皿目矛矢石示禾穴立丞丟乒乓乩亙交亦亥仿伉伙伊伕伍伐休伏仲件任仰仳份企伋光兇兆先全�".split("");
      for (j2 = 0; j2 != D[165].length; ++j2)
        if (D[165][j2].charCodeAt(0) !== 65533) {
          e[D[165][j2]] = 42240 + j2;
          d[42240 + j2] = D[165][j2];
        }
      D[166] = "����������������������������������������������������������������共再冰列刑划刎刖劣匈匡匠印危吉吏同吊吐吁吋各向名合吃后吆吒因回囝圳地在圭圬圯圩夙多夷夸妄奸妃好她如妁字存宇守宅安寺尖屹州帆并年����������������������������������式弛忙忖戎戌戍成扣扛托收早旨旬旭曲曳有朽朴朱朵次此死氖汝汗汙江池汐汕污汛汍汎灰牟牝百竹米糸缶羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色艾虫血行衣西阡串亨位住佇佗佞伴佛何估佐佑伽伺伸佃佔似但佣�".split("");
      for (j2 = 0; j2 != D[166].length; ++j2)
        if (D[166][j2].charCodeAt(0) !== 65533) {
          e[D[166][j2]] = 42496 + j2;
          d[42496 + j2] = D[166][j2];
        }
      D[167] = "����������������������������������������������������������������作你伯低伶余佝佈佚兌克免兵冶冷別判利刪刨劫助努劬匣即卵吝吭吞吾否呎吧呆呃吳呈呂君吩告吹吻吸吮吵吶吠吼呀吱含吟听囪困囤囫坊坑址坍����������������������������������均坎圾坐坏圻壯夾妝妒妨妞妣妙妖妍妤妓妊妥孝孜孚孛完宋宏尬局屁尿尾岐岑岔岌巫希序庇床廷弄弟彤形彷役忘忌志忍忱快忸忪戒我抄抗抖技扶抉扭把扼找批扳抒扯折扮投抓抑抆改攻攸旱更束李杏材村杜杖杞杉杆杠�".split("");
      for (j2 = 0; j2 != D[167].length; ++j2)
        if (D[167][j2].charCodeAt(0) !== 65533) {
          e[D[167][j2]] = 42752 + j2;
          d[42752 + j2] = D[167][j2];
        }
      D[168] = "����������������������������������������������������������������杓杗步每求汞沙沁沈沉沅沛汪決沐汰沌汨沖沒汽沃汲汾汴沆汶沍沔沘沂灶灼災灸牢牡牠狄狂玖甬甫男甸皂盯矣私秀禿究系罕肖肓肝肘肛肚育良芒����������������������������������芋芍見角言谷豆豕貝赤走足身車辛辰迂迆迅迄巡邑邢邪邦那酉釆里防阮阱阪阬並乖乳事些亞享京佯依侍佳使佬供例來侃佰併侈佩佻侖佾侏侑佺兔兒兕兩具其典冽函刻券刷刺到刮制剁劾劻卒協卓卑卦卷卸卹取叔受味呵�".split("");
      for (j2 = 0; j2 != D[168].length; ++j2)
        if (D[168][j2].charCodeAt(0) !== 65533) {
          e[D[168][j2]] = 43008 + j2;
          d[43008 + j2] = D[168][j2];
        }
      D[169] = "����������������������������������������������������������������咖呸咕咀呻呷咄咒咆呼咐呱呶和咚呢周咋命咎固垃坷坪坩坡坦坤坼夜奉奇奈奄奔妾妻委妹妮姑姆姐姍始姓姊妯妳姒姅孟孤季宗定官宜宙宛尚屈居����������������������������������屆岷岡岸岩岫岱岳帘帚帖帕帛帑幸庚店府底庖延弦弧弩往征彿彼忝忠忽念忿怏怔怯怵怖怪怕怡性怩怫怛或戕房戾所承拉拌拄抿拂抹拒招披拓拔拋拈抨抽押拐拙拇拍抵拚抱拘拖拗拆抬拎放斧於旺昔易昌昆昂明昀昏昕昊�".split("");
      for (j2 = 0; j2 != D[169].length; ++j2)
        if (D[169][j2].charCodeAt(0) !== 65533) {
          e[D[169][j2]] = 43264 + j2;
          d[43264 + j2] = D[169][j2];
        }
      D[170] = "����������������������������������������������������������������昇服朋杭枋枕東果杳杷枇枝林杯杰板枉松析杵枚枓杼杪杲欣武歧歿氓氛泣注泳沱泌泥河沽沾沼波沫法泓沸泄油況沮泗泅泱沿治泡泛泊沬泯泜泖泠����������������������������������炕炎炒炊炙爬爭爸版牧物狀狎狙狗狐玩玨玟玫玥甽疝疙疚的盂盲直知矽社祀祁秉秈空穹竺糾罔羌羋者肺肥肢肱股肫肩肴肪肯臥臾舍芳芝芙芭芽芟芹花芬芥芯芸芣芰芾芷虎虱初表軋迎返近邵邸邱邶采金長門阜陀阿阻附�".split("");
      for (j2 = 0; j2 != D[170].length; ++j2)
        if (D[170][j2].charCodeAt(0) !== 65533) {
          e[D[170][j2]] = 43520 + j2;
          d[43520 + j2] = D[170][j2];
        }
      D[171] = "����������������������������������������������������������������陂隹雨青非亟亭亮信侵侯便俠俑俏保促侶俘俟俊俗侮俐俄係俚俎俞侷兗冒冑冠剎剃削前剌剋則勇勉勃勁匍南卻厚叛咬哀咨哎哉咸咦咳哇哂咽咪品����������������������������������哄哈咯咫咱咻咩咧咿囿垂型垠垣垢城垮垓奕契奏奎奐姜姘姿姣姨娃姥姪姚姦威姻孩宣宦室客宥封屎屏屍屋峙峒巷帝帥帟幽庠度建弈弭彥很待徊律徇後徉怒思怠急怎怨恍恰恨恢恆恃恬恫恪恤扁拜挖按拼拭持拮拽指拱拷�".split("");
      for (j2 = 0; j2 != D[171].length; ++j2)
        if (D[171][j2].charCodeAt(0) !== 65533) {
          e[D[171][j2]] = 43776 + j2;
          d[43776 + j2] = D[171][j2];
        }
      D[172] = "����������������������������������������������������������������拯括拾拴挑挂政故斫施既春昭映昧是星昨昱昤曷柿染柱柔某柬架枯柵柩柯柄柑枴柚查枸柏柞柳枰柙柢柝柒歪殃殆段毒毗氟泉洋洲洪流津洌洱洞洗����������������������������������活洽派洶洛泵洹洧洸洩洮洵洎洫炫為炳炬炯炭炸炮炤爰牲牯牴狩狠狡玷珊玻玲珍珀玳甚甭畏界畎畋疫疤疥疢疣癸皆皇皈盈盆盃盅省盹相眉看盾盼眇矜砂研砌砍祆祉祈祇禹禺科秒秋穿突竿竽籽紂紅紀紉紇約紆缸美羿耄�".split("");
      for (j2 = 0; j2 != D[172].length; ++j2)
        if (D[172][j2].charCodeAt(0) !== 65533) {
          e[D[172][j2]] = 44032 + j2;
          d[44032 + j2] = D[172][j2];
        }
      D[173] = "����������������������������������������������������������������耐耍耑耶胖胥胚胃胄背胡胛胎胞胤胝致舢苧范茅苣苛苦茄若茂茉苒苗英茁苜苔苑苞苓苟苯茆虐虹虻虺衍衫要觔計訂訃貞負赴赳趴軍軌述迦迢迪迥����������������������������������迭迫迤迨郊郎郁郃酋酊重閂限陋陌降面革韋韭音頁風飛食首香乘亳倌倍倣俯倦倥俸倩倖倆值借倚倒們俺倀倔倨俱倡個候倘俳修倭倪俾倫倉兼冤冥冢凍凌准凋剖剜剔剛剝匪卿原厝叟哨唐唁唷哼哥哲唆哺唔哩哭員唉哮哪�".split("");
      for (j2 = 0; j2 != D[173].length; ++j2)
        if (D[173][j2].charCodeAt(0) !== 65533) {
          e[D[173][j2]] = 44288 + j2;
          d[44288 + j2] = D[173][j2];
        }
      D[174] = "����������������������������������������������������������������哦唧唇哽唏圃圄埂埔埋埃堉夏套奘奚娑娘娜娟娛娓姬娠娣娩娥娌娉孫屘宰害家宴宮宵容宸射屑展屐峭峽峻峪峨峰島崁峴差席師庫庭座弱徒徑徐恙����������������������������������恣恥恐恕恭恩息悄悟悚悍悔悌悅悖扇拳挈拿捎挾振捕捂捆捏捉挺捐挽挪挫挨捍捌效敉料旁旅時晉晏晃晒晌晅晁書朔朕朗校核案框桓根桂桔栩梳栗桌桑栽柴桐桀格桃株桅栓栘桁殊殉殷氣氧氨氦氤泰浪涕消涇浦浸海浙涓�".split("");
      for (j2 = 0; j2 != D[174].length; ++j2)
        if (D[174][j2].charCodeAt(0) !== 65533) {
          e[D[174][j2]] = 44544 + j2;
          d[44544 + j2] = D[174][j2];
        }
      D[175] = "����������������������������������������������������������������浬涉浮浚浴浩涌涊浹涅浥涔烊烘烤烙烈烏爹特狼狹狽狸狷玆班琉珮珠珪珞畔畝畜畚留疾病症疲疳疽疼疹痂疸皋皰益盍盎眩真眠眨矩砰砧砸砝破砷����������������������������������砥砭砠砟砲祕祐祠祟祖神祝祗祚秤秣秧租秦秩秘窄窈站笆笑粉紡紗紋紊素索純紐紕級紜納紙紛缺罟羔翅翁耆耘耕耙耗耽耿胱脂胰脅胭胴脆胸胳脈能脊胼胯臭臬舀舐航舫舨般芻茫荒荔荊茸荐草茵茴荏茲茹茶茗荀茱茨荃�".split("");
      for (j2 = 0; j2 != D[175].length; ++j2)
        if (D[175][j2].charCodeAt(0) !== 65533) {
          e[D[175][j2]] = 44800 + j2;
          d[44800 + j2] = D[175][j2];
        }
      D[176] = "����������������������������������������������������������������虔蚊蚪蚓蚤蚩蚌蚣蚜衰衷袁袂衽衹記訐討訌訕訊託訓訖訏訑豈豺豹財貢起躬軒軔軏辱送逆迷退迺迴逃追逅迸邕郡郝郢酒配酌釘針釗釜釙閃院陣陡����������������������������������陛陝除陘陞隻飢馬骨高鬥鬲鬼乾偺偽停假偃偌做偉健偶偎偕偵側偷偏倏偯偭兜冕凰剪副勒務勘動匐匏匙匿區匾參曼商啪啦啄啞啡啃啊唱啖問啕唯啤唸售啜唬啣唳啁啗圈國圉域堅堊堆埠埤基堂堵執培夠奢娶婁婉婦婪婀�".split("");
      for (j2 = 0; j2 != D[176].length; ++j2)
        if (D[176][j2].charCodeAt(0) !== 65533) {
          e[D[176][j2]] = 45056 + j2;
          d[45056 + j2] = D[176][j2];
        }
      D[177] = "����������������������������������������������������������������娼婢婚婆婊孰寇寅寄寂宿密尉專將屠屜屝崇崆崎崛崖崢崑崩崔崙崤崧崗巢常帶帳帷康庸庶庵庾張強彗彬彩彫得徙從徘御徠徜恿患悉悠您惋悴惦悽����������������������������������情悻悵惜悼惘惕惆惟悸惚惇戚戛扈掠控捲掖探接捷捧掘措捱掩掉掃掛捫推掄授掙採掬排掏掀捻捩捨捺敝敖救教敗啟敏敘敕敔斜斛斬族旋旌旎晝晚晤晨晦晞曹勗望梁梯梢梓梵桿桶梱梧梗械梃棄梭梆梅梔條梨梟梡梂欲殺�".split("");
      for (j2 = 0; j2 != D[177].length; ++j2)
        if (D[177][j2].charCodeAt(0) !== 65533) {
          e[D[177][j2]] = 45312 + j2;
          d[45312 + j2] = D[177][j2];
        }
      D[178] = "����������������������������������������������������������������毫毬氫涎涼淳淙液淡淌淤添淺清淇淋涯淑涮淞淹涸混淵淅淒渚涵淚淫淘淪深淮淨淆淄涪淬涿淦烹焉焊烽烯爽牽犁猜猛猖猓猙率琅琊球理現琍瓠瓶����������������������������������瓷甜產略畦畢異疏痔痕疵痊痍皎盔盒盛眷眾眼眶眸眺硫硃硎祥票祭移窒窕笠笨笛第符笙笞笮粒粗粕絆絃統紮紹紼絀細紳組累終紲紱缽羞羚翌翎習耜聊聆脯脖脣脫脩脰脤舂舵舷舶船莎莞莘荸莢莖莽莫莒莊莓莉莠荷荻荼�".split("");
      for (j2 = 0; j2 != D[178].length; ++j2)
        if (D[178][j2].charCodeAt(0) !== 65533) {
          e[D[178][j2]] = 45568 + j2;
          d[45568 + j2] = D[178][j2];
        }
      D[179] = "����������������������������������������������������������������莆莧處彪蛇蛀蚶蛄蚵蛆蛋蚱蚯蛉術袞袈被袒袖袍袋覓規訪訝訣訥許設訟訛訢豉豚販責貫貨貪貧赧赦趾趺軛軟這逍通逗連速逝逐逕逞造透逢逖逛途����������������������������������部郭都酗野釵釦釣釧釭釩閉陪陵陳陸陰陴陶陷陬雀雪雩章竟頂頃魚鳥鹵鹿麥麻傢傍傅備傑傀傖傘傚最凱割剴創剩勞勝勛博厥啻喀喧啼喊喝喘喂喜喪喔喇喋喃喳單喟唾喲喚喻喬喱啾喉喫喙圍堯堪場堤堰報堡堝堠壹壺奠�".split("");
      for (j2 = 0; j2 != D[179].length; ++j2)
        if (D[179][j2].charCodeAt(0) !== 65533) {
          e[D[179][j2]] = 45824 + j2;
          d[45824 + j2] = D[179][j2];
        }
      D[180] = "����������������������������������������������������������������婷媚婿媒媛媧孳孱寒富寓寐尊尋就嵌嵐崴嵇巽幅帽幀幃幾廊廁廂廄弼彭復循徨惑惡悲悶惠愜愣惺愕惰惻惴慨惱愎惶愉愀愒戟扉掣掌描揀揩揉揆揍����������������������������������插揣提握揖揭揮捶援揪換摒揚揹敞敦敢散斑斐斯普晰晴晶景暑智晾晷曾替期朝棺棕棠棘棗椅棟棵森棧棹棒棲棣棋棍植椒椎棉棚楮棻款欺欽殘殖殼毯氮氯氬港游湔渡渲湧湊渠渥渣減湛湘渤湖湮渭渦湯渴湍渺測湃渝渾滋�".split("");
      for (j2 = 0; j2 != D[180].length; ++j2)
        if (D[180][j2].charCodeAt(0) !== 65533) {
          e[D[180][j2]] = 46080 + j2;
          d[46080 + j2] = D[180][j2];
        }
      D[181] = "����������������������������������������������������������������溉渙湎湣湄湲湩湟焙焚焦焰無然煮焜牌犄犀猶猥猴猩琺琪琳琢琥琵琶琴琯琛琦琨甥甦畫番痢痛痣痙痘痞痠登發皖皓皴盜睏短硝硬硯稍稈程稅稀窘����������������������������������窗窖童竣等策筆筐筒答筍筋筏筑粟粥絞結絨絕紫絮絲絡給絢絰絳善翔翕耋聒肅腕腔腋腑腎脹腆脾腌腓腴舒舜菩萃菸萍菠菅萋菁華菱菴著萊菰萌菌菽菲菊萸萎萄菜萇菔菟虛蛟蛙蛭蛔蛛蛤蛐蛞街裁裂袱覃視註詠評詞証詁�".split("");
      for (j2 = 0; j2 != D[181].length; ++j2)
        if (D[181][j2].charCodeAt(0) !== 65533) {
          e[D[181][j2]] = 46336 + j2;
          d[46336 + j2] = D[181][j2];
        }
      D[182] = "����������������������������������������������������������������詔詛詐詆訴診訶詖象貂貯貼貳貽賁費賀貴買貶貿貸越超趁跎距跋跚跑跌跛跆軻軸軼辜逮逵週逸進逶鄂郵鄉郾酣酥量鈔鈕鈣鈉鈞鈍鈐鈇鈑閔閏開閑����������������������������������間閒閎隊階隋陽隅隆隍陲隄雁雅雄集雇雯雲韌項順須飧飪飯飩飲飭馮馭黃黍黑亂傭債傲傳僅傾催傷傻傯僇剿剷剽募勦勤勢勣匯嗟嗨嗓嗦嗎嗜嗇嗑嗣嗤嗯嗚嗡嗅嗆嗥嗉園圓塞塑塘塗塚塔填塌塭塊塢塒塋奧嫁嫉嫌媾媽媼�".split("");
      for (j2 = 0; j2 != D[182].length; ++j2)
        if (D[182][j2].charCodeAt(0) !== 65533) {
          e[D[182][j2]] = 46592 + j2;
          d[46592 + j2] = D[182][j2];
        }
      D[183] = "����������������������������������������������������������������媳嫂媲嵩嵯幌幹廉廈弒彙徬微愚意慈感想愛惹愁愈慎慌慄慍愾愴愧愍愆愷戡戢搓搾搞搪搭搽搬搏搜搔損搶搖搗搆敬斟新暗暉暇暈暖暄暘暍會榔業����������������������������������楚楷楠楔極椰概楊楨楫楞楓楹榆楝楣楛歇歲毀殿毓毽溢溯滓溶滂源溝滇滅溥溘溼溺溫滑準溜滄滔溪溧溴煎煙煩煤煉照煜煬煦煌煥煞煆煨煖爺牒猷獅猿猾瑯瑚瑕瑟瑞瑁琿瑙瑛瑜當畸瘀痰瘁痲痱痺痿痴痳盞盟睛睫睦睞督�".split("");
      for (j2 = 0; j2 != D[183].length; ++j2)
        if (D[183][j2].charCodeAt(0) !== 65533) {
          e[D[183][j2]] = 46848 + j2;
          d[46848 + j2] = D[183][j2];
        }
      D[184] = "����������������������������������������������������������������睹睪睬睜睥睨睢矮碎碰碗碘碌碉硼碑碓硿祺祿禁萬禽稜稚稠稔稟稞窟窠筷節筠筮筧粱粳粵經絹綑綁綏絛置罩罪署義羨群聖聘肆肄腱腰腸腥腮腳腫����������������������������������腹腺腦舅艇蒂葷落萱葵葦葫葉葬葛萼萵葡董葩葭葆虞虜號蛹蜓蜈蜇蜀蛾蛻蜂蜃蜆蜊衙裟裔裙補裘裝裡裊裕裒覜解詫該詳試詩詰誇詼詣誠話誅詭詢詮詬詹詻訾詨豢貊貉賊資賈賄貲賃賂賅跡跟跨路跳跺跪跤跦躲較載軾輊�".split("");
      for (j2 = 0; j2 != D[184].length; ++j2)
        if (D[184][j2].charCodeAt(0) !== 65533) {
          e[D[184][j2]] = 47104 + j2;
          d[47104 + j2] = D[184][j2];
        }
      D[185] = "����������������������������������������������������������������辟農運遊道遂達逼違遐遇遏過遍遑逾遁鄒鄗酬酪酩釉鈷鉗鈸鈽鉀鈾鉛鉋鉤鉑鈴鉉鉍鉅鈹鈿鉚閘隘隔隕雍雋雉雊雷電雹零靖靴靶預頑頓頊頒頌飼飴����������������������������������飽飾馳馱馴髡鳩麂鼎鼓鼠僧僮僥僖僭僚僕像僑僱僎僩兢凳劃劂匱厭嗾嘀嘛嘗嗽嘔嘆嘉嘍嘎嗷嘖嘟嘈嘐嗶團圖塵塾境墓墊塹墅塽壽夥夢夤奪奩嫡嫦嫩嫗嫖嫘嫣孵寞寧寡寥實寨寢寤察對屢嶄嶇幛幣幕幗幔廓廖弊彆彰徹慇�".split("");
      for (j2 = 0; j2 != D[185].length; ++j2)
        if (D[185][j2].charCodeAt(0) !== 65533) {
          e[D[185][j2]] = 47360 + j2;
          d[47360 + j2] = D[185][j2];
        }
      D[186] = "����������������������������������������������������������������愿態慷慢慣慟慚慘慵截撇摘摔撤摸摟摺摑摧搴摭摻敲斡旗旖暢暨暝榜榨榕槁榮槓構榛榷榻榫榴槐槍榭槌榦槃榣歉歌氳漳演滾漓滴漩漾漠漬漏漂漢����������������������������������滿滯漆漱漸漲漣漕漫漯澈漪滬漁滲滌滷熔熙煽熊熄熒爾犒犖獄獐瑤瑣瑪瑰瑭甄疑瘧瘍瘋瘉瘓盡監瞄睽睿睡磁碟碧碳碩碣禎福禍種稱窪窩竭端管箕箋筵算箝箔箏箸箇箄粹粽精綻綰綜綽綾綠緊綴網綱綺綢綿綵綸維緒緇綬�".split("");
      for (j2 = 0; j2 != D[186].length; ++j2)
        if (D[186][j2].charCodeAt(0) !== 65533) {
          e[D[186][j2]] = 47616 + j2;
          d[47616 + j2] = D[186][j2];
        }
      D[187] = "����������������������������������������������������������������罰翠翡翟聞聚肇腐膀膏膈膊腿膂臧臺與舔舞艋蓉蒿蓆蓄蒙蒞蒲蒜蓋蒸蓀蓓蒐蒼蓑蓊蜿蜜蜻蜢蜥蜴蜘蝕蜷蜩裳褂裴裹裸製裨褚裯誦誌語誣認誡誓誤����������������������������������說誥誨誘誑誚誧豪貍貌賓賑賒赫趙趕跼輔輒輕輓辣遠遘遜遣遙遞遢遝遛鄙鄘鄞酵酸酷酴鉸銀銅銘銖鉻銓銜銨鉼銑閡閨閩閣閥閤隙障際雌雒需靼鞅韶頗領颯颱餃餅餌餉駁骯骰髦魁魂鳴鳶鳳麼鼻齊億儀僻僵價儂儈儉儅凜�".split("");
      for (j2 = 0; j2 != D[187].length; ++j2)
        if (D[187][j2].charCodeAt(0) !== 65533) {
          e[D[187][j2]] = 47872 + j2;
          d[47872 + j2] = D[187][j2];
        }
      D[188] = "����������������������������������������������������������������劇劈劉劍劊勰厲嘮嘻嘹嘲嘿嘴嘩噓噎噗噴嘶嘯嘰墀墟增墳墜墮墩墦奭嬉嫻嬋嫵嬌嬈寮寬審寫層履嶝嶔幢幟幡廢廚廟廝廣廠彈影德徵慶慧慮慝慕憂����������������������������������慼慰慫慾憧憐憫憎憬憚憤憔憮戮摩摯摹撞撲撈撐撰撥撓撕撩撒撮播撫撚撬撙撢撳敵敷數暮暫暴暱樣樟槨樁樞標槽模樓樊槳樂樅槭樑歐歎殤毅毆漿潼澄潑潦潔澆潭潛潸潮澎潺潰潤澗潘滕潯潠潟熟熬熱熨牖犛獎獗瑩璋璃�".split("");
      for (j2 = 0; j2 != D[188].length; ++j2)
        if (D[188][j2].charCodeAt(0) !== 65533) {
          e[D[188][j2]] = 48128 + j2;
          d[48128 + j2] = D[188][j2];
        }
      D[189] = "����������������������������������������������������������������瑾璀畿瘠瘩瘟瘤瘦瘡瘢皚皺盤瞎瞇瞌瞑瞋磋磅確磊碾磕碼磐稿稼穀稽稷稻窯窮箭箱範箴篆篇篁箠篌糊締練緯緻緘緬緝編緣線緞緩綞緙緲緹罵罷羯����������������������������������翩耦膛膜膝膠膚膘蔗蔽蔚蓮蔬蔭蔓蔑蔣蔡蔔蓬蔥蓿蔆螂蝴蝶蝠蝦蝸蝨蝙蝗蝌蝓衛衝褐複褒褓褕褊誼諒談諄誕請諸課諉諂調誰論諍誶誹諛豌豎豬賠賞賦賤賬賭賢賣賜質賡赭趟趣踫踐踝踢踏踩踟踡踞躺輝輛輟輩輦輪輜輞�".split("");
      for (j2 = 0; j2 != D[189].length; ++j2)
        if (D[189][j2].charCodeAt(0) !== 65533) {
          e[D[189][j2]] = 48384 + j2;
          d[48384 + j2] = D[189][j2];
        }
      D[190] = "����������������������������������������������������������������輥適遮遨遭遷鄰鄭鄧鄱醇醉醋醃鋅銻銷鋪銬鋤鋁銳銼鋒鋇鋰銲閭閱霄霆震霉靠鞍鞋鞏頡頫頜颳養餓餒餘駝駐駟駛駑駕駒駙骷髮髯鬧魅魄魷魯鴆鴉����������������������������������鴃麩麾黎墨齒儒儘儔儐儕冀冪凝劑劓勳噙噫噹噩噤噸噪器噥噱噯噬噢噶壁墾壇壅奮嬝嬴學寰導彊憲憑憩憊懍憶憾懊懈戰擅擁擋撻撼據擄擇擂操撿擒擔撾整曆曉暹曄曇暸樽樸樺橙橫橘樹橄橢橡橋橇樵機橈歙歷氅濂澱澡�".split("");
      for (j2 = 0; j2 != D[190].length; ++j2)
        if (D[190][j2].charCodeAt(0) !== 65533) {
          e[D[190][j2]] = 48640 + j2;
          d[48640 + j2] = D[190][j2];
        }
      D[191] = "����������������������������������������������������������������濃澤濁澧澳激澹澶澦澠澴熾燉燐燒燈燕熹燎燙燜燃燄獨璜璣璘璟璞瓢甌甍瘴瘸瘺盧盥瞠瞞瞟瞥磨磚磬磧禦積穎穆穌穋窺篙簑築篤篛篡篩篦糕糖縊����������������������������������縑縈縛縣縞縝縉縐罹羲翰翱翮耨膳膩膨臻興艘艙蕊蕙蕈蕨蕩蕃蕉蕭蕪蕞螃螟螞螢融衡褪褲褥褫褡親覦諦諺諫諱謀諜諧諮諾謁謂諷諭諳諶諼豫豭貓賴蹄踱踴蹂踹踵輻輯輸輳辨辦遵遴選遲遼遺鄴醒錠錶鋸錳錯錢鋼錫錄錚�".split("");
      for (j2 = 0; j2 != D[191].length; ++j2)
        if (D[191][j2].charCodeAt(0) !== 65533) {
          e[D[191][j2]] = 48896 + j2;
          d[48896 + j2] = D[191][j2];
        }
      D[192] = "����������������������������������������������������������������錐錦錡錕錮錙閻隧隨險雕霎霑霖霍霓霏靛靜靦鞘頰頸頻頷頭頹頤餐館餞餛餡餚駭駢駱骸骼髻髭鬨鮑鴕鴣鴦鴨鴒鴛默黔龍龜優償儡儲勵嚎嚀嚐嚅嚇����������������������������������嚏壕壓壑壎嬰嬪嬤孺尷屨嶼嶺嶽嶸幫彌徽應懂懇懦懋戲戴擎擊擘擠擰擦擬擱擢擭斂斃曙曖檀檔檄檢檜櫛檣橾檗檐檠歜殮毚氈濘濱濟濠濛濤濫濯澀濬濡濩濕濮濰燧營燮燦燥燭燬燴燠爵牆獰獲璩環璦璨癆療癌盪瞳瞪瞰瞬�".split("");
      for (j2 = 0; j2 != D[192].length; ++j2)
        if (D[192][j2].charCodeAt(0) !== 65533) {
          e[D[192][j2]] = 49152 + j2;
          d[49152 + j2] = D[192][j2];
        }
      D[193] = "����������������������������������������������������������������瞧瞭矯磷磺磴磯礁禧禪穗窿簇簍篾篷簌篠糠糜糞糢糟糙糝縮績繆縷縲繃縫總縱繅繁縴縹繈縵縿縯罄翳翼聱聲聰聯聳臆臃膺臂臀膿膽臉膾臨舉艱薪����������������������������������薄蕾薜薑薔薯薛薇薨薊虧蟀蟑螳蟒蟆螫螻螺蟈蟋褻褶襄褸褽覬謎謗謙講謊謠謝謄謐豁谿豳賺賽購賸賻趨蹉蹋蹈蹊轄輾轂轅輿避遽還邁邂邀鄹醣醞醜鍍鎂錨鍵鍊鍥鍋錘鍾鍬鍛鍰鍚鍔闊闋闌闈闆隱隸雖霜霞鞠韓顆颶餵騁�".split("");
      for (j2 = 0; j2 != D[193].length; ++j2)
        if (D[193][j2].charCodeAt(0) !== 65533) {
          e[D[193][j2]] = 49408 + j2;
          d[49408 + j2] = D[193][j2];
        }
      D[194] = "����������������������������������������������������������������駿鮮鮫鮪鮭鴻鴿麋黏點黜黝黛鼾齋叢嚕嚮壙壘嬸彝懣戳擴擲擾攆擺擻擷斷曜朦檳檬櫃檻檸櫂檮檯歟歸殯瀉瀋濾瀆濺瀑瀏燻燼燾燸獷獵璧璿甕癖癘����������������������������������癒瞽瞿瞻瞼礎禮穡穢穠竄竅簫簧簪簞簣簡糧織繕繞繚繡繒繙罈翹翻職聶臍臏舊藏薩藍藐藉薰薺薹薦蟯蟬蟲蟠覆覲觴謨謹謬謫豐贅蹙蹣蹦蹤蹟蹕軀轉轍邇邃邈醫醬釐鎔鎊鎖鎢鎳鎮鎬鎰鎘鎚鎗闔闖闐闕離雜雙雛雞霤鞣鞦�".split("");
      for (j2 = 0; j2 != D[194].length; ++j2)
        if (D[194][j2].charCodeAt(0) !== 65533) {
          e[D[194][j2]] = 49664 + j2;
          d[49664 + j2] = D[194][j2];
        }
      D[195] = "����������������������������������������������������������������鞭韹額顏題顎顓颺餾餿餽餮馥騎髁鬃鬆魏魎魍鯊鯉鯽鯈鯀鵑鵝鵠黠鼕鼬儳嚥壞壟壢寵龐廬懲懷懶懵攀攏曠曝櫥櫝櫚櫓瀛瀟瀨瀚瀝瀕瀘爆爍牘犢獸����������������������������������獺璽瓊瓣疇疆癟癡矇礙禱穫穩簾簿簸簽簷籀繫繭繹繩繪羅繳羶羹羸臘藩藝藪藕藤藥藷蟻蠅蠍蟹蟾襠襟襖襞譁譜識證譚譎譏譆譙贈贊蹼蹲躇蹶蹬蹺蹴轔轎辭邊邋醱醮鏡鏑鏟鏃鏈鏜鏝鏖鏢鏍鏘鏤鏗鏨關隴難霪霧靡韜韻類�".split("");
      for (j2 = 0; j2 != D[195].length; ++j2)
        if (D[195][j2].charCodeAt(0) !== 65533) {
          e[D[195][j2]] = 49920 + j2;
          d[49920 + j2] = D[195][j2];
        }
      D[196] = "����������������������������������������������������������������願顛颼饅饉騖騙鬍鯨鯧鯖鯛鶉鵡鵲鵪鵬麒麗麓麴勸嚨嚷嚶嚴嚼壤孀孃孽寶巉懸懺攘攔攙曦朧櫬瀾瀰瀲爐獻瓏癢癥礦礪礬礫竇競籌籃籍糯糰辮繽繼����������������������������������纂罌耀臚艦藻藹蘑藺蘆蘋蘇蘊蠔蠕襤覺觸議譬警譯譟譫贏贍躉躁躅躂醴釋鐘鐃鏽闡霰飄饒饑馨騫騰騷騵鰓鰍鹹麵黨鼯齟齣齡儷儸囁囀囂夔屬巍懼懾攝攜斕曩櫻欄櫺殲灌爛犧瓖瓔癩矓籐纏續羼蘗蘭蘚蠣蠢蠡蠟襪襬覽譴�".split("");
      for (j2 = 0; j2 != D[196].length; ++j2)
        if (D[196][j2].charCodeAt(0) !== 65533) {
          e[D[196][j2]] = 50176 + j2;
          d[50176 + j2] = D[196][j2];
        }
      D[197] = "����������������������������������������������������������������護譽贓躊躍躋轟辯醺鐮鐳鐵鐺鐸鐲鐫闢霸霹露響顧顥饗驅驃驀騾髏魔魑鰭鰥鶯鶴鷂鶸麝黯鼙齜齦齧儼儻囈囊囉孿巔巒彎懿攤權歡灑灘玀瓤疊癮癬����������������������������������禳籠籟聾聽臟襲襯觼讀贖贗躑躓轡酈鑄鑑鑒霽霾韃韁顫饕驕驍髒鬚鱉鰱鰾鰻鷓鷗鼴齬齪龔囌巖戀攣攫攪曬欐瓚竊籤籣籥纓纖纔臢蘸蘿蠱變邐邏鑣鑠鑤靨顯饜驚驛驗髓體髑鱔鱗鱖鷥麟黴囑壩攬灞癱癲矗罐羈蠶蠹衢讓讒�".split("");
      for (j2 = 0; j2 != D[197].length; ++j2)
        if (D[197][j2].charCodeAt(0) !== 65533) {
          e[D[197][j2]] = 50432 + j2;
          d[50432 + j2] = D[197][j2];
        }
      D[198] = "����������������������������������������������������������������讖艷贛釀鑪靂靈靄韆顰驟鬢魘鱟鷹鷺鹼鹽鼇齷齲廳欖灣籬籮蠻觀躡釁鑲鑰顱饞髖鬣黌灤矚讚鑷韉驢驥纜讜躪釅鑽鑾鑼鱷鱸黷豔鑿鸚爨驪鬱鸛鸞籲���������������������������������������������������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[198].length; ++j2)
        if (D[198][j2].charCodeAt(0) !== 65533) {
          e[D[198][j2]] = 50688 + j2;
          d[50688 + j2] = D[198][j2];
        }
      D[201] = "����������������������������������������������������������������乂乜凵匚厂万丌乇亍囗兀屮彳丏冇与丮亓仂仉仈冘勼卬厹圠夃夬尐巿旡殳毌气爿丱丼仨仜仩仡仝仚刌匜卌圢圣夗夯宁宄尒尻屴屳帄庀庂忉戉扐氕����������������������������������氶汃氿氻犮犰玊禸肊阞伎优伬仵伔仱伀价伈伝伂伅伢伓伄仴伒冱刓刉刐劦匢匟卍厊吇囡囟圮圪圴夼妀奼妅奻奾奷奿孖尕尥屼屺屻屾巟幵庄异弚彴忕忔忏扜扞扤扡扦扢扙扠扚扥旯旮朾朹朸朻机朿朼朳氘汆汒汜汏汊汔汋�".split("");
      for (j2 = 0; j2 != D[201].length; ++j2)
        if (D[201][j2].charCodeAt(0) !== 65533) {
          e[D[201][j2]] = 51456 + j2;
          d[51456 + j2] = D[201][j2];
        }
      D[202] = "����������������������������������������������������������������汌灱牞犴犵玎甪癿穵网艸艼芀艽艿虍襾邙邗邘邛邔阢阤阠阣佖伻佢佉体佤伾佧佒佟佁佘伭伳伿佡冏冹刜刞刡劭劮匉卣卲厎厏吰吷吪呔呅吙吜吥吘����������������������������������吽呏呁吨吤呇囮囧囥坁坅坌坉坋坒夆奀妦妘妠妗妎妢妐妏妧妡宎宒尨尪岍岏岈岋岉岒岊岆岓岕巠帊帎庋庉庌庈庍弅弝彸彶忒忑忐忭忨忮忳忡忤忣忺忯忷忻怀忴戺抃抌抎抏抔抇扱扻扺扰抁抈扷扽扲扴攷旰旴旳旲旵杅杇�".split("");
      for (j2 = 0; j2 != D[202].length; ++j2)
        if (D[202][j2].charCodeAt(0) !== 65533) {
          e[D[202][j2]] = 51712 + j2;
          d[51712 + j2] = D[202][j2];
        }
      D[203] = "����������������������������������������������������������������杙杕杌杈杝杍杚杋毐氙氚汸汧汫沄沋沏汱汯汩沚汭沇沕沜汦汳汥汻沎灴灺牣犿犽狃狆狁犺狅玕玗玓玔玒町甹疔疕皁礽耴肕肙肐肒肜芐芏芅芎芑芓����������������������������������芊芃芄豸迉辿邟邡邥邞邧邠阰阨阯阭丳侘佼侅佽侀侇佶佴侉侄佷佌侗佪侚佹侁佸侐侜侔侞侒侂侕佫佮冞冼冾刵刲刳剆刱劼匊匋匼厒厔咇呿咁咑咂咈呫呺呾呥呬呴呦咍呯呡呠咘呣呧呤囷囹坯坲坭坫坱坰坶垀坵坻坳坴坢�".split("");
      for (j2 = 0; j2 != D[203].length; ++j2)
        if (D[203][j2].charCodeAt(0) !== 65533) {
          e[D[203][j2]] = 51968 + j2;
          d[51968 + j2] = D[203][j2];
        }
      D[204] = "����������������������������������������������������������������坨坽夌奅妵妺姏姎妲姌姁妶妼姃姖妱妽姀姈妴姇孢孥宓宕屄屇岮岤岠岵岯岨岬岟岣岭岢岪岧岝岥岶岰岦帗帔帙弨弢弣弤彔徂彾彽忞忥怭怦怙怲怋����������������������������������怴怊怗怳怚怞怬怢怍怐怮怓怑怌怉怜戔戽抭抴拑抾抪抶拊抮抳抯抻抩抰抸攽斨斻昉旼昄昒昈旻昃昋昍昅旽昑昐曶朊枅杬枎枒杶杻枘枆构杴枍枌杺枟枑枙枃杽极杸杹枔欥殀歾毞氝沓泬泫泮泙沶泔沭泧沷泐泂沺泃泆泭泲�".split("");
      for (j2 = 0; j2 != D[204].length; ++j2)
        if (D[204][j2].charCodeAt(0) !== 65533) {
          e[D[204][j2]] = 52224 + j2;
          d[52224 + j2] = D[204][j2];
        }
      D[205] = "����������������������������������������������������������������泒泝沴沊沝沀泞泀洰泍泇沰泹泏泩泑炔炘炅炓炆炄炑炖炂炚炃牪狖狋狘狉狜狒狔狚狌狑玤玡玭玦玢玠玬玝瓝瓨甿畀甾疌疘皯盳盱盰盵矸矼矹矻矺����������������������������������矷祂礿秅穸穻竻籵糽耵肏肮肣肸肵肭舠芠苀芫芚芘芛芵芧芮芼芞芺芴芨芡芩苂芤苃芶芢虰虯虭虮豖迒迋迓迍迖迕迗邲邴邯邳邰阹阽阼阺陃俍俅俓侲俉俋俁俔俜俙侻侳俛俇俖侺俀侹俬剄剉勀勂匽卼厗厖厙厘咺咡咭咥哏�".split("");
      for (j2 = 0; j2 != D[205].length; ++j2)
        if (D[205][j2].charCodeAt(0) !== 65533) {
          e[D[205][j2]] = 52480 + j2;
          d[52480 + j2] = D[205][j2];
        }
      D[206] = "����������������������������������������������������������������哃茍咷咮哖咶哅哆咠呰咼咢咾呲哞咰垵垞垟垤垌垗垝垛垔垘垏垙垥垚垕壴复奓姡姞姮娀姱姝姺姽姼姶姤姲姷姛姩姳姵姠姾姴姭宨屌峐峘峌峗峋峛����������������������������������峞峚峉峇峊峖峓峔峏峈峆峎峟峸巹帡帢帣帠帤庰庤庢庛庣庥弇弮彖徆怷怹恔恲恞恅恓恇恉恛恌恀恂恟怤恄恘恦恮扂扃拏挍挋拵挎挃拫拹挏挌拸拶挀挓挔拺挕拻拰敁敃斪斿昶昡昲昵昜昦昢昳昫昺昝昴昹昮朏朐柁柲柈枺�".split("");
      for (j2 = 0; j2 != D[206].length; ++j2)
        if (D[206][j2].charCodeAt(0) !== 65533) {
          e[D[206][j2]] = 52736 + j2;
          d[52736 + j2] = D[206][j2];
        }
      D[207] = "����������������������������������������������������������������柜枻柸柘柀枷柅柫柤柟枵柍枳柷柶柮柣柂枹柎柧柰枲柼柆柭柌枮柦柛柺柉柊柃柪柋欨殂殄殶毖毘毠氠氡洨洴洭洟洼洿洒洊泚洳洄洙洺洚洑洀洝浂����������������������������������洁洘洷洃洏浀洇洠洬洈洢洉洐炷炟炾炱炰炡炴炵炩牁牉牊牬牰牳牮狊狤狨狫狟狪狦狣玅珌珂珈珅玹玶玵玴珫玿珇玾珃珆玸珋瓬瓮甮畇畈疧疪癹盄眈眃眄眅眊盷盻盺矧矨砆砑砒砅砐砏砎砉砃砓祊祌祋祅祄秕种秏秖秎窀�".split("");
      for (j2 = 0; j2 != D[207].length; ++j2)
        if (D[207][j2].charCodeAt(0) !== 65533) {
          e[D[207][j2]] = 52992 + j2;
          d[52992 + j2] = D[207][j2];
        }
      D[208] = "����������������������������������������������������������������穾竑笀笁籺籸籹籿粀粁紃紈紁罘羑羍羾耇耎耏耔耷胘胇胠胑胈胂胐胅胣胙胜胊胕胉胏胗胦胍臿舡芔苙苾苹茇苨茀苕茺苫苖苴苬苡苲苵茌苻苶苰苪����������������������������������苤苠苺苳苭虷虴虼虳衁衎衧衪衩觓訄訇赲迣迡迮迠郱邽邿郕郅邾郇郋郈釔釓陔陏陑陓陊陎倞倅倇倓倢倰倛俵俴倳倷倬俶俷倗倜倠倧倵倯倱倎党冔冓凊凄凅凈凎剡剚剒剞剟剕剢勍匎厞唦哢唗唒哧哳哤唚哿唄唈哫唑唅哱�".split("");
      for (j2 = 0; j2 != D[208].length; ++j2)
        if (D[208][j2].charCodeAt(0) !== 65533) {
          e[D[208][j2]] = 53248 + j2;
          d[53248 + j2] = D[208][j2];
        }
      D[209] = "����������������������������������������������������������������唊哻哷哸哠唎唃唋圁圂埌堲埕埒垺埆垽垼垸垶垿埇埐垹埁夎奊娙娖娭娮娕娏娗娊娞娳孬宧宭宬尃屖屔峬峿峮峱峷崀峹帩帨庨庮庪庬弳弰彧恝恚恧����������������������������������恁悢悈悀悒悁悝悃悕悛悗悇悜悎戙扆拲挐捖挬捄捅挶捃揤挹捋捊挼挩捁挴捘捔捙挭捇挳捚捑挸捗捀捈敊敆旆旃旄旂晊晟晇晑朒朓栟栚桉栲栳栻桋桏栖栱栜栵栫栭栯桎桄栴栝栒栔栦栨栮桍栺栥栠欬欯欭欱欴歭肂殈毦毤�".split("");
      for (j2 = 0; j2 != D[209].length; ++j2)
        if (D[209][j2].charCodeAt(0) !== 65533) {
          e[D[209][j2]] = 53504 + j2;
          d[53504 + j2] = D[209][j2];
        }
      D[210] = "����������������������������������������������������������������毨毣毢毧氥浺浣浤浶洍浡涒浘浢浭浯涑涍淯浿涆浞浧浠涗浰浼浟涂涘洯浨涋浾涀涄洖涃浻浽浵涐烜烓烑烝烋缹烢烗烒烞烠烔烍烅烆烇烚烎烡牂牸����������������������������������牷牶猀狺狴狾狶狳狻猁珓珙珥珖玼珧珣珩珜珒珛珔珝珚珗珘珨瓞瓟瓴瓵甡畛畟疰痁疻痄痀疿疶疺皊盉眝眛眐眓眒眣眑眕眙眚眢眧砣砬砢砵砯砨砮砫砡砩砳砪砱祔祛祏祜祓祒祑秫秬秠秮秭秪秜秞秝窆窉窅窋窌窊窇竘笐�".split("");
      for (j2 = 0; j2 != D[210].length; ++j2)
        if (D[210][j2].charCodeAt(0) !== 65533) {
          e[D[210][j2]] = 53760 + j2;
          d[53760 + j2] = D[210][j2];
        }
      D[211] = "����������������������������������������������������������������笄笓笅笏笈笊笎笉笒粄粑粊粌粈粍粅紞紝紑紎紘紖紓紟紒紏紌罜罡罞罠罝罛羖羒翃翂翀耖耾耹胺胲胹胵脁胻脀舁舯舥茳茭荄茙荑茥荖茿荁茦茜茢����������������������������������荂荎茛茪茈茼荍茖茤茠茷茯茩荇荅荌荓茞茬荋茧荈虓虒蚢蚨蚖蚍蚑蚞蚇蚗蚆蚋蚚蚅蚥蚙蚡蚧蚕蚘蚎蚝蚐蚔衃衄衭衵衶衲袀衱衿衯袃衾衴衼訒豇豗豻貤貣赶赸趵趷趶軑軓迾迵适迿迻逄迼迶郖郠郙郚郣郟郥郘郛郗郜郤酐�".split("");
      for (j2 = 0; j2 != D[211].length; ++j2)
        if (D[211][j2].charCodeAt(0) !== 65533) {
          e[D[211][j2]] = 54016 + j2;
          d[54016 + j2] = D[211][j2];
        }
      D[212] = "����������������������������������������������������������������酎酏釕釢釚陜陟隼飣髟鬯乿偰偪偡偞偠偓偋偝偲偈偍偁偛偊偢倕偅偟偩偫偣偤偆偀偮偳偗偑凐剫剭剬剮勖勓匭厜啵啶唼啍啐唴唪啑啢唶唵唰啒啅����������������������������������唌唲啥啎唹啈唭唻啀啋圊圇埻堔埢埶埜埴堀埭埽堈埸堋埳埏堇埮埣埲埥埬埡堎埼堐埧堁堌埱埩埰堍堄奜婠婘婕婧婞娸娵婭婐婟婥婬婓婤婗婃婝婒婄婛婈媎娾婍娹婌婰婩婇婑婖婂婜孲孮寁寀屙崞崋崝崚崠崌崨崍崦崥崏�".split("");
      for (j2 = 0; j2 != D[212].length; ++j2)
        if (D[212][j2].charCodeAt(0) !== 65533) {
          e[D[212][j2]] = 54272 + j2;
          d[54272 + j2] = D[212][j2];
        }
      D[213] = "����������������������������������������������������������������崰崒崣崟崮帾帴庱庴庹庲庳弶弸徛徖徟悊悐悆悾悰悺惓惔惏惤惙惝惈悱惛悷惊悿惃惍惀挲捥掊掂捽掽掞掭掝掗掫掎捯掇掐据掯捵掜捭掮捼掤挻掟����������������������������������捸掅掁掑掍捰敓旍晥晡晛晙晜晢朘桹梇梐梜桭桮梮梫楖桯梣梬梩桵桴梲梏桷梒桼桫桲梪梀桱桾梛梖梋梠梉梤桸桻梑梌梊桽欶欳欷欸殑殏殍殎殌氪淀涫涴涳湴涬淩淢涷淶淔渀淈淠淟淖涾淥淜淝淛淴淊涽淭淰涺淕淂淏淉�".split("");
      for (j2 = 0; j2 != D[213].length; ++j2)
        if (D[213][j2].charCodeAt(0) !== 65533) {
          e[D[213][j2]] = 54528 + j2;
          d[54528 + j2] = D[213][j2];
        }
      D[214] = "����������������������������������������������������������������淐淲淓淽淗淍淣涻烺焍烷焗烴焌烰焄烳焐烼烿焆焓焀烸烶焋焂焎牾牻牼牿猝猗猇猑猘猊猈狿猏猞玈珶珸珵琄琁珽琇琀珺珼珿琌琋珴琈畤畣痎痒痏����������������������������������痋痌痑痐皏皉盓眹眯眭眱眲眴眳眽眥眻眵硈硒硉硍硊硌砦硅硐祤祧祩祪祣祫祡离秺秸秶秷窏窔窐笵筇笴笥笰笢笤笳笘笪笝笱笫笭笯笲笸笚笣粔粘粖粣紵紽紸紶紺絅紬紩絁絇紾紿絊紻紨罣羕羜羝羛翊翋翍翐翑翇翏翉耟�".split("");
      for (j2 = 0; j2 != D[214].length; ++j2)
        if (D[214][j2].charCodeAt(0) !== 65533) {
          e[D[214][j2]] = 54784 + j2;
          d[54784 + j2] = D[214][j2];
        }
      D[215] = "����������������������������������������������������������������耞耛聇聃聈脘脥脙脛脭脟脬脞脡脕脧脝脢舑舸舳舺舴舲艴莐莣莨莍荺荳莤荴莏莁莕莙荵莔莩荽莃莌莝莛莪莋荾莥莯莈莗莰荿莦莇莮荶莚虙虖蚿蚷����������������������������������蛂蛁蛅蚺蚰蛈蚹蚳蚸蛌蚴蚻蚼蛃蚽蚾衒袉袕袨袢袪袚袑袡袟袘袧袙袛袗袤袬袌袓袎覂觖觙觕訰訧訬訞谹谻豜豝豽貥赽赻赹趼跂趹趿跁軘軞軝軜軗軠軡逤逋逑逜逌逡郯郪郰郴郲郳郔郫郬郩酖酘酚酓酕釬釴釱釳釸釤釹釪�".split("");
      for (j2 = 0; j2 != D[215].length; ++j2)
        if (D[215][j2].charCodeAt(0) !== 65533) {
          e[D[215][j2]] = 55040 + j2;
          d[55040 + j2] = D[215][j2];
        }
      D[216] = "����������������������������������������������������������������釫釷釨釮镺閆閈陼陭陫陱陯隿靪頄飥馗傛傕傔傞傋傣傃傌傎傝偨傜傒傂傇兟凔匒匑厤厧喑喨喥喭啷噅喢喓喈喏喵喁喣喒喤啽喌喦啿喕喡喎圌堩堷����������������������������������堙堞堧堣堨埵塈堥堜堛堳堿堶堮堹堸堭堬堻奡媯媔媟婺媢媞婸媦婼媥媬媕媮娷媄媊媗媃媋媩婻婽媌媜媏媓媝寪寍寋寔寑寊寎尌尰崷嵃嵫嵁嵋崿崵嵑嵎嵕崳崺嵒崽崱嵙嵂崹嵉崸崼崲崶嵀嵅幄幁彘徦徥徫惉悹惌惢惎惄愔�".split("");
      for (j2 = 0; j2 != D[216].length; ++j2)
        if (D[216][j2].charCodeAt(0) !== 65533) {
          e[D[216][j2]] = 55296 + j2;
          d[55296 + j2] = D[216][j2];
        }
      D[217] = "����������������������������������������������������������������惲愊愖愅惵愓惸惼惾惁愃愘愝愐惿愄愋扊掔掱掰揎揥揨揯揃撝揳揊揠揶揕揲揵摡揟掾揝揜揄揘揓揂揇揌揋揈揰揗揙攲敧敪敤敜敨敥斌斝斞斮旐旒����������������������������������晼晬晻暀晱晹晪晲朁椌棓椄棜椪棬棪棱椏棖棷棫棤棶椓椐棳棡椇棌椈楰梴椑棯棆椔棸棐棽棼棨椋椊椗棎棈棝棞棦棴棑椆棔棩椕椥棇欹欻欿欼殔殗殙殕殽毰毲毳氰淼湆湇渟湉溈渼渽湅湢渫渿湁湝湳渜渳湋湀湑渻渃渮湞�".split("");
      for (j2 = 0; j2 != D[217].length; ++j2)
        if (D[217][j2].charCodeAt(0) !== 65533) {
          e[D[217][j2]] = 55552 + j2;
          d[55552 + j2] = D[217][j2];
        }
      D[218] = "����������������������������������������������������������������湨湜湡渱渨湠湱湫渹渢渰湓湥渧湸湤湷湕湹湒湦渵渶湚焠焞焯烻焮焱焣焥焢焲焟焨焺焛牋牚犈犉犆犅犋猒猋猰猢猱猳猧猲猭猦猣猵猌琮琬琰琫琖����������������������������������琚琡琭琱琤琣琝琩琠琲瓻甯畯畬痧痚痡痦痝痟痤痗皕皒盚睆睇睄睍睅睊睎睋睌矞矬硠硤硥硜硭硱硪确硰硩硨硞硢祴祳祲祰稂稊稃稌稄窙竦竤筊笻筄筈筌筎筀筘筅粢粞粨粡絘絯絣絓絖絧絪絏絭絜絫絒絔絩絑絟絎缾缿罥�".split("");
      for (j2 = 0; j2 != D[218].length; ++j2)
        if (D[218][j2].charCodeAt(0) !== 65533) {
          e[D[218][j2]] = 55808 + j2;
          d[55808 + j2] = D[218][j2];
        }
      D[219] = "����������������������������������������������������������������罦羢羠羡翗聑聏聐胾胔腃腊腒腏腇脽腍脺臦臮臷臸臹舄舼舽舿艵茻菏菹萣菀菨萒菧菤菼菶萐菆菈菫菣莿萁菝菥菘菿菡菋菎菖菵菉萉萏菞萑萆菂菳����������������������������������菕菺菇菑菪萓菃菬菮菄菻菗菢萛菛菾蛘蛢蛦蛓蛣蛚蛪蛝蛫蛜蛬蛩蛗蛨蛑衈衖衕袺裗袹袸裀袾袶袼袷袽袲褁裉覕覘覗觝觚觛詎詍訹詙詀詗詘詄詅詒詈詑詊詌詏豟貁貀貺貾貰貹貵趄趀趉跘跓跍跇跖跜跏跕跙跈跗跅軯軷軺�".split("");
      for (j2 = 0; j2 != D[219].length; ++j2)
        if (D[219][j2].charCodeAt(0) !== 65533) {
          e[D[219][j2]] = 56064 + j2;
          d[56064 + j2] = D[219][j2];
        }
      D[220] = "����������������������������������������������������������������軹軦軮軥軵軧軨軶軫軱軬軴軩逭逴逯鄆鄬鄄郿郼鄈郹郻鄁鄀鄇鄅鄃酡酤酟酢酠鈁鈊鈥鈃鈚鈦鈏鈌鈀鈒釿釽鈆鈄鈧鈂鈜鈤鈙鈗鈅鈖镻閍閌閐隇陾隈����������������������������������隉隃隀雂雈雃雱雰靬靰靮頇颩飫鳦黹亃亄亶傽傿僆傮僄僊傴僈僂傰僁傺傱僋僉傶傸凗剺剸剻剼嗃嗛嗌嗐嗋嗊嗝嗀嗔嗄嗩喿嗒喍嗏嗕嗢嗖嗈嗲嗍嗙嗂圔塓塨塤塏塍塉塯塕塎塝塙塥塛堽塣塱壼嫇嫄嫋媺媸媱媵媰媿嫈媻嫆�".split("");
      for (j2 = 0; j2 != D[220].length; ++j2)
        if (D[220][j2].charCodeAt(0) !== 65533) {
          e[D[220][j2]] = 56320 + j2;
          d[56320 + j2] = D[220][j2];
        }
      D[221] = "����������������������������������������������������������������媷嫀嫊媴媶嫍媹媐寖寘寙尟尳嵱嵣嵊嵥嵲嵬嵞嵨嵧嵢巰幏幎幊幍幋廅廌廆廋廇彀徯徭惷慉慊愫慅愶愲愮慆愯慏愩慀戠酨戣戥戤揅揱揫搐搒搉搠搤����������������������������������搳摃搟搕搘搹搷搢搣搌搦搰搨摁搵搯搊搚摀搥搧搋揧搛搮搡搎敯斒旓暆暌暕暐暋暊暙暔晸朠楦楟椸楎楢楱椿楅楪椹楂楗楙楺楈楉椵楬椳椽楥棰楸椴楩楀楯楄楶楘楁楴楌椻楋椷楜楏楑椲楒椯楻椼歆歅歃歂歈歁殛嗀毻毼�".split("");
      for (j2 = 0; j2 != D[221].length; ++j2)
        if (D[221][j2].charCodeAt(0) !== 65533) {
          e[D[221][j2]] = 56576 + j2;
          d[56576 + j2] = D[221][j2];
        }
      D[222] = "����������������������������������������������������������������毹毷毸溛滖滈溏滀溟溓溔溠溱溹滆滒溽滁溞滉溷溰滍溦滏溲溾滃滜滘溙溒溎溍溤溡溿溳滐滊溗溮溣煇煔煒煣煠煁煝煢煲煸煪煡煂煘煃煋煰煟煐煓����������������������������������煄煍煚牏犍犌犑犐犎猼獂猻猺獀獊獉瑄瑊瑋瑒瑑瑗瑀瑏瑐瑎瑂瑆瑍瑔瓡瓿瓾瓽甝畹畷榃痯瘏瘃痷痾痼痹痸瘐痻痶痭痵痽皙皵盝睕睟睠睒睖睚睩睧睔睙睭矠碇碚碔碏碄碕碅碆碡碃硹碙碀碖硻祼禂祽祹稑稘稙稒稗稕稢稓�".split("");
      for (j2 = 0; j2 != D[222].length; ++j2)
        if (D[222][j2].charCodeAt(0) !== 65533) {
          e[D[222][j2]] = 56832 + j2;
          d[56832 + j2] = D[222][j2];
        }
      D[223] = "����������������������������������������������������������������稛稐窣窢窞竫筦筤筭筴筩筲筥筳筱筰筡筸筶筣粲粴粯綈綆綀綍絿綅絺綎絻綃絼綌綔綄絽綒罭罫罧罨罬羦羥羧翛翜耡腤腠腷腜腩腛腢腲朡腞腶腧腯����������������������������������腄腡舝艉艄艀艂艅蓱萿葖葶葹蒏蒍葥葑葀蒆葧萰葍葽葚葙葴葳葝蔇葞萷萺萴葺葃葸萲葅萩菙葋萯葂萭葟葰萹葎葌葒葯蓅蒎萻葇萶萳葨葾葄萫葠葔葮葐蜋蜄蛷蜌蛺蛖蛵蝍蛸蜎蜉蜁蛶蜍蜅裖裋裍裎裞裛裚裌裐覅覛觟觥觤�".split("");
      for (j2 = 0; j2 != D[223].length; ++j2)
        if (D[223][j2].charCodeAt(0) !== 65533) {
          e[D[223][j2]] = 57088 + j2;
          d[57088 + j2] = D[223][j2];
        }
      D[224] = "����������������������������������������������������������������觡觠觢觜触詶誆詿詡訿詷誂誄詵誃誁詴詺谼豋豊豥豤豦貆貄貅賌赨赩趑趌趎趏趍趓趔趐趒跰跠跬跱跮跐跩跣跢跧跲跫跴輆軿輁輀輅輇輈輂輋遒逿����������������������������������遄遉逽鄐鄍鄏鄑鄖鄔鄋鄎酮酯鉈鉒鈰鈺鉦鈳鉥鉞銃鈮鉊鉆鉭鉬鉏鉠鉧鉯鈶鉡鉰鈱鉔鉣鉐鉲鉎鉓鉌鉖鈲閟閜閞閛隒隓隑隗雎雺雽雸雵靳靷靸靲頏頍頎颬飶飹馯馲馰馵骭骫魛鳪鳭鳧麀黽僦僔僗僨僳僛僪僝僤僓僬僰僯僣僠�".split("");
      for (j2 = 0; j2 != D[224].length; ++j2)
        if (D[224][j2].charCodeAt(0) !== 65533) {
          e[D[224][j2]] = 57344 + j2;
          d[57344 + j2] = D[224][j2];
        }
      D[225] = "����������������������������������������������������������������凘劀劁勩勫匰厬嘧嘕嘌嘒嗼嘏嘜嘁嘓嘂嗺嘝嘄嗿嗹墉塼墐墘墆墁塿塴墋塺墇墑墎塶墂墈塻墔墏壾奫嫜嫮嫥嫕嫪嫚嫭嫫嫳嫢嫠嫛嫬嫞嫝嫙嫨嫟孷寠����������������������������������寣屣嶂嶀嵽嶆嵺嶁嵷嶊嶉嶈嵾嵼嶍嵹嵿幘幙幓廘廑廗廎廜廕廙廒廔彄彃彯徶愬愨慁慞慱慳慒慓慲慬憀慴慔慺慛慥愻慪慡慖戩戧戫搫摍摛摝摴摶摲摳摽摵摦撦摎撂摞摜摋摓摠摐摿搿摬摫摙摥摷敳斠暡暠暟朅朄朢榱榶槉�".split("");
      for (j2 = 0; j2 != D[225].length; ++j2)
        if (D[225][j2].charCodeAt(0) !== 65533) {
          e[D[225][j2]] = 57600 + j2;
          d[57600 + j2] = D[225][j2];
        }
      D[226] = "����������������������������������������������������������������榠槎榖榰榬榼榑榙榎榧榍榩榾榯榿槄榽榤槔榹槊榚槏榳榓榪榡榞槙榗榐槂榵榥槆歊歍歋殞殟殠毃毄毾滎滵滱漃漥滸漷滻漮漉潎漙漚漧漘漻漒滭漊����������������������������������漶潳滹滮漭潀漰漼漵滫漇漎潃漅滽滶漹漜滼漺漟漍漞漈漡熇熐熉熀熅熂熏煻熆熁熗牄牓犗犕犓獃獍獑獌瑢瑳瑱瑵瑲瑧瑮甀甂甃畽疐瘖瘈瘌瘕瘑瘊瘔皸瞁睼瞅瞂睮瞀睯睾瞃碲碪碴碭碨硾碫碞碥碠碬碢碤禘禊禋禖禕禔禓�".split("");
      for (j2 = 0; j2 != D[226].length; ++j2)
        if (D[226][j2].charCodeAt(0) !== 65533) {
          e[D[226][j2]] = 57856 + j2;
          d[57856 + j2] = D[226][j2];
        }
      D[227] = "����������������������������������������������������������������禗禈禒禐稫穊稰稯稨稦窨窫窬竮箈箜箊箑箐箖箍箌箛箎箅箘劄箙箤箂粻粿粼粺綧綷緂綣綪緁緀緅綝緎緄緆緋緌綯綹綖綼綟綦綮綩綡緉罳翢翣翥翞����������������������������������耤聝聜膉膆膃膇膍膌膋舕蒗蒤蒡蒟蒺蓎蓂蒬蒮蒫蒹蒴蓁蓍蒪蒚蒱蓐蒝蒧蒻蒢蒔蓇蓌蒛蒩蒯蒨蓖蒘蒶蓏蒠蓗蓔蓒蓛蒰蒑虡蜳蜣蜨蝫蝀蜮蜞蜡蜙蜛蝃蜬蝁蜾蝆蜠蜲蜪蜭蜼蜒蜺蜱蜵蝂蜦蜧蜸蜤蜚蜰蜑裷裧裱裲裺裾裮裼裶裻�".split("");
      for (j2 = 0; j2 != D[227].length; ++j2)
        if (D[227][j2].charCodeAt(0) !== 65533) {
          e[D[227][j2]] = 58112 + j2;
          d[58112 + j2] = D[227][j2];
        }
      D[228] = "����������������������������������������������������������������裰裬裫覝覡覟覞觩觫觨誫誙誋誒誏誖谽豨豩賕賏賗趖踉踂跿踍跽踊踃踇踆踅跾踀踄輐輑輎輍鄣鄜鄠鄢鄟鄝鄚鄤鄡鄛酺酲酹酳銥銤鉶銛鉺銠銔銪銍����������������������������������銦銚銫鉹銗鉿銣鋮銎銂銕銢鉽銈銡銊銆銌銙銧鉾銇銩銝銋鈭隞隡雿靘靽靺靾鞃鞀鞂靻鞄鞁靿韎韍頖颭颮餂餀餇馝馜駃馹馻馺駂馽駇骱髣髧鬾鬿魠魡魟鳱鳲鳵麧僿儃儰僸儆儇僶僾儋儌僽儊劋劌勱勯噈噂噌嘵噁噊噉噆噘�".split("");
      for (j2 = 0; j2 != D[228].length; ++j2)
        if (D[228][j2].charCodeAt(0) !== 65533) {
          e[D[228][j2]] = 58368 + j2;
          d[58368 + j2] = D[228][j2];
        }
      D[229] = "����������������������������������������������������������������噚噀嘳嘽嘬嘾嘸嘪嘺圚墫墝墱墠墣墯墬墥墡壿嫿嫴嫽嫷嫶嬃嫸嬂嫹嬁嬇嬅嬏屧嶙嶗嶟嶒嶢嶓嶕嶠嶜嶡嶚嶞幩幝幠幜緳廛廞廡彉徲憋憃慹憱憰憢憉����������������������������������憛憓憯憭憟憒憪憡憍慦憳戭摮摰撖撠撅撗撜撏撋撊撌撣撟摨撱撘敶敺敹敻斲斳暵暰暩暲暷暪暯樀樆樗槥槸樕槱槤樠槿槬槢樛樝槾樧槲槮樔槷槧橀樈槦槻樍槼槫樉樄樘樥樏槶樦樇槴樖歑殥殣殢殦氁氀毿氂潁漦潾澇濆澒�".split("");
      for (j2 = 0; j2 != D[229].length; ++j2)
        if (D[229][j2].charCodeAt(0) !== 65533) {
          e[D[229][j2]] = 58624 + j2;
          d[58624 + j2] = D[229][j2];
        }
      D[230] = "����������������������������������������������������������������澍澉澌潢潏澅潚澖潶潬澂潕潲潒潐潗澔澓潝漀潡潫潽潧澐潓澋潩潿澕潣潷潪潻熲熯熛熰熠熚熩熵熝熥熞熤熡熪熜熧熳犘犚獘獒獞獟獠獝獛獡獚獙����������������������������������獢璇璉璊璆璁瑽璅璈瑼瑹甈甇畾瘥瘞瘙瘝瘜瘣瘚瘨瘛皜皝皞皛瞍瞏瞉瞈磍碻磏磌磑磎磔磈磃磄磉禚禡禠禜禢禛歶稹窲窴窳箷篋箾箬篎箯箹篊箵糅糈糌糋緷緛緪緧緗緡縃緺緦緶緱緰緮緟罶羬羰羭翭翫翪翬翦翨聤聧膣膟�".split("");
      for (j2 = 0; j2 != D[230].length; ++j2)
        if (D[230][j2].charCodeAt(0) !== 65533) {
          e[D[230][j2]] = 58880 + j2;
          d[58880 + j2] = D[230][j2];
        }
      D[231] = "����������������������������������������������������������������膞膕膢膙膗舖艏艓艒艐艎艑蔤蔻蔏蔀蔩蔎蔉蔍蔟蔊蔧蔜蓻蔫蓺蔈蔌蓴蔪蓲蔕蓷蓫蓳蓼蔒蓪蓩蔖蓾蔨蔝蔮蔂蓽蔞蓶蔱蔦蓧蓨蓰蓯蓹蔘蔠蔰蔋蔙蔯虢����������������������������������蝖蝣蝤蝷蟡蝳蝘蝔蝛蝒蝡蝚蝑蝞蝭蝪蝐蝎蝟蝝蝯蝬蝺蝮蝜蝥蝏蝻蝵蝢蝧蝩衚褅褌褔褋褗褘褙褆褖褑褎褉覢覤覣觭觰觬諏諆誸諓諑諔諕誻諗誾諀諅諘諃誺誽諙谾豍貏賥賟賙賨賚賝賧趠趜趡趛踠踣踥踤踮踕踛踖踑踙踦踧�".split("");
      for (j2 = 0; j2 != D[231].length; ++j2)
        if (D[231][j2].charCodeAt(0) !== 65533) {
          e[D[231][j2]] = 59136 + j2;
          d[59136 + j2] = D[231][j2];
        }
      D[232] = "����������������������������������������������������������������踔踒踘踓踜踗踚輬輤輘輚輠輣輖輗遳遰遯遧遫鄯鄫鄩鄪鄲鄦鄮醅醆醊醁醂醄醀鋐鋃鋄鋀鋙銶鋏鋱鋟鋘鋩鋗鋝鋌鋯鋂鋨鋊鋈鋎鋦鋍鋕鋉鋠鋞鋧鋑鋓����������������������������������銵鋡鋆銴镼閬閫閮閰隤隢雓霅霈霂靚鞊鞎鞈韐韏頞頝頦頩頨頠頛頧颲餈飺餑餔餖餗餕駜駍駏駓駔駎駉駖駘駋駗駌骳髬髫髳髲髱魆魃魧魴魱魦魶魵魰魨魤魬鳼鳺鳽鳿鳷鴇鴀鳹鳻鴈鴅鴄麃黓鼏鼐儜儓儗儚儑凞匴叡噰噠噮�".split("");
      for (j2 = 0; j2 != D[232].length; ++j2)
        if (D[232][j2].charCodeAt(0) !== 65533) {
          e[D[232][j2]] = 59392 + j2;
          d[59392 + j2] = D[232][j2];
        }
      D[233] = "����������������������������������������������������������������噳噦噣噭噲噞噷圜圛壈墽壉墿墺壂墼壆嬗嬙嬛嬡嬔嬓嬐嬖嬨嬚嬠嬞寯嶬嶱嶩嶧嶵嶰嶮嶪嶨嶲嶭嶯嶴幧幨幦幯廩廧廦廨廥彋徼憝憨憖懅憴懆懁懌憺����������������������������������憿憸憌擗擖擐擏擉撽撉擃擛擳擙攳敿敼斢曈暾曀曊曋曏暽暻暺曌朣樴橦橉橧樲橨樾橝橭橶橛橑樨橚樻樿橁橪橤橐橏橔橯橩橠樼橞橖橕橍橎橆歕歔歖殧殪殫毈毇氄氃氆澭濋澣濇澼濎濈潞濄澽澞濊澨瀄澥澮澺澬澪濏澿澸�".split("");
      for (j2 = 0; j2 != D[233].length; ++j2)
        if (D[233][j2].charCodeAt(0) !== 65533) {
          e[D[233][j2]] = 59648 + j2;
          d[59648 + j2] = D[233][j2];
        }
      D[234] = "����������������������������������������������������������������澢濉澫濍澯澲澰燅燂熿熸燖燀燁燋燔燊燇燏熽燘熼燆燚燛犝犞獩獦獧獬獥獫獪瑿璚璠璔璒璕璡甋疀瘯瘭瘱瘽瘳瘼瘵瘲瘰皻盦瞚瞝瞡瞜瞛瞢瞣瞕瞙����������������������������������瞗磝磩磥磪磞磣磛磡磢磭磟磠禤穄穈穇窶窸窵窱窷篞篣篧篝篕篥篚篨篹篔篪篢篜篫篘篟糒糔糗糐糑縒縡縗縌縟縠縓縎縜縕縚縢縋縏縖縍縔縥縤罃罻罼罺羱翯耪耩聬膱膦膮膹膵膫膰膬膴膲膷膧臲艕艖艗蕖蕅蕫蕍蕓蕡蕘�".split("");
      for (j2 = 0; j2 != D[234].length; ++j2)
        if (D[234][j2].charCodeAt(0) !== 65533) {
          e[D[234][j2]] = 59904 + j2;
          d[59904 + j2] = D[234][j2];
        }
      D[235] = "����������������������������������������������������������������蕀蕆蕤蕁蕢蕄蕑蕇蕣蔾蕛蕱蕎蕮蕵蕕蕧蕠薌蕦蕝蕔蕥蕬虣虥虤螛螏螗螓螒螈螁螖螘蝹螇螣螅螐螑螝螄螔螜螚螉褞褦褰褭褮褧褱褢褩褣褯褬褟觱諠����������������������������������諢諲諴諵諝謔諤諟諰諈諞諡諨諿諯諻貑貒貐賵賮賱賰賳赬赮趥趧踳踾踸蹀蹅踶踼踽蹁踰踿躽輶輮輵輲輹輷輴遶遹遻邆郺鄳鄵鄶醓醐醑醍醏錧錞錈錟錆錏鍺錸錼錛錣錒錁鍆錭錎錍鋋錝鋺錥錓鋹鋷錴錂錤鋿錩錹錵錪錔錌�".split("");
      for (j2 = 0; j2 != D[235].length; ++j2)
        if (D[235][j2].charCodeAt(0) !== 65533) {
          e[D[235][j2]] = 60160 + j2;
          d[60160 + j2] = D[235][j2];
        }
      D[236] = "����������������������������������������������������������������錋鋾錉錀鋻錖閼闍閾閹閺閶閿閵閽隩雔霋霒霐鞙鞗鞔韰韸頵頯頲餤餟餧餩馞駮駬駥駤駰駣駪駩駧骹骿骴骻髶髺髹髷鬳鮀鮅鮇魼魾魻鮂鮓鮒鮐魺鮕����������������������������������魽鮈鴥鴗鴠鴞鴔鴩鴝鴘鴢鴐鴙鴟麈麆麇麮麭黕黖黺鼒鼽儦儥儢儤儠儩勴嚓嚌嚍嚆嚄嚃噾嚂噿嚁壖壔壏壒嬭嬥嬲嬣嬬嬧嬦嬯嬮孻寱寲嶷幬幪徾徻懃憵憼懧懠懥懤懨懞擯擩擣擫擤擨斁斀斶旚曒檍檖檁檥檉檟檛檡檞檇檓檎�".split("");
      for (j2 = 0; j2 != D[236].length; ++j2)
        if (D[236][j2].charCodeAt(0) !== 65533) {
          e[D[236][j2]] = 60416 + j2;
          d[60416 + j2] = D[236][j2];
        }
      D[237] = "����������������������������������������������������������������檕檃檨檤檑橿檦檚檅檌檒歛殭氉濌澩濴濔濣濜濭濧濦濞濲濝濢濨燡燱燨燲燤燰燢獳獮獯璗璲璫璐璪璭璱璥璯甐甑甒甏疄癃癈癉癇皤盩瞵瞫瞲瞷瞶����������������������������������瞴瞱瞨矰磳磽礂磻磼磲礅磹磾礄禫禨穜穛穖穘穔穚窾竀竁簅簏篲簀篿篻簎篴簋篳簂簉簃簁篸篽簆篰篱簐簊糨縭縼繂縳顈縸縪繉繀繇縩繌縰縻縶繄縺罅罿罾罽翴翲耬膻臄臌臊臅臇膼臩艛艚艜薃薀薏薧薕薠薋薣蕻薤薚薞�".split("");
      for (j2 = 0; j2 != D[237].length; ++j2)
        if (D[237][j2].charCodeAt(0) !== 65533) {
          e[D[237][j2]] = 60672 + j2;
          d[60672 + j2] = D[237][j2];
        }
      D[238] = "����������������������������������������������������������������蕷蕼薉薡蕺蕸蕗薎薖薆薍薙薝薁薢薂薈薅蕹蕶薘薐薟虨螾螪螭蟅螰螬螹螵螼螮蟉蟃蟂蟌螷螯蟄蟊螴螶螿螸螽蟞螲褵褳褼褾襁襒褷襂覭覯覮觲觳謞����������������������������������謘謖謑謅謋謢謏謒謕謇謍謈謆謜謓謚豏豰豲豱豯貕貔賹赯蹎蹍蹓蹐蹌蹇轃轀邅遾鄸醚醢醛醙醟醡醝醠鎡鎃鎯鍤鍖鍇鍼鍘鍜鍶鍉鍐鍑鍠鍭鎏鍌鍪鍹鍗鍕鍒鍏鍱鍷鍻鍡鍞鍣鍧鎀鍎鍙闇闀闉闃闅閷隮隰隬霠霟霘霝霙鞚鞡鞜�".split("");
      for (j2 = 0; j2 != D[238].length; ++j2)
        if (D[238][j2].charCodeAt(0) !== 65533) {
          e[D[238][j2]] = 60928 + j2;
          d[60928 + j2] = D[238][j2];
        }
      D[239] = "����������������������������������������������������������������鞞鞝韕韔韱顁顄顊顉顅顃餥餫餬餪餳餲餯餭餱餰馘馣馡騂駺駴駷駹駸駶駻駽駾駼騃骾髾髽鬁髼魈鮚鮨鮞鮛鮦鮡鮥鮤鮆鮢鮠鮯鴳鵁鵧鴶鴮鴯鴱鴸鴰����������������������������������鵅鵂鵃鴾鴷鵀鴽翵鴭麊麉麍麰黈黚黻黿鼤鼣鼢齔龠儱儭儮嚘嚜嚗嚚嚝嚙奰嬼屩屪巀幭幮懘懟懭懮懱懪懰懫懖懩擿攄擽擸攁攃擼斔旛曚曛曘櫅檹檽櫡櫆檺檶檷櫇檴檭歞毉氋瀇瀌瀍瀁瀅瀔瀎濿瀀濻瀦濼濷瀊爁燿燹爃燽獶�".split("");
      for (j2 = 0; j2 != D[239].length; ++j2)
        if (D[239][j2].charCodeAt(0) !== 65533) {
          e[D[239][j2]] = 61184 + j2;
          d[61184 + j2] = D[239][j2];
        }
      D[240] = "����������������������������������������������������������������璸瓀璵瓁璾璶璻瓂甔甓癜癤癙癐癓癗癚皦皽盬矂瞺磿礌礓礔礉礐礒礑禭禬穟簜簩簙簠簟簭簝簦簨簢簥簰繜繐繖繣繘繢繟繑繠繗繓羵羳翷翸聵臑臒����������������������������������臐艟艞薴藆藀藃藂薳薵薽藇藄薿藋藎藈藅薱薶藒蘤薸薷薾虩蟧蟦蟢蟛蟫蟪蟥蟟蟳蟤蟔蟜蟓蟭蟘蟣螤蟗蟙蠁蟴蟨蟝襓襋襏襌襆襐襑襉謪謧謣謳謰謵譇謯謼謾謱謥謷謦謶謮謤謻謽謺豂豵貙貘貗賾贄贂贀蹜蹢蹠蹗蹖蹞蹥蹧�".split("");
      for (j2 = 0; j2 != D[240].length; ++j2)
        if (D[240][j2].charCodeAt(0) !== 65533) {
          e[D[240][j2]] = 61440 + j2;
          d[61440 + j2] = D[240][j2];
        }
      D[241] = "����������������������������������������������������������������蹛蹚蹡蹝蹩蹔轆轇轈轋鄨鄺鄻鄾醨醥醧醯醪鎵鎌鎒鎷鎛鎝鎉鎧鎎鎪鎞鎦鎕鎈鎙鎟鎍鎱鎑鎲鎤鎨鎴鎣鎥闒闓闑隳雗雚巂雟雘雝霣霢霥鞬鞮鞨鞫鞤鞪����������������������������������鞢鞥韗韙韖韘韺顐顑顒颸饁餼餺騏騋騉騍騄騑騊騅騇騆髀髜鬈鬄鬅鬩鬵魊魌魋鯇鯆鯃鮿鯁鮵鮸鯓鮶鯄鮹鮽鵜鵓鵏鵊鵛鵋鵙鵖鵌鵗鵒鵔鵟鵘鵚麎麌黟鼁鼀鼖鼥鼫鼪鼩鼨齌齕儴儵劖勷厴嚫嚭嚦嚧嚪嚬壚壝壛夒嬽嬾嬿巃幰�".split("");
      for (j2 = 0; j2 != D[241].length; ++j2)
        if (D[241][j2].charCodeAt(0) !== 65533) {
          e[D[241][j2]] = 61696 + j2;
          d[61696 + j2] = D[241][j2];
        }
      D[242] = "����������������������������������������������������������������徿懻攇攐攍攉攌攎斄旞旝曞櫧櫠櫌櫑櫙櫋櫟櫜櫐櫫櫏櫍櫞歠殰氌瀙瀧瀠瀖瀫瀡瀢瀣瀩瀗瀤瀜瀪爌爊爇爂爅犥犦犤犣犡瓋瓅璷瓃甖癠矉矊矄矱礝礛����������������������������������礡礜礗礞禰穧穨簳簼簹簬簻糬糪繶繵繸繰繷繯繺繲繴繨罋罊羃羆羷翽翾聸臗臕艤艡艣藫藱藭藙藡藨藚藗藬藲藸藘藟藣藜藑藰藦藯藞藢蠀蟺蠃蟶蟷蠉蠌蠋蠆蟼蠈蟿蠊蠂襢襚襛襗襡襜襘襝襙覈覷覶觶譐譈譊譀譓譖譔譋譕�".split("");
      for (j2 = 0; j2 != D[242].length; ++j2)
        if (D[242][j2].charCodeAt(0) !== 65533) {
          e[D[242][j2]] = 61952 + j2;
          d[61952 + j2] = D[242][j2];
        }
      D[243] = "����������������������������������������������������������������譑譂譒譗豃豷豶貚贆贇贉趬趪趭趫蹭蹸蹳蹪蹯蹻軂轒轑轏轐轓辴酀鄿醰醭鏞鏇鏏鏂鏚鏐鏹鏬鏌鏙鎩鏦鏊鏔鏮鏣鏕鏄鏎鏀鏒鏧镽闚闛雡霩霫霬霨霦����������������������������������鞳鞷鞶韝韞韟顜顙顝顗颿颽颻颾饈饇饃馦馧騚騕騥騝騤騛騢騠騧騣騞騜騔髂鬋鬊鬎鬌鬷鯪鯫鯠鯞鯤鯦鯢鯰鯔鯗鯬鯜鯙鯥鯕鯡鯚鵷鶁鶊鶄鶈鵱鶀鵸鶆鶋鶌鵽鵫鵴鵵鵰鵩鶅鵳鵻鶂鵯鵹鵿鶇鵨麔麑黀黼鼭齀齁齍齖齗齘匷嚲�".split("");
      for (j2 = 0; j2 != D[243].length; ++j2)
        if (D[243][j2].charCodeAt(0) !== 65533) {
          e[D[243][j2]] = 62208 + j2;
          d[62208 + j2] = D[243][j2];
        }
      D[244] = "����������������������������������������������������������������嚵嚳壣孅巆巇廮廯忀忁懹攗攖攕攓旟曨曣曤櫳櫰櫪櫨櫹櫱櫮櫯瀼瀵瀯瀷瀴瀱灂瀸瀿瀺瀹灀瀻瀳灁爓爔犨獽獼璺皫皪皾盭矌矎矏矍矲礥礣礧礨礤礩����������������������������������禲穮穬穭竷籉籈籊籇籅糮繻繾纁纀羺翿聹臛臙舋艨艩蘢藿蘁藾蘛蘀藶蘄蘉蘅蘌藽蠙蠐蠑蠗蠓蠖襣襦覹觷譠譪譝譨譣譥譧譭趮躆躈躄轙轖轗轕轘轚邍酃酁醷醵醲醳鐋鐓鏻鐠鐏鐔鏾鐕鐐鐨鐙鐍鏵鐀鏷鐇鐎鐖鐒鏺鐉鏸鐊鏿�".split("");
      for (j2 = 0; j2 != D[244].length; ++j2)
        if (D[244][j2].charCodeAt(0) !== 65533) {
          e[D[244][j2]] = 62464 + j2;
          d[62464 + j2] = D[244][j2];
        }
      D[245] = "����������������������������������������������������������������鏼鐌鏶鐑鐆闞闠闟霮霯鞹鞻韽韾顠顢顣顟飁飂饐饎饙饌饋饓騲騴騱騬騪騶騩騮騸騭髇髊髆鬐鬒鬑鰋鰈鯷鰅鰒鯸鱀鰇鰎鰆鰗鰔鰉鶟鶙鶤鶝鶒鶘鶐鶛����������������������������������鶠鶔鶜鶪鶗鶡鶚鶢鶨鶞鶣鶿鶩鶖鶦鶧麙麛麚黥黤黧黦鼰鼮齛齠齞齝齙龑儺儹劘劗囃嚽嚾孈孇巋巏廱懽攛欂櫼欃櫸欀灃灄灊灈灉灅灆爝爚爙獾甗癪矐礭礱礯籔籓糲纊纇纈纋纆纍罍羻耰臝蘘蘪蘦蘟蘣蘜蘙蘧蘮蘡蘠蘩蘞蘥�".split("");
      for (j2 = 0; j2 != D[245].length; ++j2)
        if (D[245][j2].charCodeAt(0) !== 65533) {
          e[D[245][j2]] = 62720 + j2;
          d[62720 + j2] = D[245][j2];
        }
      D[246] = "����������������������������������������������������������������蠩蠝蠛蠠蠤蠜蠫衊襭襩襮襫觺譹譸譅譺譻贐贔趯躎躌轞轛轝酆酄酅醹鐿鐻鐶鐩鐽鐼鐰鐹鐪鐷鐬鑀鐱闥闤闣霵霺鞿韡顤飉飆飀饘饖騹騽驆驄驂驁騺����������������������������������騿髍鬕鬗鬘鬖鬺魒鰫鰝鰜鰬鰣鰨鰩鰤鰡鶷鶶鶼鷁鷇鷊鷏鶾鷅鷃鶻鶵鷎鶹鶺鶬鷈鶱鶭鷌鶳鷍鶲鹺麜黫黮黭鼛鼘鼚鼱齎齥齤龒亹囆囅囋奱孋孌巕巑廲攡攠攦攢欋欈欉氍灕灖灗灒爞爟犩獿瓘瓕瓙瓗癭皭礵禴穰穱籗籜籙籛籚�".split("");
      for (j2 = 0; j2 != D[246].length; ++j2)
        if (D[246][j2].charCodeAt(0) !== 65533) {
          e[D[246][j2]] = 62976 + j2;
          d[62976 + j2] = D[246][j2];
        }
      D[247] = "����������������������������������������������������������������糴糱纑罏羇臞艫蘴蘵蘳蘬蘲蘶蠬蠨蠦蠪蠥襱覿覾觻譾讄讂讆讅譿贕躕躔躚躒躐躖躗轠轢酇鑌鑐鑊鑋鑏鑇鑅鑈鑉鑆霿韣顪顩飋饔饛驎驓驔驌驏驈驊����������������������������������驉驒驐髐鬙鬫鬻魖魕鱆鱈鰿鱄鰹鰳鱁鰼鰷鰴鰲鰽鰶鷛鷒鷞鷚鷋鷐鷜鷑鷟鷩鷙鷘鷖鷵鷕鷝麶黰鼵鼳鼲齂齫龕龢儽劙壨壧奲孍巘蠯彏戁戃戄攩攥斖曫欑欒欏毊灛灚爢玂玁玃癰矔籧籦纕艬蘺虀蘹蘼蘱蘻蘾蠰蠲蠮蠳襶襴襳觾�".split("");
      for (j2 = 0; j2 != D[247].length; ++j2)
        if (D[247][j2].charCodeAt(0) !== 65533) {
          e[D[247][j2]] = 63232 + j2;
          d[63232 + j2] = D[247][j2];
        }
      D[248] = "����������������������������������������������������������������讌讎讋讈豅贙躘轤轣醼鑢鑕鑝鑗鑞韄韅頀驖驙鬞鬟鬠鱒鱘鱐鱊鱍鱋鱕鱙鱌鱎鷻鷷鷯鷣鷫鷸鷤鷶鷡鷮鷦鷲鷰鷢鷬鷴鷳鷨鷭黂黐黲黳鼆鼜鼸鼷鼶齃齏����������������������������������齱齰齮齯囓囍孎屭攭曭曮欓灟灡灝灠爣瓛瓥矕礸禷禶籪纗羉艭虃蠸蠷蠵衋讔讕躞躟躠躝醾醽釂鑫鑨鑩雥靆靃靇韇韥驞髕魙鱣鱧鱦鱢鱞鱠鸂鷾鸇鸃鸆鸅鸀鸁鸉鷿鷽鸄麠鼞齆齴齵齶囔攮斸欘欙欗欚灢爦犪矘矙礹籩籫糶纚�".split("");
      for (j2 = 0; j2 != D[248].length; ++j2)
        if (D[248][j2].charCodeAt(0) !== 65533) {
          e[D[248][j2]] = 63488 + j2;
          d[63488 + j2] = D[248][j2];
        }
      D[249] = "����������������������������������������������������������������纘纛纙臠臡虆虇虈襹襺襼襻觿讘讙躥躤躣鑮鑭鑯鑱鑳靉顲饟鱨鱮鱭鸋鸍鸐鸏鸒鸑麡黵鼉齇齸齻齺齹圞灦籯蠼趲躦釃鑴鑸鑶鑵驠鱴鱳鱱鱵鸔鸓黶鼊����������������������������������龤灨灥糷虪蠾蠽蠿讞貜躩軉靋顳顴飌饡馫驤驦驧鬤鸕鸗齈戇欞爧虌躨钂钀钁驩驨鬮鸙爩虋讟钃鱹麷癵驫鱺鸝灩灪麤齾齉龘碁銹裏墻恒粧嫺╔╦╗╠╬╣╚╩╝╒╤╕╞╪╡╘╧╛╓╥╖╟╫╢╙╨╜║═╭╮╰╯▓�".split("");
      for (j2 = 0; j2 != D[249].length; ++j2)
        if (D[249][j2].charCodeAt(0) !== 65533) {
          e[D[249][j2]] = 63744 + j2;
          d[63744 + j2] = D[249][j2];
        }
      return { "enc": e, "dec": d };
    }();
    cptable2[1250] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰Š‹ŚŤŽŹ�‘’“”•–—�™š›śťžź ˇ˘Ł¤Ą¦§¨©Ş«¬­®Ż°±˛ł´µ¶·¸ąş»Ľ˝ľżŔÁÂĂÄĹĆÇČÉĘËĚÍÎĎĐŃŇÓÔŐÖ×ŘŮÚŰÜÝŢßŕáâăäĺćçčéęëěíîďđńňóôőö÷řůúűüýţ˙", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1251] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—�™љ›њќћџ ЎўЈ¤Ґ¦§Ё©Є«¬­®Ї°±Ііґµ¶·ё№є»јЅѕїАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1252] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ�Ž��‘’“”•–—˜™š›œ�žŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1253] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡�‰�‹�����‘’“”•–—�™�›���� ΅Ά£¤¥¦§¨©�«¬­®―°±²³΄µ¶·ΈΉΊ»Ό½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡ�ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώ�", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1254] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰Š‹Œ����‘’“”•–—˜™š›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏĞÑÒÓÔÕÖרÙÚÛÜİŞßàáâãäåæçèéêëìíîïğñòóôõö÷øùúûüışÿ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1255] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹�����‘’“”•–—˜™�›���� ¡¢£₪¥¦§¨©×«¬­®¯°±²³´µ¶·¸¹÷»¼½¾¿ְֱֲֳִֵֶַָֹ�ֻּֽ־ֿ׀ׁׂ׃װױײ׳״�������אבגדהוזחטיךכלםמןנסעףפץצקרשת��‎‏�", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1256] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€پ‚ƒ„…†‡ˆ‰ٹ‹Œچژڈگ‘’“”•–—ک™ڑ›œ‌‍ں ،¢£¤¥¦§¨©ھ«¬­®¯°±²³´µ¶·¸¹؛»¼½¾؟ہءآأؤإئابةتثجحخدذرزسشصض×طظعغـفقكàلâمنهوçèéêëىيîïًٌٍَôُِ÷ّùْûü‎‏ے", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1257] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚�„…†‡�‰�‹�¨ˇ¸�‘’“”•–—�™�›�¯˛� �¢£¤�¦§Ø©Ŗ«¬­®Æ°±²³´µ¶·ø¹ŗ»¼½¾æĄĮĀĆÄÅĘĒČÉŹĖĢĶĪĻŠŃŅÓŌÕÖ×ŲŁŚŪÜŻŽßąįāćäåęēčéźėģķīļšńņóōõö÷ųłśūüżž˙", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1258] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€�‚ƒ„…†‡ˆ‰�‹Œ����‘’“”•–—˜™�›œ��Ÿ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂĂÄÅÆÇÈÉÊË̀ÍÎÏĐÑ̉ÓÔƠÖרÙÚÛÜỮßàáâăäåæçèéêë́íîïđṇ̃óôơö÷øùúûüư₫ÿ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[1e4] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[10006] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦­ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩάΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ�", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[10007] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°¢£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµ∂ЈЄєЇїЉљЊњјЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю¤", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[10008] = function() {
      var d = [], e = {}, D = [], j2;
      D[0] = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~€���������������������������������������������������������������������������������������".split("");
      for (j2 = 0; j2 != D[0].length; ++j2)
        if (D[0][j2].charCodeAt(0) !== 65533) {
          e[D[0][j2]] = 0 + j2;
          d[0 + j2] = D[0][j2];
        }
      D[161] = "����������������������������������������������������������������������������������������������������������������������������������������������������������������� 、。・ˉˇ¨〃々―~�…‘’“”〔〕〈〉《》「」『』〖〗【】±×÷∶∧∨∑∏∪∩∈∷√⊥∥∠⌒⊙∫∮≡≌≈∽∝≠≮≯≤≥∞∵∴♂♀°′″℃$¤¢£‰§№☆★○●◎◇◆□■△▲※→←↑↓〓�".split("");
      for (j2 = 0; j2 != D[161].length; ++j2)
        if (D[161][j2].charCodeAt(0) !== 65533) {
          e[D[161][j2]] = 41216 + j2;
          d[41216 + j2] = D[161][j2];
        }
      D[162] = "���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇①②③④⑤⑥⑦⑧⑨⑩��㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩��ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫ���".split("");
      for (j2 = 0; j2 != D[162].length; ++j2)
        if (D[162][j2].charCodeAt(0) !== 65533) {
          e[D[162][j2]] = 41472 + j2;
          d[41472 + j2] = D[162][j2];
        }
      D[163] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������!"#¥%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|} ̄�".split("");
      for (j2 = 0; j2 != D[163].length; ++j2)
        if (D[163][j2].charCodeAt(0) !== 65533) {
          e[D[163][j2]] = 41728 + j2;
          d[41728 + j2] = D[163][j2];
        }
      D[164] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをん������������".split("");
      for (j2 = 0; j2 != D[164].length; ++j2)
        if (D[164][j2].charCodeAt(0) !== 65533) {
          e[D[164][j2]] = 41984 + j2;
          d[41984 + j2] = D[164][j2];
        }
      D[165] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶ���������".split("");
      for (j2 = 0; j2 != D[165].length; ++j2)
        if (D[165][j2].charCodeAt(0) !== 65533) {
          e[D[165][j2]] = 42240 + j2;
          d[42240 + j2] = D[165][j2];
        }
      D[166] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ��������αβγδεζηθικλμνξοπρστυφχψω���������������������������������������".split("");
      for (j2 = 0; j2 != D[166].length; ++j2)
        if (D[166][j2].charCodeAt(0) !== 65533) {
          e[D[166][j2]] = 42496 + j2;
          d[42496 + j2] = D[166][j2];
        }
      D[167] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ���������������абвгдеёжзийклмнопрстуфхцчшщъыьэюя��������������".split("");
      for (j2 = 0; j2 != D[167].length; ++j2)
        if (D[167][j2].charCodeAt(0) !== 65533) {
          e[D[167][j2]] = 42752 + j2;
          d[42752 + j2] = D[167][j2];
        }
      D[168] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������āáǎàēéěèīíǐìōóǒòūúǔùǖǘǚǜüê����������ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ����������������������".split("");
      for (j2 = 0; j2 != D[168].length; ++j2)
        if (D[168][j2].charCodeAt(0) !== 65533) {
          e[D[168][j2]] = 43008 + j2;
          d[43008 + j2] = D[168][j2];
        }
      D[169] = "��������������������������������������������������������������������������������������������������������������������������������������������������������������������─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋����������������".split("");
      for (j2 = 0; j2 != D[169].length; ++j2)
        if (D[169][j2].charCodeAt(0) !== 65533) {
          e[D[169][j2]] = 43264 + j2;
          d[43264 + j2] = D[169][j2];
        }
      D[176] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬扳般颁板版扮拌伴瓣半办绊邦帮梆榜膀绑棒磅蚌镑傍谤苞胞包褒剥�".split("");
      for (j2 = 0; j2 != D[176].length; ++j2)
        if (D[176][j2].charCodeAt(0) !== 65533) {
          e[D[176][j2]] = 45056 + j2;
          d[45056 + j2] = D[176][j2];
        }
      D[177] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������薄雹保堡饱宝抱报暴豹鲍爆杯碑悲卑北辈背贝钡倍狈备惫焙被奔苯本笨崩绷甭泵蹦迸逼鼻比鄙笔彼碧蓖蔽毕毙毖币庇痹闭敝弊必辟壁臂避陛鞭边编贬扁便变卞辨辩辫遍标彪膘表鳖憋别瘪彬斌濒滨宾摈兵冰柄丙秉饼炳�".split("");
      for (j2 = 0; j2 != D[177].length; ++j2)
        if (D[177][j2].charCodeAt(0) !== 65533) {
          e[D[177][j2]] = 45312 + j2;
          d[45312 + j2] = D[177][j2];
        }
      D[178] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������病并玻菠播拨钵波博勃搏铂箔伯帛舶脖膊渤泊驳捕卜哺补埠不布步簿部怖擦猜裁材才财睬踩采彩菜蔡餐参蚕残惭惨灿苍舱仓沧藏操糙槽曹草厕策侧册测层蹭插叉茬茶查碴搽察岔差诧拆柴豺搀掺蝉馋谗缠铲产阐颤昌猖�".split("");
      for (j2 = 0; j2 != D[178].length; ++j2)
        if (D[178][j2].charCodeAt(0) !== 65533) {
          e[D[178][j2]] = 45568 + j2;
          d[45568 + j2] = D[178][j2];
        }
      D[179] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������场尝常长偿肠厂敞畅唱倡超抄钞朝嘲潮巢吵炒车扯撤掣彻澈郴臣辰尘晨忱沉陈趁衬撑称城橙成呈乘程惩澄诚承逞骋秤吃痴持匙池迟弛驰耻齿侈尺赤翅斥炽充冲虫崇宠抽酬畴踌稠愁筹仇绸瞅丑臭初出橱厨躇锄雏滁除楚�".split("");
      for (j2 = 0; j2 != D[179].length; ++j2)
        if (D[179][j2].charCodeAt(0) !== 65533) {
          e[D[179][j2]] = 45824 + j2;
          d[45824 + j2] = D[179][j2];
        }
      D[180] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������础储矗搐触处揣川穿椽传船喘串疮窗幢床闯创吹炊捶锤垂春椿醇唇淳纯蠢戳绰疵茨磁雌辞慈瓷词此刺赐次聪葱囱匆从丛凑粗醋簇促蹿篡窜摧崔催脆瘁粹淬翠村存寸磋撮搓措挫错搭达答瘩打大呆歹傣戴带殆代贷袋待逮�".split("");
      for (j2 = 0; j2 != D[180].length; ++j2)
        if (D[180][j2].charCodeAt(0) !== 65533) {
          e[D[180][j2]] = 46080 + j2;
          d[46080 + j2] = D[180][j2];
        }
      D[181] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������怠耽担丹单郸掸胆旦氮但惮淡诞弹蛋当挡党荡档刀捣蹈倒岛祷导到稻悼道盗德得的蹬灯登等瞪凳邓堤低滴迪敌笛狄涤翟嫡抵底地蒂第帝弟递缔颠掂滇碘点典靛垫电佃甸店惦奠淀殿碉叼雕凋刁掉吊钓调跌爹碟蝶迭谍叠�".split("");
      for (j2 = 0; j2 != D[181].length; ++j2)
        if (D[181][j2].charCodeAt(0) !== 65533) {
          e[D[181][j2]] = 46336 + j2;
          d[46336 + j2] = D[181][j2];
        }
      D[182] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������丁盯叮钉顶鼎锭定订丢东冬董懂动栋侗恫冻洞兜抖斗陡豆逗痘都督毒犊独读堵睹赌杜镀肚度渡妒端短锻段断缎堆兑队对墩吨蹲敦顿囤钝盾遁掇哆多夺垛躲朵跺舵剁惰堕蛾峨鹅俄额讹娥恶厄扼遏鄂饿恩而儿耳尔饵洱二�".split("");
      for (j2 = 0; j2 != D[182].length; ++j2)
        if (D[182][j2].charCodeAt(0) !== 65533) {
          e[D[182][j2]] = 46592 + j2;
          d[46592 + j2] = D[182][j2];
        }
      D[183] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������贰发罚筏伐乏阀法珐藩帆番翻樊矾钒繁凡烦反返范贩犯饭泛坊芳方肪房防妨仿访纺放菲非啡飞肥匪诽吠肺废沸费芬酚吩氛分纷坟焚汾粉奋份忿愤粪丰封枫蜂峰锋风疯烽逢冯缝讽奉凤佛否夫敷肤孵扶拂辐幅氟符伏俘服�".split("");
      for (j2 = 0; j2 != D[183].length; ++j2)
        if (D[183][j2].charCodeAt(0) !== 65533) {
          e[D[183][j2]] = 46848 + j2;
          d[46848 + j2] = D[183][j2];
        }
      D[184] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������浮涪福袱弗甫抚辅俯釜斧脯腑府腐赴副覆赋复傅付阜父腹负富讣附妇缚咐噶嘎该改概钙盖溉干甘杆柑竿肝赶感秆敢赣冈刚钢缸肛纲岗港杠篙皋高膏羔糕搞镐稿告哥歌搁戈鸽胳疙割革葛格蛤阁隔铬个各给根跟耕更庚羹�".split("");
      for (j2 = 0; j2 != D[184].length; ++j2)
        if (D[184][j2].charCodeAt(0) !== 65533) {
          e[D[184][j2]] = 47104 + j2;
          d[47104 + j2] = D[184][j2];
        }
      D[185] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������埂耿梗工攻功恭龚供躬公宫弓巩汞拱贡共钩勾沟苟狗垢构购够辜菇咕箍估沽孤姑鼓古蛊骨谷股故顾固雇刮瓜剐寡挂褂乖拐怪棺关官冠观管馆罐惯灌贯光广逛瑰规圭硅归龟闺轨鬼诡癸桂柜跪贵刽辊滚棍锅郭国果裹过哈�".split("");
      for (j2 = 0; j2 != D[185].length; ++j2)
        if (D[185][j2].charCodeAt(0) !== 65533) {
          e[D[185][j2]] = 47360 + j2;
          d[47360 + j2] = D[185][j2];
        }
      D[186] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������骸孩海氦亥害骇酣憨邯韩含涵寒函喊罕翰撼捍旱憾悍焊汗汉夯杭航壕嚎豪毫郝好耗号浩呵喝荷菏核禾和何合盒貉阂河涸赫褐鹤贺嘿黑痕很狠恨哼亨横衡恒轰哄烘虹鸿洪宏弘红喉侯猴吼厚候后呼乎忽瑚壶葫胡蝴狐糊湖�".split("");
      for (j2 = 0; j2 != D[186].length; ++j2)
        if (D[186][j2].charCodeAt(0) !== 65533) {
          e[D[186][j2]] = 47616 + j2;
          d[47616 + j2] = D[186][j2];
        }
      D[187] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������弧虎唬护互沪户花哗华猾滑画划化话槐徊怀淮坏欢环桓还缓换患唤痪豢焕涣宦幻荒慌黄磺蝗簧皇凰惶煌晃幌恍谎灰挥辉徽恢蛔回毁悔慧卉惠晦贿秽会烩汇讳诲绘荤昏婚魂浑混豁活伙火获或惑霍货祸击圾基机畸稽积箕�".split("");
      for (j2 = 0; j2 != D[187].length; ++j2)
        if (D[187][j2].charCodeAt(0) !== 65533) {
          e[D[187][j2]] = 47872 + j2;
          d[47872 + j2] = D[187][j2];
        }
      D[188] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������肌饥迹激讥鸡姬绩缉吉极棘辑籍集及急疾汲即嫉级挤几脊己蓟技冀季伎祭剂悸济寄寂计记既忌际妓继纪嘉枷夹佳家加荚颊贾甲钾假稼价架驾嫁歼监坚尖笺间煎兼肩艰奸缄茧检柬碱硷拣捡简俭剪减荐槛鉴践贱见键箭件�".split("");
      for (j2 = 0; j2 != D[188].length; ++j2)
        if (D[188][j2].charCodeAt(0) !== 65533) {
          e[D[188][j2]] = 48128 + j2;
          d[48128 + j2] = D[188][j2];
        }
      D[189] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������健舰剑饯渐溅涧建僵姜将浆江疆蒋桨奖讲匠酱降蕉椒礁焦胶交郊浇骄娇嚼搅铰矫侥脚狡角饺缴绞剿教酵轿较叫窖揭接皆秸街阶截劫节桔杰捷睫竭洁结解姐戒藉芥界借介疥诫届巾筋斤金今津襟紧锦仅谨进靳晋禁近烬浸�".split("");
      for (j2 = 0; j2 != D[189].length; ++j2)
        if (D[189][j2].charCodeAt(0) !== 65533) {
          e[D[189][j2]] = 48384 + j2;
          d[48384 + j2] = D[189][j2];
        }
      D[190] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������尽劲荆兢茎睛晶鲸京惊精粳经井警景颈静境敬镜径痉靖竟竞净炯窘揪究纠玖韭久灸九酒厩救旧臼舅咎就疚鞠拘狙疽居驹菊局咀矩举沮聚拒据巨具距踞锯俱句惧炬剧捐鹃娟倦眷卷绢撅攫抉掘倔爵觉决诀绝均菌钧军君峻�".split("");
      for (j2 = 0; j2 != D[190].length; ++j2)
        if (D[190][j2].charCodeAt(0) !== 65533) {
          e[D[190][j2]] = 48640 + j2;
          d[48640 + j2] = D[190][j2];
        }
      D[191] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������俊竣浚郡骏喀咖卡咯开揩楷凯慨刊堪勘坎砍看康慷糠扛抗亢炕考拷烤靠坷苛柯棵磕颗科壳咳可渴克刻客课肯啃垦恳坑吭空恐孔控抠口扣寇枯哭窟苦酷库裤夸垮挎跨胯块筷侩快宽款匡筐狂框矿眶旷况亏盔岿窥葵奎魁傀�".split("");
      for (j2 = 0; j2 != D[191].length; ++j2)
        if (D[191][j2].charCodeAt(0) !== 65533) {
          e[D[191][j2]] = 48896 + j2;
          d[48896 + j2] = D[191][j2];
        }
      D[192] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������馈愧溃坤昆捆困括扩廓阔垃拉喇蜡腊辣啦莱来赖蓝婪栏拦篮阑兰澜谰揽览懒缆烂滥琅榔狼廊郎朗浪捞劳牢老佬姥酪烙涝勒乐雷镭蕾磊累儡垒擂肋类泪棱楞冷厘梨犁黎篱狸离漓理李里鲤礼莉荔吏栗丽厉励砾历利傈例俐�".split("");
      for (j2 = 0; j2 != D[192].length; ++j2)
        if (D[192][j2].charCodeAt(0) !== 65533) {
          e[D[192][j2]] = 49152 + j2;
          d[49152 + j2] = D[192][j2];
        }
      D[193] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������痢立粒沥隶力璃哩俩联莲连镰廉怜涟帘敛脸链恋炼练粮凉梁粱良两辆量晾亮谅撩聊僚疗燎寥辽潦了撂镣廖料列裂烈劣猎琳林磷霖临邻鳞淋凛赁吝拎玲菱零龄铃伶羚凌灵陵岭领另令溜琉榴硫馏留刘瘤流柳六龙聋咙笼窿�".split("");
      for (j2 = 0; j2 != D[193].length; ++j2)
        if (D[193][j2].charCodeAt(0) !== 65533) {
          e[D[193][j2]] = 49408 + j2;
          d[49408 + j2] = D[193][j2];
        }
      D[194] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������隆垄拢陇楼娄搂篓漏陋芦卢颅庐炉掳卤虏鲁麓碌露路赂鹿潞禄录陆戮驴吕铝侣旅履屡缕虑氯律率滤绿峦挛孪滦卵乱掠略抡轮伦仑沦纶论萝螺罗逻锣箩骡裸落洛骆络妈麻玛码蚂马骂嘛吗埋买麦卖迈脉瞒馒蛮满蔓曼慢漫�".split("");
      for (j2 = 0; j2 != D[194].length; ++j2)
        if (D[194][j2].charCodeAt(0) !== 65533) {
          e[D[194][j2]] = 49664 + j2;
          d[49664 + j2] = D[194][j2];
        }
      D[195] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������谩芒茫盲氓忙莽猫茅锚毛矛铆卯茂冒帽貌贸么玫枚梅酶霉煤没眉媒镁每美昧寐妹媚门闷们萌蒙檬盟锰猛梦孟眯醚靡糜迷谜弥米秘觅泌蜜密幂棉眠绵冕免勉娩缅面苗描瞄藐秒渺庙妙蔑灭民抿皿敏悯闽明螟鸣铭名命谬摸�".split("");
      for (j2 = 0; j2 != D[195].length; ++j2)
        if (D[195][j2].charCodeAt(0) !== 65533) {
          e[D[195][j2]] = 49920 + j2;
          d[49920 + j2] = D[195][j2];
        }
      D[196] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摹蘑模膜磨摩魔抹末莫墨默沫漠寞陌谋牟某拇牡亩姆母墓暮幕募慕木目睦牧穆拿哪呐钠那娜纳氖乃奶耐奈南男难囊挠脑恼闹淖呢馁内嫩能妮霓倪泥尼拟你匿腻逆溺蔫拈年碾撵捻念娘酿鸟尿捏聂孽啮镊镍涅您柠狞凝宁�".split("");
      for (j2 = 0; j2 != D[196].length; ++j2)
        if (D[196][j2].charCodeAt(0) !== 65533) {
          e[D[196][j2]] = 50176 + j2;
          d[50176 + j2] = D[196][j2];
        }
      D[197] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������拧泞牛扭钮纽脓浓农弄奴努怒女暖虐疟挪懦糯诺哦欧鸥殴藕呕偶沤啪趴爬帕怕琶拍排牌徘湃派攀潘盘磐盼畔判叛乓庞旁耪胖抛咆刨炮袍跑泡呸胚培裴赔陪配佩沛喷盆砰抨烹澎彭蓬棚硼篷膨朋鹏捧碰坯砒霹批披劈琵毗�".split("");
      for (j2 = 0; j2 != D[197].length; ++j2)
        if (D[197][j2].charCodeAt(0) !== 65533) {
          e[D[197][j2]] = 50432 + j2;
          d[50432 + j2] = D[197][j2];
        }
      D[198] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������啤脾疲皮匹痞僻屁譬篇偏片骗飘漂瓢票撇瞥拼频贫品聘乒坪苹萍平凭瓶评屏坡泼颇婆破魄迫粕剖扑铺仆莆葡菩蒲埔朴圃普浦谱曝瀑期欺栖戚妻七凄漆柒沏其棋奇歧畦崎脐齐旗祈祁骑起岂乞企启契砌器气迄弃汽泣讫掐�".split("");
      for (j2 = 0; j2 != D[198].length; ++j2)
        if (D[198][j2].charCodeAt(0) !== 65533) {
          e[D[198][j2]] = 50688 + j2;
          d[50688 + j2] = D[198][j2];
        }
      D[199] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恰洽牵扦钎铅千迁签仟谦乾黔钱钳前潜遣浅谴堑嵌欠歉枪呛腔羌墙蔷强抢橇锹敲悄桥瞧乔侨巧鞘撬翘峭俏窍切茄且怯窃钦侵亲秦琴勤芹擒禽寝沁青轻氢倾卿清擎晴氰情顷请庆琼穷秋丘邱球求囚酋泅趋区蛆曲躯屈驱渠�".split("");
      for (j2 = 0; j2 != D[199].length; ++j2)
        if (D[199][j2].charCodeAt(0) !== 65533) {
          e[D[199][j2]] = 50944 + j2;
          d[50944 + j2] = D[199][j2];
        }
      D[200] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������取娶龋趣去圈颧权醛泉全痊拳犬券劝缺炔瘸却鹊榷确雀裙群然燃冉染瓤壤攘嚷让饶扰绕惹热壬仁人忍韧任认刃妊纫扔仍日戎茸蓉荣融熔溶容绒冗揉柔肉茹蠕儒孺如辱乳汝入褥软阮蕊瑞锐闰润若弱撒洒萨腮鳃塞赛三叁�".split("");
      for (j2 = 0; j2 != D[200].length; ++j2)
        if (D[200][j2].charCodeAt(0) !== 65533) {
          e[D[200][j2]] = 51200 + j2;
          d[51200 + j2] = D[200][j2];
        }
      D[201] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������伞散桑嗓丧搔骚扫嫂瑟色涩森僧莎砂杀刹沙纱傻啥煞筛晒珊苫杉山删煽衫闪陕擅赡膳善汕扇缮墒伤商赏晌上尚裳梢捎稍烧芍勺韶少哨邵绍奢赊蛇舌舍赦摄射慑涉社设砷申呻伸身深娠绅神沈审婶甚肾慎渗声生甥牲升绳�".split("");
      for (j2 = 0; j2 != D[201].length; ++j2)
        if (D[201][j2].charCodeAt(0) !== 65533) {
          e[D[201][j2]] = 51456 + j2;
          d[51456 + j2] = D[201][j2];
        }
      D[202] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������省盛剩胜圣师失狮施湿诗尸虱十石拾时什食蚀实识史矢使屎驶始式示士世柿事拭誓逝势是嗜噬适仕侍释饰氏市恃室视试收手首守寿授售受瘦兽蔬枢梳殊抒输叔舒淑疏书赎孰熟薯暑曙署蜀黍鼠属术述树束戍竖墅庶数漱�".split("");
      for (j2 = 0; j2 != D[202].length; ++j2)
        if (D[202][j2].charCodeAt(0) !== 65533) {
          e[D[202][j2]] = 51712 + j2;
          d[51712 + j2] = D[202][j2];
        }
      D[203] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恕刷耍摔衰甩帅栓拴霜双爽谁水睡税吮瞬顺舜说硕朔烁斯撕嘶思私司丝死肆寺嗣四伺似饲巳松耸怂颂送宋讼诵搜艘擞嗽苏酥俗素速粟僳塑溯宿诉肃酸蒜算虽隋随绥髓碎岁穗遂隧祟孙损笋蓑梭唆缩琐索锁所塌他它她塔�".split("");
      for (j2 = 0; j2 != D[203].length; ++j2)
        if (D[203][j2].charCodeAt(0) !== 65533) {
          e[D[203][j2]] = 51968 + j2;
          d[51968 + j2] = D[203][j2];
        }
      D[204] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������獭挞蹋踏胎苔抬台泰酞太态汰坍摊贪瘫滩坛檀痰潭谭谈坦毯袒碳探叹炭汤塘搪堂棠膛唐糖倘躺淌趟烫掏涛滔绦萄桃逃淘陶讨套特藤腾疼誊梯剔踢锑提题蹄啼体替嚏惕涕剃屉天添填田甜恬舔腆挑条迢眺跳贴铁帖厅听烃�".split("");
      for (j2 = 0; j2 != D[204].length; ++j2)
        if (D[204][j2].charCodeAt(0) !== 65533) {
          e[D[204][j2]] = 52224 + j2;
          d[52224 + j2] = D[204][j2];
        }
      D[205] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������汀廷停亭庭挺艇通桐酮瞳同铜彤童桶捅筒统痛偷投头透凸秃突图徒途涂屠土吐兔湍团推颓腿蜕褪退吞屯臀拖托脱鸵陀驮驼椭妥拓唾挖哇蛙洼娃瓦袜歪外豌弯湾玩顽丸烷完碗挽晚皖惋宛婉万腕汪王亡枉网往旺望忘妄威�".split("");
      for (j2 = 0; j2 != D[205].length; ++j2)
        if (D[205][j2].charCodeAt(0) !== 65533) {
          e[D[205][j2]] = 52480 + j2;
          d[52480 + j2] = D[205][j2];
        }
      D[206] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������巍微危韦违桅围唯惟为潍维苇萎委伟伪尾纬未蔚味畏胃喂魏位渭谓尉慰卫瘟温蚊文闻纹吻稳紊问嗡翁瓮挝蜗涡窝我斡卧握沃巫呜钨乌污诬屋无芜梧吾吴毋武五捂午舞伍侮坞戊雾晤物勿务悟误昔熙析西硒矽晰嘻吸锡牺�".split("");
      for (j2 = 0; j2 != D[206].length; ++j2)
        if (D[206][j2].charCodeAt(0) !== 65533) {
          e[D[206][j2]] = 52736 + j2;
          d[52736 + j2] = D[206][j2];
        }
      D[207] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������稀息希悉膝夕惜熄烯溪汐犀檄袭席习媳喜铣洗系隙戏细瞎虾匣霞辖暇峡侠狭下厦夏吓掀锨先仙鲜纤咸贤衔舷闲涎弦嫌显险现献县腺馅羡宪陷限线相厢镶香箱襄湘乡翔祥详想响享项巷橡像向象萧硝霄削哮嚣销消宵淆晓�".split("");
      for (j2 = 0; j2 != D[207].length; ++j2)
        if (D[207][j2].charCodeAt(0) !== 65533) {
          e[D[207][j2]] = 52992 + j2;
          d[52992 + j2] = D[207][j2];
        }
      D[208] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������小孝校肖啸笑效楔些歇蝎鞋协挟携邪斜胁谐写械卸蟹懈泄泻谢屑薪芯锌欣辛新忻心信衅星腥猩惺兴刑型形邢行醒幸杏性姓兄凶胸匈汹雄熊休修羞朽嗅锈秀袖绣墟戌需虚嘘须徐许蓄酗叙旭序畜恤絮婿绪续轩喧宣悬旋玄�".split("");
      for (j2 = 0; j2 != D[208].length; ++j2)
        if (D[208][j2].charCodeAt(0) !== 65533) {
          e[D[208][j2]] = 53248 + j2;
          d[53248 + j2] = D[208][j2];
        }
      D[209] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������选癣眩绚靴薛学穴雪血勋熏循旬询寻驯巡殉汛训讯逊迅压押鸦鸭呀丫芽牙蚜崖衙涯雅哑亚讶焉咽阉烟淹盐严研蜒岩延言颜阎炎沿奄掩眼衍演艳堰燕厌砚雁唁彦焰宴谚验殃央鸯秧杨扬佯疡羊洋阳氧仰痒养样漾邀腰妖瑶�".split("");
      for (j2 = 0; j2 != D[209].length; ++j2)
        if (D[209][j2].charCodeAt(0) !== 65533) {
          e[D[209][j2]] = 53504 + j2;
          d[53504 + j2] = D[209][j2];
        }
      D[210] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摇尧遥窑谣姚咬舀药要耀椰噎耶爷野冶也页掖业叶曳腋夜液一壹医揖铱依伊衣颐夷遗移仪胰疑沂宜姨彝椅蚁倚已乙矣以艺抑易邑屹亿役臆逸肄疫亦裔意毅忆义益溢诣议谊译异翼翌绎茵荫因殷音阴姻吟银淫寅饮尹引隐�".split("");
      for (j2 = 0; j2 != D[210].length; ++j2)
        if (D[210][j2].charCodeAt(0) !== 65533) {
          e[D[210][j2]] = 53760 + j2;
          d[53760 + j2] = D[210][j2];
        }
      D[211] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������印英樱婴鹰应缨莹萤营荧蝇迎赢盈影颖硬映哟拥佣臃痈庸雍踊蛹咏泳涌永恿勇用幽优悠忧尤由邮铀犹油游酉有友右佑釉诱又幼迂淤于盂榆虞愚舆余俞逾鱼愉渝渔隅予娱雨与屿禹宇语羽玉域芋郁吁遇喻峪御愈欲狱育誉�".split("");
      for (j2 = 0; j2 != D[211].length; ++j2)
        if (D[211][j2].charCodeAt(0) !== 65533) {
          e[D[211][j2]] = 54016 + j2;
          d[54016 + j2] = D[211][j2];
        }
      D[212] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������浴寓裕预豫驭鸳渊冤元垣袁原援辕园员圆猿源缘远苑愿怨院曰约越跃钥岳粤月悦阅耘云郧匀陨允运蕴酝晕韵孕匝砸杂栽哉灾宰载再在咱攒暂赞赃脏葬遭糟凿藻枣早澡蚤躁噪造皂灶燥责择则泽贼怎增憎曾赠扎喳渣札轧�".split("");
      for (j2 = 0; j2 != D[212].length; ++j2)
        if (D[212][j2].charCodeAt(0) !== 65533) {
          e[D[212][j2]] = 54272 + j2;
          d[54272 + j2] = D[212][j2];
        }
      D[213] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������铡闸眨栅榨咋乍炸诈摘斋宅窄债寨瞻毡詹粘沾盏斩辗崭展蘸栈占战站湛绽樟章彰漳张掌涨杖丈帐账仗胀瘴障招昭找沼赵照罩兆肇召遮折哲蛰辙者锗蔗这浙珍斟真甄砧臻贞针侦枕疹诊震振镇阵蒸挣睁征狰争怔整拯正政�".split("");
      for (j2 = 0; j2 != D[213].length; ++j2)
        if (D[213][j2].charCodeAt(0) !== 65533) {
          e[D[213][j2]] = 54528 + j2;
          d[54528 + j2] = D[213][j2];
        }
      D[214] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������帧症郑证芝枝支吱蜘知肢脂汁之织职直植殖执值侄址指止趾只旨纸志挚掷至致置帜峙制智秩稚质炙痔滞治窒中盅忠钟衷终种肿重仲众舟周州洲诌粥轴肘帚咒皱宙昼骤珠株蛛朱猪诸诛逐竹烛煮拄瞩嘱主著柱助蛀贮铸筑�".split("");
      for (j2 = 0; j2 != D[214].length; ++j2)
        if (D[214][j2].charCodeAt(0) !== 65533) {
          e[D[214][j2]] = 54784 + j2;
          d[54784 + j2] = D[214][j2];
        }
      D[215] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������住注祝驻抓爪拽专砖转撰赚篆桩庄装妆撞壮状椎锥追赘坠缀谆准捉拙卓桌琢茁酌啄着灼浊兹咨资姿滋淄孜紫仔籽滓子自渍字鬃棕踪宗综总纵邹走奏揍租足卒族祖诅阻组钻纂嘴醉最罪尊遵昨左佐柞做作坐座������".split("");
      for (j2 = 0; j2 != D[215].length; ++j2)
        if (D[215][j2].charCodeAt(0) !== 65533) {
          e[D[215][j2]] = 55040 + j2;
          d[55040 + j2] = D[215][j2];
        }
      D[216] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������亍丌兀丐廿卅丕亘丞鬲孬噩丨禺丿匕乇夭爻卮氐囟胤馗毓睾鼗丶亟鼐乜乩亓芈孛啬嘏仄厍厝厣厥厮靥赝匚叵匦匮匾赜卦卣刂刈刎刭刳刿剀剌剞剡剜蒯剽劂劁劐劓冂罔亻仃仉仂仨仡仫仞伛仳伢佤仵伥伧伉伫佞佧攸佚佝�".split("");
      for (j2 = 0; j2 != D[216].length; ++j2)
        if (D[216][j2].charCodeAt(0) !== 65533) {
          e[D[216][j2]] = 55296 + j2;
          d[55296 + j2] = D[216][j2];
        }
      D[217] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������佟佗伲伽佶佴侑侉侃侏佾佻侪佼侬侔俦俨俪俅俚俣俜俑俟俸倩偌俳倬倏倮倭俾倜倌倥倨偾偃偕偈偎偬偻傥傧傩傺僖儆僭僬僦僮儇儋仝氽佘佥俎龠汆籴兮巽黉馘冁夔勹匍訇匐凫夙兕亠兖亳衮袤亵脔裒禀嬴蠃羸冫冱冽冼�".split("");
      for (j2 = 0; j2 != D[217].length; ++j2)
        if (D[217][j2].charCodeAt(0) !== 65533) {
          e[D[217][j2]] = 55552 + j2;
          d[55552 + j2] = D[217][j2];
        }
      D[218] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������凇冖冢冥讠讦讧讪讴讵讷诂诃诋诏诎诒诓诔诖诘诙诜诟诠诤诨诩诮诰诳诶诹诼诿谀谂谄谇谌谏谑谒谔谕谖谙谛谘谝谟谠谡谥谧谪谫谮谯谲谳谵谶卩卺阝阢阡阱阪阽阼陂陉陔陟陧陬陲陴隈隍隗隰邗邛邝邙邬邡邴邳邶邺�".split("");
      for (j2 = 0; j2 != D[218].length; ++j2)
        if (D[218][j2].charCodeAt(0) !== 65533) {
          e[D[218][j2]] = 55808 + j2;
          d[55808 + j2] = D[218][j2];
        }
      D[219] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������邸邰郏郅邾郐郄郇郓郦郢郜郗郛郫郯郾鄄鄢鄞鄣鄱鄯鄹酃酆刍奂劢劬劭劾哿勐勖勰叟燮矍廴凵凼鬯厶弁畚巯坌垩垡塾墼壅壑圩圬圪圳圹圮圯坜圻坂坩垅坫垆坼坻坨坭坶坳垭垤垌垲埏垧垴垓垠埕埘埚埙埒垸埴埯埸埤埝�".split("");
      for (j2 = 0; j2 != D[219].length; ++j2)
        if (D[219][j2].charCodeAt(0) !== 65533) {
          e[D[219][j2]] = 56064 + j2;
          d[56064 + j2] = D[219][j2];
        }
      D[220] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������堋堍埽埭堀堞堙塄堠塥塬墁墉墚墀馨鼙懿艹艽艿芏芊芨芄芎芑芗芙芫芸芾芰苈苊苣芘芷芮苋苌苁芩芴芡芪芟苄苎芤苡茉苷苤茏茇苜苴苒苘茌苻苓茑茚茆茔茕苠苕茜荑荛荜茈莒茼茴茱莛荞茯荏荇荃荟荀茗荠茭茺茳荦荥�".split("");
      for (j2 = 0; j2 != D[220].length; ++j2)
        if (D[220][j2].charCodeAt(0) !== 65533) {
          e[D[220][j2]] = 56320 + j2;
          d[56320 + j2] = D[220][j2];
        }
      D[221] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������荨茛荩荬荪荭荮莰荸莳莴莠莪莓莜莅荼莶莩荽莸荻莘莞莨莺莼菁萁菥菘堇萘萋菝菽菖萜萸萑萆菔菟萏萃菸菹菪菅菀萦菰菡葜葑葚葙葳蒇蒈葺蒉葸萼葆葩葶蒌蒎萱葭蓁蓍蓐蓦蒽蓓蓊蒿蒺蓠蒡蒹蒴蒗蓥蓣蔌甍蔸蓰蔹蔟蔺�".split("");
      for (j2 = 0; j2 != D[221].length; ++j2)
        if (D[221][j2].charCodeAt(0) !== 65533) {
          e[D[221][j2]] = 56576 + j2;
          d[56576 + j2] = D[221][j2];
        }
      D[222] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蕖蔻蓿蓼蕙蕈蕨蕤蕞蕺瞢蕃蕲蕻薤薨薇薏蕹薮薜薅薹薷薰藓藁藜藿蘧蘅蘩蘖蘼廾弈夼奁耷奕奚奘匏尢尥尬尴扌扪抟抻拊拚拗拮挢拶挹捋捃掭揶捱捺掎掴捭掬掊捩掮掼揲揸揠揿揄揞揎摒揆掾摅摁搋搛搠搌搦搡摞撄摭撖�".split("");
      for (j2 = 0; j2 != D[222].length; ++j2)
        if (D[222][j2].charCodeAt(0) !== 65533) {
          e[D[222][j2]] = 56832 + j2;
          d[56832 + j2] = D[222][j2];
        }
      D[223] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������摺撷撸撙撺擀擐擗擤擢攉攥攮弋忒甙弑卟叱叽叩叨叻吒吖吆呋呒呓呔呖呃吡呗呙吣吲咂咔呷呱呤咚咛咄呶呦咝哐咭哂咴哒咧咦哓哔呲咣哕咻咿哌哙哚哜咩咪咤哝哏哞唛哧唠哽唔哳唢唣唏唑唧唪啧喏喵啉啭啁啕唿啐唼�".split("");
      for (j2 = 0; j2 != D[223].length; ++j2)
        if (D[223][j2].charCodeAt(0) !== 65533) {
          e[D[223][j2]] = 57088 + j2;
          d[57088 + j2] = D[223][j2];
        }
      D[224] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������唷啖啵啶啷唳唰啜喋嗒喃喱喹喈喁喟啾嗖喑啻嗟喽喾喔喙嗪嗷嗉嘟嗑嗫嗬嗔嗦嗝嗄嗯嗥嗲嗳嗌嗍嗨嗵嗤辔嘞嘈嘌嘁嘤嘣嗾嘀嘧嘭噘嘹噗嘬噍噢噙噜噌噔嚆噤噱噫噻噼嚅嚓嚯囔囗囝囡囵囫囹囿圄圊圉圜帏帙帔帑帱帻帼�".split("");
      for (j2 = 0; j2 != D[224].length; ++j2)
        if (D[224][j2].charCodeAt(0) !== 65533) {
          e[D[224][j2]] = 57344 + j2;
          d[57344 + j2] = D[224][j2];
        }
      D[225] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������帷幄幔幛幞幡岌屺岍岐岖岈岘岙岑岚岜岵岢岽岬岫岱岣峁岷峄峒峤峋峥崂崃崧崦崮崤崞崆崛嵘崾崴崽嵬嵛嵯嵝嵫嵋嵊嵩嵴嶂嶙嶝豳嶷巅彳彷徂徇徉後徕徙徜徨徭徵徼衢彡犭犰犴犷犸狃狁狎狍狒狨狯狩狲狴狷猁狳猃狺�".split("");
      for (j2 = 0; j2 != D[225].length; ++j2)
        if (D[225][j2].charCodeAt(0) !== 65533) {
          e[D[225][j2]] = 57600 + j2;
          d[57600 + j2] = D[225][j2];
        }
      D[226] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������狻猗猓猡猊猞猝猕猢猹猥猬猸猱獐獍獗獠獬獯獾舛夥飧夤夂饣饧饨饩饪饫饬饴饷饽馀馄馇馊馍馐馑馓馔馕庀庑庋庖庥庠庹庵庾庳赓廒廑廛廨廪膺忄忉忖忏怃忮怄忡忤忾怅怆忪忭忸怙怵怦怛怏怍怩怫怊怿怡恸恹恻恺恂�".split("");
      for (j2 = 0; j2 != D[226].length; ++j2)
        if (D[226][j2].charCodeAt(0) !== 65533) {
          e[D[226][j2]] = 57856 + j2;
          d[57856 + j2] = D[226][j2];
        }
      D[227] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������恪恽悖悚悭悝悃悒悌悛惬悻悱惝惘惆惚悴愠愦愕愣惴愀愎愫慊慵憬憔憧憷懔懵忝隳闩闫闱闳闵闶闼闾阃阄阆阈阊阋阌阍阏阒阕阖阗阙阚丬爿戕氵汔汜汊沣沅沐沔沌汨汩汴汶沆沩泐泔沭泷泸泱泗沲泠泖泺泫泮沱泓泯泾�".split("");
      for (j2 = 0; j2 != D[227].length; ++j2)
        if (D[227][j2].charCodeAt(0) !== 65533) {
          e[D[227][j2]] = 58112 + j2;
          d[58112 + j2] = D[227][j2];
        }
      D[228] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������洹洧洌浃浈洇洄洙洎洫浍洮洵洚浏浒浔洳涑浯涞涠浞涓涔浜浠浼浣渚淇淅淞渎涿淠渑淦淝淙渖涫渌涮渫湮湎湫溲湟溆湓湔渲渥湄滟溱溘滠漭滢溥溧溽溻溷滗溴滏溏滂溟潢潆潇漤漕滹漯漶潋潴漪漉漩澉澍澌潸潲潼潺濑�".split("");
      for (j2 = 0; j2 != D[228].length; ++j2)
        if (D[228][j2].charCodeAt(0) !== 65533) {
          e[D[228][j2]] = 58368 + j2;
          d[58368 + j2] = D[228][j2];
        }
      D[229] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������濉澧澹澶濂濡濮濞濠濯瀚瀣瀛瀹瀵灏灞宀宄宕宓宥宸甯骞搴寤寮褰寰蹇謇辶迓迕迥迮迤迩迦迳迨逅逄逋逦逑逍逖逡逵逶逭逯遄遑遒遐遨遘遢遛暹遴遽邂邈邃邋彐彗彖彘尻咫屐屙孱屣屦羼弪弩弭艴弼鬻屮妁妃妍妩妪妣�".split("");
      for (j2 = 0; j2 != D[229].length; ++j2)
        if (D[229][j2].charCodeAt(0) !== 65533) {
          e[D[229][j2]] = 58624 + j2;
          d[58624 + j2] = D[229][j2];
        }
      D[230] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������妗姊妫妞妤姒妲妯姗妾娅娆姝娈姣姘姹娌娉娲娴娑娣娓婀婧婊婕娼婢婵胬媪媛婷婺媾嫫媲嫒嫔媸嫠嫣嫱嫖嫦嫘嫜嬉嬗嬖嬲嬷孀尕尜孚孥孳孑孓孢驵驷驸驺驿驽骀骁骅骈骊骐骒骓骖骘骛骜骝骟骠骢骣骥骧纟纡纣纥纨纩�".split("");
      for (j2 = 0; j2 != D[230].length; ++j2)
        if (D[230][j2].charCodeAt(0) !== 65533) {
          e[D[230][j2]] = 58880 + j2;
          d[58880 + j2] = D[230][j2];
        }
      D[231] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������纭纰纾绀绁绂绉绋绌绐绔绗绛绠绡绨绫绮绯绱绲缍绶绺绻绾缁缂缃缇缈缋缌缏缑缒缗缙缜缛缟缡缢缣缤缥缦缧缪缫缬缭缯缰缱缲缳缵幺畿巛甾邕玎玑玮玢玟珏珂珑玷玳珀珉珈珥珙顼琊珩珧珞玺珲琏琪瑛琦琥琨琰琮琬�".split("");
      for (j2 = 0; j2 != D[231].length; ++j2)
        if (D[231][j2].charCodeAt(0) !== 65533) {
          e[D[231][j2]] = 59136 + j2;
          d[59136 + j2] = D[231][j2];
        }
      D[232] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������琛琚瑁瑜瑗瑕瑙瑷瑭瑾璜璎璀璁璇璋璞璨璩璐璧瓒璺韪韫韬杌杓杞杈杩枥枇杪杳枘枧杵枨枞枭枋杷杼柰栉柘栊柩枰栌柙枵柚枳柝栀柃枸柢栎柁柽栲栳桠桡桎桢桄桤梃栝桕桦桁桧桀栾桊桉栩梵梏桴桷梓桫棂楮棼椟椠棹�".split("");
      for (j2 = 0; j2 != D[232].length; ++j2)
        if (D[232][j2].charCodeAt(0) !== 65533) {
          e[D[232][j2]] = 59392 + j2;
          d[59392 + j2] = D[232][j2];
        }
      D[233] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������椤棰椋椁楗棣椐楱椹楠楂楝榄楫榀榘楸椴槌榇榈槎榉楦楣楹榛榧榻榫榭槔榱槁槊槟榕槠榍槿樯槭樗樘橥槲橄樾檠橐橛樵檎橹樽樨橘橼檑檐檩檗檫猷獒殁殂殇殄殒殓殍殚殛殡殪轫轭轱轲轳轵轶轸轷轹轺轼轾辁辂辄辇辋�".split("");
      for (j2 = 0; j2 != D[233].length; ++j2)
        if (D[233][j2].charCodeAt(0) !== 65533) {
          e[D[233][j2]] = 59648 + j2;
          d[59648 + j2] = D[233][j2];
        }
      D[234] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������辍辎辏辘辚軎戋戗戛戟戢戡戥戤戬臧瓯瓴瓿甏甑甓攴旮旯旰昊昙杲昃昕昀炅曷昝昴昱昶昵耆晟晔晁晏晖晡晗晷暄暌暧暝暾曛曜曦曩贲贳贶贻贽赀赅赆赈赉赇赍赕赙觇觊觋觌觎觏觐觑牮犟牝牦牯牾牿犄犋犍犏犒挈挲掰�".split("");
      for (j2 = 0; j2 != D[234].length; ++j2)
        if (D[234][j2].charCodeAt(0) !== 65533) {
          e[D[234][j2]] = 59904 + j2;
          d[59904 + j2] = D[234][j2];
        }
      D[235] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������搿擘耄毪毳毽毵毹氅氇氆氍氕氘氙氚氡氩氤氪氲攵敕敫牍牒牖爰虢刖肟肜肓肼朊肽肱肫肭肴肷胧胨胩胪胛胂胄胙胍胗朐胝胫胱胴胭脍脎胲胼朕脒豚脶脞脬脘脲腈腌腓腴腙腚腱腠腩腼腽腭腧塍媵膈膂膑滕膣膪臌朦臊膻�".split("");
      for (j2 = 0; j2 != D[235].length; ++j2)
        if (D[235][j2].charCodeAt(0) !== 65533) {
          e[D[235][j2]] = 60160 + j2;
          d[60160 + j2] = D[235][j2];
        }
      D[236] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������臁膦欤欷欹歃歆歙飑飒飓飕飙飚殳彀毂觳斐齑斓於旆旄旃旌旎旒旖炀炜炖炝炻烀炷炫炱烨烊焐焓焖焯焱煳煜煨煅煲煊煸煺熘熳熵熨熠燠燔燧燹爝爨灬焘煦熹戾戽扃扈扉礻祀祆祉祛祜祓祚祢祗祠祯祧祺禅禊禚禧禳忑忐�".split("");
      for (j2 = 0; j2 != D[236].length; ++j2)
        if (D[236][j2].charCodeAt(0) !== 65533) {
          e[D[236][j2]] = 60416 + j2;
          d[60416 + j2] = D[236][j2];
        }
      D[237] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������怼恝恚恧恁恙恣悫愆愍慝憩憝懋懑戆肀聿沓泶淼矶矸砀砉砗砘砑斫砭砜砝砹砺砻砟砼砥砬砣砩硎硭硖硗砦硐硇硌硪碛碓碚碇碜碡碣碲碹碥磔磙磉磬磲礅磴礓礤礞礴龛黹黻黼盱眄眍盹眇眈眚眢眙眭眦眵眸睐睑睇睃睚睨�".split("");
      for (j2 = 0; j2 != D[237].length; ++j2)
        if (D[237][j2].charCodeAt(0) !== 65533) {
          e[D[237][j2]] = 60672 + j2;
          d[60672 + j2] = D[237][j2];
        }
      D[238] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������睢睥睿瞍睽瞀瞌瞑瞟瞠瞰瞵瞽町畀畎畋畈畛畲畹疃罘罡罟詈罨罴罱罹羁罾盍盥蠲钅钆钇钋钊钌钍钏钐钔钗钕钚钛钜钣钤钫钪钭钬钯钰钲钴钶钷钸钹钺钼钽钿铄铈铉铊铋铌铍铎铐铑铒铕铖铗铙铘铛铞铟铠铢铤铥铧铨铪�".split("");
      for (j2 = 0; j2 != D[238].length; ++j2)
        if (D[238][j2].charCodeAt(0) !== 65533) {
          e[D[238][j2]] = 60928 + j2;
          d[60928 + j2] = D[238][j2];
        }
      D[239] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������铩铫铮铯铳铴铵铷铹铼铽铿锃锂锆锇锉锊锍锎锏锒锓锔锕锖锘锛锝锞锟锢锪锫锩锬锱锲锴锶锷锸锼锾锿镂锵镄镅镆镉镌镎镏镒镓镔镖镗镘镙镛镞镟镝镡镢镤镥镦镧镨镩镪镫镬镯镱镲镳锺矧矬雉秕秭秣秫稆嵇稃稂稞稔�".split("");
      for (j2 = 0; j2 != D[239].length; ++j2)
        if (D[239][j2].charCodeAt(0) !== 65533) {
          e[D[239][j2]] = 61184 + j2;
          d[61184 + j2] = D[239][j2];
        }
      D[240] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������稹稷穑黏馥穰皈皎皓皙皤瓞瓠甬鸠鸢鸨鸩鸪鸫鸬鸲鸱鸶鸸鸷鸹鸺鸾鹁鹂鹄鹆鹇鹈鹉鹋鹌鹎鹑鹕鹗鹚鹛鹜鹞鹣鹦鹧鹨鹩鹪鹫鹬鹱鹭鹳疒疔疖疠疝疬疣疳疴疸痄疱疰痃痂痖痍痣痨痦痤痫痧瘃痱痼痿瘐瘀瘅瘌瘗瘊瘥瘘瘕瘙�".split("");
      for (j2 = 0; j2 != D[240].length; ++j2)
        if (D[240][j2].charCodeAt(0) !== 65533) {
          e[D[240][j2]] = 61440 + j2;
          d[61440 + j2] = D[240][j2];
        }
      D[241] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������瘛瘼瘢瘠癀瘭瘰瘿瘵癃瘾瘳癍癞癔癜癖癫癯翊竦穸穹窀窆窈窕窦窠窬窨窭窳衤衩衲衽衿袂袢裆袷袼裉裢裎裣裥裱褚裼裨裾裰褡褙褓褛褊褴褫褶襁襦襻疋胥皲皴矜耒耔耖耜耠耢耥耦耧耩耨耱耋耵聃聆聍聒聩聱覃顸颀颃�".split("");
      for (j2 = 0; j2 != D[241].length; ++j2)
        if (D[241][j2].charCodeAt(0) !== 65533) {
          e[D[241][j2]] = 61696 + j2;
          d[61696 + j2] = D[241][j2];
        }
      D[242] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������颉颌颍颏颔颚颛颞颟颡颢颥颦虍虔虬虮虿虺虼虻蚨蚍蚋蚬蚝蚧蚣蚪蚓蚩蚶蛄蚵蛎蚰蚺蚱蚯蛉蛏蚴蛩蛱蛲蛭蛳蛐蜓蛞蛴蛟蛘蛑蜃蜇蛸蜈蜊蜍蜉蜣蜻蜞蜥蜮蜚蜾蝈蜴蜱蜩蜷蜿螂蜢蝽蝾蝻蝠蝰蝌蝮螋蝓蝣蝼蝤蝙蝥螓螯螨蟒�".split("");
      for (j2 = 0; j2 != D[242].length; ++j2)
        if (D[242][j2].charCodeAt(0) !== 65533) {
          e[D[242][j2]] = 61952 + j2;
          d[61952 + j2] = D[242][j2];
        }
      D[243] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������蟆螈螅螭螗螃螫蟥螬螵螳蟋蟓螽蟑蟀蟊蟛蟪蟠蟮蠖蠓蟾蠊蠛蠡蠹蠼缶罂罄罅舐竺竽笈笃笄笕笊笫笏筇笸笪笙笮笱笠笥笤笳笾笞筘筚筅筵筌筝筠筮筻筢筲筱箐箦箧箸箬箝箨箅箪箜箢箫箴篑篁篌篝篚篥篦篪簌篾篼簏簖簋�".split("");
      for (j2 = 0; j2 != D[243].length; ++j2)
        if (D[243][j2].charCodeAt(0) !== 65533) {
          e[D[243][j2]] = 62208 + j2;
          d[62208 + j2] = D[243][j2];
        }
      D[244] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������簟簪簦簸籁籀臾舁舂舄臬衄舡舢舣舭舯舨舫舸舻舳舴舾艄艉艋艏艚艟艨衾袅袈裘裟襞羝羟羧羯羰羲籼敉粑粝粜粞粢粲粼粽糁糇糌糍糈糅糗糨艮暨羿翎翕翥翡翦翩翮翳糸絷綦綮繇纛麸麴赳趄趔趑趱赧赭豇豉酊酐酎酏酤�".split("");
      for (j2 = 0; j2 != D[244].length; ++j2)
        if (D[244][j2].charCodeAt(0) !== 65533) {
          e[D[244][j2]] = 62464 + j2;
          d[62464 + j2] = D[244][j2];
        }
      D[245] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������酢酡酰酩酯酽酾酲酴酹醌醅醐醍醑醢醣醪醭醮醯醵醴醺豕鹾趸跫踅蹙蹩趵趿趼趺跄跖跗跚跞跎跏跛跆跬跷跸跣跹跻跤踉跽踔踝踟踬踮踣踯踺蹀踹踵踽踱蹉蹁蹂蹑蹒蹊蹰蹶蹼蹯蹴躅躏躔躐躜躞豸貂貊貅貘貔斛觖觞觚觜�".split("");
      for (j2 = 0; j2 != D[245].length; ++j2)
        if (D[245][j2].charCodeAt(0) !== 65533) {
          e[D[245][j2]] = 62720 + j2;
          d[62720 + j2] = D[245][j2];
        }
      D[246] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������觥觫觯訾謦靓雩雳雯霆霁霈霏霎霪霭霰霾龀龃龅龆龇龈龉龊龌黾鼋鼍隹隼隽雎雒瞿雠銎銮鋈錾鍪鏊鎏鐾鑫鱿鲂鲅鲆鲇鲈稣鲋鲎鲐鲑鲒鲔鲕鲚鲛鲞鲟鲠鲡鲢鲣鲥鲦鲧鲨鲩鲫鲭鲮鲰鲱鲲鲳鲴鲵鲶鲷鲺鲻鲼鲽鳄鳅鳆鳇鳊鳋�".split("");
      for (j2 = 0; j2 != D[246].length; ++j2)
        if (D[246][j2].charCodeAt(0) !== 65533) {
          e[D[246][j2]] = 62976 + j2;
          d[62976 + j2] = D[246][j2];
        }
      D[247] = "�����������������������������������������������������������������������������������������������������������������������������������������������������������������鳌鳍鳎鳏鳐鳓鳔鳕鳗鳘鳙鳜鳝鳟鳢靼鞅鞑鞒鞔鞯鞫鞣鞲鞴骱骰骷鹘骶骺骼髁髀髅髂髋髌髑魅魃魇魉魈魍魑飨餍餮饕饔髟髡髦髯髫髻髭髹鬈鬏鬓鬟鬣麽麾縻麂麇麈麋麒鏖麝麟黛黜黝黠黟黢黩黧黥黪黯鼢鼬鼯鼹鼷鼽鼾齄�".split("");
      for (j2 = 0; j2 != D[247].length; ++j2)
        if (D[247][j2].charCodeAt(0) !== 65533) {
          e[D[247][j2]] = 63232 + j2;
          d[63232 + j2] = D[247][j2];
        }
      return { "enc": e, "dec": d };
    }();
    cptable2[10029] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[10079] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüݰ¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄¤ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    cptable2[10081] = function() {
      var d = "\0\x07\b	\n\v\f\r\x1B !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔ�ÒÚÛÙ�ˆ˜¯˘˙˚¸˝˛ˇ", D = [], e = {};
      for (var i2 = 0; i2 != d.length; ++i2) {
        if (d.charCodeAt(i2) !== 65533)
          e[d.charAt(i2)] = i2;
        D[i2] = d.charAt(i2);
      }
      return { "enc": e, "dec": D };
    }();
    if (module.exports && typeof DO_NOT_EXPORT_CODEPAGE === "undefined")
      module.exports = cptable2;
    (function(root, factory) {
      if (typeof cptable2 === "undefined") {
        if (typeof commonjsRequire !== "undefined") {
          var cpt = cptable2;
          if (module.exports && typeof DO_NOT_EXPORT_CODEPAGE === "undefined")
            module.exports = factory(cpt);
          else
            root.cptable = factory(cpt);
        } else
          throw new Error("cptable not found");
      } else
        cptable2 = factory(cptable2);
    })(commonjsGlobal, function(cpt) {
      var magic = {
        "1200": "utf16le",
        "1201": "utf16be",
        "12000": "utf32le",
        "12001": "utf32be",
        "16969": "utf64le",
        "20127": "ascii",
        "65000": "utf7",
        "65001": "utf8"
      };
      var sbcs_cache = [874, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1e4];
      var dbcs_cache = [932, 936, 949, 950];
      var magic_cache = [65001];
      var magic_decode = {};
      var magic_encode = {};
      var cpdcache = {};
      var cpecache = {};
      var sfcc = function sfcc2(x) {
        return String.fromCharCode(x);
      };
      var cca = function cca2(x) {
        return x.charCodeAt(0);
      };
      var has_buf = typeof Buffer !== "undefined";
      var Buffer_from = function() {
      };
      if (has_buf) {
        var nbfs = !Buffer.from;
        if (!nbfs)
          try {
            Buffer.from("foo", "utf8");
          } catch (e) {
            nbfs = true;
          }
        Buffer_from = nbfs ? function(buf, enc) {
          return enc ? new Buffer(buf, enc) : new Buffer(buf);
        } : Buffer.from.bind(Buffer);
        if (!Buffer.allocUnsafe)
          Buffer.allocUnsafe = function(n) {
            return new Buffer(n);
          };
        var mdl = 1024, mdb = Buffer.allocUnsafe(mdl);
        var make_EE = function make_EE2(E) {
          var EE = Buffer.allocUnsafe(65536);
          for (var i2 = 0; i2 < 65536; ++i2)
            EE[i2] = 0;
          var keys = Object.keys(E), len = keys.length;
          for (var ee = 0, e = keys[ee]; ee < len; ++ee) {
            if (!(e = keys[ee]))
              continue;
            EE[e.charCodeAt(0)] = E[e];
          }
          return EE;
        };
        var sbcs_encode = function make_sbcs_encode(cp) {
          var EE = make_EE(cpt[cp].enc);
          return function sbcs_e(data, ofmt) {
            var len = data.length;
            var out, i2 = 0, j2 = 0, D = 0, w = 0;
            if (typeof data === "string") {
              out = Buffer.allocUnsafe(len);
              for (i2 = 0; i2 < len; ++i2)
                out[i2] = EE[data.charCodeAt(i2)];
            } else if (Buffer.isBuffer(data)) {
              out = Buffer.allocUnsafe(2 * len);
              j2 = 0;
              for (i2 = 0; i2 < len; ++i2) {
                D = data[i2];
                if (D < 128)
                  out[j2++] = EE[D];
                else if (D < 224) {
                  out[j2++] = EE[((D & 31) << 6) + (data[i2 + 1] & 63)];
                  ++i2;
                } else if (D < 240) {
                  out[j2++] = EE[((D & 15) << 12) + ((data[i2 + 1] & 63) << 6) + (data[i2 + 2] & 63)];
                  i2 += 2;
                } else {
                  w = ((D & 7) << 18) + ((data[i2 + 1] & 63) << 12) + ((data[i2 + 2] & 63) << 6) + (data[i2 + 3] & 63);
                  i2 += 3;
                  if (w < 65536)
                    out[j2++] = EE[w];
                  else {
                    w -= 65536;
                    out[j2++] = EE[55296 + (w >> 10 & 1023)];
                    out[j2++] = EE[56320 + (w & 1023)];
                  }
                }
              }
              out = out.slice(0, j2);
            } else {
              out = Buffer.allocUnsafe(len);
              for (i2 = 0; i2 < len; ++i2)
                out[i2] = EE[data[i2].charCodeAt(0)];
            }
            if (!ofmt || ofmt === "buf")
              return out;
            if (ofmt !== "arr")
              return out.toString("binary");
            return [].slice.call(out);
          };
        };
        var sbcs_decode = function make_sbcs_decode(cp) {
          var D = cpt[cp].dec;
          var DD = Buffer.allocUnsafe(131072), d = 0, c = "";
          for (d = 0; d < D.length; ++d) {
            if (!(c = D[d]))
              continue;
            var w = c.charCodeAt(0);
            DD[2 * d] = w & 255;
            DD[2 * d + 1] = w >> 8;
          }
          return function sbcs_d(data) {
            var len = data.length, i2 = 0, j2 = 0;
            if (2 * len > mdl) {
              mdl = 2 * len;
              mdb = Buffer.allocUnsafe(mdl);
            }
            if (Buffer.isBuffer(data)) {
              for (i2 = 0; i2 < len; i2++) {
                j2 = 2 * data[i2];
                mdb[2 * i2] = DD[j2];
                mdb[2 * i2 + 1] = DD[j2 + 1];
              }
            } else if (typeof data === "string") {
              for (i2 = 0; i2 < len; i2++) {
                j2 = 2 * data.charCodeAt(i2);
                mdb[2 * i2] = DD[j2];
                mdb[2 * i2 + 1] = DD[j2 + 1];
              }
            } else {
              for (i2 = 0; i2 < len; i2++) {
                j2 = 2 * data[i2];
                mdb[2 * i2] = DD[j2];
                mdb[2 * i2 + 1] = DD[j2 + 1];
              }
            }
            return mdb.slice(0, 2 * len).toString("ucs2");
          };
        };
        var dbcs_encode = function make_dbcs_encode(cp) {
          var E = cpt[cp].enc;
          var EE = Buffer.allocUnsafe(131072);
          for (var i2 = 0; i2 < 131072; ++i2)
            EE[i2] = 0;
          var keys = Object.keys(E);
          for (var ee = 0, e = keys[ee]; ee < keys.length; ++ee) {
            if (!(e = keys[ee]))
              continue;
            var f = e.charCodeAt(0);
            EE[2 * f] = E[e] & 255;
            EE[2 * f + 1] = E[e] >> 8;
          }
          return function dbcs_e(data, ofmt) {
            var len = data.length, out = Buffer.allocUnsafe(2 * len), i3 = 0, j2 = 0, jj = 0, k = 0, D = 0;
            if (typeof data === "string") {
              for (i3 = k = 0; i3 < len; ++i3) {
                j2 = data.charCodeAt(i3) * 2;
                out[k++] = EE[j2 + 1] || EE[j2];
                if (EE[j2 + 1] > 0)
                  out[k++] = EE[j2];
              }
              out = out.slice(0, k);
            } else if (Buffer.isBuffer(data)) {
              for (i3 = k = 0; i3 < len; ++i3) {
                D = data[i3];
                if (D < 128)
                  j2 = D;
                else if (D < 224) {
                  j2 = ((D & 31) << 6) + (data[i3 + 1] & 63);
                  ++i3;
                } else if (D < 240) {
                  j2 = ((D & 15) << 12) + ((data[i3 + 1] & 63) << 6) + (data[i3 + 2] & 63);
                  i3 += 2;
                } else {
                  j2 = ((D & 7) << 18) + ((data[i3 + 1] & 63) << 12) + ((data[i3 + 2] & 63) << 6) + (data[i3 + 3] & 63);
                  i3 += 3;
                }
                if (j2 < 65536) {
                  j2 *= 2;
                  out[k++] = EE[j2 + 1] || EE[j2];
                  if (EE[j2 + 1] > 0)
                    out[k++] = EE[j2];
                } else {
                  jj = j2 - 65536;
                  j2 = 2 * (55296 + (jj >> 10 & 1023));
                  out[k++] = EE[j2 + 1] || EE[j2];
                  if (EE[j2 + 1] > 0)
                    out[k++] = EE[j2];
                  j2 = 2 * (56320 + (jj & 1023));
                  out[k++] = EE[j2 + 1] || EE[j2];
                  if (EE[j2 + 1] > 0)
                    out[k++] = EE[j2];
                }
              }
              out = out.slice(0, k);
            } else {
              for (i3 = k = 0; i3 < len; i3++) {
                j2 = data[i3].charCodeAt(0) * 2;
                out[k++] = EE[j2 + 1] || EE[j2];
                if (EE[j2 + 1] > 0)
                  out[k++] = EE[j2];
              }
            }
            if (!ofmt || ofmt === "buf")
              return out;
            if (ofmt !== "arr")
              return out.toString("binary");
            return [].slice.call(out);
          };
        };
        var dbcs_decode = function make_dbcs_decode(cp) {
          var D = cpt[cp].dec;
          var DD = Buffer.allocUnsafe(131072), d = 0, c, w = 0, j2 = 0, i2 = 0;
          for (i2 = 0; i2 < 65536; ++i2) {
            DD[2 * i2] = 255;
            DD[2 * i2 + 1] = 253;
          }
          for (d = 0; d < D.length; ++d) {
            if (!(c = D[d]))
              continue;
            w = c.charCodeAt(0);
            j2 = 2 * d;
            DD[j2] = w & 255;
            DD[j2 + 1] = w >> 8;
          }
          return function dbcs_d(data) {
            var len = data.length, out = Buffer.allocUnsafe(2 * len), i3 = 0, j3 = 0, k = 0;
            if (Buffer.isBuffer(data)) {
              for (i3 = 0; i3 < len; i3++) {
                j3 = 2 * data[i3];
                if (DD[j3] === 255 && DD[j3 + 1] === 253) {
                  j3 = 2 * ((data[i3] << 8) + data[i3 + 1]);
                  ++i3;
                }
                out[k++] = DD[j3];
                out[k++] = DD[j3 + 1];
              }
            } else if (typeof data === "string") {
              for (i3 = 0; i3 < len; i3++) {
                j3 = 2 * data.charCodeAt(i3);
                if (DD[j3] === 255 && DD[j3 + 1] === 253) {
                  j3 = 2 * ((data.charCodeAt(i3) << 8) + data.charCodeAt(i3 + 1));
                  ++i3;
                }
                out[k++] = DD[j3];
                out[k++] = DD[j3 + 1];
              }
            } else {
              for (i3 = 0; i3 < len; i3++) {
                j3 = 2 * data[i3];
                if (DD[j3] === 255 && DD[j3 + 1] === 253) {
                  j3 = 2 * ((data[i3] << 8) + data[i3 + 1]);
                  ++i3;
                }
                out[k++] = DD[j3];
                out[k++] = DD[j3 + 1];
              }
            }
            return out.slice(0, k).toString("ucs2");
          };
        };
        magic_decode[65001] = function utf8_d(data) {
          if (typeof data === "string")
            return utf8_d(data.split("").map(cca));
          var len = data.length, w = 0, ww = 0;
          if (4 * len > mdl) {
            mdl = 4 * len;
            mdb = Buffer.allocUnsafe(mdl);
          }
          var i2 = 0;
          if (len >= 3 && data[0] == 239) {
            if (data[1] == 187 && data[2] == 191)
              i2 = 3;
          }
          for (var j2 = 1, k = 0, D = 0; i2 < len; i2 += j2) {
            j2 = 1;
            D = data[i2];
            if (D < 128)
              w = D;
            else if (D < 224) {
              w = (D & 31) * 64 + (data[i2 + 1] & 63);
              j2 = 2;
            } else if (D < 240) {
              w = ((D & 15) << 12) + (data[i2 + 1] & 63) * 64 + (data[i2 + 2] & 63);
              j2 = 3;
            } else {
              w = (D & 7) * 262144 + ((data[i2 + 1] & 63) << 12) + (data[i2 + 2] & 63) * 64 + (data[i2 + 3] & 63);
              j2 = 4;
            }
            if (w < 65536) {
              mdb[k++] = w & 255;
              mdb[k++] = w >> 8;
            } else {
              w -= 65536;
              ww = 55296 + (w >> 10 & 1023);
              w = 56320 + (w & 1023);
              mdb[k++] = ww & 255;
              mdb[k++] = ww >>> 8;
              mdb[k++] = w & 255;
              mdb[k++] = w >>> 8 & 255;
            }
          }
          return mdb.slice(0, k).toString("ucs2");
        };
        magic_encode[65001] = function utf8_e(data, ofmt) {
          if (has_buf && Buffer.isBuffer(data)) {
            if (!ofmt || ofmt === "buf")
              return data;
            if (ofmt !== "arr")
              return data.toString("binary");
            return [].slice.call(data);
          }
          var len = data.length, w = 0, ww = 0, j2 = 0;
          var direct = typeof data === "string";
          if (4 * len > mdl) {
            mdl = 4 * len;
            mdb = Buffer.allocUnsafe(mdl);
          }
          for (var i2 = 0; i2 < len; ++i2) {
            w = direct ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
            if (w <= 127)
              mdb[j2++] = w;
            else if (w <= 2047) {
              mdb[j2++] = 192 + (w >> 6);
              mdb[j2++] = 128 + (w & 63);
            } else if (w >= 55296 && w <= 57343) {
              w -= 55296;
              ++i2;
              ww = (direct ? data.charCodeAt(i2) : data[i2].charCodeAt(0)) - 56320 + (w << 10);
              mdb[j2++] = 240 + (ww >>> 18 & 7);
              mdb[j2++] = 144 + (ww >>> 12 & 63);
              mdb[j2++] = 128 + (ww >>> 6 & 63);
              mdb[j2++] = 128 + (ww & 63);
            } else {
              mdb[j2++] = 224 + (w >> 12);
              mdb[j2++] = 128 + (w >> 6 & 63);
              mdb[j2++] = 128 + (w & 63);
            }
          }
          if (!ofmt || ofmt === "buf")
            return mdb.slice(0, j2);
          if (ofmt !== "arr")
            return mdb.slice(0, j2).toString("binary");
          return [].slice.call(mdb, 0, j2);
        };
      }
      var encache = function encache2() {
        if (has_buf) {
          if (cpdcache[sbcs_cache[0]])
            return;
          var i2 = 0, s = 0;
          for (i2 = 0; i2 < sbcs_cache.length; ++i2) {
            s = sbcs_cache[i2];
            if (cpt[s]) {
              cpdcache[s] = sbcs_decode(s);
              cpecache[s] = sbcs_encode(s);
            }
          }
          for (i2 = 0; i2 < dbcs_cache.length; ++i2) {
            s = dbcs_cache[i2];
            if (cpt[s]) {
              cpdcache[s] = dbcs_decode(s);
              cpecache[s] = dbcs_encode(s);
            }
          }
          for (i2 = 0; i2 < magic_cache.length; ++i2) {
            s = magic_cache[i2];
            if (magic_decode[s])
              cpdcache[s] = magic_decode[s];
            if (magic_encode[s])
              cpecache[s] = magic_encode[s];
          }
        }
      };
      var null_enc = function(data, ofmt) {
        return "";
      };
      var cp_decache = function cp_decache2(cp) {
        delete cpdcache[cp];
        delete cpecache[cp];
      };
      var decache = function decache2() {
        if (has_buf) {
          if (!cpdcache[sbcs_cache[0]])
            return;
          sbcs_cache.forEach(cp_decache);
          dbcs_cache.forEach(cp_decache);
          magic_cache.forEach(cp_decache);
        }
        last_enc = null_enc;
        last_cp = 0;
      };
      var cache = {
        encache,
        decache,
        sbcs: sbcs_cache,
        dbcs: dbcs_cache
      };
      encache();
      var BM = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
      var SetD = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'(),-./:?";
      var last_enc = null_enc, last_cp = 0;
      var encode = function encode2(cp, data, ofmt) {
        if (cp === last_cp && last_enc) {
          return last_enc(data, ofmt);
        }
        if (cpecache[cp]) {
          last_enc = cpecache[last_cp = cp];
          return last_enc(data, ofmt);
        }
        if (has_buf && Buffer.isBuffer(data))
          data = data.toString("utf8");
        var len = data.length;
        var out = has_buf ? Buffer.allocUnsafe(4 * len) : [], w = 0, i2 = 0, j2 = 0, ww = 0;
        var C = cpt[cp], E, M = "";
        var isstr = typeof data === "string";
        if (C && (E = C.enc))
          for (i2 = 0; i2 < len; ++i2, ++j2) {
            w = E[isstr ? data.charAt(i2) : data[i2]];
            if (w > 255) {
              out[j2] = w >> 8;
              out[++j2] = w & 255;
            } else
              out[j2] = w & 255;
          }
        else if (M = magic[cp])
          switch (M) {
            case "utf8":
              if (has_buf && isstr) {
                out = Buffer_from(data, M);
                j2 = out.length;
                break;
              }
              for (i2 = 0; i2 < len; ++i2, ++j2) {
                w = isstr ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
                if (w <= 127)
                  out[j2] = w;
                else if (w <= 2047) {
                  out[j2] = 192 + (w >> 6);
                  out[++j2] = 128 + (w & 63);
                } else if (w >= 55296 && w <= 57343) {
                  w -= 55296;
                  ww = (isstr ? data.charCodeAt(++i2) : data[++i2].charCodeAt(0)) - 56320 + (w << 10);
                  out[j2] = 240 + (ww >>> 18 & 7);
                  out[++j2] = 144 + (ww >>> 12 & 63);
                  out[++j2] = 128 + (ww >>> 6 & 63);
                  out[++j2] = 128 + (ww & 63);
                } else {
                  out[j2] = 224 + (w >> 12);
                  out[++j2] = 128 + (w >> 6 & 63);
                  out[++j2] = 128 + (w & 63);
                }
              }
              break;
            case "ascii":
              if (has_buf && typeof data === "string") {
                out = Buffer_from(data, M);
                j2 = out.length;
                break;
              }
              for (i2 = 0; i2 < len; ++i2, ++j2) {
                w = isstr ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
                if (w <= 127)
                  out[j2] = w;
                else
                  throw new Error("bad ascii " + w);
              }
              break;
            case "utf16le":
              if (has_buf && typeof data === "string") {
                out = Buffer_from(data, M);
                j2 = out.length;
                break;
              }
              for (i2 = 0; i2 < len; ++i2) {
                w = isstr ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
                out[j2++] = w & 255;
                out[j2++] = w >> 8;
              }
              break;
            case "utf16be":
              for (i2 = 0; i2 < len; ++i2) {
                w = isstr ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
                out[j2++] = w >> 8;
                out[j2++] = w & 255;
              }
              break;
            case "utf32le":
              for (i2 = 0; i2 < len; ++i2) {
                w = isstr ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
                if (w >= 55296 && w <= 57343)
                  w = 65536 + (w - 55296 << 10) + (data[++i2].charCodeAt(0) - 56320);
                out[j2++] = w & 255;
                w >>= 8;
                out[j2++] = w & 255;
                w >>= 8;
                out[j2++] = w & 255;
                w >>= 8;
                out[j2++] = w & 255;
              }
              break;
            case "utf32be":
              for (i2 = 0; i2 < len; ++i2) {
                w = isstr ? data.charCodeAt(i2) : data[i2].charCodeAt(0);
                if (w >= 55296 && w <= 57343)
                  w = 65536 + (w - 55296 << 10) + (data[++i2].charCodeAt(0) - 56320);
                out[j2 + 3] = w & 255;
                w >>= 8;
                out[j2 + 2] = w & 255;
                w >>= 8;
                out[j2 + 1] = w & 255;
                w >>= 8;
                out[j2] = w & 255;
                j2 += 4;
              }
              break;
            case "utf7":
              for (i2 = 0; i2 < len; i2++) {
                var c = isstr ? data.charAt(i2) : data[i2].charAt(0);
                if (c === "+") {
                  out[j2++] = 43;
                  out[j2++] = 45;
                  continue;
                }
                if (SetD.indexOf(c) > -1) {
                  out[j2++] = c.charCodeAt(0);
                  continue;
                }
                var tt = encode2(1201, c);
                out[j2++] = 43;
                out[j2++] = BM.charCodeAt(tt[0] >> 2);
                out[j2++] = BM.charCodeAt(((tt[0] & 3) << 4) + ((tt[1] || 0) >> 4));
                out[j2++] = BM.charCodeAt(((tt[1] & 15) << 2) + ((tt[2] || 0) >> 6));
                out[j2++] = 45;
              }
              break;
            default:
              throw new Error("Unsupported magic: " + cp + " " + magic[cp]);
          }
        else
          throw new Error("Unrecognized CP: " + cp);
        out = out.slice(0, j2);
        if (!has_buf)
          return ofmt == "str" ? out.map(sfcc).join("") : out;
        if (!ofmt || ofmt === "buf")
          return out;
        if (ofmt !== "arr")
          return out.toString("binary");
        return [].slice.call(out);
      };
      var decode = function decode2(cp, data) {
        var F;
        if (F = cpdcache[cp])
          return F(data);
        if (typeof data === "string")
          return decode2(cp, data.split("").map(cca));
        var len = data.length, out = new Array(len), s = "", w = 0, i2 = 0, j2 = 1, k = 0, ww = 0;
        var C = cpt[cp], D, M = "";
        if (C && (D = C.dec)) {
          for (i2 = 0; i2 < len; i2 += j2) {
            j2 = 2;
            s = D[(data[i2] << 8) + data[i2 + 1]];
            if (!s) {
              j2 = 1;
              s = D[data[i2]];
            }
            if (!s)
              throw new Error("Unrecognized code: " + data[i2] + " " + data[i2 + j2 - 1] + " " + i2 + " " + j2 + " " + D[data[i2]]);
            out[k++] = s;
          }
        } else if (M = magic[cp])
          switch (M) {
            case "utf8":
              if (len >= 3 && data[0] == 239) {
                if (data[1] == 187 && data[2] == 191)
                  i2 = 3;
              }
              for (; i2 < len; i2 += j2) {
                j2 = 1;
                if (data[i2] < 128)
                  w = data[i2];
                else if (data[i2] < 224) {
                  w = (data[i2] & 31) * 64 + (data[i2 + 1] & 63);
                  j2 = 2;
                } else if (data[i2] < 240) {
                  w = ((data[i2] & 15) << 12) + (data[i2 + 1] & 63) * 64 + (data[i2 + 2] & 63);
                  j2 = 3;
                } else {
                  w = (data[i2] & 7) * 262144 + ((data[i2 + 1] & 63) << 12) + (data[i2 + 2] & 63) * 64 + (data[i2 + 3] & 63);
                  j2 = 4;
                }
                if (w < 65536) {
                  out[k++] = String.fromCharCode(w);
                } else {
                  w -= 65536;
                  ww = 55296 + (w >> 10 & 1023);
                  w = 56320 + (w & 1023);
                  out[k++] = String.fromCharCode(ww);
                  out[k++] = String.fromCharCode(w);
                }
              }
              break;
            case "ascii":
              if (has_buf && Buffer.isBuffer(data))
                return data.toString(M);
              for (i2 = 0; i2 < len; i2++)
                out[i2] = String.fromCharCode(data[i2]);
              k = len;
              break;
            case "utf16le":
              if (len >= 2 && data[0] == 255) {
                if (data[1] == 254)
                  i2 = 2;
              }
              if (has_buf && Buffer.isBuffer(data))
                return data.toString(M);
              j2 = 2;
              for (; i2 + 1 < len; i2 += j2) {
                out[k++] = String.fromCharCode((data[i2 + 1] << 8) + data[i2]);
              }
              break;
            case "utf16be":
              if (len >= 2 && data[0] == 254) {
                if (data[1] == 255)
                  i2 = 2;
              }
              j2 = 2;
              for (; i2 + 1 < len; i2 += j2) {
                out[k++] = String.fromCharCode((data[i2] << 8) + data[i2 + 1]);
              }
              break;
            case "utf32le":
              if (len >= 4 && data[0] == 255) {
                if (data[1] == 254 && data[2] === 0 && data[3] === 0)
                  i2 = 4;
              }
              j2 = 4;
              for (; i2 < len; i2 += j2) {
                w = (data[i2 + 3] << 24) + (data[i2 + 2] << 16) + (data[i2 + 1] << 8) + data[i2];
                if (w > 65535) {
                  w -= 65536;
                  out[k++] = String.fromCharCode(55296 + (w >> 10 & 1023));
                  out[k++] = String.fromCharCode(56320 + (w & 1023));
                } else
                  out[k++] = String.fromCharCode(w);
              }
              break;
            case "utf32be":
              if (len >= 4 && data[3] == 255) {
                if (data[2] == 254 && data[1] === 0 && data[0] === 0)
                  i2 = 4;
              }
              j2 = 4;
              for (; i2 < len; i2 += j2) {
                w = (data[i2] << 24) + (data[i2 + 1] << 16) + (data[i2 + 2] << 8) + data[i2 + 3];
                if (w > 65535) {
                  w -= 65536;
                  out[k++] = String.fromCharCode(55296 + (w >> 10 & 1023));
                  out[k++] = String.fromCharCode(56320 + (w & 1023));
                } else
                  out[k++] = String.fromCharCode(w);
              }
              break;
            case "utf7":
              if (len >= 4 && data[0] == 43 && data[1] == 47 && data[2] == 118) {
                if (len >= 5 && data[3] == 56 && data[4] == 45)
                  i2 = 5;
                else if (data[3] == 56 || data[3] == 57 || data[3] == 43 || data[3] == 47)
                  i2 = 4;
              }
              for (; i2 < len; i2 += j2) {
                if (data[i2] !== 43) {
                  j2 = 1;
                  out[k++] = String.fromCharCode(data[i2]);
                  continue;
                }
                j2 = 1;
                if (data[i2 + 1] === 45) {
                  j2 = 2;
                  out[k++] = "+";
                  continue;
                }
                while (String.fromCharCode(data[i2 + j2]).match(/[A-Za-z0-9+\/]/))
                  j2++;
                var dash = 0;
                if (data[i2 + j2] === 45) {
                  ++j2;
                  dash = 1;
                }
                var tt = [];
                var o64 = "";
                var c1 = 0, c2 = 0, c3 = 0;
                var e1 = 0, e2 = 0, e3 = 0, e4 = 0;
                for (var l = 1; l < j2 - dash; ) {
                  e1 = BM.indexOf(String.fromCharCode(data[i2 + l++]));
                  e2 = BM.indexOf(String.fromCharCode(data[i2 + l++]));
                  c1 = e1 << 2 | e2 >> 4;
                  tt.push(c1);
                  e3 = BM.indexOf(String.fromCharCode(data[i2 + l++]));
                  if (e3 === -1)
                    break;
                  c2 = (e2 & 15) << 4 | e3 >> 2;
                  tt.push(c2);
                  e4 = BM.indexOf(String.fromCharCode(data[i2 + l++]));
                  if (e4 === -1)
                    break;
                  c3 = (e3 & 3) << 6 | e4;
                  if (e4 < 64)
                    tt.push(c3);
                }
                o64 = decode2(1201, tt);
                for (l = 0; l < o64.length; ++l)
                  out[k++] = o64.charAt(l);
              }
              break;
            default:
              throw new Error("Unsupported magic: " + cp + " " + magic[cp]);
          }
        else
          throw new Error("Unrecognized CP: " + cp);
        return out.slice(0, k).join("");
      };
      var hascp = function hascp2(cp) {
        return !!(cpt[cp] || magic[cp]);
      };
      cpt.utils = { decode, encode, hascp, magic, cache };
      return cpt;
    });
  })(cpexcel);
  return cpexcel.exports;
}
const __viteBrowserExternal = {};
const __viteBrowserExternal$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  __proto__: null,
  default: __viteBrowserExternal
}, Symbol.toStringTag, { value: "Module" }));
const require$$4 = /* @__PURE__ */ getAugmentedNamespace(__viteBrowserExternal$1);
var jszip = { exports: {} };
var hasRequiredJszip;
function requireJszip() {
  if (hasRequiredJszip)
    return jszip.exports;
  hasRequiredJszip = 1;
  (function(module, exports) {
    (function(e) {
      if ("undefined" == typeof DO_NOT_EXPORT_JSZIP)
        module.exports = e();
      else {
        var f;
        "undefined" != typeof window ? f = window : "undefined" != typeof commonjsGlobal ? f = commonjsGlobal : "undefined" != typeof $ && $.global ? f = $.global : "undefined" != typeof self && (f = self), f.JSZipSync = e();
      }
    })(function() {
      return function e(t, n, r) {
        function s(o2, u) {
          if (!n[o2]) {
            if (!t[o2]) {
              var a = typeof commonjsRequire == "function" && commonjsRequire;
              if (!u && a)
                return a(o2, true);
              if (i2)
                return i2(o2, true);
              throw new Error("Cannot find module '" + o2 + "'");
            }
            var f = n[o2] = { exports: {} };
            t[o2][0].call(f.exports, function(e2) {
              var n2 = t[o2][1][e2];
              return s(n2 ? n2 : e2);
            }, f, f.exports, e, t, n, r);
          }
          return n[o2].exports;
        }
        var i2 = typeof commonjsRequire == "function" && commonjsRequire;
        for (var o = 0; o < r.length; o++)
          s(r[o]);
        return s;
      }({ 1: [function(_dereq_, module2, exports2) {
        var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
        exports2.encode = function(input, utf8) {
          var output = "";
          var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
          var i2 = 0;
          while (i2 < input.length) {
            chr1 = input.charCodeAt(i2++);
            chr2 = input.charCodeAt(i2++);
            chr3 = input.charCodeAt(i2++);
            enc1 = chr1 >> 2;
            enc2 = (chr1 & 3) << 4 | chr2 >> 4;
            enc3 = (chr2 & 15) << 2 | chr3 >> 6;
            enc4 = chr3 & 63;
            if (isNaN(chr2)) {
              enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
              enc4 = 64;
            }
            output = output + _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4);
          }
          return output;
        };
        exports2.decode = function(input, utf8) {
          var output = "";
          var chr1, chr2, chr3;
          var enc1, enc2, enc3, enc4;
          var i2 = 0;
          input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
          while (i2 < input.length) {
            enc1 = _keyStr.indexOf(input.charAt(i2++));
            enc2 = _keyStr.indexOf(input.charAt(i2++));
            enc3 = _keyStr.indexOf(input.charAt(i2++));
            enc4 = _keyStr.indexOf(input.charAt(i2++));
            chr1 = enc1 << 2 | enc2 >> 4;
            chr2 = (enc2 & 15) << 4 | enc3 >> 2;
            chr3 = (enc3 & 3) << 6 | enc4;
            output = output + String.fromCharCode(chr1);
            if (enc3 != 64) {
              output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
              output = output + String.fromCharCode(chr3);
            }
          }
          return output;
        };
      }, {}], 2: [function(_dereq_, module2, exports2) {
        function CompressedObject() {
          this.compressedSize = 0;
          this.uncompressedSize = 0;
          this.crc32 = 0;
          this.compressionMethod = null;
          this.compressedContent = null;
        }
        CompressedObject.prototype = {
          /**
           * Return the decompressed content in an unspecified format.
           * The format will depend on the decompressor.
           * @return {Object} the decompressed content.
           */
          getContent: function() {
            return null;
          },
          /**
           * Return the compressed content in an unspecified format.
           * The format will depend on the compressed conten source.
           * @return {Object} the compressed content.
           */
          getCompressedContent: function() {
            return null;
          }
        };
        module2.exports = CompressedObject;
      }, {}], 3: [function(_dereq_, module2, exports2) {
        exports2.STORE = {
          magic: "\0\0",
          compress: function(content) {
            return content;
          },
          uncompress: function(content) {
            return content;
          },
          compressInputType: null,
          uncompressInputType: null
        };
        exports2.DEFLATE = _dereq_("./flate");
      }, { "./flate": 8 }], 4: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./utils");
        var table = [
          0,
          1996959894,
          3993919788,
          2567524794,
          124634137,
          1886057615,
          3915621685,
          2657392035,
          249268274,
          2044508324,
          3772115230,
          2547177864,
          162941995,
          2125561021,
          3887607047,
          2428444049,
          498536548,
          1789927666,
          4089016648,
          2227061214,
          450548861,
          1843258603,
          4107580753,
          2211677639,
          325883990,
          1684777152,
          4251122042,
          2321926636,
          335633487,
          1661365465,
          4195302755,
          2366115317,
          997073096,
          1281953886,
          3579855332,
          2724688242,
          1006888145,
          1258607687,
          3524101629,
          2768942443,
          901097722,
          1119000684,
          3686517206,
          2898065728,
          853044451,
          1172266101,
          3705015759,
          2882616665,
          651767980,
          1373503546,
          3369554304,
          3218104598,
          565507253,
          1454621731,
          3485111705,
          3099436303,
          671266974,
          1594198024,
          3322730930,
          2970347812,
          795835527,
          1483230225,
          3244367275,
          3060149565,
          1994146192,
          31158534,
          2563907772,
          4023717930,
          1907459465,
          112637215,
          2680153253,
          3904427059,
          2013776290,
          251722036,
          2517215374,
          3775830040,
          2137656763,
          141376813,
          2439277719,
          3865271297,
          1802195444,
          476864866,
          2238001368,
          4066508878,
          1812370925,
          453092731,
          2181625025,
          4111451223,
          1706088902,
          314042704,
          2344532202,
          4240017532,
          1658658271,
          366619977,
          2362670323,
          4224994405,
          1303535960,
          984961486,
          2747007092,
          3569037538,
          1256170817,
          1037604311,
          2765210733,
          3554079995,
          1131014506,
          879679996,
          2909243462,
          3663771856,
          1141124467,
          855842277,
          2852801631,
          3708648649,
          1342533948,
          654459306,
          3188396048,
          3373015174,
          1466479909,
          544179635,
          3110523913,
          3462522015,
          1591671054,
          702138776,
          2966460450,
          3352799412,
          1504918807,
          783551873,
          3082640443,
          3233442989,
          3988292384,
          2596254646,
          62317068,
          1957810842,
          3939845945,
          2647816111,
          81470997,
          1943803523,
          3814918930,
          2489596804,
          225274430,
          2053790376,
          3826175755,
          2466906013,
          167816743,
          2097651377,
          4027552580,
          2265490386,
          503444072,
          1762050814,
          4150417245,
          2154129355,
          426522225,
          1852507879,
          4275313526,
          2312317920,
          282753626,
          1742555852,
          4189708143,
          2394877945,
          397917763,
          1622183637,
          3604390888,
          2714866558,
          953729732,
          1340076626,
          3518719985,
          2797360999,
          1068828381,
          1219638859,
          3624741850,
          2936675148,
          906185462,
          1090812512,
          3747672003,
          2825379669,
          829329135,
          1181335161,
          3412177804,
          3160834842,
          628085408,
          1382605366,
          3423369109,
          3138078467,
          570562233,
          1426400815,
          3317316542,
          2998733608,
          733239954,
          1555261956,
          3268935591,
          3050360625,
          752459403,
          1541320221,
          2607071920,
          3965973030,
          1969922972,
          40735498,
          2617837225,
          3943577151,
          1913087877,
          83908371,
          2512341634,
          3803740692,
          2075208622,
          213261112,
          2463272603,
          3855990285,
          2094854071,
          198958881,
          2262029012,
          4057260610,
          1759359992,
          534414190,
          2176718541,
          4139329115,
          1873836001,
          414664567,
          2282248934,
          4279200368,
          1711684554,
          285281116,
          2405801727,
          4167216745,
          1634467795,
          376229701,
          2685067896,
          3608007406,
          1308918612,
          956543938,
          2808555105,
          3495958263,
          1231636301,
          1047427035,
          2932959818,
          3654703836,
          1088359270,
          936918e3,
          2847714899,
          3736837829,
          1202900863,
          817233897,
          3183342108,
          3401237130,
          1404277552,
          615818150,
          3134207493,
          3453421203,
          1423857449,
          601450431,
          3009837614,
          3294710456,
          1567103746,
          711928724,
          3020668471,
          3272380065,
          1510334235,
          755167117
        ];
        module2.exports = function crc32(input, crc) {
          if (typeof input === "undefined" || !input.length) {
            return 0;
          }
          var isArray = utils.getTypeOf(input) !== "string";
          if (typeof crc == "undefined") {
            crc = 0;
          }
          var x = 0;
          var y = 0;
          var b = 0;
          crc = crc ^ -1;
          for (var i2 = 0, iTop = input.length; i2 < iTop; i2++) {
            b = isArray ? input[i2] : input.charCodeAt(i2);
            y = (crc ^ b) & 255;
            x = table[y];
            crc = crc >>> 8 ^ x;
          }
          return crc ^ -1;
        };
      }, { "./utils": 21 }], 5: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./utils");
        function DataReader(data) {
          this.data = null;
          this.length = 0;
          this.index = 0;
        }
        DataReader.prototype = {
          /**
           * Check that the offset will not go too far.
           * @param {string} offset the additional offset to check.
           * @throws {Error} an Error if the offset is out of bounds.
           */
          checkOffset: function(offset) {
            this.checkIndex(this.index + offset);
          },
          /**
           * Check that the specifed index will not be too far.
           * @param {string} newIndex the index to check.
           * @throws {Error} an Error if the index is out of bounds.
           */
          checkIndex: function(newIndex) {
            if (this.length < newIndex || newIndex < 0) {
              throw new Error("End of data reached (data length = " + this.length + ", asked index = " + newIndex + "). Corrupted zip ?");
            }
          },
          /**
           * Change the index.
           * @param {number} newIndex The new index.
           * @throws {Error} if the new index is out of the data.
           */
          setIndex: function(newIndex) {
            this.checkIndex(newIndex);
            this.index = newIndex;
          },
          /**
           * Skip the next n bytes.
           * @param {number} n the number of bytes to skip.
           * @throws {Error} if the new index is out of the data.
           */
          skip: function(n) {
            this.setIndex(this.index + n);
          },
          /**
           * Get the byte at the specified index.
           * @param {number} i the index to use.
           * @return {number} a byte.
           */
          byteAt: function(i2) {
          },
          /**
           * Get the next number with a given byte size.
           * @param {number} size the number of bytes to read.
           * @return {number} the corresponding number.
           */
          readInt: function(size) {
            var result = 0, i2;
            this.checkOffset(size);
            for (i2 = this.index + size - 1; i2 >= this.index; i2--) {
              result = (result << 8) + this.byteAt(i2);
            }
            this.index += size;
            return result;
          },
          /**
           * Get the next string with a given byte size.
           * @param {number} size the number of bytes to read.
           * @return {string} the corresponding string.
           */
          readString: function(size) {
            return utils.transformTo("string", this.readData(size));
          },
          /**
           * Get raw data without conversion, <size> bytes.
           * @param {number} size the number of bytes to read.
           * @return {Object} the raw data, implementation specific.
           */
          readData: function(size) {
          },
          /**
           * Find the last occurence of a zip signature (4 bytes).
           * @param {string} sig the signature to find.
           * @return {number} the index of the last occurence, -1 if not found.
           */
          lastIndexOfSignature: function(sig) {
          },
          /**
           * Get the next date.
           * @return {Date} the date.
           */
          readDate: function() {
            var dostime = this.readInt(4);
            return new Date(
              (dostime >> 25 & 127) + 1980,
              // year
              (dostime >> 21 & 15) - 1,
              // month
              dostime >> 16 & 31,
              // day
              dostime >> 11 & 31,
              // hour
              dostime >> 5 & 63,
              // minute
              (dostime & 31) << 1
            );
          }
        };
        module2.exports = DataReader;
      }, { "./utils": 21 }], 6: [function(_dereq_, module2, exports2) {
        exports2.base64 = false;
        exports2.binary = false;
        exports2.dir = false;
        exports2.createFolders = false;
        exports2.date = null;
        exports2.compression = null;
        exports2.comment = null;
      }, {}], 7: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./utils");
        exports2.string2binary = function(str) {
          return utils.string2binary(str);
        };
        exports2.string2Uint8Array = function(str) {
          return utils.transformTo("uint8array", str);
        };
        exports2.uint8Array2String = function(array) {
          return utils.transformTo("string", array);
        };
        exports2.string2Blob = function(str) {
          var buffer = utils.transformTo("arraybuffer", str);
          return utils.arrayBuffer2Blob(buffer);
        };
        exports2.arrayBuffer2Blob = function(buffer) {
          return utils.arrayBuffer2Blob(buffer);
        };
        exports2.transformTo = function(outputType, input) {
          return utils.transformTo(outputType, input);
        };
        exports2.getTypeOf = function(input) {
          return utils.getTypeOf(input);
        };
        exports2.checkSupport = function(type) {
          return utils.checkSupport(type);
        };
        exports2.MAX_VALUE_16BITS = utils.MAX_VALUE_16BITS;
        exports2.MAX_VALUE_32BITS = utils.MAX_VALUE_32BITS;
        exports2.pretty = function(str) {
          return utils.pretty(str);
        };
        exports2.findCompression = function(compressionMethod) {
          return utils.findCompression(compressionMethod);
        };
        exports2.isRegExp = function(object) {
          return utils.isRegExp(object);
        };
      }, { "./utils": 21 }], 8: [function(_dereq_, module2, exports2) {
        var USE_TYPEDARRAY = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Uint32Array !== "undefined";
        var pako = _dereq_("pako");
        exports2.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
        exports2.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array";
        exports2.magic = "\b\0";
        exports2.compress = function(input) {
          return pako.deflateRaw(input);
        };
        exports2.uncompress = function(input) {
          return pako.inflateRaw(input);
        };
      }, { "pako": 24 }], 9: [function(_dereq_, module2, exports2) {
        var base64 = _dereq_("./base64");
        function JSZipSync2(data, options) {
          if (!(this instanceof JSZipSync2))
            return new JSZipSync2(data, options);
          this.files = {};
          this.comment = null;
          this.root = "";
          if (data) {
            this.load(data, options);
          }
          this.clone = function() {
            var newObj = new JSZipSync2();
            for (var i2 in this) {
              if (typeof this[i2] !== "function") {
                newObj[i2] = this[i2];
              }
            }
            return newObj;
          };
        }
        JSZipSync2.prototype = _dereq_("./object");
        JSZipSync2.prototype.load = _dereq_("./load");
        JSZipSync2.support = _dereq_("./support");
        JSZipSync2.defaults = _dereq_("./defaults");
        JSZipSync2.utils = _dereq_("./deprecatedPublicUtils");
        JSZipSync2.base64 = {
          /**
           * @deprecated
           * This method will be removed in a future version without replacement.
           */
          encode: function(input) {
            return base64.encode(input);
          },
          /**
           * @deprecated
           * This method will be removed in a future version without replacement.
           */
          decode: function(input) {
            return base64.decode(input);
          }
        };
        JSZipSync2.compressions = _dereq_("./compressions");
        module2.exports = JSZipSync2;
      }, { "./base64": 1, "./compressions": 3, "./defaults": 6, "./deprecatedPublicUtils": 7, "./load": 10, "./object": 13, "./support": 17 }], 10: [function(_dereq_, module2, exports2) {
        var base64 = _dereq_("./base64");
        var ZipEntries = _dereq_("./zipEntries");
        module2.exports = function(data, options) {
          var files, zipEntries, i2, input;
          options = options || {};
          if (options.base64) {
            data = base64.decode(data);
          }
          zipEntries = new ZipEntries(data, options);
          files = zipEntries.files;
          for (i2 = 0; i2 < files.length; i2++) {
            input = files[i2];
            this.file(input.fileName, input.decompressed, {
              binary: true,
              optimizedBinaryString: true,
              date: input.date,
              dir: input.dir,
              comment: input.fileComment.length ? input.fileComment : null,
              createFolders: options.createFolders
            });
          }
          if (zipEntries.zipComment.length) {
            this.comment = zipEntries.zipComment;
          }
          return this;
        };
      }, { "./base64": 1, "./zipEntries": 22 }], 11: [function(_dereq_, module2, exports2) {
        (function(Buffer2) {
          var Buffer_from = (
            /*::(*/
            function() {
            }
          );
          if (typeof Buffer2 !== "undefined") {
            var nbfs = !Buffer2.from;
            if (!nbfs)
              try {
                Buffer2.from("foo", "utf8");
              } catch (e) {
                nbfs = true;
              }
            Buffer_from = nbfs ? function(buf, enc) {
              return enc ? new Buffer2(buf, enc) : new Buffer2(buf);
            } : Buffer2.from.bind(Buffer2);
            if (!Buffer2.alloc)
              Buffer2.alloc = function(n) {
                return new Buffer2(n);
              };
          }
          module2.exports = function(data, encoding) {
            return typeof data == "number" ? Buffer2.alloc(data) : Buffer_from(data, encoding);
          };
          module2.exports.test = function(b) {
            return Buffer2.isBuffer(b);
          };
        }).call(this, typeof Buffer !== "undefined" ? Buffer : void 0);
      }, {}], 12: [function(_dereq_, module2, exports2) {
        var Uint8ArrayReader = _dereq_("./uint8ArrayReader");
        function NodeBufferReader(data) {
          this.data = data;
          this.length = this.data.length;
          this.index = 0;
        }
        NodeBufferReader.prototype = new Uint8ArrayReader();
        NodeBufferReader.prototype.readData = function(size) {
          this.checkOffset(size);
          var result = this.data.slice(this.index, this.index + size);
          this.index += size;
          return result;
        };
        module2.exports = NodeBufferReader;
      }, { "./uint8ArrayReader": 18 }], 13: [function(_dereq_, module2, exports2) {
        var support = _dereq_("./support");
        var utils = _dereq_("./utils");
        var crc32 = _dereq_("./crc32");
        var signature = _dereq_("./signature");
        var defaults = _dereq_("./defaults");
        var base64 = _dereq_("./base64");
        var compressions = _dereq_("./compressions");
        var CompressedObject = _dereq_("./compressedObject");
        var nodeBuffer = _dereq_("./nodeBuffer");
        var utf8 = _dereq_("./utf8");
        var StringWriter = _dereq_("./stringWriter");
        var Uint8ArrayWriter = _dereq_("./uint8ArrayWriter");
        var getRawData = function(file) {
          if (file._data instanceof CompressedObject) {
            file._data = file._data.getContent();
            file.options.binary = true;
            file.options.base64 = false;
            if (utils.getTypeOf(file._data) === "uint8array") {
              var copy = file._data;
              file._data = new Uint8Array(copy.length);
              if (copy.length !== 0) {
                file._data.set(copy, 0);
              }
            }
          }
          return file._data;
        };
        var getBinaryData = function(file) {
          var result = getRawData(file), type = utils.getTypeOf(result);
          if (type === "string") {
            if (!file.options.binary) {
              if (support.nodebuffer) {
                return nodeBuffer(result, "utf-8");
              }
            }
            return file.asBinary();
          }
          return result;
        };
        var dataToString = function(asUTF8) {
          var result = getRawData(this);
          if (result === null || typeof result === "undefined") {
            return "";
          }
          if (this.options.base64) {
            result = base64.decode(result);
          }
          if (asUTF8 && this.options.binary) {
            result = out.utf8decode(result);
          } else {
            result = utils.transformTo("string", result);
          }
          if (!asUTF8 && !this.options.binary) {
            result = utils.transformTo("string", out.utf8encode(result));
          }
          return result;
        };
        var ZipObject = function(name, data, options) {
          this.name = name;
          this.dir = options.dir;
          this.date = options.date;
          this.comment = options.comment;
          this._data = data;
          this.options = options;
          this._initialMetadata = {
            dir: options.dir,
            date: options.date
          };
        };
        ZipObject.prototype = {
          /**
           * Return the content as UTF8 string.
           * @return {string} the UTF8 string.
           */
          asText: function() {
            return dataToString.call(this, true);
          },
          /**
           * Returns the binary content.
           * @return {string} the content as binary.
           */
          asBinary: function() {
            return dataToString.call(this, false);
          },
          /**
           * Returns the content as a nodejs Buffer.
           * @return {Buffer} the content as a Buffer.
           */
          asNodeBuffer: function() {
            var result = getBinaryData(this);
            return utils.transformTo("nodebuffer", result);
          },
          /**
           * Returns the content as an Uint8Array.
           * @return {Uint8Array} the content as an Uint8Array.
           */
          asUint8Array: function() {
            var result = getBinaryData(this);
            return utils.transformTo("uint8array", result);
          },
          /**
           * Returns the content as an ArrayBuffer.
           * @return {ArrayBuffer} the content as an ArrayBufer.
           */
          asArrayBuffer: function() {
            return this.asUint8Array().buffer;
          }
        };
        var decToHex = function(dec, bytes) {
          var hex = "", i2;
          for (i2 = 0; i2 < bytes; i2++) {
            hex += String.fromCharCode(dec & 255);
            dec = dec >>> 8;
          }
          return hex;
        };
        var extend = function() {
          var result = {}, i2, attr;
          for (i2 = 0; i2 < arguments.length; i2++) {
            for (attr in arguments[i2]) {
              if (arguments[i2].hasOwnProperty(attr) && typeof result[attr] === "undefined") {
                result[attr] = arguments[i2][attr];
              }
            }
          }
          return result;
        };
        var prepareFileAttrs = function(o) {
          o = o || {};
          if (o.base64 === true && (o.binary === null || o.binary === void 0)) {
            o.binary = true;
          }
          o = extend(o, defaults);
          o.date = o.date || /* @__PURE__ */ new Date();
          if (o.compression !== null)
            o.compression = o.compression.toUpperCase();
          return o;
        };
        var fileAdd = function(name, data, o) {
          var dataType = utils.getTypeOf(data), parent;
          o = prepareFileAttrs(o);
          if (o.createFolders && (parent = parentFolder(name))) {
            folderAdd.call(this, parent, true);
          }
          if (o.dir || data === null || typeof data === "undefined") {
            o.base64 = false;
            o.binary = false;
            data = null;
          } else if (dataType === "string") {
            if (o.binary && !o.base64) {
              if (o.optimizedBinaryString !== true) {
                data = utils.string2binary(data);
              }
            }
          } else {
            o.base64 = false;
            o.binary = true;
            if (!dataType && !(data instanceof CompressedObject)) {
              throw new Error("The data of '" + name + "' is in an unsupported format !");
            }
            if (dataType === "arraybuffer") {
              data = utils.transformTo("uint8array", data);
            }
          }
          var object = new ZipObject(name, data, o);
          this.files[name] = object;
          return object;
        };
        var parentFolder = function(path) {
          if (path.slice(-1) == "/") {
            path = path.substring(0, path.length - 1);
          }
          var lastSlash = path.lastIndexOf("/");
          return lastSlash > 0 ? path.substring(0, lastSlash) : "";
        };
        var folderAdd = function(name, createFolders) {
          if (name.slice(-1) != "/") {
            name += "/";
          }
          createFolders = typeof createFolders !== "undefined" ? createFolders : false;
          if (!this.files[name]) {
            fileAdd.call(this, name, null, {
              dir: true,
              createFolders
            });
          }
          return this.files[name];
        };
        var generateCompressedObjectFrom = function(file, compression) {
          var result = new CompressedObject(), content;
          if (file._data instanceof CompressedObject) {
            result.uncompressedSize = file._data.uncompressedSize;
            result.crc32 = file._data.crc32;
            if (result.uncompressedSize === 0 || file.dir) {
              compression = compressions["STORE"];
              result.compressedContent = "";
              result.crc32 = 0;
            } else if (file._data.compressionMethod === compression.magic) {
              result.compressedContent = file._data.getCompressedContent();
            } else {
              content = file._data.getContent();
              result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));
            }
          } else {
            content = getBinaryData(file);
            if (!content || content.length === 0 || file.dir) {
              compression = compressions["STORE"];
              content = "";
            }
            result.uncompressedSize = content.length;
            result.crc32 = crc32(content);
            result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content));
          }
          result.compressedSize = result.compressedContent.length;
          result.compressionMethod = compression.magic;
          return result;
        };
        var generateZipParts = function(name, file, compressedObject, offset) {
          compressedObject.compressedContent;
          var utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)), comment = file.comment || "", utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)), useUTF8ForFileName = utfEncodedFileName.length !== file.name.length, useUTF8ForComment = utfEncodedComment.length !== comment.length, o = file.options, dosTime, dosDate, extraFields = "", unicodePathExtraField = "", unicodeCommentExtraField = "", dir, date;
          if (file._initialMetadata.dir !== file.dir) {
            dir = file.dir;
          } else {
            dir = o.dir;
          }
          if (file._initialMetadata.date !== file.date) {
            date = file.date;
          } else {
            date = o.date;
          }
          dosTime = date.getHours();
          dosTime = dosTime << 6;
          dosTime = dosTime | date.getMinutes();
          dosTime = dosTime << 5;
          dosTime = dosTime | date.getSeconds() / 2;
          dosDate = date.getFullYear() - 1980;
          dosDate = dosDate << 4;
          dosDate = dosDate | date.getMonth() + 1;
          dosDate = dosDate << 5;
          dosDate = dosDate | date.getDate();
          if (useUTF8ForFileName) {
            unicodePathExtraField = // Version
            decToHex(1, 1) + // NameCRC32
            decToHex(crc32(utfEncodedFileName), 4) + // UnicodeName
            utfEncodedFileName;
            extraFields += // Info-ZIP Unicode Path Extra Field
            "up" + // size
            decToHex(unicodePathExtraField.length, 2) + // content
            unicodePathExtraField;
          }
          if (useUTF8ForComment) {
            unicodeCommentExtraField = // Version
            decToHex(1, 1) + // CommentCRC32
            decToHex(this.crc32(utfEncodedComment), 4) + // UnicodeName
            utfEncodedComment;
            extraFields += // Info-ZIP Unicode Path Extra Field
            "uc" + // size
            decToHex(unicodeCommentExtraField.length, 2) + // content
            unicodeCommentExtraField;
          }
          var header = "";
          header += "\n\0";
          header += useUTF8ForFileName || useUTF8ForComment ? "\0\b" : "\0\0";
          header += compressedObject.compressionMethod;
          header += decToHex(dosTime, 2);
          header += decToHex(dosDate, 2);
          header += decToHex(compressedObject.crc32, 4);
          header += decToHex(compressedObject.compressedSize, 4);
          header += decToHex(compressedObject.uncompressedSize, 4);
          header += decToHex(utfEncodedFileName.length, 2);
          header += decToHex(extraFields.length, 2);
          var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields;
          var dirRecord = signature.CENTRAL_FILE_HEADER + // version made by (00: DOS)
          "\0" + // file header (common to file and central directory)
          header + // file comment length
          decToHex(utfEncodedComment.length, 2) + // disk number start
          "\0\0\0\0" + // external file attributes
          (dir === true ? "\0\0\0" : "\0\0\0\0") + // relative offset of local header
          decToHex(offset, 4) + // file name
          utfEncodedFileName + // extra field
          extraFields + // file comment
          utfEncodedComment;
          return {
            fileRecord,
            dirRecord,
            compressedObject
          };
        };
        var out = {
          /**
           * Read an existing zip and merge the data in the current JSZip object.
           * The implementation is in jszip-load.js, don't forget to include it.
           * @param {String|ArrayBuffer|Uint8Array|Buffer} stream  The stream to load
           * @param {Object} options Options for loading the stream.
           *  options.base64 : is the stream in base64 ? default : false
           * @return {JSZip} the current JSZip object
           */
          load: function(stream, options) {
            throw new Error("Load method is not defined. Is the file jszip-load.js included ?");
          },
          /**
           * Filter nested files/folders with the specified function.
           * @param {Function} search the predicate to use :
           * function (relativePath, file) {...}
           * It takes 2 arguments : the relative path and the file.
           * @return {Array} An array of matching elements.
           */
          filter: function(search) {
            var result = [], filename, relativePath, file, fileClone;
            for (filename in this.files) {
              if (!this.files.hasOwnProperty(filename)) {
                continue;
              }
              file = this.files[filename];
              fileClone = new ZipObject(file.name, file._data, extend(file.options));
              relativePath = filename.slice(this.root.length, filename.length);
              if (filename.slice(0, this.root.length) === this.root && // the file is in the current root
              search(relativePath, fileClone)) {
                result.push(fileClone);
              }
            }
            return result;
          },
          /**
           * Add a file to the zip file, or search a file.
           * @param   {string|RegExp} name The name of the file to add (if data is defined),
           * the name of the file to find (if no data) or a regex to match files.
           * @param   {String|ArrayBuffer|Uint8Array|Buffer} data  The file data, either raw or base64 encoded
           * @param   {Object} o     File options
           * @return  {JSZip|Object|Array} this JSZip object (when adding a file),
           * a file (when searching by string) or an array of files (when searching by regex).
           */
          file: function(name, data, o) {
            if (arguments.length === 1) {
              if (utils.isRegExp(name)) {
                var regexp2 = name;
                return this.filter(function(relativePath, file) {
                  return !file.dir && regexp2.test(relativePath);
                });
              } else {
                return this.filter(function(relativePath, file) {
                  return !file.dir && relativePath === name;
                })[0] || null;
              }
            } else {
              name = this.root + name;
              fileAdd.call(this, name, data, o);
            }
            return this;
          },
          /**
           * Add a directory to the zip file, or search.
           * @param   {String|RegExp} arg The name of the directory to add, or a regex to search folders.
           * @return  {JSZip} an object with the new directory as the root, or an array containing matching folders.
           */
          folder: function(arg) {
            if (!arg) {
              return this;
            }
            if (utils.isRegExp(arg)) {
              return this.filter(function(relativePath, file) {
                return file.dir && arg.test(relativePath);
              });
            }
            var name = this.root + arg;
            var newFolder = folderAdd.call(this, name);
            var ret = this.clone();
            ret.root = newFolder.name;
            return ret;
          },
          /**
           * Delete a file, or a directory and all sub-files, from the zip
           * @param {string} name the name of the file to delete
           * @return {JSZip} this JSZip object
           */
          remove: function(name) {
            name = this.root + name;
            var file = this.files[name];
            if (!file) {
              if (name.slice(-1) != "/") {
                name += "/";
              }
              file = this.files[name];
            }
            if (file && !file.dir) {
              delete this.files[name];
            } else {
              var kids = this.filter(function(relativePath, file2) {
                return file2.name.slice(0, name.length) === name;
              });
              for (var i2 = 0; i2 < kids.length; i2++) {
                delete this.files[kids[i2].name];
              }
            }
            return this;
          },
          /**
           * Generate the complete zip file
           * @param {Object} options the options to generate the zip file :
           * - base64, (deprecated, use type instead) true to generate base64.
           * - compression, "STORE" by default.
           * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob.
           * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file
           */
          generate: function(options) {
            options = extend(options || {}, {
              base64: true,
              compression: "STORE",
              type: "base64",
              comment: null
            });
            utils.checkSupport(options.type);
            var zipData = [], localDirLength = 0, centralDirLength = 0, writer, i2, utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || ""));
            for (var name in this.files) {
              if (!this.files.hasOwnProperty(name)) {
                continue;
              }
              var file = this.files[name];
              var compressionName = file.options.compression || options.compression.toUpperCase();
              var compression = compressions[compressionName];
              if (!compression) {
                throw new Error(compressionName + " is not a valid compression method !");
              }
              var compressedObject = generateCompressedObjectFrom.call(this, file, compression);
              var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength);
              localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize;
              centralDirLength += zipPart.dirRecord.length;
              zipData.push(zipPart);
            }
            var dirEnd = "";
            dirEnd = signature.CENTRAL_DIRECTORY_END + // number of this disk
            "\0\0\0\0" + // total number of entries in the central directory on this disk
            decToHex(zipData.length, 2) + // total number of entries in the central directory
            decToHex(zipData.length, 2) + // size of the central directory   4 bytes
            decToHex(centralDirLength, 4) + // offset of start of central directory with respect to the starting disk number
            decToHex(localDirLength, 4) + // .ZIP file comment length
            decToHex(utfEncodedComment.length, 2) + // .ZIP file comment
            utfEncodedComment;
            var typeName = options.type.toLowerCase();
            if (typeName === "uint8array" || typeName === "arraybuffer" || typeName === "blob" || typeName === "nodebuffer") {
              writer = new Uint8ArrayWriter(localDirLength + centralDirLength + dirEnd.length);
            } else {
              writer = new StringWriter(localDirLength + centralDirLength + dirEnd.length);
            }
            for (i2 = 0; i2 < zipData.length; i2++) {
              writer.append(zipData[i2].fileRecord);
              writer.append(zipData[i2].compressedObject.compressedContent);
            }
            for (i2 = 0; i2 < zipData.length; i2++) {
              writer.append(zipData[i2].dirRecord);
            }
            writer.append(dirEnd);
            var zip = writer.finalize();
            switch (options.type.toLowerCase()) {
              case "uint8array":
              case "arraybuffer":
              case "nodebuffer":
                return utils.transformTo(options.type.toLowerCase(), zip);
              case "blob":
                return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip));
              case "base64":
                return options.base64 ? base64.encode(zip) : zip;
              default:
                return zip;
            }
          },
          /**
           * @deprecated
           * This method will be removed in a future version without replacement.
           */
          crc32: function(input, crc) {
            return crc32(input, crc);
          },
          /**
           * @deprecated
           * This method will be removed in a future version without replacement.
           */
          utf8encode: function(string) {
            return utils.transformTo("string", utf8.utf8encode(string));
          },
          /**
           * @deprecated
           * This method will be removed in a future version without replacement.
           */
          utf8decode: function(input) {
            return utf8.utf8decode(input);
          }
        };
        module2.exports = out;
      }, { "./base64": 1, "./compressedObject": 2, "./compressions": 3, "./crc32": 4, "./defaults": 6, "./nodeBuffer": 11, "./signature": 14, "./stringWriter": 16, "./support": 17, "./uint8ArrayWriter": 19, "./utf8": 20, "./utils": 21 }], 14: [function(_dereq_, module2, exports2) {
        exports2.LOCAL_FILE_HEADER = "PK";
        exports2.CENTRAL_FILE_HEADER = "PK";
        exports2.CENTRAL_DIRECTORY_END = "PK";
        exports2.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x07";
        exports2.ZIP64_CENTRAL_DIRECTORY_END = "PK";
        exports2.DATA_DESCRIPTOR = "PK\x07\b";
      }, {}], 15: [function(_dereq_, module2, exports2) {
        var DataReader = _dereq_("./dataReader");
        var utils = _dereq_("./utils");
        function StringReader(data, optimizedBinaryString) {
          this.data = data;
          if (!optimizedBinaryString) {
            this.data = utils.string2binary(this.data);
          }
          this.length = this.data.length;
          this.index = 0;
        }
        StringReader.prototype = new DataReader();
        StringReader.prototype.byteAt = function(i2) {
          return this.data.charCodeAt(i2);
        };
        StringReader.prototype.lastIndexOfSignature = function(sig) {
          return this.data.lastIndexOf(sig);
        };
        StringReader.prototype.readData = function(size) {
          this.checkOffset(size);
          var result = this.data.slice(this.index, this.index + size);
          this.index += size;
          return result;
        };
        module2.exports = StringReader;
      }, { "./dataReader": 5, "./utils": 21 }], 16: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./utils");
        var StringWriter = function() {
          this.data = [];
        };
        StringWriter.prototype = {
          /**
           * Append any content to the current string.
           * @param {Object} input the content to add.
           */
          append: function(input) {
            input = utils.transformTo("string", input);
            this.data.push(input);
          },
          /**
           * Finalize the construction an return the result.
           * @return {string} the generated string.
           */
          finalize: function() {
            return this.data.join("");
          }
        };
        module2.exports = StringWriter;
      }, { "./utils": 21 }], 17: [function(_dereq_, module2, exports2) {
        (function(Buffer2) {
          exports2.base64 = true;
          exports2.array = true;
          exports2.string = true;
          exports2.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined";
          exports2.nodebuffer = typeof Buffer2 !== "undefined";
          exports2.uint8array = typeof Uint8Array !== "undefined";
          if (typeof ArrayBuffer === "undefined") {
            exports2.blob = false;
          } else {
            var buffer = new ArrayBuffer(0);
            try {
              exports2.blob = new Blob([buffer], {
                type: "application/zip"
              }).size === 0;
            } catch (e) {
              try {
                var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
                var builder = new Builder();
                builder.append(buffer);
                exports2.blob = builder.getBlob("application/zip").size === 0;
              } catch (e2) {
                exports2.blob = false;
              }
            }
          }
        }).call(this, typeof Buffer !== "undefined" ? Buffer : void 0);
      }, {}], 18: [function(_dereq_, module2, exports2) {
        var DataReader = _dereq_("./dataReader");
        function Uint8ArrayReader(data) {
          if (data) {
            this.data = data;
            this.length = this.data.length;
            this.index = 0;
          }
        }
        Uint8ArrayReader.prototype = new DataReader();
        Uint8ArrayReader.prototype.byteAt = function(i2) {
          return this.data[i2];
        };
        Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) {
          var sig0 = sig.charCodeAt(0), sig1 = sig.charCodeAt(1), sig2 = sig.charCodeAt(2), sig3 = sig.charCodeAt(3);
          for (var i2 = this.length - 4; i2 >= 0; --i2) {
            if (this.data[i2] === sig0 && this.data[i2 + 1] === sig1 && this.data[i2 + 2] === sig2 && this.data[i2 + 3] === sig3) {
              return i2;
            }
          }
          return -1;
        };
        Uint8ArrayReader.prototype.readData = function(size) {
          this.checkOffset(size);
          if (size === 0) {
            return new Uint8Array(0);
          }
          var result = this.data.subarray(this.index, this.index + size);
          this.index += size;
          return result;
        };
        module2.exports = Uint8ArrayReader;
      }, { "./dataReader": 5 }], 19: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./utils");
        var Uint8ArrayWriter = function(length) {
          this.data = new Uint8Array(length);
          this.index = 0;
        };
        Uint8ArrayWriter.prototype = {
          /**
           * Append any content to the current array.
           * @param {Object} input the content to add.
           */
          append: function(input) {
            if (input.length !== 0) {
              input = utils.transformTo("uint8array", input);
              this.data.set(input, this.index);
              this.index += input.length;
            }
          },
          /**
           * Finalize the construction an return the result.
           * @return {Uint8Array} the generated array.
           */
          finalize: function() {
            return this.data;
          }
        };
        module2.exports = Uint8ArrayWriter;
      }, { "./utils": 21 }], 20: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./utils");
        var support = _dereq_("./support");
        var nodeBuffer = _dereq_("./nodeBuffer");
        var _utf8len = new Array(256);
        for (var i2 = 0; i2 < 256; i2++) {
          _utf8len[i2] = i2 >= 252 ? 6 : i2 >= 248 ? 5 : i2 >= 240 ? 4 : i2 >= 224 ? 3 : i2 >= 192 ? 2 : 1;
        }
        _utf8len[254] = _utf8len[254] = 1;
        var string2buf = function(str) {
          var buf, c, c2, m_pos, i3, str_len = str.length, buf_len = 0;
          for (m_pos = 0; m_pos < str_len; m_pos++) {
            c = str.charCodeAt(m_pos);
            if ((c & 64512) === 55296 && m_pos + 1 < str_len) {
              c2 = str.charCodeAt(m_pos + 1);
              if ((c2 & 64512) === 56320) {
                c = 65536 + (c - 55296 << 10) + (c2 - 56320);
                m_pos++;
              }
            }
            buf_len += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4;
          }
          if (support.uint8array) {
            buf = new Uint8Array(buf_len);
          } else {
            buf = new Array(buf_len);
          }
          for (i3 = 0, m_pos = 0; i3 < buf_len; m_pos++) {
            c = str.charCodeAt(m_pos);
            if ((c & 64512) === 55296 && m_pos + 1 < str_len) {
              c2 = str.charCodeAt(m_pos + 1);
              if ((c2 & 64512) === 56320) {
                c = 65536 + (c - 55296 << 10) + (c2 - 56320);
                m_pos++;
              }
            }
            if (c < 128) {
              buf[i3++] = c;
            } else if (c < 2048) {
              buf[i3++] = 192 | c >>> 6;
              buf[i3++] = 128 | c & 63;
            } else if (c < 65536) {
              buf[i3++] = 224 | c >>> 12;
              buf[i3++] = 128 | c >>> 6 & 63;
              buf[i3++] = 128 | c & 63;
            } else {
              buf[i3++] = 240 | c >>> 18;
              buf[i3++] = 128 | c >>> 12 & 63;
              buf[i3++] = 128 | c >>> 6 & 63;
              buf[i3++] = 128 | c & 63;
            }
          }
          return buf;
        };
        var utf8border = function(buf, max) {
          var pos;
          max = max || buf.length;
          if (max > buf.length) {
            max = buf.length;
          }
          pos = max - 1;
          while (pos >= 0 && (buf[pos] & 192) === 128) {
            pos--;
          }
          if (pos < 0) {
            return max;
          }
          if (pos === 0) {
            return max;
          }
          return pos + _utf8len[buf[pos]] > max ? pos : max;
        };
        var buf2string = function(buf) {
          var i3, out, c, c_len;
          var len = buf.length;
          var utf16buf = new Array(len * 2);
          for (out = 0, i3 = 0; i3 < len; ) {
            c = buf[i3++];
            if (c < 128) {
              utf16buf[out++] = c;
              continue;
            }
            c_len = _utf8len[c];
            if (c_len > 4) {
              utf16buf[out++] = 65533;
              i3 += c_len - 1;
              continue;
            }
            c &= c_len === 2 ? 31 : c_len === 3 ? 15 : 7;
            while (c_len > 1 && i3 < len) {
              c = c << 6 | buf[i3++] & 63;
              c_len--;
            }
            if (c_len > 1) {
              utf16buf[out++] = 65533;
              continue;
            }
            if (c < 65536) {
              utf16buf[out++] = c;
            } else {
              c -= 65536;
              utf16buf[out++] = 55296 | c >> 10 & 1023;
              utf16buf[out++] = 56320 | c & 1023;
            }
          }
          if (utf16buf.length !== out) {
            if (utf16buf.subarray) {
              utf16buf = utf16buf.subarray(0, out);
            } else {
              utf16buf.length = out;
            }
          }
          return utils.applyFromCharCode(utf16buf);
        };
        exports2.utf8encode = function utf8encode(str) {
          if (support.nodebuffer) {
            return nodeBuffer(str, "utf-8");
          }
          return string2buf(str);
        };
        exports2.utf8decode = function utf8decode(buf) {
          if (support.nodebuffer) {
            return utils.transformTo("nodebuffer", buf).toString("utf-8");
          }
          buf = utils.transformTo(support.uint8array ? "uint8array" : "array", buf);
          var result = [], k = 0, len = buf.length, chunk = 65536;
          while (k < len) {
            var nextBoundary = utf8border(buf, Math.min(k + chunk, len));
            if (support.uint8array) {
              result.push(buf2string(buf.subarray(k, nextBoundary)));
            } else {
              result.push(buf2string(buf.slice(k, nextBoundary)));
            }
            k = nextBoundary;
          }
          return result.join("");
        };
      }, { "./nodeBuffer": 11, "./support": 17, "./utils": 21 }], 21: [function(_dereq_, module2, exports2) {
        var support = _dereq_("./support");
        var compressions = _dereq_("./compressions");
        var nodeBuffer = _dereq_("./nodeBuffer");
        exports2.string2binary = function(str) {
          var result = "";
          for (var i2 = 0; i2 < str.length; i2++) {
            result += String.fromCharCode(str.charCodeAt(i2) & 255);
          }
          return result;
        };
        exports2.arrayBuffer2Blob = function(buffer) {
          exports2.checkSupport("blob");
          try {
            return new Blob([buffer], {
              type: "application/zip"
            });
          } catch (e) {
            try {
              var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder;
              var builder = new Builder();
              builder.append(buffer);
              return builder.getBlob("application/zip");
            } catch (e2) {
              throw new Error("Bug : can't construct the Blob.");
            }
          }
        };
        function identity(input) {
          return input;
        }
        function stringToArrayLike(str, array) {
          for (var i2 = 0; i2 < str.length; ++i2) {
            array[i2] = str.charCodeAt(i2) & 255;
          }
          return array;
        }
        function arrayLikeToString(array) {
          var chunk = 65536;
          var result = [], len = array.length, type = exports2.getTypeOf(array), k = 0, canUseApply = true;
          try {
            switch (type) {
              case "uint8array":
                String.fromCharCode.apply(null, new Uint8Array(0));
                break;
              case "nodebuffer":
                String.fromCharCode.apply(null, nodeBuffer(0));
                break;
            }
          } catch (e) {
            canUseApply = false;
          }
          if (!canUseApply) {
            var resultStr = "";
            for (var i2 = 0; i2 < array.length; i2++) {
              resultStr += String.fromCharCode(array[i2]);
            }
            return resultStr;
          }
          while (k < len && chunk > 1) {
            try {
              if (type === "array" || type === "nodebuffer") {
                result.push(String.fromCharCode.apply(null, array.slice(k, Math.min(k + chunk, len))));
              } else {
                result.push(String.fromCharCode.apply(null, array.subarray(k, Math.min(k + chunk, len))));
              }
              k += chunk;
            } catch (e) {
              chunk = Math.floor(chunk / 2);
            }
          }
          return result.join("");
        }
        exports2.applyFromCharCode = arrayLikeToString;
        function arrayLikeToArrayLike(arrayFrom, arrayTo) {
          for (var i2 = 0; i2 < arrayFrom.length; i2++) {
            arrayTo[i2] = arrayFrom[i2];
          }
          return arrayTo;
        }
        var transform = {};
        transform["string"] = {
          "string": identity,
          "array": function(input) {
            return stringToArrayLike(input, new Array(input.length));
          },
          "arraybuffer": function(input) {
            return transform["string"]["uint8array"](input).buffer;
          },
          "uint8array": function(input) {
            return stringToArrayLike(input, new Uint8Array(input.length));
          },
          "nodebuffer": function(input) {
            return stringToArrayLike(input, nodeBuffer(input.length));
          }
        };
        transform["array"] = {
          "string": arrayLikeToString,
          "array": identity,
          "arraybuffer": function(input) {
            return new Uint8Array(input).buffer;
          },
          "uint8array": function(input) {
            return new Uint8Array(input);
          },
          "nodebuffer": function(input) {
            return nodeBuffer(input);
          }
        };
        transform["arraybuffer"] = {
          "string": function(input) {
            return arrayLikeToString(new Uint8Array(input));
          },
          "array": function(input) {
            return arrayLikeToArrayLike(new Uint8Array(input), new Array(input.byteLength));
          },
          "arraybuffer": identity,
          "uint8array": function(input) {
            return new Uint8Array(input);
          },
          "nodebuffer": function(input) {
            return nodeBuffer(new Uint8Array(input));
          }
        };
        transform["uint8array"] = {
          "string": arrayLikeToString,
          "array": function(input) {
            return arrayLikeToArrayLike(input, new Array(input.length));
          },
          "arraybuffer": function(input) {
            return input.buffer;
          },
          "uint8array": identity,
          "nodebuffer": function(input) {
            return nodeBuffer(input);
          }
        };
        transform["nodebuffer"] = {
          "string": arrayLikeToString,
          "array": function(input) {
            return arrayLikeToArrayLike(input, new Array(input.length));
          },
          "arraybuffer": function(input) {
            return transform["nodebuffer"]["uint8array"](input).buffer;
          },
          "uint8array": function(input) {
            return arrayLikeToArrayLike(input, new Uint8Array(input.length));
          },
          "nodebuffer": identity
        };
        exports2.transformTo = function(outputType, input) {
          if (!input) {
            input = "";
          }
          if (!outputType) {
            return input;
          }
          exports2.checkSupport(outputType);
          var inputType = exports2.getTypeOf(input);
          var result = transform[inputType][outputType](input);
          return result;
        };
        exports2.getTypeOf = function(input) {
          if (typeof input === "string") {
            return "string";
          }
          if (Object.prototype.toString.call(input) === "[object Array]") {
            return "array";
          }
          if (support.nodebuffer && nodeBuffer.test(input)) {
            return "nodebuffer";
          }
          if (support.uint8array && input instanceof Uint8Array) {
            return "uint8array";
          }
          if (support.arraybuffer && input instanceof ArrayBuffer) {
            return "arraybuffer";
          }
        };
        exports2.checkSupport = function(type) {
          var supported = support[type.toLowerCase()];
          if (!supported) {
            throw new Error(type + " is not supported by this browser");
          }
        };
        exports2.MAX_VALUE_16BITS = 65535;
        exports2.MAX_VALUE_32BITS = -1;
        exports2.pretty = function(str) {
          var res = "", code, i2;
          for (i2 = 0; i2 < (str || "").length; i2++) {
            code = str.charCodeAt(i2);
            res += "\\x" + (code < 16 ? "0" : "") + code.toString(16).toUpperCase();
          }
          return res;
        };
        exports2.findCompression = function(compressionMethod) {
          for (var method in compressions) {
            if (!compressions.hasOwnProperty(method)) {
              continue;
            }
            if (compressions[method].magic === compressionMethod) {
              return compressions[method];
            }
          }
          return null;
        };
        exports2.isRegExp = function(object) {
          return Object.prototype.toString.call(object) === "[object RegExp]";
        };
      }, { "./compressions": 3, "./nodeBuffer": 11, "./support": 17 }], 22: [function(_dereq_, module2, exports2) {
        var StringReader = _dereq_("./stringReader");
        var NodeBufferReader = _dereq_("./nodeBufferReader");
        var Uint8ArrayReader = _dereq_("./uint8ArrayReader");
        var utils = _dereq_("./utils");
        var sig = _dereq_("./signature");
        var ZipEntry = _dereq_("./zipEntry");
        var support = _dereq_("./support");
        var jszipProto = _dereq_("./object");
        function ZipEntries(data, loadOptions) {
          this.files = [];
          this.loadOptions = loadOptions;
          if (data) {
            this.load(data);
          }
        }
        ZipEntries.prototype = {
          /**
           * Check that the reader is on the speficied signature.
           * @param {string} expectedSignature the expected signature.
           * @throws {Error} if it is an other signature.
           */
          checkSignature: function(expectedSignature) {
            var signature = this.reader.readString(4);
            if (signature !== expectedSignature) {
              throw new Error("Corrupted zip or bug : unexpected signature (" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")");
            }
          },
          /**
           * Read the end of the central directory.
           */
          readBlockEndOfCentral: function() {
            this.diskNumber = this.reader.readInt(2);
            this.diskWithCentralDirStart = this.reader.readInt(2);
            this.centralDirRecordsOnThisDisk = this.reader.readInt(2);
            this.centralDirRecords = this.reader.readInt(2);
            this.centralDirSize = this.reader.readInt(4);
            this.centralDirOffset = this.reader.readInt(4);
            this.zipCommentLength = this.reader.readInt(2);
            this.zipComment = this.reader.readString(this.zipCommentLength);
            this.zipComment = jszipProto.utf8decode(this.zipComment);
          },
          /**
           * Read the end of the Zip 64 central directory.
           * Not merged with the method readEndOfCentral :
           * The end of central can coexist with its Zip64 brother,
           * I don't want to read the wrong number of bytes !
           */
          readBlockZip64EndOfCentral: function() {
            this.zip64EndOfCentralSize = this.reader.readInt(8);
            this.versionMadeBy = this.reader.readString(2);
            this.versionNeeded = this.reader.readInt(2);
            this.diskNumber = this.reader.readInt(4);
            this.diskWithCentralDirStart = this.reader.readInt(4);
            this.centralDirRecordsOnThisDisk = this.reader.readInt(8);
            this.centralDirRecords = this.reader.readInt(8);
            this.centralDirSize = this.reader.readInt(8);
            this.centralDirOffset = this.reader.readInt(8);
            this.zip64ExtensibleData = {};
            var extraDataSize = this.zip64EndOfCentralSize - 44, index2 = 0, extraFieldId, extraFieldLength, extraFieldValue;
            while (index2 < extraDataSize) {
              extraFieldId = this.reader.readInt(2);
              extraFieldLength = this.reader.readInt(4);
              extraFieldValue = this.reader.readString(extraFieldLength);
              this.zip64ExtensibleData[extraFieldId] = {
                id: extraFieldId,
                length: extraFieldLength,
                value: extraFieldValue
              };
            }
          },
          /**
           * Read the end of the Zip 64 central directory locator.
           */
          readBlockZip64EndOfCentralLocator: function() {
            this.diskWithZip64CentralDirStart = this.reader.readInt(4);
            this.relativeOffsetEndOfZip64CentralDir = this.reader.readInt(8);
            this.disksCount = this.reader.readInt(4);
            if (this.disksCount > 1) {
              throw new Error("Multi-volumes zip are not supported");
            }
          },
          /**
           * Read the local files, based on the offset read in the central part.
           */
          readLocalFiles: function() {
            var i2, file;
            for (i2 = 0; i2 < this.files.length; i2++) {
              file = this.files[i2];
              this.reader.setIndex(file.localHeaderOffset);
              this.checkSignature(sig.LOCAL_FILE_HEADER);
              file.readLocalPart(this.reader);
              file.handleUTF8();
            }
          },
          /**
           * Read the central directory.
           */
          readCentralDir: function() {
            var file;
            this.reader.setIndex(this.centralDirOffset);
            while (this.reader.readString(4) === sig.CENTRAL_FILE_HEADER) {
              file = new ZipEntry({
                zip64: this.zip64
              }, this.loadOptions);
              file.readCentralPart(this.reader);
              this.files.push(file);
            }
          },
          /**
           * Read the end of central directory.
           */
          readEndOfCentral: function() {
            var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END);
            if (offset === -1) {
              throw new Error("Corrupted zip : can't find end of central directory");
            }
            this.reader.setIndex(offset);
            this.checkSignature(sig.CENTRAL_DIRECTORY_END);
            this.readBlockEndOfCentral();
            if (this.diskNumber === utils.MAX_VALUE_16BITS || this.diskWithCentralDirStart === utils.MAX_VALUE_16BITS || this.centralDirRecordsOnThisDisk === utils.MAX_VALUE_16BITS || this.centralDirRecords === utils.MAX_VALUE_16BITS || this.centralDirSize === utils.MAX_VALUE_32BITS || this.centralDirOffset === utils.MAX_VALUE_32BITS) {
              this.zip64 = true;
              offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
              if (offset === -1) {
                throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");
              }
              this.reader.setIndex(offset);
              this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR);
              this.readBlockZip64EndOfCentralLocator();
              this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir);
              this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END);
              this.readBlockZip64EndOfCentral();
            }
          },
          prepareReader: function(data) {
            var type = utils.getTypeOf(data);
            if (type === "string" && !support.uint8array) {
              this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString);
            } else if (type === "nodebuffer") {
              this.reader = new NodeBufferReader(data);
            } else {
              this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data));
            }
          },
          /**
           * Read a zip file and create ZipEntries.
           * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file.
           */
          load: function(data) {
            this.prepareReader(data);
            this.readEndOfCentral();
            this.readCentralDir();
            this.readLocalFiles();
          }
        };
        module2.exports = ZipEntries;
      }, { "./nodeBufferReader": 12, "./object": 13, "./signature": 14, "./stringReader": 15, "./support": 17, "./uint8ArrayReader": 18, "./utils": 21, "./zipEntry": 23 }], 23: [function(_dereq_, module2, exports2) {
        var StringReader = _dereq_("./stringReader");
        var utils = _dereq_("./utils");
        var CompressedObject = _dereq_("./compressedObject");
        var jszipProto = _dereq_("./object");
        function ZipEntry(options, loadOptions) {
          this.options = options;
          this.loadOptions = loadOptions;
        }
        ZipEntry.prototype = {
          /**
           * say if the file is encrypted.
           * @return {boolean} true if the file is encrypted, false otherwise.
           */
          isEncrypted: function() {
            return (this.bitFlag & 1) === 1;
          },
          /**
           * say if the file has utf-8 filename/comment.
           * @return {boolean} true if the filename/comment is in utf-8, false otherwise.
           */
          useUTF8: function() {
            return (this.bitFlag & 2048) === 2048;
          },
          /**
           * Prepare the function used to generate the compressed content from this ZipFile.
           * @param {DataReader} reader the reader to use.
           * @param {number} from the offset from where we should read the data.
           * @param {number} length the length of the data to read.
           * @return {Function} the callback to get the compressed content (the type depends of the DataReader class).
           */
          prepareCompressedContent: function(reader, from, length) {
            return function() {
              var previousIndex = reader.index;
              reader.setIndex(from);
              var compressedFileData = reader.readData(length);
              reader.setIndex(previousIndex);
              return compressedFileData;
            };
          },
          /**
           * Prepare the function used to generate the uncompressed content from this ZipFile.
           * @param {DataReader} reader the reader to use.
           * @param {number} from the offset from where we should read the data.
           * @param {number} length the length of the data to read.
           * @param {JSZip.compression} compression the compression used on this file.
           * @param {number} uncompressedSize the uncompressed size to expect.
           * @return {Function} the callback to get the uncompressed content (the type depends of the DataReader class).
           */
          prepareContent: function(reader, from, length, compression, uncompressedSize) {
            return function() {
              var compressedFileData = utils.transformTo(compression.uncompressInputType, this.getCompressedContent());
              var uncompressedFileData = compression.uncompress(compressedFileData);
              if (uncompressedFileData.length !== uncompressedSize) {
                throw new Error("Bug : uncompressed data size mismatch");
              }
              return uncompressedFileData;
            };
          },
          /**
           * Read the local part of a zip file and add the info in this object.
           * @param {DataReader} reader the reader to use.
           */
          readLocalPart: function(reader) {
            var compression, localExtraFieldsLength;
            reader.skip(22);
            this.fileNameLength = reader.readInt(2);
            localExtraFieldsLength = reader.readInt(2);
            this.fileName = reader.readString(this.fileNameLength);
            reader.skip(localExtraFieldsLength);
            if (this.compressedSize == -1 || this.uncompressedSize == -1) {
              throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize == -1 || uncompressedSize == -1)");
            }
            compression = utils.findCompression(this.compressionMethod);
            if (compression === null) {
              throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")");
            }
            this.decompressed = new CompressedObject();
            this.decompressed.compressedSize = this.compressedSize;
            this.decompressed.uncompressedSize = this.uncompressedSize;
            this.decompressed.crc32 = this.crc32;
            this.decompressed.compressionMethod = this.compressionMethod;
            this.decompressed.getCompressedContent = this.prepareCompressedContent(reader, reader.index, this.compressedSize, compression);
            this.decompressed.getContent = this.prepareContent(reader, reader.index, this.compressedSize, compression, this.uncompressedSize);
            if (this.loadOptions.checkCRC32) {
              this.decompressed = utils.transformTo("string", this.decompressed.getContent());
              if (jszipProto.crc32(this.decompressed) !== this.crc32) {
                throw new Error("Corrupted zip : CRC32 mismatch");
              }
            }
          },
          /**
           * Read the central part of a zip file and add the info in this object.
           * @param {DataReader} reader the reader to use.
           */
          readCentralPart: function(reader) {
            this.versionMadeBy = reader.readString(2);
            this.versionNeeded = reader.readInt(2);
            this.bitFlag = reader.readInt(2);
            this.compressionMethod = reader.readString(2);
            this.date = reader.readDate();
            this.crc32 = reader.readInt(4);
            this.compressedSize = reader.readInt(4);
            this.uncompressedSize = reader.readInt(4);
            this.fileNameLength = reader.readInt(2);
            this.extraFieldsLength = reader.readInt(2);
            this.fileCommentLength = reader.readInt(2);
            this.diskNumberStart = reader.readInt(2);
            this.internalFileAttributes = reader.readInt(2);
            this.externalFileAttributes = reader.readInt(4);
            this.localHeaderOffset = reader.readInt(4);
            if (this.isEncrypted()) {
              throw new Error("Encrypted zip are not supported");
            }
            this.fileName = reader.readString(this.fileNameLength);
            this.readExtraFields(reader);
            this.parseZIP64ExtraField(reader);
            this.fileComment = reader.readString(this.fileCommentLength);
            this.dir = this.externalFileAttributes & 16 ? true : false;
          },
          /**
           * Parse the ZIP64 extra field and merge the info in the current ZipEntry.
           * @param {DataReader} reader the reader to use.
           */
          parseZIP64ExtraField: function(reader) {
            if (!this.extraFields[1]) {
              return;
            }
            var extraReader = new StringReader(this.extraFields[1].value);
            if (this.uncompressedSize === utils.MAX_VALUE_32BITS) {
              this.uncompressedSize = extraReader.readInt(8);
            }
            if (this.compressedSize === utils.MAX_VALUE_32BITS) {
              this.compressedSize = extraReader.readInt(8);
            }
            if (this.localHeaderOffset === utils.MAX_VALUE_32BITS) {
              this.localHeaderOffset = extraReader.readInt(8);
            }
            if (this.diskNumberStart === utils.MAX_VALUE_32BITS) {
              this.diskNumberStart = extraReader.readInt(4);
            }
          },
          /**
           * Read the central part of a zip file and add the info in this object.
           * @param {DataReader} reader the reader to use.
           */
          readExtraFields: function(reader) {
            var start = reader.index, extraFieldId, extraFieldLength, extraFieldValue;
            this.extraFields = this.extraFields || {};
            while (reader.index < start + this.extraFieldsLength) {
              extraFieldId = reader.readInt(2);
              extraFieldLength = reader.readInt(2);
              extraFieldValue = reader.readString(extraFieldLength);
              this.extraFields[extraFieldId] = {
                id: extraFieldId,
                length: extraFieldLength,
                value: extraFieldValue
              };
            }
          },
          /**
           * Apply an UTF8 transformation if needed.
           */
          handleUTF8: function() {
            if (this.useUTF8()) {
              this.fileName = jszipProto.utf8decode(this.fileName);
              this.fileComment = jszipProto.utf8decode(this.fileComment);
            } else {
              var upath = this.findExtraFieldUnicodePath();
              if (upath !== null) {
                this.fileName = upath;
              }
              var ucomment = this.findExtraFieldUnicodeComment();
              if (ucomment !== null) {
                this.fileComment = ucomment;
              }
            }
          },
          /**
           * Find the unicode path declared in the extra field, if any.
           * @return {String} the unicode path, null otherwise.
           */
          findExtraFieldUnicodePath: function() {
            var upathField = this.extraFields[28789];
            if (upathField) {
              var extraReader = new StringReader(upathField.value);
              if (extraReader.readInt(1) !== 1) {
                return null;
              }
              if (jszipProto.crc32(this.fileName) !== extraReader.readInt(4)) {
                return null;
              }
              return jszipProto.utf8decode(extraReader.readString(upathField.length - 5));
            }
            return null;
          },
          /**
           * Find the unicode comment declared in the extra field, if any.
           * @return {String} the unicode comment, null otherwise.
           */
          findExtraFieldUnicodeComment: function() {
            var ucommentField = this.extraFields[25461];
            if (ucommentField) {
              var extraReader = new StringReader(ucommentField.value);
              if (extraReader.readInt(1) !== 1) {
                return null;
              }
              if (jszipProto.crc32(this.fileComment) !== extraReader.readInt(4)) {
                return null;
              }
              return jszipProto.utf8decode(extraReader.readString(ucommentField.length - 5));
            }
            return null;
          }
        };
        module2.exports = ZipEntry;
      }, { "./compressedObject": 2, "./object": 13, "./stringReader": 15, "./utils": 21 }], 24: [function(_dereq_, module2, exports2) {
        var assign = _dereq_("./lib/utils/common").assign;
        var deflate = _dereq_("./lib/deflate");
        var inflate = _dereq_("./lib/inflate");
        var constants = _dereq_("./lib/zlib/constants");
        var pako = {};
        assign(pako, deflate, inflate, constants);
        module2.exports = pako;
      }, { "./lib/deflate": 25, "./lib/inflate": 26, "./lib/utils/common": 27, "./lib/zlib/constants": 30 }], 25: [function(_dereq_, module2, exports2) {
        var zlib_deflate = _dereq_("./zlib/deflate.js");
        var utils = _dereq_("./utils/common");
        var strings = _dereq_("./utils/strings");
        var msg = _dereq_("./zlib/messages");
        var zstream = _dereq_("./zlib/zstream");
        var Z_NO_FLUSH = 0;
        var Z_FINISH = 4;
        var Z_OK = 0;
        var Z_STREAM_END = 1;
        var Z_DEFAULT_COMPRESSION = -1;
        var Z_DEFAULT_STRATEGY = 0;
        var Z_DEFLATED = 8;
        var Deflate = function(options) {
          this.options = utils.assign({
            level: Z_DEFAULT_COMPRESSION,
            method: Z_DEFLATED,
            chunkSize: 16384,
            windowBits: 15,
            memLevel: 8,
            strategy: Z_DEFAULT_STRATEGY,
            to: ""
          }, options || {});
          var opt = this.options;
          if (opt.raw && opt.windowBits > 0) {
            opt.windowBits = -opt.windowBits;
          } else if (opt.gzip && opt.windowBits > 0 && opt.windowBits < 16) {
            opt.windowBits += 16;
          }
          this.err = 0;
          this.msg = "";
          this.ended = false;
          this.chunks = [];
          this.strm = new zstream();
          this.strm.avail_out = 0;
          var status = zlib_deflate.deflateInit2(
            this.strm,
            opt.level,
            opt.method,
            opt.windowBits,
            opt.memLevel,
            opt.strategy
          );
          if (status !== Z_OK) {
            throw new Error(msg[status]);
          }
          if (opt.header) {
            zlib_deflate.deflateSetHeader(this.strm, opt.header);
          }
        };
        Deflate.prototype.push = function(data, mode) {
          var strm = this.strm;
          var chunkSize = this.options.chunkSize;
          var status, _mode;
          if (this.ended) {
            return false;
          }
          _mode = mode === ~~mode ? mode : mode === true ? Z_FINISH : Z_NO_FLUSH;
          if (typeof data === "string") {
            strm.input = strings.string2buf(data);
          } else {
            strm.input = data;
          }
          strm.next_in = 0;
          strm.avail_in = strm.input.length;
          do {
            if (strm.avail_out === 0) {
              strm.output = new utils.Buf8(chunkSize);
              strm.next_out = 0;
              strm.avail_out = chunkSize;
            }
            status = zlib_deflate.deflate(strm, _mode);
            if (status !== Z_STREAM_END && status !== Z_OK) {
              this.onEnd(status);
              this.ended = true;
              return false;
            }
            if (strm.avail_out === 0 || strm.avail_in === 0 && _mode === Z_FINISH) {
              if (this.options.to === "string") {
                this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));
              } else {
                this.onData(utils.shrinkBuf(strm.output, strm.next_out));
              }
            }
          } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);
          if (_mode === Z_FINISH) {
            status = zlib_deflate.deflateEnd(this.strm);
            this.onEnd(status);
            this.ended = true;
            return status === Z_OK;
          }
          return true;
        };
        Deflate.prototype.onData = function(chunk) {
          this.chunks.push(chunk);
        };
        Deflate.prototype.onEnd = function(status) {
          if (status === Z_OK) {
            if (this.options.to === "string") {
              this.result = this.chunks.join("");
            } else {
              this.result = utils.flattenChunks(this.chunks);
            }
          }
          this.chunks = [];
          this.err = status;
          this.msg = this.strm.msg;
        };
        function deflate(input, options) {
          var deflator = new Deflate(options);
          deflator.push(input, true);
          if (deflator.err) {
            throw deflator.msg;
          }
          return deflator.result;
        }
        function deflateRaw(input, options) {
          options = options || {};
          options.raw = true;
          return deflate(input, options);
        }
        function gzip(input, options) {
          options = options || {};
          options.gzip = true;
          return deflate(input, options);
        }
        exports2.Deflate = Deflate;
        exports2.deflate = deflate;
        exports2.deflateRaw = deflateRaw;
        exports2.gzip = gzip;
      }, { "./utils/common": 27, "./utils/strings": 28, "./zlib/deflate.js": 32, "./zlib/messages": 37, "./zlib/zstream": 39 }], 26: [function(_dereq_, module2, exports2) {
        var zlib_inflate = _dereq_("./zlib/inflate.js");
        var utils = _dereq_("./utils/common");
        var strings = _dereq_("./utils/strings");
        var c = _dereq_("./zlib/constants");
        var msg = _dereq_("./zlib/messages");
        var zstream = _dereq_("./zlib/zstream");
        var gzheader = _dereq_("./zlib/gzheader");
        var Inflate = function(options) {
          this.options = utils.assign({
            chunkSize: 16384,
            windowBits: 0,
            to: ""
          }, options || {});
          var opt = this.options;
          if (opt.raw && opt.windowBits >= 0 && opt.windowBits < 16) {
            opt.windowBits = -opt.windowBits;
            if (opt.windowBits === 0) {
              opt.windowBits = -15;
            }
          }
          if (opt.windowBits >= 0 && opt.windowBits < 16 && !(options && options.windowBits)) {
            opt.windowBits += 32;
          }
          if (opt.windowBits > 15 && opt.windowBits < 48) {
            if ((opt.windowBits & 15) === 0) {
              opt.windowBits |= 15;
            }
          }
          this.err = 0;
          this.msg = "";
          this.ended = false;
          this.chunks = [];
          this.strm = new zstream();
          this.strm.avail_out = 0;
          var status = zlib_inflate.inflateInit2(
            this.strm,
            opt.windowBits
          );
          if (status !== c.Z_OK) {
            throw new Error(msg[status]);
          }
          this.header = new gzheader();
          zlib_inflate.inflateGetHeader(this.strm, this.header);
        };
        Inflate.prototype.push = function(data, mode) {
          var strm = this.strm;
          var chunkSize = this.options.chunkSize;
          var status, _mode;
          var next_out_utf8, tail, utf8str;
          if (this.ended) {
            return false;
          }
          _mode = mode === ~~mode ? mode : mode === true ? c.Z_FINISH : c.Z_NO_FLUSH;
          if (typeof data === "string") {
            strm.input = strings.binstring2buf(data);
          } else {
            strm.input = data;
          }
          strm.next_in = 0;
          strm.avail_in = strm.input.length;
          do {
            if (strm.avail_out === 0) {
              strm.output = new utils.Buf8(chunkSize);
              strm.next_out = 0;
              strm.avail_out = chunkSize;
            }
            status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);
            if (status !== c.Z_STREAM_END && status !== c.Z_OK) {
              this.onEnd(status);
              this.ended = true;
              return false;
            }
            if (strm.next_out) {
              if (strm.avail_out === 0 || status === c.Z_STREAM_END || strm.avail_in === 0 && _mode === c.Z_FINISH) {
                if (this.options.to === "string") {
                  next_out_utf8 = strings.utf8border(strm.output, strm.next_out);
                  tail = strm.next_out - next_out_utf8;
                  utf8str = strings.buf2string(strm.output, next_out_utf8);
                  strm.next_out = tail;
                  strm.avail_out = chunkSize - tail;
                  if (tail) {
                    utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0);
                  }
                  this.onData(utf8str);
                } else {
                  this.onData(utils.shrinkBuf(strm.output, strm.next_out));
                }
              }
            }
          } while (strm.avail_in > 0 && status !== c.Z_STREAM_END);
          if (status === c.Z_STREAM_END) {
            _mode = c.Z_FINISH;
          }
          if (_mode === c.Z_FINISH) {
            status = zlib_inflate.inflateEnd(this.strm);
            this.onEnd(status);
            this.ended = true;
            return status === c.Z_OK;
          }
          return true;
        };
        Inflate.prototype.onData = function(chunk) {
          this.chunks.push(chunk);
        };
        Inflate.prototype.onEnd = function(status) {
          if (status === c.Z_OK) {
            if (this.options.to === "string") {
              this.result = this.chunks.join("");
            } else {
              this.result = utils.flattenChunks(this.chunks);
            }
          }
          this.chunks = [];
          this.err = status;
          this.msg = this.strm.msg;
        };
        function inflate(input, options) {
          var inflator = new Inflate(options);
          inflator.push(input, true);
          if (inflator.err) {
            throw inflator.msg;
          }
          return inflator.result;
        }
        function inflateRaw(input, options) {
          options = options || {};
          options.raw = true;
          return inflate(input, options);
        }
        exports2.Inflate = Inflate;
        exports2.inflate = inflate;
        exports2.inflateRaw = inflateRaw;
        exports2.ungzip = inflate;
      }, { "./utils/common": 27, "./utils/strings": 28, "./zlib/constants": 30, "./zlib/gzheader": 33, "./zlib/inflate.js": 35, "./zlib/messages": 37, "./zlib/zstream": 39 }], 27: [function(_dereq_, module2, exports2) {
        var TYPED_OK = typeof Uint8Array !== "undefined" && typeof Uint16Array !== "undefined" && typeof Int32Array !== "undefined";
        exports2.assign = function(obj) {
          var sources = Array.prototype.slice.call(arguments, 1);
          while (sources.length) {
            var source = sources.shift();
            if (!source) {
              continue;
            }
            if (typeof source !== "object") {
              throw new TypeError(source + "must be non-object");
            }
            for (var p in source) {
              if (source.hasOwnProperty(p)) {
                obj[p] = source[p];
              }
            }
          }
          return obj;
        };
        exports2.shrinkBuf = function(buf, size) {
          if (buf.length === size) {
            return buf;
          }
          if (buf.subarray) {
            return buf.subarray(0, size);
          }
          buf.length = size;
          return buf;
        };
        var fnTyped = {
          arraySet: function(dest, src, src_offs, len, dest_offs) {
            if (src.subarray && dest.subarray) {
              dest.set(src.subarray(src_offs, src_offs + len), dest_offs);
              return;
            }
            for (var i2 = 0; i2 < len; i2++) {
              dest[dest_offs + i2] = src[src_offs + i2];
            }
          },
          // Join array of chunks to single array.
          flattenChunks: function(chunks) {
            var i2, l, len, pos, chunk, result;
            len = 0;
            for (i2 = 0, l = chunks.length; i2 < l; i2++) {
              len += chunks[i2].length;
            }
            result = new Uint8Array(len);
            pos = 0;
            for (i2 = 0, l = chunks.length; i2 < l; i2++) {
              chunk = chunks[i2];
              result.set(chunk, pos);
              pos += chunk.length;
            }
            return result;
          }
        };
        var fnUntyped = {
          arraySet: function(dest, src, src_offs, len, dest_offs) {
            for (var i2 = 0; i2 < len; i2++) {
              dest[dest_offs + i2] = src[src_offs + i2];
            }
          },
          // Join array of chunks to single array.
          flattenChunks: function(chunks) {
            return [].concat.apply([], chunks);
          }
        };
        exports2.setTyped = function(on2) {
          if (on2) {
            exports2.Buf8 = Uint8Array;
            exports2.Buf16 = Uint16Array;
            exports2.Buf32 = Int32Array;
            exports2.assign(exports2, fnTyped);
          } else {
            exports2.Buf8 = Array;
            exports2.Buf16 = Array;
            exports2.Buf32 = Array;
            exports2.assign(exports2, fnUntyped);
          }
        };
        exports2.setTyped(TYPED_OK);
      }, {}], 28: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("./common");
        var STR_APPLY_OK = true;
        var STR_APPLY_UIA_OK = true;
        try {
          String.fromCharCode.apply(null, [0]);
        } catch (__) {
          STR_APPLY_OK = false;
        }
        try {
          String.fromCharCode.apply(null, new Uint8Array(1));
        } catch (__) {
          STR_APPLY_UIA_OK = false;
        }
        var _utf8len = new utils.Buf8(256);
        for (var i2 = 0; i2 < 256; i2++) {
          _utf8len[i2] = i2 >= 252 ? 6 : i2 >= 248 ? 5 : i2 >= 240 ? 4 : i2 >= 224 ? 3 : i2 >= 192 ? 2 : 1;
        }
        _utf8len[254] = _utf8len[254] = 1;
        exports2.string2buf = function(str) {
          var buf, c, c2, m_pos, i3, str_len = str.length, buf_len = 0;
          for (m_pos = 0; m_pos < str_len; m_pos++) {
            c = str.charCodeAt(m_pos);
            if ((c & 64512) === 55296 && m_pos + 1 < str_len) {
              c2 = str.charCodeAt(m_pos + 1);
              if ((c2 & 64512) === 56320) {
                c = 65536 + (c - 55296 << 10) + (c2 - 56320);
                m_pos++;
              }
            }
            buf_len += c < 128 ? 1 : c < 2048 ? 2 : c < 65536 ? 3 : 4;
          }
          buf = new utils.Buf8(buf_len);
          for (i3 = 0, m_pos = 0; i3 < buf_len; m_pos++) {
            c = str.charCodeAt(m_pos);
            if ((c & 64512) === 55296 && m_pos + 1 < str_len) {
              c2 = str.charCodeAt(m_pos + 1);
              if ((c2 & 64512) === 56320) {
                c = 65536 + (c - 55296 << 10) + (c2 - 56320);
                m_pos++;
              }
            }
            if (c < 128) {
              buf[i3++] = c;
            } else if (c < 2048) {
              buf[i3++] = 192 | c >>> 6;
              buf[i3++] = 128 | c & 63;
            } else if (c < 65536) {
              buf[i3++] = 224 | c >>> 12;
              buf[i3++] = 128 | c >>> 6 & 63;
              buf[i3++] = 128 | c & 63;
            } else {
              buf[i3++] = 240 | c >>> 18;
              buf[i3++] = 128 | c >>> 12 & 63;
              buf[i3++] = 128 | c >>> 6 & 63;
              buf[i3++] = 128 | c & 63;
            }
          }
          return buf;
        };
        function buf2binstring(buf, len) {
          if (len < 65537) {
            if (buf.subarray && STR_APPLY_UIA_OK || !buf.subarray && STR_APPLY_OK) {
              return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));
            }
          }
          var result = "";
          for (var i3 = 0; i3 < len; i3++) {
            result += String.fromCharCode(buf[i3]);
          }
          return result;
        }
        exports2.buf2binstring = function(buf) {
          return buf2binstring(buf, buf.length);
        };
        exports2.binstring2buf = function(str) {
          var buf = new utils.Buf8(str.length);
          for (var i3 = 0, len = buf.length; i3 < len; i3++) {
            buf[i3] = str.charCodeAt(i3);
          }
          return buf;
        };
        exports2.buf2string = function(buf, max) {
          var i3, out, c, c_len;
          var len = max || buf.length;
          var utf16buf = new Array(len * 2);
          for (out = 0, i3 = 0; i3 < len; ) {
            c = buf[i3++];
            if (c < 128) {
              utf16buf[out++] = c;
              continue;
            }
            c_len = _utf8len[c];
            if (c_len > 4) {
              utf16buf[out++] = 65533;
              i3 += c_len - 1;
              continue;
            }
            c &= c_len === 2 ? 31 : c_len === 3 ? 15 : 7;
            while (c_len > 1 && i3 < len) {
              c = c << 6 | buf[i3++] & 63;
              c_len--;
            }
            if (c_len > 1) {
              utf16buf[out++] = 65533;
              continue;
            }
            if (c < 65536) {
              utf16buf[out++] = c;
            } else {
              c -= 65536;
              utf16buf[out++] = 55296 | c >> 10 & 1023;
              utf16buf[out++] = 56320 | c & 1023;
            }
          }
          return buf2binstring(utf16buf, out);
        };
        exports2.utf8border = function(buf, max) {
          var pos;
          max = max || buf.length;
          if (max > buf.length) {
            max = buf.length;
          }
          pos = max - 1;
          while (pos >= 0 && (buf[pos] & 192) === 128) {
            pos--;
          }
          if (pos < 0) {
            return max;
          }
          if (pos === 0) {
            return max;
          }
          return pos + _utf8len[buf[pos]] > max ? pos : max;
        };
      }, { "./common": 27 }], 29: [function(_dereq_, module2, exports2) {
        function adler32(adler, buf, len, pos) {
          var s1 = adler & 65535 | 0, s2 = adler >>> 16 & 65535 | 0, n = 0;
          while (len !== 0) {
            n = len > 2e3 ? 2e3 : len;
            len -= n;
            do {
              s1 = s1 + buf[pos++] | 0;
              s2 = s2 + s1 | 0;
            } while (--n);
            s1 %= 65521;
            s2 %= 65521;
          }
          return s1 | s2 << 16 | 0;
        }
        module2.exports = adler32;
      }, {}], 30: [function(_dereq_, module2, exports2) {
        module2.exports = {
          /* Allowed flush values; see deflate() and inflate() below for details */
          Z_NO_FLUSH: 0,
          Z_PARTIAL_FLUSH: 1,
          Z_SYNC_FLUSH: 2,
          Z_FULL_FLUSH: 3,
          Z_FINISH: 4,
          Z_BLOCK: 5,
          Z_TREES: 6,
          /* Return codes for the compression/decompression functions. Negative values
          * are errors, positive values are used for special but normal events.
          */
          Z_OK: 0,
          Z_STREAM_END: 1,
          Z_NEED_DICT: 2,
          Z_ERRNO: -1,
          Z_STREAM_ERROR: -2,
          Z_DATA_ERROR: -3,
          //Z_MEM_ERROR:     -4,
          Z_BUF_ERROR: -5,
          //Z_VERSION_ERROR: -6,
          /* compression levels */
          Z_NO_COMPRESSION: 0,
          Z_BEST_SPEED: 1,
          Z_BEST_COMPRESSION: 9,
          Z_DEFAULT_COMPRESSION: -1,
          Z_FILTERED: 1,
          Z_HUFFMAN_ONLY: 2,
          Z_RLE: 3,
          Z_FIXED: 4,
          Z_DEFAULT_STRATEGY: 0,
          /* Possible values of the data_type field (though see inflate()) */
          Z_BINARY: 0,
          Z_TEXT: 1,
          //Z_ASCII:                1, // = Z_TEXT (deprecated)
          Z_UNKNOWN: 2,
          /* The deflate compression method */
          Z_DEFLATED: 8
          //Z_NULL:                 null // Use -1 or null inline, depending on var type
        };
      }, {}], 31: [function(_dereq_, module2, exports2) {
        function makeTable() {
          var c, table = [];
          for (var n = 0; n < 256; n++) {
            c = n;
            for (var k = 0; k < 8; k++) {
              c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
            }
            table[n] = c;
          }
          return table;
        }
        var crcTable = makeTable();
        function crc32(crc, buf, len, pos) {
          var t = crcTable, end = pos + len;
          crc = crc ^ -1;
          for (var i2 = pos; i2 < end; i2++) {
            crc = crc >>> 8 ^ t[(crc ^ buf[i2]) & 255];
          }
          return crc ^ -1;
        }
        module2.exports = crc32;
      }, {}], 32: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("../utils/common");
        var trees = _dereq_("./trees");
        var adler32 = _dereq_("./adler32");
        var crc32 = _dereq_("./crc32");
        var msg = _dereq_("./messages");
        var Z_NO_FLUSH = 0;
        var Z_PARTIAL_FLUSH = 1;
        var Z_FULL_FLUSH = 3;
        var Z_FINISH = 4;
        var Z_BLOCK = 5;
        var Z_OK = 0;
        var Z_STREAM_END = 1;
        var Z_STREAM_ERROR = -2;
        var Z_DATA_ERROR = -3;
        var Z_BUF_ERROR = -5;
        var Z_DEFAULT_COMPRESSION = -1;
        var Z_FILTERED = 1;
        var Z_HUFFMAN_ONLY = 2;
        var Z_RLE = 3;
        var Z_FIXED = 4;
        var Z_DEFAULT_STRATEGY = 0;
        var Z_UNKNOWN = 2;
        var Z_DEFLATED = 8;
        var MAX_MEM_LEVEL = 9;
        var MAX_WBITS = 15;
        var DEF_MEM_LEVEL = 8;
        var LENGTH_CODES = 29;
        var LITERALS = 256;
        var L_CODES = LITERALS + 1 + LENGTH_CODES;
        var D_CODES = 30;
        var BL_CODES = 19;
        var HEAP_SIZE = 2 * L_CODES + 1;
        var MAX_BITS = 15;
        var MIN_MATCH = 3;
        var MAX_MATCH = 258;
        var MIN_LOOKAHEAD = MAX_MATCH + MIN_MATCH + 1;
        var PRESET_DICT = 32;
        var INIT_STATE = 42;
        var EXTRA_STATE = 69;
        var NAME_STATE = 73;
        var COMMENT_STATE = 91;
        var HCRC_STATE = 103;
        var BUSY_STATE = 113;
        var FINISH_STATE = 666;
        var BS_NEED_MORE = 1;
        var BS_BLOCK_DONE = 2;
        var BS_FINISH_STARTED = 3;
        var BS_FINISH_DONE = 4;
        var OS_CODE = 3;
        function err(strm, errorCode) {
          strm.msg = msg[errorCode];
          return errorCode;
        }
        function rank(f) {
          return (f << 1) - (f > 4 ? 9 : 0);
        }
        function zero(buf) {
          var len = buf.length;
          while (--len >= 0) {
            buf[len] = 0;
          }
        }
        function flush_pending(strm) {
          var s = strm.state;
          var len = s.pending;
          if (len > strm.avail_out) {
            len = strm.avail_out;
          }
          if (len === 0) {
            return;
          }
          utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);
          strm.next_out += len;
          s.pending_out += len;
          strm.total_out += len;
          strm.avail_out -= len;
          s.pending -= len;
          if (s.pending === 0) {
            s.pending_out = 0;
          }
        }
        function flush_block_only(s, last) {
          trees._tr_flush_block(s, s.block_start >= 0 ? s.block_start : -1, s.strstart - s.block_start, last);
          s.block_start = s.strstart;
          flush_pending(s.strm);
        }
        function put_byte(s, b) {
          s.pending_buf[s.pending++] = b;
        }
        function putShortMSB(s, b) {
          s.pending_buf[s.pending++] = b >>> 8 & 255;
          s.pending_buf[s.pending++] = b & 255;
        }
        function read_buf(strm, buf, start, size) {
          var len = strm.avail_in;
          if (len > size) {
            len = size;
          }
          if (len === 0) {
            return 0;
          }
          strm.avail_in -= len;
          utils.arraySet(buf, strm.input, strm.next_in, len, start);
          if (strm.state.wrap === 1) {
            strm.adler = adler32(strm.adler, buf, len, start);
          } else if (strm.state.wrap === 2) {
            strm.adler = crc32(strm.adler, buf, len, start);
          }
          strm.next_in += len;
          strm.total_in += len;
          return len;
        }
        function longest_match(s, cur_match) {
          var chain_length = s.max_chain_length;
          var scan = s.strstart;
          var match;
          var len;
          var best_len = s.prev_length;
          var nice_match = s.nice_match;
          var limit = s.strstart > s.w_size - MIN_LOOKAHEAD ? s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0;
          var _win = s.window;
          var wmask = s.w_mask;
          var prev = s.prev;
          var strend = s.strstart + MAX_MATCH;
          var scan_end1 = _win[scan + best_len - 1];
          var scan_end = _win[scan + best_len];
          if (s.prev_length >= s.good_match) {
            chain_length >>= 2;
          }
          if (nice_match > s.lookahead) {
            nice_match = s.lookahead;
          }
          do {
            match = cur_match;
            if (_win[match + best_len] !== scan_end || _win[match + best_len - 1] !== scan_end1 || _win[match] !== _win[scan] || _win[++match] !== _win[scan + 1]) {
              continue;
            }
            scan += 2;
            match++;
            do {
            } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && _win[++scan] === _win[++match] && scan < strend);
            len = MAX_MATCH - (strend - scan);
            scan = strend - MAX_MATCH;
            if (len > best_len) {
              s.match_start = cur_match;
              best_len = len;
              if (len >= nice_match) {
                break;
              }
              scan_end1 = _win[scan + best_len - 1];
              scan_end = _win[scan + best_len];
            }
          } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);
          if (best_len <= s.lookahead) {
            return best_len;
          }
          return s.lookahead;
        }
        function fill_window(s) {
          var _w_size = s.w_size;
          var p, n, m, more, str;
          do {
            more = s.window_size - s.lookahead - s.strstart;
            if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {
              utils.arraySet(s.window, s.window, _w_size, _w_size, 0);
              s.match_start -= _w_size;
              s.strstart -= _w_size;
              s.block_start -= _w_size;
              n = s.hash_size;
              p = n;
              do {
                m = s.head[--p];
                s.head[p] = m >= _w_size ? m - _w_size : 0;
              } while (--n);
              n = _w_size;
              p = n;
              do {
                m = s.prev[--p];
                s.prev[p] = m >= _w_size ? m - _w_size : 0;
              } while (--n);
              more += _w_size;
            }
            if (s.strm.avail_in === 0) {
              break;
            }
            n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);
            s.lookahead += n;
            if (s.lookahead + s.insert >= MIN_MATCH) {
              str = s.strstart - s.insert;
              s.ins_h = s.window[str];
              s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + 1]) & s.hash_mask;
              while (s.insert) {
                s.ins_h = (s.ins_h << s.hash_shift ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;
                s.prev[str & s.w_mask] = s.head[s.ins_h];
                s.head[s.ins_h] = str;
                str++;
                s.insert--;
                if (s.lookahead + s.insert < MIN_MATCH) {
                  break;
                }
              }
            }
          } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);
        }
        function deflate_stored(s, flush) {
          var max_block_size = 65535;
          if (max_block_size > s.pending_buf_size - 5) {
            max_block_size = s.pending_buf_size - 5;
          }
          for (; ; ) {
            if (s.lookahead <= 1) {
              fill_window(s);
              if (s.lookahead === 0 && flush === Z_NO_FLUSH) {
                return BS_NEED_MORE;
              }
              if (s.lookahead === 0) {
                break;
              }
            }
            s.strstart += s.lookahead;
            s.lookahead = 0;
            var max_start = s.block_start + max_block_size;
            if (s.strstart === 0 || s.strstart >= max_start) {
              s.lookahead = s.strstart - max_start;
              s.strstart = max_start;
              flush_block_only(s, false);
              if (s.strm.avail_out === 0) {
                return BS_NEED_MORE;
              }
            }
            if (s.strstart - s.block_start >= s.w_size - MIN_LOOKAHEAD) {
              flush_block_only(s, false);
              if (s.strm.avail_out === 0) {
                return BS_NEED_MORE;
              }
            }
          }
          s.insert = 0;
          if (flush === Z_FINISH) {
            flush_block_only(s, true);
            if (s.strm.avail_out === 0) {
              return BS_FINISH_STARTED;
            }
            return BS_FINISH_DONE;
          }
          if (s.strstart > s.block_start) {
            flush_block_only(s, false);
            if (s.strm.avail_out === 0) {
              return BS_NEED_MORE;
            }
          }
          return BS_NEED_MORE;
        }
        function deflate_fast(s, flush) {
          var hash_head;
          var bflush;
          for (; ; ) {
            if (s.lookahead < MIN_LOOKAHEAD) {
              fill_window(s);
              if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
                return BS_NEED_MORE;
              }
              if (s.lookahead === 0) {
                break;
              }
            }
            hash_head = 0;
            if (s.lookahead >= MIN_MATCH) {
              s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
              hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
              s.head[s.ins_h] = s.strstart;
            }
            if (hash_head !== 0 && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) {
              s.match_length = longest_match(s, hash_head);
            }
            if (s.match_length >= MIN_MATCH) {
              bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);
              s.lookahead -= s.match_length;
              if (s.match_length <= s.max_lazy_match && s.lookahead >= MIN_MATCH) {
                s.match_length--;
                do {
                  s.strstart++;
                  s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
                  hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
                  s.head[s.ins_h] = s.strstart;
                } while (--s.match_length !== 0);
                s.strstart++;
              } else {
                s.strstart += s.match_length;
                s.match_length = 0;
                s.ins_h = s.window[s.strstart];
                s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + 1]) & s.hash_mask;
              }
            } else {
              bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
              s.lookahead--;
              s.strstart++;
            }
            if (bflush) {
              flush_block_only(s, false);
              if (s.strm.avail_out === 0) {
                return BS_NEED_MORE;
              }
            }
          }
          s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
          if (flush === Z_FINISH) {
            flush_block_only(s, true);
            if (s.strm.avail_out === 0) {
              return BS_FINISH_STARTED;
            }
            return BS_FINISH_DONE;
          }
          if (s.last_lit) {
            flush_block_only(s, false);
            if (s.strm.avail_out === 0) {
              return BS_NEED_MORE;
            }
          }
          return BS_BLOCK_DONE;
        }
        function deflate_slow(s, flush) {
          var hash_head;
          var bflush;
          var max_insert;
          for (; ; ) {
            if (s.lookahead < MIN_LOOKAHEAD) {
              fill_window(s);
              if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {
                return BS_NEED_MORE;
              }
              if (s.lookahead === 0) {
                break;
              }
            }
            hash_head = 0;
            if (s.lookahead >= MIN_MATCH) {
              s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
              hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
              s.head[s.ins_h] = s.strstart;
            }
            s.prev_length = s.match_length;
            s.prev_match = s.match_start;
            s.match_length = MIN_MATCH - 1;
            if (hash_head !== 0 && s.prev_length < s.max_lazy_match && s.strstart - hash_head <= s.w_size - MIN_LOOKAHEAD) {
              s.match_length = longest_match(s, hash_head);
              if (s.match_length <= 5 && (s.strategy === Z_FILTERED || s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096)) {
                s.match_length = MIN_MATCH - 1;
              }
            }
            if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {
              max_insert = s.strstart + s.lookahead - MIN_MATCH;
              bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);
              s.lookahead -= s.prev_length - 1;
              s.prev_length -= 2;
              do {
                if (++s.strstart <= max_insert) {
                  s.ins_h = (s.ins_h << s.hash_shift ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;
                  hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];
                  s.head[s.ins_h] = s.strstart;
                }
              } while (--s.prev_length !== 0);
              s.match_available = 0;
              s.match_length = MIN_MATCH - 1;
              s.strstart++;
              if (bflush) {
                flush_block_only(s, false);
                if (s.strm.avail_out === 0) {
                  return BS_NEED_MORE;
                }
              }
            } else if (s.match_available) {
              bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
              if (bflush) {
                flush_block_only(s, false);
              }
              s.strstart++;
              s.lookahead--;
              if (s.strm.avail_out === 0) {
                return BS_NEED_MORE;
              }
            } else {
              s.match_available = 1;
              s.strstart++;
              s.lookahead--;
            }
          }
          if (s.match_available) {
            bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);
            s.match_available = 0;
          }
          s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;
          if (flush === Z_FINISH) {
            flush_block_only(s, true);
            if (s.strm.avail_out === 0) {
              return BS_FINISH_STARTED;
            }
            return BS_FINISH_DONE;
          }
          if (s.last_lit) {
            flush_block_only(s, false);
            if (s.strm.avail_out === 0) {
              return BS_NEED_MORE;
            }
          }
          return BS_BLOCK_DONE;
        }
        function deflate_rle(s, flush) {
          var bflush;
          var prev;
          var scan, strend;
          var _win = s.window;
          for (; ; ) {
            if (s.lookahead <= MAX_MATCH) {
              fill_window(s);
              if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {
                return BS_NEED_MORE;
              }
              if (s.lookahead === 0) {
                break;
              }
            }
            s.match_length = 0;
            if (s.lookahead >= MIN_MATCH && s.strstart > 0) {
              scan = s.strstart - 1;
              prev = _win[scan];
              if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {
                strend = s.strstart + MAX_MATCH;
                do {
                } while (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan] && scan < strend);
                s.match_length = MAX_MATCH - (strend - scan);
                if (s.match_length > s.lookahead) {
                  s.match_length = s.lookahead;
                }
              }
            }
            if (s.match_length >= MIN_MATCH) {
              bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);
              s.lookahead -= s.match_length;
              s.strstart += s.match_length;
              s.match_length = 0;
            } else {
              bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
              s.lookahead--;
              s.strstart++;
            }
            if (bflush) {
              flush_block_only(s, false);
              if (s.strm.avail_out === 0) {
                return BS_NEED_MORE;
              }
            }
          }
          s.insert = 0;
          if (flush === Z_FINISH) {
            flush_block_only(s, true);
            if (s.strm.avail_out === 0) {
              return BS_FINISH_STARTED;
            }
            return BS_FINISH_DONE;
          }
          if (s.last_lit) {
            flush_block_only(s, false);
            if (s.strm.avail_out === 0) {
              return BS_NEED_MORE;
            }
          }
          return BS_BLOCK_DONE;
        }
        function deflate_huff(s, flush) {
          var bflush;
          for (; ; ) {
            if (s.lookahead === 0) {
              fill_window(s);
              if (s.lookahead === 0) {
                if (flush === Z_NO_FLUSH) {
                  return BS_NEED_MORE;
                }
                break;
              }
            }
            s.match_length = 0;
            bflush = trees._tr_tally(s, 0, s.window[s.strstart]);
            s.lookahead--;
            s.strstart++;
            if (bflush) {
              flush_block_only(s, false);
              if (s.strm.avail_out === 0) {
                return BS_NEED_MORE;
              }
            }
          }
          s.insert = 0;
          if (flush === Z_FINISH) {
            flush_block_only(s, true);
            if (s.strm.avail_out === 0) {
              return BS_FINISH_STARTED;
            }
            return BS_FINISH_DONE;
          }
          if (s.last_lit) {
            flush_block_only(s, false);
            if (s.strm.avail_out === 0) {
              return BS_NEED_MORE;
            }
          }
          return BS_BLOCK_DONE;
        }
        var Config = function(good_length, max_lazy, nice_length, max_chain, func) {
          this.good_length = good_length;
          this.max_lazy = max_lazy;
          this.nice_length = nice_length;
          this.max_chain = max_chain;
          this.func = func;
        };
        var configuration_table;
        configuration_table = [
          /*      good lazy nice chain */
          new Config(0, 0, 0, 0, deflate_stored),
          /* 0 store only */
          new Config(4, 4, 8, 4, deflate_fast),
          /* 1 max speed, no lazy matches */
          new Config(4, 5, 16, 8, deflate_fast),
          /* 2 */
          new Config(4, 6, 32, 32, deflate_fast),
          /* 3 */
          new Config(4, 4, 16, 16, deflate_slow),
          /* 4 lazy matches */
          new Config(8, 16, 32, 32, deflate_slow),
          /* 5 */
          new Config(8, 16, 128, 128, deflate_slow),
          /* 6 */
          new Config(8, 32, 128, 256, deflate_slow),
          /* 7 */
          new Config(32, 128, 258, 1024, deflate_slow),
          /* 8 */
          new Config(32, 258, 258, 4096, deflate_slow)
          /* 9 max compression */
        ];
        function lm_init(s) {
          s.window_size = 2 * s.w_size;
          zero(s.head);
          s.max_lazy_match = configuration_table[s.level].max_lazy;
          s.good_match = configuration_table[s.level].good_length;
          s.nice_match = configuration_table[s.level].nice_length;
          s.max_chain_length = configuration_table[s.level].max_chain;
          s.strstart = 0;
          s.block_start = 0;
          s.lookahead = 0;
          s.insert = 0;
          s.match_length = s.prev_length = MIN_MATCH - 1;
          s.match_available = 0;
          s.ins_h = 0;
        }
        function DeflateState() {
          this.strm = null;
          this.status = 0;
          this.pending_buf = null;
          this.pending_buf_size = 0;
          this.pending_out = 0;
          this.pending = 0;
          this.wrap = 0;
          this.gzhead = null;
          this.gzindex = 0;
          this.method = Z_DEFLATED;
          this.last_flush = -1;
          this.w_size = 0;
          this.w_bits = 0;
          this.w_mask = 0;
          this.window = null;
          this.window_size = 0;
          this.prev = null;
          this.head = null;
          this.ins_h = 0;
          this.hash_size = 0;
          this.hash_bits = 0;
          this.hash_mask = 0;
          this.hash_shift = 0;
          this.block_start = 0;
          this.match_length = 0;
          this.prev_match = 0;
          this.match_available = 0;
          this.strstart = 0;
          this.match_start = 0;
          this.lookahead = 0;
          this.prev_length = 0;
          this.max_chain_length = 0;
          this.max_lazy_match = 0;
          this.level = 0;
          this.strategy = 0;
          this.good_match = 0;
          this.nice_match = 0;
          this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2);
          this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2);
          this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2);
          zero(this.dyn_ltree);
          zero(this.dyn_dtree);
          zero(this.bl_tree);
          this.l_desc = null;
          this.d_desc = null;
          this.bl_desc = null;
          this.bl_count = new utils.Buf16(MAX_BITS + 1);
          this.heap = new utils.Buf16(2 * L_CODES + 1);
          zero(this.heap);
          this.heap_len = 0;
          this.heap_max = 0;
          this.depth = new utils.Buf16(2 * L_CODES + 1);
          zero(this.depth);
          this.l_buf = 0;
          this.lit_bufsize = 0;
          this.last_lit = 0;
          this.d_buf = 0;
          this.opt_len = 0;
          this.static_len = 0;
          this.matches = 0;
          this.insert = 0;
          this.bi_buf = 0;
          this.bi_valid = 0;
        }
        function deflateResetKeep(strm) {
          var s;
          if (!strm || !strm.state) {
            return err(strm, Z_STREAM_ERROR);
          }
          strm.total_in = strm.total_out = 0;
          strm.data_type = Z_UNKNOWN;
          s = strm.state;
          s.pending = 0;
          s.pending_out = 0;
          if (s.wrap < 0) {
            s.wrap = -s.wrap;
          }
          s.status = s.wrap ? INIT_STATE : BUSY_STATE;
          strm.adler = s.wrap === 2 ? 0 : 1;
          s.last_flush = Z_NO_FLUSH;
          trees._tr_init(s);
          return Z_OK;
        }
        function deflateReset(strm) {
          var ret = deflateResetKeep(strm);
          if (ret === Z_OK) {
            lm_init(strm.state);
          }
          return ret;
        }
        function deflateSetHeader(strm, head) {
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          if (strm.state.wrap !== 2) {
            return Z_STREAM_ERROR;
          }
          strm.state.gzhead = head;
          return Z_OK;
        }
        function deflateInit2(strm, level, method, windowBits, memLevel, strategy) {
          if (!strm) {
            return Z_STREAM_ERROR;
          }
          var wrap = 1;
          if (level === Z_DEFAULT_COMPRESSION) {
            level = 6;
          }
          if (windowBits < 0) {
            wrap = 0;
            windowBits = -windowBits;
          } else if (windowBits > 15) {
            wrap = 2;
            windowBits -= 16;
          }
          if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED || windowBits < 8 || windowBits > 15 || level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
            return err(strm, Z_STREAM_ERROR);
          }
          if (windowBits === 8) {
            windowBits = 9;
          }
          var s = new DeflateState();
          strm.state = s;
          s.strm = strm;
          s.wrap = wrap;
          s.gzhead = null;
          s.w_bits = windowBits;
          s.w_size = 1 << s.w_bits;
          s.w_mask = s.w_size - 1;
          s.hash_bits = memLevel + 7;
          s.hash_size = 1 << s.hash_bits;
          s.hash_mask = s.hash_size - 1;
          s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);
          s.window = new utils.Buf8(s.w_size * 2);
          s.head = new utils.Buf16(s.hash_size);
          s.prev = new utils.Buf16(s.w_size);
          s.lit_bufsize = 1 << memLevel + 6;
          s.pending_buf_size = s.lit_bufsize * 4;
          s.pending_buf = new utils.Buf8(s.pending_buf_size);
          s.d_buf = s.lit_bufsize >> 1;
          s.l_buf = (1 + 2) * s.lit_bufsize;
          s.level = level;
          s.strategy = strategy;
          s.method = method;
          return deflateReset(strm);
        }
        function deflateInit(strm, level) {
          return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);
        }
        function deflate(strm, flush) {
          var old_flush, s;
          var beg, val;
          if (!strm || !strm.state || flush > Z_BLOCK || flush < 0) {
            return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;
          }
          s = strm.state;
          if (!strm.output || !strm.input && strm.avail_in !== 0 || s.status === FINISH_STATE && flush !== Z_FINISH) {
            return err(strm, strm.avail_out === 0 ? Z_BUF_ERROR : Z_STREAM_ERROR);
          }
          s.strm = strm;
          old_flush = s.last_flush;
          s.last_flush = flush;
          if (s.status === INIT_STATE) {
            if (s.wrap === 2) {
              strm.adler = 0;
              put_byte(s, 31);
              put_byte(s, 139);
              put_byte(s, 8);
              if (!s.gzhead) {
                put_byte(s, 0);
                put_byte(s, 0);
                put_byte(s, 0);
                put_byte(s, 0);
                put_byte(s, 0);
                put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0);
                put_byte(s, OS_CODE);
                s.status = BUSY_STATE;
              } else {
                put_byte(
                  s,
                  (s.gzhead.text ? 1 : 0) + (s.gzhead.hcrc ? 2 : 0) + (!s.gzhead.extra ? 0 : 4) + (!s.gzhead.name ? 0 : 8) + (!s.gzhead.comment ? 0 : 16)
                );
                put_byte(s, s.gzhead.time & 255);
                put_byte(s, s.gzhead.time >> 8 & 255);
                put_byte(s, s.gzhead.time >> 16 & 255);
                put_byte(s, s.gzhead.time >> 24 & 255);
                put_byte(s, s.level === 9 ? 2 : s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ? 4 : 0);
                put_byte(s, s.gzhead.os & 255);
                if (s.gzhead.extra && s.gzhead.extra.length) {
                  put_byte(s, s.gzhead.extra.length & 255);
                  put_byte(s, s.gzhead.extra.length >> 8 & 255);
                }
                if (s.gzhead.hcrc) {
                  strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);
                }
                s.gzindex = 0;
                s.status = EXTRA_STATE;
              }
            } else {
              var header = Z_DEFLATED + (s.w_bits - 8 << 4) << 8;
              var level_flags = -1;
              if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {
                level_flags = 0;
              } else if (s.level < 6) {
                level_flags = 1;
              } else if (s.level === 6) {
                level_flags = 2;
              } else {
                level_flags = 3;
              }
              header |= level_flags << 6;
              if (s.strstart !== 0) {
                header |= PRESET_DICT;
              }
              header += 31 - header % 31;
              s.status = BUSY_STATE;
              putShortMSB(s, header);
              if (s.strstart !== 0) {
                putShortMSB(s, strm.adler >>> 16);
                putShortMSB(s, strm.adler & 65535);
              }
              strm.adler = 1;
            }
          }
          if (s.status === EXTRA_STATE) {
            if (s.gzhead.extra) {
              beg = s.pending;
              while (s.gzindex < (s.gzhead.extra.length & 65535)) {
                if (s.pending === s.pending_buf_size) {
                  if (s.gzhead.hcrc && s.pending > beg) {
                    strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
                  }
                  flush_pending(strm);
                  beg = s.pending;
                  if (s.pending === s.pending_buf_size) {
                    break;
                  }
                }
                put_byte(s, s.gzhead.extra[s.gzindex] & 255);
                s.gzindex++;
              }
              if (s.gzhead.hcrc && s.pending > beg) {
                strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
              }
              if (s.gzindex === s.gzhead.extra.length) {
                s.gzindex = 0;
                s.status = NAME_STATE;
              }
            } else {
              s.status = NAME_STATE;
            }
          }
          if (s.status === NAME_STATE) {
            if (s.gzhead.name) {
              beg = s.pending;
              do {
                if (s.pending === s.pending_buf_size) {
                  if (s.gzhead.hcrc && s.pending > beg) {
                    strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
                  }
                  flush_pending(strm);
                  beg = s.pending;
                  if (s.pending === s.pending_buf_size) {
                    val = 1;
                    break;
                  }
                }
                if (s.gzindex < s.gzhead.name.length) {
                  val = s.gzhead.name.charCodeAt(s.gzindex++) & 255;
                } else {
                  val = 0;
                }
                put_byte(s, val);
              } while (val !== 0);
              if (s.gzhead.hcrc && s.pending > beg) {
                strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
              }
              if (val === 0) {
                s.gzindex = 0;
                s.status = COMMENT_STATE;
              }
            } else {
              s.status = COMMENT_STATE;
            }
          }
          if (s.status === COMMENT_STATE) {
            if (s.gzhead.comment) {
              beg = s.pending;
              do {
                if (s.pending === s.pending_buf_size) {
                  if (s.gzhead.hcrc && s.pending > beg) {
                    strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
                  }
                  flush_pending(strm);
                  beg = s.pending;
                  if (s.pending === s.pending_buf_size) {
                    val = 1;
                    break;
                  }
                }
                if (s.gzindex < s.gzhead.comment.length) {
                  val = s.gzhead.comment.charCodeAt(s.gzindex++) & 255;
                } else {
                  val = 0;
                }
                put_byte(s, val);
              } while (val !== 0);
              if (s.gzhead.hcrc && s.pending > beg) {
                strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);
              }
              if (val === 0) {
                s.status = HCRC_STATE;
              }
            } else {
              s.status = HCRC_STATE;
            }
          }
          if (s.status === HCRC_STATE) {
            if (s.gzhead.hcrc) {
              if (s.pending + 2 > s.pending_buf_size) {
                flush_pending(strm);
              }
              if (s.pending + 2 <= s.pending_buf_size) {
                put_byte(s, strm.adler & 255);
                put_byte(s, strm.adler >> 8 & 255);
                strm.adler = 0;
                s.status = BUSY_STATE;
              }
            } else {
              s.status = BUSY_STATE;
            }
          }
          if (s.pending !== 0) {
            flush_pending(strm);
            if (strm.avail_out === 0) {
              s.last_flush = -1;
              return Z_OK;
            }
          } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) && flush !== Z_FINISH) {
            return err(strm, Z_BUF_ERROR);
          }
          if (s.status === FINISH_STATE && strm.avail_in !== 0) {
            return err(strm, Z_BUF_ERROR);
          }
          if (strm.avail_in !== 0 || s.lookahead !== 0 || flush !== Z_NO_FLUSH && s.status !== FINISH_STATE) {
            var bstate = s.strategy === Z_HUFFMAN_ONLY ? deflate_huff(s, flush) : s.strategy === Z_RLE ? deflate_rle(s, flush) : configuration_table[s.level].func(s, flush);
            if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {
              s.status = FINISH_STATE;
            }
            if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {
              if (strm.avail_out === 0) {
                s.last_flush = -1;
              }
              return Z_OK;
            }
            if (bstate === BS_BLOCK_DONE) {
              if (flush === Z_PARTIAL_FLUSH) {
                trees._tr_align(s);
              } else if (flush !== Z_BLOCK) {
                trees._tr_stored_block(s, 0, 0, false);
                if (flush === Z_FULL_FLUSH) {
                  zero(s.head);
                  if (s.lookahead === 0) {
                    s.strstart = 0;
                    s.block_start = 0;
                    s.insert = 0;
                  }
                }
              }
              flush_pending(strm);
              if (strm.avail_out === 0) {
                s.last_flush = -1;
                return Z_OK;
              }
            }
          }
          if (flush !== Z_FINISH) {
            return Z_OK;
          }
          if (s.wrap <= 0) {
            return Z_STREAM_END;
          }
          if (s.wrap === 2) {
            put_byte(s, strm.adler & 255);
            put_byte(s, strm.adler >> 8 & 255);
            put_byte(s, strm.adler >> 16 & 255);
            put_byte(s, strm.adler >> 24 & 255);
            put_byte(s, strm.total_in & 255);
            put_byte(s, strm.total_in >> 8 & 255);
            put_byte(s, strm.total_in >> 16 & 255);
            put_byte(s, strm.total_in >> 24 & 255);
          } else {
            putShortMSB(s, strm.adler >>> 16);
            putShortMSB(s, strm.adler & 65535);
          }
          flush_pending(strm);
          if (s.wrap > 0) {
            s.wrap = -s.wrap;
          }
          return s.pending !== 0 ? Z_OK : Z_STREAM_END;
        }
        function deflateEnd(strm) {
          var status;
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          status = strm.state.status;
          if (status !== INIT_STATE && status !== EXTRA_STATE && status !== NAME_STATE && status !== COMMENT_STATE && status !== HCRC_STATE && status !== BUSY_STATE && status !== FINISH_STATE) {
            return err(strm, Z_STREAM_ERROR);
          }
          strm.state = null;
          return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;
        }
        exports2.deflateInit = deflateInit;
        exports2.deflateInit2 = deflateInit2;
        exports2.deflateReset = deflateReset;
        exports2.deflateResetKeep = deflateResetKeep;
        exports2.deflateSetHeader = deflateSetHeader;
        exports2.deflate = deflate;
        exports2.deflateEnd = deflateEnd;
        exports2.deflateInfo = "pako deflate (from Nodeca project)";
      }, { "../utils/common": 27, "./adler32": 29, "./crc32": 31, "./messages": 37, "./trees": 38 }], 33: [function(_dereq_, module2, exports2) {
        function GZheader() {
          this.text = 0;
          this.time = 0;
          this.xflags = 0;
          this.os = 0;
          this.extra = null;
          this.extra_len = 0;
          this.name = "";
          this.comment = "";
          this.hcrc = 0;
          this.done = false;
        }
        module2.exports = GZheader;
      }, {}], 34: [function(_dereq_, module2, exports2) {
        var BAD = 30;
        var TYPE = 12;
        module2.exports = function inflate_fast(strm, start) {
          var state;
          var _in;
          var last;
          var _out;
          var beg;
          var end;
          var dmax;
          var wsize;
          var whave;
          var wnext;
          var window2;
          var hold;
          var bits;
          var lcode;
          var dcode;
          var lmask;
          var dmask;
          var here;
          var op;
          var len;
          var dist;
          var from;
          var from_source;
          var input, output;
          state = strm.state;
          _in = strm.next_in;
          input = strm.input;
          last = _in + (strm.avail_in - 5);
          _out = strm.next_out;
          output = strm.output;
          beg = _out - (start - strm.avail_out);
          end = _out + (strm.avail_out - 257);
          dmax = state.dmax;
          wsize = state.wsize;
          whave = state.whave;
          wnext = state.wnext;
          window2 = state.window;
          hold = state.hold;
          bits = state.bits;
          lcode = state.lencode;
          dcode = state.distcode;
          lmask = (1 << state.lenbits) - 1;
          dmask = (1 << state.distbits) - 1;
          top:
            do {
              if (bits < 15) {
                hold += input[_in++] << bits;
                bits += 8;
                hold += input[_in++] << bits;
                bits += 8;
              }
              here = lcode[hold & lmask];
              dolen:
                for (; ; ) {
                  op = here >>> 24;
                  hold >>>= op;
                  bits -= op;
                  op = here >>> 16 & 255;
                  if (op === 0) {
                    output[_out++] = here & 65535;
                  } else if (op & 16) {
                    len = here & 65535;
                    op &= 15;
                    if (op) {
                      if (bits < op) {
                        hold += input[_in++] << bits;
                        bits += 8;
                      }
                      len += hold & (1 << op) - 1;
                      hold >>>= op;
                      bits -= op;
                    }
                    if (bits < 15) {
                      hold += input[_in++] << bits;
                      bits += 8;
                      hold += input[_in++] << bits;
                      bits += 8;
                    }
                    here = dcode[hold & dmask];
                    dodist:
                      for (; ; ) {
                        op = here >>> 24;
                        hold >>>= op;
                        bits -= op;
                        op = here >>> 16 & 255;
                        if (op & 16) {
                          dist = here & 65535;
                          op &= 15;
                          if (bits < op) {
                            hold += input[_in++] << bits;
                            bits += 8;
                            if (bits < op) {
                              hold += input[_in++] << bits;
                              bits += 8;
                            }
                          }
                          dist += hold & (1 << op) - 1;
                          if (dist > dmax) {
                            strm.msg = "invalid distance too far back";
                            state.mode = BAD;
                            break top;
                          }
                          hold >>>= op;
                          bits -= op;
                          op = _out - beg;
                          if (dist > op) {
                            op = dist - op;
                            if (op > whave) {
                              if (state.sane) {
                                strm.msg = "invalid distance too far back";
                                state.mode = BAD;
                                break top;
                              }
                            }
                            from = 0;
                            from_source = window2;
                            if (wnext === 0) {
                              from += wsize - op;
                              if (op < len) {
                                len -= op;
                                do {
                                  output[_out++] = window2[from++];
                                } while (--op);
                                from = _out - dist;
                                from_source = output;
                              }
                            } else if (wnext < op) {
                              from += wsize + wnext - op;
                              op -= wnext;
                              if (op < len) {
                                len -= op;
                                do {
                                  output[_out++] = window2[from++];
                                } while (--op);
                                from = 0;
                                if (wnext < len) {
                                  op = wnext;
                                  len -= op;
                                  do {
                                    output[_out++] = window2[from++];
                                  } while (--op);
                                  from = _out - dist;
                                  from_source = output;
                                }
                              }
                            } else {
                              from += wnext - op;
                              if (op < len) {
                                len -= op;
                                do {
                                  output[_out++] = window2[from++];
                                } while (--op);
                                from = _out - dist;
                                from_source = output;
                              }
                            }
                            while (len > 2) {
                              output[_out++] = from_source[from++];
                              output[_out++] = from_source[from++];
                              output[_out++] = from_source[from++];
                              len -= 3;
                            }
                            if (len) {
                              output[_out++] = from_source[from++];
                              if (len > 1) {
                                output[_out++] = from_source[from++];
                              }
                            }
                          } else {
                            from = _out - dist;
                            do {
                              output[_out++] = output[from++];
                              output[_out++] = output[from++];
                              output[_out++] = output[from++];
                              len -= 3;
                            } while (len > 2);
                            if (len) {
                              output[_out++] = output[from++];
                              if (len > 1) {
                                output[_out++] = output[from++];
                              }
                            }
                          }
                        } else if ((op & 64) === 0) {
                          here = dcode[(here & 65535) + (hold & (1 << op) - 1)];
                          continue dodist;
                        } else {
                          strm.msg = "invalid distance code";
                          state.mode = BAD;
                          break top;
                        }
                        break;
                      }
                  } else if ((op & 64) === 0) {
                    here = lcode[(here & 65535) + (hold & (1 << op) - 1)];
                    continue dolen;
                  } else if (op & 32) {
                    state.mode = TYPE;
                    break top;
                  } else {
                    strm.msg = "invalid literal/length code";
                    state.mode = BAD;
                    break top;
                  }
                  break;
                }
            } while (_in < last && _out < end);
          len = bits >> 3;
          _in -= len;
          bits -= len << 3;
          hold &= (1 << bits) - 1;
          strm.next_in = _in;
          strm.next_out = _out;
          strm.avail_in = _in < last ? 5 + (last - _in) : 5 - (_in - last);
          strm.avail_out = _out < end ? 257 + (end - _out) : 257 - (_out - end);
          state.hold = hold;
          state.bits = bits;
          return;
        };
      }, {}], 35: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("../utils/common");
        var adler32 = _dereq_("./adler32");
        var crc32 = _dereq_("./crc32");
        var inflate_fast = _dereq_("./inffast");
        var inflate_table = _dereq_("./inftrees");
        var CODES = 0;
        var LENS = 1;
        var DISTS = 2;
        var Z_FINISH = 4;
        var Z_BLOCK = 5;
        var Z_TREES = 6;
        var Z_OK = 0;
        var Z_STREAM_END = 1;
        var Z_NEED_DICT = 2;
        var Z_STREAM_ERROR = -2;
        var Z_DATA_ERROR = -3;
        var Z_MEM_ERROR = -4;
        var Z_BUF_ERROR = -5;
        var Z_DEFLATED = 8;
        var HEAD = 1;
        var FLAGS = 2;
        var TIME = 3;
        var OS = 4;
        var EXLEN = 5;
        var EXTRA = 6;
        var NAME = 7;
        var COMMENT = 8;
        var HCRC = 9;
        var DICTID = 10;
        var DICT = 11;
        var TYPE = 12;
        var TYPEDO = 13;
        var STORED = 14;
        var COPY_ = 15;
        var COPY = 16;
        var TABLE = 17;
        var LENLENS = 18;
        var CODELENS = 19;
        var LEN_ = 20;
        var LEN = 21;
        var LENEXT = 22;
        var DIST = 23;
        var DISTEXT = 24;
        var MATCH = 25;
        var LIT = 26;
        var CHECK = 27;
        var LENGTH = 28;
        var DONE = 29;
        var BAD = 30;
        var MEM = 31;
        var SYNC = 32;
        var ENOUGH_LENS = 852;
        var ENOUGH_DISTS = 592;
        var MAX_WBITS = 15;
        var DEF_WBITS = MAX_WBITS;
        function ZSWAP32(q) {
          return (q >>> 24 & 255) + (q >>> 8 & 65280) + ((q & 65280) << 8) + ((q & 255) << 24);
        }
        function InflateState() {
          this.mode = 0;
          this.last = false;
          this.wrap = 0;
          this.havedict = false;
          this.flags = 0;
          this.dmax = 0;
          this.check = 0;
          this.total = 0;
          this.head = null;
          this.wbits = 0;
          this.wsize = 0;
          this.whave = 0;
          this.wnext = 0;
          this.window = null;
          this.hold = 0;
          this.bits = 0;
          this.length = 0;
          this.offset = 0;
          this.extra = 0;
          this.lencode = null;
          this.distcode = null;
          this.lenbits = 0;
          this.distbits = 0;
          this.ncode = 0;
          this.nlen = 0;
          this.ndist = 0;
          this.have = 0;
          this.next = null;
          this.lens = new utils.Buf16(320);
          this.work = new utils.Buf16(288);
          this.lendyn = null;
          this.distdyn = null;
          this.sane = 0;
          this.back = 0;
          this.was = 0;
        }
        function inflateResetKeep(strm) {
          var state;
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          state = strm.state;
          strm.total_in = strm.total_out = state.total = 0;
          strm.msg = "";
          if (state.wrap) {
            strm.adler = state.wrap & 1;
          }
          state.mode = HEAD;
          state.last = 0;
          state.havedict = 0;
          state.dmax = 32768;
          state.head = null;
          state.hold = 0;
          state.bits = 0;
          state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);
          state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);
          state.sane = 1;
          state.back = -1;
          return Z_OK;
        }
        function inflateReset(strm) {
          var state;
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          state = strm.state;
          state.wsize = 0;
          state.whave = 0;
          state.wnext = 0;
          return inflateResetKeep(strm);
        }
        function inflateReset2(strm, windowBits) {
          var wrap;
          var state;
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          state = strm.state;
          if (windowBits < 0) {
            wrap = 0;
            windowBits = -windowBits;
          } else {
            wrap = (windowBits >> 4) + 1;
            if (windowBits < 48) {
              windowBits &= 15;
            }
          }
          if (windowBits && (windowBits < 8 || windowBits > 15)) {
            return Z_STREAM_ERROR;
          }
          if (state.window !== null && state.wbits !== windowBits) {
            state.window = null;
          }
          state.wrap = wrap;
          state.wbits = windowBits;
          return inflateReset(strm);
        }
        function inflateInit2(strm, windowBits) {
          var ret;
          var state;
          if (!strm) {
            return Z_STREAM_ERROR;
          }
          state = new InflateState();
          strm.state = state;
          state.window = null;
          ret = inflateReset2(strm, windowBits);
          if (ret !== Z_OK) {
            strm.state = null;
          }
          return ret;
        }
        function inflateInit(strm) {
          return inflateInit2(strm, DEF_WBITS);
        }
        var virgin = true;
        var lenfix, distfix;
        function fixedtables(state) {
          if (virgin) {
            var sym;
            lenfix = new utils.Buf32(512);
            distfix = new utils.Buf32(32);
            sym = 0;
            while (sym < 144) {
              state.lens[sym++] = 8;
            }
            while (sym < 256) {
              state.lens[sym++] = 9;
            }
            while (sym < 280) {
              state.lens[sym++] = 7;
            }
            while (sym < 288) {
              state.lens[sym++] = 8;
            }
            inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 });
            sym = 0;
            while (sym < 32) {
              state.lens[sym++] = 5;
            }
            inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 });
            virgin = false;
          }
          state.lencode = lenfix;
          state.lenbits = 9;
          state.distcode = distfix;
          state.distbits = 5;
        }
        function updatewindow(strm, src, end, copy) {
          var dist;
          var state = strm.state;
          if (state.window === null) {
            state.wsize = 1 << state.wbits;
            state.wnext = 0;
            state.whave = 0;
            state.window = new utils.Buf8(state.wsize);
          }
          if (copy >= state.wsize) {
            utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);
            state.wnext = 0;
            state.whave = state.wsize;
          } else {
            dist = state.wsize - state.wnext;
            if (dist > copy) {
              dist = copy;
            }
            utils.arraySet(state.window, src, end - copy, dist, state.wnext);
            copy -= dist;
            if (copy) {
              utils.arraySet(state.window, src, end - copy, copy, 0);
              state.wnext = copy;
              state.whave = state.wsize;
            } else {
              state.wnext += dist;
              if (state.wnext === state.wsize) {
                state.wnext = 0;
              }
              if (state.whave < state.wsize) {
                state.whave += dist;
              }
            }
          }
          return 0;
        }
        function inflate(strm, flush) {
          var state;
          var input, output;
          var next;
          var put2;
          var have, left;
          var hold;
          var bits;
          var _in, _out;
          var copy;
          var from;
          var from_source;
          var here = 0;
          var here_bits, here_op, here_val;
          var last_bits, last_op, last_val;
          var len;
          var ret;
          var hbuf = new utils.Buf8(4);
          var opts;
          var n;
          var order = (
            /* permutation of code lengths */
            [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]
          );
          if (!strm || !strm.state || !strm.output || !strm.input && strm.avail_in !== 0) {
            return Z_STREAM_ERROR;
          }
          state = strm.state;
          if (state.mode === TYPE) {
            state.mode = TYPEDO;
          }
          put2 = strm.next_out;
          output = strm.output;
          left = strm.avail_out;
          next = strm.next_in;
          input = strm.input;
          have = strm.avail_in;
          hold = state.hold;
          bits = state.bits;
          _in = have;
          _out = left;
          ret = Z_OK;
          inf_leave:
            for (; ; ) {
              switch (state.mode) {
                case HEAD:
                  if (state.wrap === 0) {
                    state.mode = TYPEDO;
                    break;
                  }
                  while (bits < 16) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  if (state.wrap & 2 && hold === 35615) {
                    state.check = 0;
                    hbuf[0] = hold & 255;
                    hbuf[1] = hold >>> 8 & 255;
                    state.check = crc32(state.check, hbuf, 2, 0);
                    hold = 0;
                    bits = 0;
                    state.mode = FLAGS;
                    break;
                  }
                  state.flags = 0;
                  if (state.head) {
                    state.head.done = false;
                  }
                  if (!(state.wrap & 1) || /* check if zlib header allowed */
                  (((hold & 255) << 8) + (hold >> 8)) % 31) {
                    strm.msg = "incorrect header check";
                    state.mode = BAD;
                    break;
                  }
                  if ((hold & 15) !== Z_DEFLATED) {
                    strm.msg = "unknown compression method";
                    state.mode = BAD;
                    break;
                  }
                  hold >>>= 4;
                  bits -= 4;
                  len = (hold & 15) + 8;
                  if (state.wbits === 0) {
                    state.wbits = len;
                  } else if (len > state.wbits) {
                    strm.msg = "invalid window size";
                    state.mode = BAD;
                    break;
                  }
                  state.dmax = 1 << len;
                  strm.adler = state.check = 1;
                  state.mode = hold & 512 ? DICTID : TYPE;
                  hold = 0;
                  bits = 0;
                  break;
                case FLAGS:
                  while (bits < 16) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  state.flags = hold;
                  if ((state.flags & 255) !== Z_DEFLATED) {
                    strm.msg = "unknown compression method";
                    state.mode = BAD;
                    break;
                  }
                  if (state.flags & 57344) {
                    strm.msg = "unknown header flags set";
                    state.mode = BAD;
                    break;
                  }
                  if (state.head) {
                    state.head.text = hold >> 8 & 1;
                  }
                  if (state.flags & 512) {
                    hbuf[0] = hold & 255;
                    hbuf[1] = hold >>> 8 & 255;
                    state.check = crc32(state.check, hbuf, 2, 0);
                  }
                  hold = 0;
                  bits = 0;
                  state.mode = TIME;
                case TIME:
                  while (bits < 32) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  if (state.head) {
                    state.head.time = hold;
                  }
                  if (state.flags & 512) {
                    hbuf[0] = hold & 255;
                    hbuf[1] = hold >>> 8 & 255;
                    hbuf[2] = hold >>> 16 & 255;
                    hbuf[3] = hold >>> 24 & 255;
                    state.check = crc32(state.check, hbuf, 4, 0);
                  }
                  hold = 0;
                  bits = 0;
                  state.mode = OS;
                case OS:
                  while (bits < 16) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  if (state.head) {
                    state.head.xflags = hold & 255;
                    state.head.os = hold >> 8;
                  }
                  if (state.flags & 512) {
                    hbuf[0] = hold & 255;
                    hbuf[1] = hold >>> 8 & 255;
                    state.check = crc32(state.check, hbuf, 2, 0);
                  }
                  hold = 0;
                  bits = 0;
                  state.mode = EXLEN;
                case EXLEN:
                  if (state.flags & 1024) {
                    while (bits < 16) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    state.length = hold;
                    if (state.head) {
                      state.head.extra_len = hold;
                    }
                    if (state.flags & 512) {
                      hbuf[0] = hold & 255;
                      hbuf[1] = hold >>> 8 & 255;
                      state.check = crc32(state.check, hbuf, 2, 0);
                    }
                    hold = 0;
                    bits = 0;
                  } else if (state.head) {
                    state.head.extra = null;
                  }
                  state.mode = EXTRA;
                case EXTRA:
                  if (state.flags & 1024) {
                    copy = state.length;
                    if (copy > have) {
                      copy = have;
                    }
                    if (copy) {
                      if (state.head) {
                        len = state.head.extra_len - state.length;
                        if (!state.head.extra) {
                          state.head.extra = new Array(state.head.extra_len);
                        }
                        utils.arraySet(
                          state.head.extra,
                          input,
                          next,
                          // extra field is limited to 65536 bytes
                          // - no need for additional size check
                          copy,
                          /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/
                          len
                        );
                      }
                      if (state.flags & 512) {
                        state.check = crc32(state.check, input, copy, next);
                      }
                      have -= copy;
                      next += copy;
                      state.length -= copy;
                    }
                    if (state.length) {
                      break inf_leave;
                    }
                  }
                  state.length = 0;
                  state.mode = NAME;
                case NAME:
                  if (state.flags & 2048) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    copy = 0;
                    do {
                      len = input[next + copy++];
                      if (state.head && len && state.length < 65536) {
                        state.head.name += String.fromCharCode(len);
                      }
                    } while (len && copy < have);
                    if (state.flags & 512) {
                      state.check = crc32(state.check, input, copy, next);
                    }
                    have -= copy;
                    next += copy;
                    if (len) {
                      break inf_leave;
                    }
                  } else if (state.head) {
                    state.head.name = null;
                  }
                  state.length = 0;
                  state.mode = COMMENT;
                case COMMENT:
                  if (state.flags & 4096) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    copy = 0;
                    do {
                      len = input[next + copy++];
                      if (state.head && len && state.length < 65536) {
                        state.head.comment += String.fromCharCode(len);
                      }
                    } while (len && copy < have);
                    if (state.flags & 512) {
                      state.check = crc32(state.check, input, copy, next);
                    }
                    have -= copy;
                    next += copy;
                    if (len) {
                      break inf_leave;
                    }
                  } else if (state.head) {
                    state.head.comment = null;
                  }
                  state.mode = HCRC;
                case HCRC:
                  if (state.flags & 512) {
                    while (bits < 16) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    if (hold !== (state.check & 65535)) {
                      strm.msg = "header crc mismatch";
                      state.mode = BAD;
                      break;
                    }
                    hold = 0;
                    bits = 0;
                  }
                  if (state.head) {
                    state.head.hcrc = state.flags >> 9 & 1;
                    state.head.done = true;
                  }
                  strm.adler = state.check = 0;
                  state.mode = TYPE;
                  break;
                case DICTID:
                  while (bits < 32) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  strm.adler = state.check = ZSWAP32(hold);
                  hold = 0;
                  bits = 0;
                  state.mode = DICT;
                case DICT:
                  if (state.havedict === 0) {
                    strm.next_out = put2;
                    strm.avail_out = left;
                    strm.next_in = next;
                    strm.avail_in = have;
                    state.hold = hold;
                    state.bits = bits;
                    return Z_NEED_DICT;
                  }
                  strm.adler = state.check = 1;
                  state.mode = TYPE;
                case TYPE:
                  if (flush === Z_BLOCK || flush === Z_TREES) {
                    break inf_leave;
                  }
                case TYPEDO:
                  if (state.last) {
                    hold >>>= bits & 7;
                    bits -= bits & 7;
                    state.mode = CHECK;
                    break;
                  }
                  while (bits < 3) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  state.last = hold & 1;
                  hold >>>= 1;
                  bits -= 1;
                  switch (hold & 3) {
                    case 0:
                      state.mode = STORED;
                      break;
                    case 1:
                      fixedtables(state);
                      state.mode = LEN_;
                      if (flush === Z_TREES) {
                        hold >>>= 2;
                        bits -= 2;
                        break inf_leave;
                      }
                      break;
                    case 2:
                      state.mode = TABLE;
                      break;
                    case 3:
                      strm.msg = "invalid block type";
                      state.mode = BAD;
                  }
                  hold >>>= 2;
                  bits -= 2;
                  break;
                case STORED:
                  hold >>>= bits & 7;
                  bits -= bits & 7;
                  while (bits < 32) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  if ((hold & 65535) !== (hold >>> 16 ^ 65535)) {
                    strm.msg = "invalid stored block lengths";
                    state.mode = BAD;
                    break;
                  }
                  state.length = hold & 65535;
                  hold = 0;
                  bits = 0;
                  state.mode = COPY_;
                  if (flush === Z_TREES) {
                    break inf_leave;
                  }
                case COPY_:
                  state.mode = COPY;
                case COPY:
                  copy = state.length;
                  if (copy) {
                    if (copy > have) {
                      copy = have;
                    }
                    if (copy > left) {
                      copy = left;
                    }
                    if (copy === 0) {
                      break inf_leave;
                    }
                    utils.arraySet(output, input, next, copy, put2);
                    have -= copy;
                    next += copy;
                    left -= copy;
                    put2 += copy;
                    state.length -= copy;
                    break;
                  }
                  state.mode = TYPE;
                  break;
                case TABLE:
                  while (bits < 14) {
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  state.nlen = (hold & 31) + 257;
                  hold >>>= 5;
                  bits -= 5;
                  state.ndist = (hold & 31) + 1;
                  hold >>>= 5;
                  bits -= 5;
                  state.ncode = (hold & 15) + 4;
                  hold >>>= 4;
                  bits -= 4;
                  if (state.nlen > 286 || state.ndist > 30) {
                    strm.msg = "too many length or distance symbols";
                    state.mode = BAD;
                    break;
                  }
                  state.have = 0;
                  state.mode = LENLENS;
                case LENLENS:
                  while (state.have < state.ncode) {
                    while (bits < 3) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    state.lens[order[state.have++]] = hold & 7;
                    hold >>>= 3;
                    bits -= 3;
                  }
                  while (state.have < 19) {
                    state.lens[order[state.have++]] = 0;
                  }
                  state.lencode = state.lendyn;
                  state.lenbits = 7;
                  opts = { bits: state.lenbits };
                  ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);
                  state.lenbits = opts.bits;
                  if (ret) {
                    strm.msg = "invalid code lengths set";
                    state.mode = BAD;
                    break;
                  }
                  state.have = 0;
                  state.mode = CODELENS;
                case CODELENS:
                  while (state.have < state.nlen + state.ndist) {
                    for (; ; ) {
                      here = state.lencode[hold & (1 << state.lenbits) - 1];
                      here_bits = here >>> 24;
                      here_op = here >>> 16 & 255;
                      here_val = here & 65535;
                      if (here_bits <= bits) {
                        break;
                      }
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    if (here_val < 16) {
                      hold >>>= here_bits;
                      bits -= here_bits;
                      state.lens[state.have++] = here_val;
                    } else {
                      if (here_val === 16) {
                        n = here_bits + 2;
                        while (bits < n) {
                          if (have === 0) {
                            break inf_leave;
                          }
                          have--;
                          hold += input[next++] << bits;
                          bits += 8;
                        }
                        hold >>>= here_bits;
                        bits -= here_bits;
                        if (state.have === 0) {
                          strm.msg = "invalid bit length repeat";
                          state.mode = BAD;
                          break;
                        }
                        len = state.lens[state.have - 1];
                        copy = 3 + (hold & 3);
                        hold >>>= 2;
                        bits -= 2;
                      } else if (here_val === 17) {
                        n = here_bits + 3;
                        while (bits < n) {
                          if (have === 0) {
                            break inf_leave;
                          }
                          have--;
                          hold += input[next++] << bits;
                          bits += 8;
                        }
                        hold >>>= here_bits;
                        bits -= here_bits;
                        len = 0;
                        copy = 3 + (hold & 7);
                        hold >>>= 3;
                        bits -= 3;
                      } else {
                        n = here_bits + 7;
                        while (bits < n) {
                          if (have === 0) {
                            break inf_leave;
                          }
                          have--;
                          hold += input[next++] << bits;
                          bits += 8;
                        }
                        hold >>>= here_bits;
                        bits -= here_bits;
                        len = 0;
                        copy = 11 + (hold & 127);
                        hold >>>= 7;
                        bits -= 7;
                      }
                      if (state.have + copy > state.nlen + state.ndist) {
                        strm.msg = "invalid bit length repeat";
                        state.mode = BAD;
                        break;
                      }
                      while (copy--) {
                        state.lens[state.have++] = len;
                      }
                    }
                  }
                  if (state.mode === BAD) {
                    break;
                  }
                  if (state.lens[256] === 0) {
                    strm.msg = "invalid code -- missing end-of-block";
                    state.mode = BAD;
                    break;
                  }
                  state.lenbits = 9;
                  opts = { bits: state.lenbits };
                  ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);
                  state.lenbits = opts.bits;
                  if (ret) {
                    strm.msg = "invalid literal/lengths set";
                    state.mode = BAD;
                    break;
                  }
                  state.distbits = 6;
                  state.distcode = state.distdyn;
                  opts = { bits: state.distbits };
                  ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);
                  state.distbits = opts.bits;
                  if (ret) {
                    strm.msg = "invalid distances set";
                    state.mode = BAD;
                    break;
                  }
                  state.mode = LEN_;
                  if (flush === Z_TREES) {
                    break inf_leave;
                  }
                case LEN_:
                  state.mode = LEN;
                case LEN:
                  if (have >= 6 && left >= 258) {
                    strm.next_out = put2;
                    strm.avail_out = left;
                    strm.next_in = next;
                    strm.avail_in = have;
                    state.hold = hold;
                    state.bits = bits;
                    inflate_fast(strm, _out);
                    put2 = strm.next_out;
                    output = strm.output;
                    left = strm.avail_out;
                    next = strm.next_in;
                    input = strm.input;
                    have = strm.avail_in;
                    hold = state.hold;
                    bits = state.bits;
                    if (state.mode === TYPE) {
                      state.back = -1;
                    }
                    break;
                  }
                  state.back = 0;
                  for (; ; ) {
                    here = state.lencode[hold & (1 << state.lenbits) - 1];
                    here_bits = here >>> 24;
                    here_op = here >>> 16 & 255;
                    here_val = here & 65535;
                    if (here_bits <= bits) {
                      break;
                    }
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  if (here_op && (here_op & 240) === 0) {
                    last_bits = here_bits;
                    last_op = here_op;
                    last_val = here_val;
                    for (; ; ) {
                      here = state.lencode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)];
                      here_bits = here >>> 24;
                      here_op = here >>> 16 & 255;
                      here_val = here & 65535;
                      if (last_bits + here_bits <= bits) {
                        break;
                      }
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    hold >>>= last_bits;
                    bits -= last_bits;
                    state.back += last_bits;
                  }
                  hold >>>= here_bits;
                  bits -= here_bits;
                  state.back += here_bits;
                  state.length = here_val;
                  if (here_op === 0) {
                    state.mode = LIT;
                    break;
                  }
                  if (here_op & 32) {
                    state.back = -1;
                    state.mode = TYPE;
                    break;
                  }
                  if (here_op & 64) {
                    strm.msg = "invalid literal/length code";
                    state.mode = BAD;
                    break;
                  }
                  state.extra = here_op & 15;
                  state.mode = LENEXT;
                case LENEXT:
                  if (state.extra) {
                    n = state.extra;
                    while (bits < n) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    state.length += hold & (1 << state.extra) - 1;
                    hold >>>= state.extra;
                    bits -= state.extra;
                    state.back += state.extra;
                  }
                  state.was = state.length;
                  state.mode = DIST;
                case DIST:
                  for (; ; ) {
                    here = state.distcode[hold & (1 << state.distbits) - 1];
                    here_bits = here >>> 24;
                    here_op = here >>> 16 & 255;
                    here_val = here & 65535;
                    if (here_bits <= bits) {
                      break;
                    }
                    if (have === 0) {
                      break inf_leave;
                    }
                    have--;
                    hold += input[next++] << bits;
                    bits += 8;
                  }
                  if ((here_op & 240) === 0) {
                    last_bits = here_bits;
                    last_op = here_op;
                    last_val = here_val;
                    for (; ; ) {
                      here = state.distcode[last_val + ((hold & (1 << last_bits + last_op) - 1) >> last_bits)];
                      here_bits = here >>> 24;
                      here_op = here >>> 16 & 255;
                      here_val = here & 65535;
                      if (last_bits + here_bits <= bits) {
                        break;
                      }
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    hold >>>= last_bits;
                    bits -= last_bits;
                    state.back += last_bits;
                  }
                  hold >>>= here_bits;
                  bits -= here_bits;
                  state.back += here_bits;
                  if (here_op & 64) {
                    strm.msg = "invalid distance code";
                    state.mode = BAD;
                    break;
                  }
                  state.offset = here_val;
                  state.extra = here_op & 15;
                  state.mode = DISTEXT;
                case DISTEXT:
                  if (state.extra) {
                    n = state.extra;
                    while (bits < n) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    state.offset += hold & (1 << state.extra) - 1;
                    hold >>>= state.extra;
                    bits -= state.extra;
                    state.back += state.extra;
                  }
                  if (state.offset > state.dmax) {
                    strm.msg = "invalid distance too far back";
                    state.mode = BAD;
                    break;
                  }
                  state.mode = MATCH;
                case MATCH:
                  if (left === 0) {
                    break inf_leave;
                  }
                  copy = _out - left;
                  if (state.offset > copy) {
                    copy = state.offset - copy;
                    if (copy > state.whave) {
                      if (state.sane) {
                        strm.msg = "invalid distance too far back";
                        state.mode = BAD;
                        break;
                      }
                    }
                    if (copy > state.wnext) {
                      copy -= state.wnext;
                      from = state.wsize - copy;
                    } else {
                      from = state.wnext - copy;
                    }
                    if (copy > state.length) {
                      copy = state.length;
                    }
                    from_source = state.window;
                  } else {
                    from_source = output;
                    from = put2 - state.offset;
                    copy = state.length;
                  }
                  if (copy > left) {
                    copy = left;
                  }
                  left -= copy;
                  state.length -= copy;
                  do {
                    output[put2++] = from_source[from++];
                  } while (--copy);
                  if (state.length === 0) {
                    state.mode = LEN;
                  }
                  break;
                case LIT:
                  if (left === 0) {
                    break inf_leave;
                  }
                  output[put2++] = state.length;
                  left--;
                  state.mode = LEN;
                  break;
                case CHECK:
                  if (state.wrap) {
                    while (bits < 32) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold |= input[next++] << bits;
                      bits += 8;
                    }
                    _out -= left;
                    strm.total_out += _out;
                    state.total += _out;
                    if (_out) {
                      strm.adler = state.check = /*UPDATE(state.check, put - _out, _out);*/
                      state.flags ? crc32(state.check, output, _out, put2 - _out) : adler32(state.check, output, _out, put2 - _out);
                    }
                    _out = left;
                    if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) {
                      strm.msg = "incorrect data check";
                      state.mode = BAD;
                      break;
                    }
                    hold = 0;
                    bits = 0;
                  }
                  state.mode = LENGTH;
                case LENGTH:
                  if (state.wrap && state.flags) {
                    while (bits < 32) {
                      if (have === 0) {
                        break inf_leave;
                      }
                      have--;
                      hold += input[next++] << bits;
                      bits += 8;
                    }
                    if (hold !== (state.total & 4294967295)) {
                      strm.msg = "incorrect length check";
                      state.mode = BAD;
                      break;
                    }
                    hold = 0;
                    bits = 0;
                  }
                  state.mode = DONE;
                case DONE:
                  ret = Z_STREAM_END;
                  break inf_leave;
                case BAD:
                  ret = Z_DATA_ERROR;
                  break inf_leave;
                case MEM:
                  return Z_MEM_ERROR;
                case SYNC:
                default:
                  return Z_STREAM_ERROR;
              }
            }
          strm.next_out = put2;
          strm.avail_out = left;
          strm.next_in = next;
          strm.avail_in = have;
          state.hold = hold;
          state.bits = bits;
          if (state.wsize || _out !== strm.avail_out && state.mode < BAD && (state.mode < CHECK || flush !== Z_FINISH)) {
            if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out))
              ;
          }
          _in -= strm.avail_in;
          _out -= strm.avail_out;
          strm.total_in += _in;
          strm.total_out += _out;
          state.total += _out;
          if (state.wrap && _out) {
            strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/
            state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out);
          }
          strm.data_type = state.bits + (state.last ? 64 : 0) + (state.mode === TYPE ? 128 : 0) + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);
          if ((_in === 0 && _out === 0 || flush === Z_FINISH) && ret === Z_OK) {
            ret = Z_BUF_ERROR;
          }
          return ret;
        }
        function inflateEnd(strm) {
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          var state = strm.state;
          if (state.window) {
            state.window = null;
          }
          strm.state = null;
          return Z_OK;
        }
        function inflateGetHeader(strm, head) {
          var state;
          if (!strm || !strm.state) {
            return Z_STREAM_ERROR;
          }
          state = strm.state;
          if ((state.wrap & 2) === 0) {
            return Z_STREAM_ERROR;
          }
          state.head = head;
          head.done = false;
          return Z_OK;
        }
        exports2.inflateReset = inflateReset;
        exports2.inflateReset2 = inflateReset2;
        exports2.inflateResetKeep = inflateResetKeep;
        exports2.inflateInit = inflateInit;
        exports2.inflateInit2 = inflateInit2;
        exports2.inflate = inflate;
        exports2.inflateEnd = inflateEnd;
        exports2.inflateGetHeader = inflateGetHeader;
        exports2.inflateInfo = "pako inflate (from Nodeca project)";
      }, { "../utils/common": 27, "./adler32": 29, "./crc32": 31, "./inffast": 34, "./inftrees": 36 }], 36: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("../utils/common");
        var MAXBITS = 15;
        var ENOUGH_LENS = 852;
        var ENOUGH_DISTS = 592;
        var CODES = 0;
        var LENS = 1;
        var DISTS = 2;
        var lbase = [
          /* Length codes 257..285 base */
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          13,
          15,
          17,
          19,
          23,
          27,
          31,
          35,
          43,
          51,
          59,
          67,
          83,
          99,
          115,
          131,
          163,
          195,
          227,
          258,
          0,
          0
        ];
        var lext = [
          /* Length codes 257..285 extra */
          16,
          16,
          16,
          16,
          16,
          16,
          16,
          16,
          17,
          17,
          17,
          17,
          18,
          18,
          18,
          18,
          19,
          19,
          19,
          19,
          20,
          20,
          20,
          20,
          21,
          21,
          21,
          21,
          16,
          72,
          78
        ];
        var dbase = [
          /* Distance codes 0..29 base */
          1,
          2,
          3,
          4,
          5,
          7,
          9,
          13,
          17,
          25,
          33,
          49,
          65,
          97,
          129,
          193,
          257,
          385,
          513,
          769,
          1025,
          1537,
          2049,
          3073,
          4097,
          6145,
          8193,
          12289,
          16385,
          24577,
          0,
          0
        ];
        var dext = [
          /* Distance codes 0..29 extra */
          16,
          16,
          16,
          16,
          17,
          17,
          18,
          18,
          19,
          19,
          20,
          20,
          21,
          21,
          22,
          22,
          23,
          23,
          24,
          24,
          25,
          25,
          26,
          26,
          27,
          27,
          28,
          28,
          29,
          29,
          64,
          64
        ];
        module2.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) {
          var bits = opts.bits;
          var len = 0;
          var sym = 0;
          var min = 0, max = 0;
          var root = 0;
          var curr = 0;
          var drop = 0;
          var left = 0;
          var used = 0;
          var huff = 0;
          var incr;
          var fill;
          var low;
          var mask;
          var next;
          var base = null;
          var base_index = 0;
          var end;
          var count = new utils.Buf16(MAXBITS + 1);
          var offs = new utils.Buf16(MAXBITS + 1);
          var extra = null;
          var extra_index = 0;
          var here_bits, here_op, here_val;
          for (len = 0; len <= MAXBITS; len++) {
            count[len] = 0;
          }
          for (sym = 0; sym < codes; sym++) {
            count[lens[lens_index + sym]]++;
          }
          root = bits;
          for (max = MAXBITS; max >= 1; max--) {
            if (count[max] !== 0) {
              break;
            }
          }
          if (root > max) {
            root = max;
          }
          if (max === 0) {
            table[table_index++] = 1 << 24 | 64 << 16 | 0;
            table[table_index++] = 1 << 24 | 64 << 16 | 0;
            opts.bits = 1;
            return 0;
          }
          for (min = 1; min < max; min++) {
            if (count[min] !== 0) {
              break;
            }
          }
          if (root < min) {
            root = min;
          }
          left = 1;
          for (len = 1; len <= MAXBITS; len++) {
            left <<= 1;
            left -= count[len];
            if (left < 0) {
              return -1;
            }
          }
          if (left > 0 && (type === CODES || max !== 1)) {
            return -1;
          }
          offs[1] = 0;
          for (len = 1; len < MAXBITS; len++) {
            offs[len + 1] = offs[len] + count[len];
          }
          for (sym = 0; sym < codes; sym++) {
            if (lens[lens_index + sym] !== 0) {
              work[offs[lens[lens_index + sym]]++] = sym;
            }
          }
          if (type === CODES) {
            base = extra = work;
            end = 19;
          } else if (type === LENS) {
            base = lbase;
            base_index -= 257;
            extra = lext;
            extra_index -= 257;
            end = 256;
          } else {
            base = dbase;
            extra = dext;
            end = -1;
          }
          huff = 0;
          sym = 0;
          len = min;
          next = table_index;
          curr = root;
          drop = 0;
          low = -1;
          used = 1 << root;
          mask = used - 1;
          if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) {
            return 1;
          }
          for (; ; ) {
            here_bits = len - drop;
            if (work[sym] < end) {
              here_op = 0;
              here_val = work[sym];
            } else if (work[sym] > end) {
              here_op = extra[extra_index + work[sym]];
              here_val = base[base_index + work[sym]];
            } else {
              here_op = 32 + 64;
              here_val = 0;
            }
            incr = 1 << len - drop;
            fill = 1 << curr;
            min = fill;
            do {
              fill -= incr;
              table[next + (huff >> drop) + fill] = here_bits << 24 | here_op << 16 | here_val | 0;
            } while (fill !== 0);
            incr = 1 << len - 1;
            while (huff & incr) {
              incr >>= 1;
            }
            if (incr !== 0) {
              huff &= incr - 1;
              huff += incr;
            } else {
              huff = 0;
            }
            sym++;
            if (--count[len] === 0) {
              if (len === max) {
                break;
              }
              len = lens[lens_index + work[sym]];
            }
            if (len > root && (huff & mask) !== low) {
              if (drop === 0) {
                drop = root;
              }
              next += min;
              curr = len - drop;
              left = 1 << curr;
              while (curr + drop < max) {
                left -= count[curr + drop];
                if (left <= 0) {
                  break;
                }
                curr++;
                left <<= 1;
              }
              used += 1 << curr;
              if (type === LENS && used > ENOUGH_LENS || type === DISTS && used > ENOUGH_DISTS) {
                return 1;
              }
              low = huff & mask;
              table[low] = root << 24 | curr << 16 | next - table_index | 0;
            }
          }
          if (huff !== 0) {
            table[next + huff] = len - drop << 24 | 64 << 16 | 0;
          }
          opts.bits = root;
          return 0;
        };
      }, { "../utils/common": 27 }], 37: [function(_dereq_, module2, exports2) {
        module2.exports = {
          "2": "need dictionary",
          /* Z_NEED_DICT       2  */
          "1": "stream end",
          /* Z_STREAM_END      1  */
          "0": "",
          /* Z_OK              0  */
          "-1": "file error",
          /* Z_ERRNO         (-1) */
          "-2": "stream error",
          /* Z_STREAM_ERROR  (-2) */
          "-3": "data error",
          /* Z_DATA_ERROR    (-3) */
          "-4": "insufficient memory",
          /* Z_MEM_ERROR     (-4) */
          "-5": "buffer error",
          /* Z_BUF_ERROR     (-5) */
          "-6": "incompatible version"
          /* Z_VERSION_ERROR (-6) */
        };
      }, {}], 38: [function(_dereq_, module2, exports2) {
        var utils = _dereq_("../utils/common");
        var Z_FIXED = 4;
        var Z_BINARY = 0;
        var Z_TEXT = 1;
        var Z_UNKNOWN = 2;
        function zero(buf) {
          var len = buf.length;
          while (--len >= 0) {
            buf[len] = 0;
          }
        }
        var STORED_BLOCK = 0;
        var STATIC_TREES = 1;
        var DYN_TREES = 2;
        var MIN_MATCH = 3;
        var MAX_MATCH = 258;
        var LENGTH_CODES = 29;
        var LITERALS = 256;
        var L_CODES = LITERALS + 1 + LENGTH_CODES;
        var D_CODES = 30;
        var BL_CODES = 19;
        var HEAP_SIZE = 2 * L_CODES + 1;
        var MAX_BITS = 15;
        var Buf_size = 16;
        var MAX_BL_BITS = 7;
        var END_BLOCK = 256;
        var REP_3_6 = 16;
        var REPZ_3_10 = 17;
        var REPZ_11_138 = 18;
        var extra_lbits = (
          /* extra bits for each length code */
          [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0]
        );
        var extra_dbits = (
          /* extra bits for each distance code */
          [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13]
        );
        var extra_blbits = (
          /* extra bits for each bit length code */
          [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7]
        );
        var bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
        var DIST_CODE_LEN = 512;
        var static_ltree = new Array((L_CODES + 2) * 2);
        zero(static_ltree);
        var static_dtree = new Array(D_CODES * 2);
        zero(static_dtree);
        var _dist_code = new Array(DIST_CODE_LEN);
        zero(_dist_code);
        var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1);
        zero(_length_code);
        var base_length = new Array(LENGTH_CODES);
        zero(base_length);
        var base_dist = new Array(D_CODES);
        zero(base_dist);
        var StaticTreeDesc = function(static_tree, extra_bits, extra_base, elems, max_length) {
          this.static_tree = static_tree;
          this.extra_bits = extra_bits;
          this.extra_base = extra_base;
          this.elems = elems;
          this.max_length = max_length;
          this.has_stree = static_tree && static_tree.length;
        };
        var static_l_desc;
        var static_d_desc;
        var static_bl_desc;
        var TreeDesc = function(dyn_tree, stat_desc) {
          this.dyn_tree = dyn_tree;
          this.max_code = 0;
          this.stat_desc = stat_desc;
        };
        function d_code(dist) {
          return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];
        }
        function put_short(s, w) {
          s.pending_buf[s.pending++] = w & 255;
          s.pending_buf[s.pending++] = w >>> 8 & 255;
        }
        function send_bits(s, value, length) {
          if (s.bi_valid > Buf_size - length) {
            s.bi_buf |= value << s.bi_valid & 65535;
            put_short(s, s.bi_buf);
            s.bi_buf = value >> Buf_size - s.bi_valid;
            s.bi_valid += length - Buf_size;
          } else {
            s.bi_buf |= value << s.bi_valid & 65535;
            s.bi_valid += length;
          }
        }
        function send_code(s, c, tree) {
          send_bits(
            s,
            tree[c * 2],
            tree[c * 2 + 1]
            /*.Len*/
          );
        }
        function bi_reverse(code, len) {
          var res = 0;
          do {
            res |= code & 1;
            code >>>= 1;
            res <<= 1;
          } while (--len > 0);
          return res >>> 1;
        }
        function bi_flush(s) {
          if (s.bi_valid === 16) {
            put_short(s, s.bi_buf);
            s.bi_buf = 0;
            s.bi_valid = 0;
          } else if (s.bi_valid >= 8) {
            s.pending_buf[s.pending++] = s.bi_buf & 255;
            s.bi_buf >>= 8;
            s.bi_valid -= 8;
          }
        }
        function gen_bitlen(s, desc) {
          var tree = desc.dyn_tree;
          var max_code = desc.max_code;
          var stree = desc.stat_desc.static_tree;
          var has_stree = desc.stat_desc.has_stree;
          var extra = desc.stat_desc.extra_bits;
          var base = desc.stat_desc.extra_base;
          var max_length = desc.stat_desc.max_length;
          var h;
          var n, m;
          var bits;
          var xbits;
          var f;
          var overflow = 0;
          for (bits = 0; bits <= MAX_BITS; bits++) {
            s.bl_count[bits] = 0;
          }
          tree[s.heap[s.heap_max] * 2 + 1] = 0;
          for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {
            n = s.heap[h];
            bits = tree[tree[n * 2 + 1] * 2 + 1] + 1;
            if (bits > max_length) {
              bits = max_length;
              overflow++;
            }
            tree[n * 2 + 1] = bits;
            if (n > max_code) {
              continue;
            }
            s.bl_count[bits]++;
            xbits = 0;
            if (n >= base) {
              xbits = extra[n - base];
            }
            f = tree[n * 2];
            s.opt_len += f * (bits + xbits);
            if (has_stree) {
              s.static_len += f * (stree[n * 2 + 1] + xbits);
            }
          }
          if (overflow === 0) {
            return;
          }
          do {
            bits = max_length - 1;
            while (s.bl_count[bits] === 0) {
              bits--;
            }
            s.bl_count[bits]--;
            s.bl_count[bits + 1] += 2;
            s.bl_count[max_length]--;
            overflow -= 2;
          } while (overflow > 0);
          for (bits = max_length; bits !== 0; bits--) {
            n = s.bl_count[bits];
            while (n !== 0) {
              m = s.heap[--h];
              if (m > max_code) {
                continue;
              }
              if (tree[m * 2 + 1] !== bits) {
                s.opt_len += (bits - tree[m * 2 + 1]) * tree[m * 2];
                tree[m * 2 + 1] = bits;
              }
              n--;
            }
          }
        }
        function gen_codes(tree, max_code, bl_count) {
          var next_code = new Array(MAX_BITS + 1);
          var code = 0;
          var bits;
          var n;
          for (bits = 1; bits <= MAX_BITS; bits++) {
            next_code[bits] = code = code + bl_count[bits - 1] << 1;
          }
          for (n = 0; n <= max_code; n++) {
            var len = tree[n * 2 + 1];
            if (len === 0) {
              continue;
            }
            tree[n * 2] = bi_reverse(next_code[len]++, len);
          }
        }
        function tr_static_init() {
          var n;
          var bits;
          var length;
          var code;
          var dist;
          var bl_count = new Array(MAX_BITS + 1);
          length = 0;
          for (code = 0; code < LENGTH_CODES - 1; code++) {
            base_length[code] = length;
            for (n = 0; n < 1 << extra_lbits[code]; n++) {
              _length_code[length++] = code;
            }
          }
          _length_code[length - 1] = code;
          dist = 0;
          for (code = 0; code < 16; code++) {
            base_dist[code] = dist;
            for (n = 0; n < 1 << extra_dbits[code]; n++) {
              _dist_code[dist++] = code;
            }
          }
          dist >>= 7;
          for (; code < D_CODES; code++) {
            base_dist[code] = dist << 7;
            for (n = 0; n < 1 << extra_dbits[code] - 7; n++) {
              _dist_code[256 + dist++] = code;
            }
          }
          for (bits = 0; bits <= MAX_BITS; bits++) {
            bl_count[bits] = 0;
          }
          n = 0;
          while (n <= 143) {
            static_ltree[n * 2 + 1] = 8;
            n++;
            bl_count[8]++;
          }
          while (n <= 255) {
            static_ltree[n * 2 + 1] = 9;
            n++;
            bl_count[9]++;
          }
          while (n <= 279) {
            static_ltree[n * 2 + 1] = 7;
            n++;
            bl_count[7]++;
          }
          while (n <= 287) {
            static_ltree[n * 2 + 1] = 8;
            n++;
            bl_count[8]++;
          }
          gen_codes(static_ltree, L_CODES + 1, bl_count);
          for (n = 0; n < D_CODES; n++) {
            static_dtree[n * 2 + 1] = 5;
            static_dtree[n * 2] = bi_reverse(n, 5);
          }
          static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);
          static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS);
          static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS);
        }
        function init_block(s) {
          var n;
          for (n = 0; n < L_CODES; n++) {
            s.dyn_ltree[n * 2] = 0;
          }
          for (n = 0; n < D_CODES; n++) {
            s.dyn_dtree[n * 2] = 0;
          }
          for (n = 0; n < BL_CODES; n++) {
            s.bl_tree[n * 2] = 0;
          }
          s.dyn_ltree[END_BLOCK * 2] = 1;
          s.opt_len = s.static_len = 0;
          s.last_lit = s.matches = 0;
        }
        function bi_windup(s) {
          if (s.bi_valid > 8) {
            put_short(s, s.bi_buf);
          } else if (s.bi_valid > 0) {
            s.pending_buf[s.pending++] = s.bi_buf;
          }
          s.bi_buf = 0;
          s.bi_valid = 0;
        }
        function copy_block(s, buf, len, header) {
          bi_windup(s);
          if (header) {
            put_short(s, len);
            put_short(s, ~len);
          }
          utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);
          s.pending += len;
        }
        function smaller(tree, n, m, depth) {
          var _n2 = n * 2;
          var _m2 = m * 2;
          return tree[_n2] < tree[_m2] || tree[_n2] === tree[_m2] && depth[n] <= depth[m];
        }
        function pqdownheap(s, tree, k) {
          var v = s.heap[k];
          var j2 = k << 1;
          while (j2 <= s.heap_len) {
            if (j2 < s.heap_len && smaller(tree, s.heap[j2 + 1], s.heap[j2], s.depth)) {
              j2++;
            }
            if (smaller(tree, v, s.heap[j2], s.depth)) {
              break;
            }
            s.heap[k] = s.heap[j2];
            k = j2;
            j2 <<= 1;
          }
          s.heap[k] = v;
        }
        function compress_block(s, ltree, dtree) {
          var dist;
          var lc;
          var lx = 0;
          var code;
          var extra;
          if (s.last_lit !== 0) {
            do {
              dist = s.pending_buf[s.d_buf + lx * 2] << 8 | s.pending_buf[s.d_buf + lx * 2 + 1];
              lc = s.pending_buf[s.l_buf + lx];
              lx++;
              if (dist === 0) {
                send_code(s, lc, ltree);
              } else {
                code = _length_code[lc];
                send_code(s, code + LITERALS + 1, ltree);
                extra = extra_lbits[code];
                if (extra !== 0) {
                  lc -= base_length[code];
                  send_bits(s, lc, extra);
                }
                dist--;
                code = d_code(dist);
                send_code(s, code, dtree);
                extra = extra_dbits[code];
                if (extra !== 0) {
                  dist -= base_dist[code];
                  send_bits(s, dist, extra);
                }
              }
            } while (lx < s.last_lit);
          }
          send_code(s, END_BLOCK, ltree);
        }
        function build_tree(s, desc) {
          var tree = desc.dyn_tree;
          var stree = desc.stat_desc.static_tree;
          var has_stree = desc.stat_desc.has_stree;
          var elems = desc.stat_desc.elems;
          var n, m;
          var max_code = -1;
          var node;
          s.heap_len = 0;
          s.heap_max = HEAP_SIZE;
          for (n = 0; n < elems; n++) {
            if (tree[n * 2] !== 0) {
              s.heap[++s.heap_len] = max_code = n;
              s.depth[n] = 0;
            } else {
              tree[n * 2 + 1] = 0;
            }
          }
          while (s.heap_len < 2) {
            node = s.heap[++s.heap_len] = max_code < 2 ? ++max_code : 0;
            tree[node * 2] = 1;
            s.depth[node] = 0;
            s.opt_len--;
            if (has_stree) {
              s.static_len -= stree[node * 2 + 1];
            }
          }
          desc.max_code = max_code;
          for (n = s.heap_len >> 1; n >= 1; n--) {
            pqdownheap(s, tree, n);
          }
          node = elems;
          do {
            n = s.heap[
              1
              /*SMALLEST*/
            ];
            s.heap[
              1
              /*SMALLEST*/
            ] = s.heap[s.heap_len--];
            pqdownheap(
              s,
              tree,
              1
              /*SMALLEST*/
            );
            m = s.heap[
              1
              /*SMALLEST*/
            ];
            s.heap[--s.heap_max] = n;
            s.heap[--s.heap_max] = m;
            tree[node * 2] = tree[n * 2] + tree[m * 2];
            s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;
            tree[n * 2 + 1] = tree[m * 2 + 1] = node;
            s.heap[
              1
              /*SMALLEST*/
            ] = node++;
            pqdownheap(
              s,
              tree,
              1
              /*SMALLEST*/
            );
          } while (s.heap_len >= 2);
          s.heap[--s.heap_max] = s.heap[
            1
            /*SMALLEST*/
          ];
          gen_bitlen(s, desc);
          gen_codes(tree, max_code, s.bl_count);
        }
        function scan_tree(s, tree, max_code) {
          var n;
          var prevlen = -1;
          var curlen;
          var nextlen = tree[0 * 2 + 1];
          var count = 0;
          var max_count = 7;
          var min_count = 4;
          if (nextlen === 0) {
            max_count = 138;
            min_count = 3;
          }
          tree[(max_code + 1) * 2 + 1] = 65535;
          for (n = 0; n <= max_code; n++) {
            curlen = nextlen;
            nextlen = tree[(n + 1) * 2 + 1];
            if (++count < max_count && curlen === nextlen) {
              continue;
            } else if (count < min_count) {
              s.bl_tree[curlen * 2] += count;
            } else if (curlen !== 0) {
              if (curlen !== prevlen) {
                s.bl_tree[curlen * 2]++;
              }
              s.bl_tree[REP_3_6 * 2]++;
            } else if (count <= 10) {
              s.bl_tree[REPZ_3_10 * 2]++;
            } else {
              s.bl_tree[REPZ_11_138 * 2]++;
            }
            count = 0;
            prevlen = curlen;
            if (nextlen === 0) {
              max_count = 138;
              min_count = 3;
            } else if (curlen === nextlen) {
              max_count = 6;
              min_count = 3;
            } else {
              max_count = 7;
              min_count = 4;
            }
          }
        }
        function send_tree(s, tree, max_code) {
          var n;
          var prevlen = -1;
          var curlen;
          var nextlen = tree[0 * 2 + 1];
          var count = 0;
          var max_count = 7;
          var min_count = 4;
          if (nextlen === 0) {
            max_count = 138;
            min_count = 3;
          }
          for (n = 0; n <= max_code; n++) {
            curlen = nextlen;
            nextlen = tree[(n + 1) * 2 + 1];
            if (++count < max_count && curlen === nextlen) {
              continue;
            } else if (count < min_count) {
              do {
                send_code(s, curlen, s.bl_tree);
              } while (--count !== 0);
            } else if (curlen !== 0) {
              if (curlen !== prevlen) {
                send_code(s, curlen, s.bl_tree);
                count--;
              }
              send_code(s, REP_3_6, s.bl_tree);
              send_bits(s, count - 3, 2);
            } else if (count <= 10) {
              send_code(s, REPZ_3_10, s.bl_tree);
              send_bits(s, count - 3, 3);
            } else {
              send_code(s, REPZ_11_138, s.bl_tree);
              send_bits(s, count - 11, 7);
            }
            count = 0;
            prevlen = curlen;
            if (nextlen === 0) {
              max_count = 138;
              min_count = 3;
            } else if (curlen === nextlen) {
              max_count = 6;
              min_count = 3;
            } else {
              max_count = 7;
              min_count = 4;
            }
          }
        }
        function build_bl_tree(s) {
          var max_blindex;
          scan_tree(s, s.dyn_ltree, s.l_desc.max_code);
          scan_tree(s, s.dyn_dtree, s.d_desc.max_code);
          build_tree(s, s.bl_desc);
          for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {
            if (s.bl_tree[bl_order[max_blindex] * 2 + 1] !== 0) {
              break;
            }
          }
          s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;
          return max_blindex;
        }
        function send_all_trees(s, lcodes, dcodes, blcodes) {
          var rank;
          send_bits(s, lcodes - 257, 5);
          send_bits(s, dcodes - 1, 5);
          send_bits(s, blcodes - 4, 4);
          for (rank = 0; rank < blcodes; rank++) {
            send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1], 3);
          }
          send_tree(s, s.dyn_ltree, lcodes - 1);
          send_tree(s, s.dyn_dtree, dcodes - 1);
        }
        function detect_data_type(s) {
          var black_mask = 4093624447;
          var n;
          for (n = 0; n <= 31; n++, black_mask >>>= 1) {
            if (black_mask & 1 && s.dyn_ltree[n * 2] !== 0) {
              return Z_BINARY;
            }
          }
          if (s.dyn_ltree[9 * 2] !== 0 || s.dyn_ltree[10 * 2] !== 0 || s.dyn_ltree[13 * 2] !== 0) {
            return Z_TEXT;
          }
          for (n = 32; n < LITERALS; n++) {
            if (s.dyn_ltree[n * 2] !== 0) {
              return Z_TEXT;
            }
          }
          return Z_BINARY;
        }
        var static_init_done = false;
        function _tr_init(s) {
          if (!static_init_done) {
            tr_static_init();
            static_init_done = true;
          }
          s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc);
          s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc);
          s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);
          s.bi_buf = 0;
          s.bi_valid = 0;
          init_block(s);
        }
        function _tr_stored_block(s, buf, stored_len, last) {
          send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);
          copy_block(s, buf, stored_len, true);
        }
        function _tr_align(s) {
          send_bits(s, STATIC_TREES << 1, 3);
          send_code(s, END_BLOCK, static_ltree);
          bi_flush(s);
        }
        function _tr_flush_block(s, buf, stored_len, last) {
          var opt_lenb, static_lenb;
          var max_blindex = 0;
          if (s.level > 0) {
            if (s.strm.data_type === Z_UNKNOWN) {
              s.strm.data_type = detect_data_type(s);
            }
            build_tree(s, s.l_desc);
            build_tree(s, s.d_desc);
            max_blindex = build_bl_tree(s);
            opt_lenb = s.opt_len + 3 + 7 >>> 3;
            static_lenb = s.static_len + 3 + 7 >>> 3;
            if (static_lenb <= opt_lenb) {
              opt_lenb = static_lenb;
            }
          } else {
            opt_lenb = static_lenb = stored_len + 5;
          }
          if (stored_len + 4 <= opt_lenb && buf !== -1) {
            _tr_stored_block(s, buf, stored_len, last);
          } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {
            send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);
            compress_block(s, static_ltree, static_dtree);
          } else {
            send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);
            send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);
            compress_block(s, s.dyn_ltree, s.dyn_dtree);
          }
          init_block(s);
          if (last) {
            bi_windup(s);
          }
        }
        function _tr_tally(s, dist, lc) {
          s.pending_buf[s.d_buf + s.last_lit * 2] = dist >>> 8 & 255;
          s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 255;
          s.pending_buf[s.l_buf + s.last_lit] = lc & 255;
          s.last_lit++;
          if (dist === 0) {
            s.dyn_ltree[lc * 2]++;
          } else {
            s.matches++;
            dist--;
            s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]++;
            s.dyn_dtree[d_code(dist) * 2]++;
          }
          return s.last_lit === s.lit_bufsize - 1;
        }
        exports2._tr_init = _tr_init;
        exports2._tr_stored_block = _tr_stored_block;
        exports2._tr_flush_block = _tr_flush_block;
        exports2._tr_tally = _tr_tally;
        exports2._tr_align = _tr_align;
      }, { "../utils/common": 27 }], 39: [function(_dereq_, module2, exports2) {
        function ZStream() {
          this.input = null;
          this.next_in = 0;
          this.avail_in = 0;
          this.total_in = 0;
          this.output = null;
          this.next_out = 0;
          this.avail_out = 0;
          this.total_out = 0;
          this.msg = "";
          this.state = null;
          this.data_type = 2;
          this.adler = 0;
        }
        module2.exports = ZStream;
      }, {}] }, {}, [9])(9);
    });
  })(jszip);
  return jszip.exports;
}
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
(function(module, exports) {
  function make_xlsx_lib(XLSX) {
    XLSX.version = "0.15.6";
    var current_codepage = 1200, current_ansi = 1252;
    if (typeof commonjsRequire !== "undefined") {
      if (typeof cptable === "undefined") {
        if (typeof commonjsGlobal !== "undefined")
          commonjsGlobal.cptable = requireCpexcel();
        else if (typeof window !== "undefined")
          window.cptable = requireCpexcel();
      }
    }
    var VALID_ANSI = [874, 932, 936, 949, 950];
    for (var i2 = 0; i2 <= 8; ++i2)
      VALID_ANSI.push(1250 + i2);
    var CS2CP = {
      0: 1252,
      /* ANSI */
      1: 65001,
      /* DEFAULT */
      2: 65001,
      /* SYMBOL */
      77: 1e4,
      /* MAC */
      128: 932,
      /* SHIFTJIS */
      129: 949,
      /* HANGUL */
      130: 1361,
      /* JOHAB */
      134: 936,
      /* GB2312 */
      136: 950,
      /* CHINESEBIG5 */
      161: 1253,
      /* GREEK */
      162: 1254,
      /* TURKISH */
      163: 1258,
      /* VIETNAMESE */
      177: 1255,
      /* HEBREW */
      178: 1256,
      /* ARABIC */
      186: 1257,
      /* BALTIC */
      204: 1251,
      /* RUSSIAN */
      222: 874,
      /* THAI */
      238: 1250,
      /* EASTEUROPE */
      255: 1252,
      /* OEM */
      69: 6969
      /* MISC */
    };
    var set_ansi = function(cp) {
      if (VALID_ANSI.indexOf(cp) == -1)
        return;
      current_ansi = CS2CP[0] = cp;
    };
    function reset_ansi() {
      set_ansi(1252);
    }
    var set_cp = function(cp) {
      current_codepage = cp;
      set_ansi(cp);
    };
    function reset_cp() {
      set_cp(1200);
      reset_ansi();
    }
    function char_codes(data) {
      var o = [];
      for (var i3 = 0, len = data.length; i3 < len; ++i3)
        o[i3] = data.charCodeAt(i3);
      return o;
    }
    function utf16leread(data) {
      var o = [];
      for (var i3 = 0; i3 < data.length >> 1; ++i3)
        o[i3] = String.fromCharCode(data.charCodeAt(2 * i3) + (data.charCodeAt(2 * i3 + 1) << 8));
      return o.join("");
    }
    function utf16beread(data) {
      var o = [];
      for (var i3 = 0; i3 < data.length >> 1; ++i3)
        o[i3] = String.fromCharCode(data.charCodeAt(2 * i3 + 1) + (data.charCodeAt(2 * i3) << 8));
      return o.join("");
    }
    var debom = function(data) {
      var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);
      if (c1 == 255 && c2 == 254)
        return utf16leread(data.slice(2));
      if (c1 == 254 && c2 == 255)
        return utf16beread(data.slice(2));
      if (c1 == 65279)
        return data.slice(1);
      return data;
    };
    var _getchar = function _gc1(x) {
      return String.fromCharCode(x);
    };
    var _getansi = function _ga1(x) {
      return String.fromCharCode(x);
    };
    if (typeof cptable !== "undefined") {
      set_cp = function(cp) {
        current_codepage = cp;
        set_ansi(cp);
      };
      debom = function(data) {
        if (data.charCodeAt(0) === 255 && data.charCodeAt(1) === 254) {
          return cptable.utils.decode(1200, char_codes(data.slice(2)));
        }
        return data;
      };
      _getchar = function _gc2(x) {
        if (current_codepage === 1200)
          return String.fromCharCode(x);
        return cptable.utils.decode(current_codepage, [x & 255, x >> 8])[0];
      };
      _getansi = function _ga2(x) {
        return cptable.utils.decode(current_ansi, [x])[0];
      };
    }
    var Base64 = function make_b64() {
      var map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
      return {
        encode: function(input) {
          var o = "";
          var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
          for (var i3 = 0; i3 < input.length; ) {
            c1 = input.charCodeAt(i3++);
            e1 = c1 >> 2;
            c2 = input.charCodeAt(i3++);
            e2 = (c1 & 3) << 4 | c2 >> 4;
            c3 = input.charCodeAt(i3++);
            e3 = (c2 & 15) << 2 | c3 >> 6;
            e4 = c3 & 63;
            if (isNaN(c2)) {
              e3 = e4 = 64;
            } else if (isNaN(c3)) {
              e4 = 64;
            }
            o += map.charAt(e1) + map.charAt(e2) + map.charAt(e3) + map.charAt(e4);
          }
          return o;
        },
        decode: function b64_decode(input) {
          var o = "";
          var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
          input = input.replace(/[^\w\+\/\=]/g, "");
          for (var i3 = 0; i3 < input.length; ) {
            e1 = map.indexOf(input.charAt(i3++));
            e2 = map.indexOf(input.charAt(i3++));
            c1 = e1 << 2 | e2 >> 4;
            o += String.fromCharCode(c1);
            e3 = map.indexOf(input.charAt(i3++));
            c2 = (e2 & 15) << 4 | e3 >> 2;
            if (e3 !== 64) {
              o += String.fromCharCode(c2);
            }
            e4 = map.indexOf(input.charAt(i3++));
            c3 = (e3 & 3) << 6 | e4;
            if (e4 !== 64) {
              o += String.fromCharCode(c3);
            }
          }
          return o;
        }
      };
    }();
    var has_buf = typeof Buffer !== "undefined" && typeof process !== "undefined" && typeof process.versions !== "undefined" && !!process.versions.node;
    var Buffer_from = function() {
    };
    if (typeof Buffer !== "undefined") {
      var nbfs = !Buffer.from;
      if (!nbfs)
        try {
          Buffer.from("foo", "utf8");
        } catch (e) {
          nbfs = true;
        }
      Buffer_from = nbfs ? function(buf, enc) {
        return enc ? new Buffer(buf, enc) : new Buffer(buf);
      } : Buffer.from.bind(Buffer);
      if (!Buffer.alloc)
        Buffer.alloc = function(n) {
          return new Buffer(n);
        };
      if (!Buffer.allocUnsafe)
        Buffer.allocUnsafe = function(n) {
          return new Buffer(n);
        };
    }
    function new_raw_buf(len) {
      return has_buf ? Buffer.alloc(len) : new Array(len);
    }
    function new_unsafe_buf(len) {
      return has_buf ? Buffer.allocUnsafe(len) : new Array(len);
    }
    var s2a = function s2a2(s) {
      if (has_buf)
        return Buffer_from(s, "binary");
      return s.split("").map(function(x) {
        return x.charCodeAt(0) & 255;
      });
    };
    function s2ab(s) {
      if (typeof ArrayBuffer === "undefined")
        return s2a(s);
      var buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);
      for (var i3 = 0; i3 != s.length; ++i3)
        view[i3] = s.charCodeAt(i3) & 255;
      return buf;
    }
    function a2s(data) {
      if (Array.isArray(data))
        return data.map(function(c) {
          return String.fromCharCode(c);
        }).join("");
      var o = [];
      for (var i3 = 0; i3 < data.length; ++i3)
        o[i3] = String.fromCharCode(data[i3]);
      return o.join("");
    }
    function a2u(data) {
      if (typeof Uint8Array === "undefined")
        throw new Error("Unsupported");
      return new Uint8Array(data);
    }
    function ab2a(data) {
      if (typeof ArrayBuffer == "undefined")
        throw new Error("Unsupported");
      if (data instanceof ArrayBuffer)
        return ab2a(new Uint8Array(data));
      var o = new Array(data.length);
      for (var i3 = 0; i3 < data.length; ++i3)
        o[i3] = data[i3];
      return o;
    }
    var bconcat = function(bufs) {
      return [].concat.apply([], bufs);
    };
    var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g;
    var SSF = {};
    var make_ssf = function make_ssf2(SSF2) {
      SSF2.version = "0.10.3";
      function _strrev(x) {
        var o = "", i3 = x.length - 1;
        while (i3 >= 0)
          o += x.charAt(i3--);
        return o;
      }
      function fill2(c, l) {
        var o = "";
        while (o.length < l)
          o += c;
        return o;
      }
      function pad0(v, d) {
        var t = "" + v;
        return t.length >= d ? t : fill2("0", d - t.length) + t;
      }
      function pad_(v, d) {
        var t = "" + v;
        return t.length >= d ? t : fill2(" ", d - t.length) + t;
      }
      function rpad_(v, d) {
        var t = "" + v;
        return t.length >= d ? t : t + fill2(" ", d - t.length);
      }
      function pad0r1(v, d) {
        var t = "" + Math.round(v);
        return t.length >= d ? t : fill2("0", d - t.length) + t;
      }
      function pad0r2(v, d) {
        var t = "" + v;
        return t.length >= d ? t : fill2("0", d - t.length) + t;
      }
      var p2_32 = Math.pow(2, 32);
      function pad0r(v, d) {
        if (v > p2_32 || v < -p2_32)
          return pad0r1(v, d);
        var i3 = Math.round(v);
        return pad0r2(i3, d);
      }
      function isgeneral(s, i3) {
        i3 = i3 || 0;
        return s.length >= 7 + i3 && (s.charCodeAt(i3) | 32) === 103 && (s.charCodeAt(i3 + 1) | 32) === 101 && (s.charCodeAt(i3 + 2) | 32) === 110 && (s.charCodeAt(i3 + 3) | 32) === 101 && (s.charCodeAt(i3 + 4) | 32) === 114 && (s.charCodeAt(i3 + 5) | 32) === 97 && (s.charCodeAt(i3 + 6) | 32) === 108;
      }
      var days = [
        ["Sun", "Sunday"],
        ["Mon", "Monday"],
        ["Tue", "Tuesday"],
        ["Wed", "Wednesday"],
        ["Thu", "Thursday"],
        ["Fri", "Friday"],
        ["Sat", "Saturday"]
      ];
      var months = [
        ["J", "Jan", "January"],
        ["F", "Feb", "February"],
        ["M", "Mar", "March"],
        ["A", "Apr", "April"],
        ["M", "May", "May"],
        ["J", "Jun", "June"],
        ["J", "Jul", "July"],
        ["A", "Aug", "August"],
        ["S", "Sep", "September"],
        ["O", "Oct", "October"],
        ["N", "Nov", "November"],
        ["D", "Dec", "December"]
      ];
      function init_table(t) {
        t[0] = "General";
        t[1] = "0";
        t[2] = "0.00";
        t[3] = "#,##0";
        t[4] = "#,##0.00";
        t[9] = "0%";
        t[10] = "0.00%";
        t[11] = "0.00E+00";
        t[12] = "# ?/?";
        t[13] = "# ??/??";
        t[14] = "m/d/yy";
        t[15] = "d-mmm-yy";
        t[16] = "d-mmm";
        t[17] = "mmm-yy";
        t[18] = "h:mm AM/PM";
        t[19] = "h:mm:ss AM/PM";
        t[20] = "h:mm";
        t[21] = "h:mm:ss";
        t[22] = "m/d/yy h:mm";
        t[37] = "#,##0 ;(#,##0)";
        t[38] = "#,##0 ;[Red](#,##0)";
        t[39] = "#,##0.00;(#,##0.00)";
        t[40] = "#,##0.00;[Red](#,##0.00)";
        t[45] = "mm:ss";
        t[46] = "[h]:mm:ss";
        t[47] = "mmss.0";
        t[48] = "##0.0E+0";
        t[49] = "@";
        t[56] = '"上午/下午 "hh"時"mm"分"ss"秒 "';
        t[65535] = "General";
      }
      var table_fmt = {};
      init_table(table_fmt);
      function frac(x, D, mixed) {
        var sgn = x < 0 ? -1 : 1;
        var B = x * sgn;
        var P_2 = 0, P_1 = 1, P = 0;
        var Q_2 = 1, Q_1 = 0, Q = 0;
        var A = Math.floor(B);
        while (Q_1 < D) {
          A = Math.floor(B);
          P = A * P_1 + P_2;
          Q = A * Q_1 + Q_2;
          if (B - A < 5e-8)
            break;
          B = 1 / (B - A);
          P_2 = P_1;
          P_1 = P;
          Q_2 = Q_1;
          Q_1 = Q;
        }
        if (Q > D) {
          if (Q_1 > D) {
            Q = Q_2;
            P = P_2;
          } else {
            Q = Q_1;
            P = P_1;
          }
        }
        if (!mixed)
          return [0, sgn * P, Q];
        var q = Math.floor(sgn * P / Q);
        return [q, sgn * P - q * Q, Q];
      }
      function parse_date_code(v, opts, b2) {
        if (v > 2958465 || v < 0)
          return null;
        var date = v | 0, time = Math.floor(86400 * (v - date)), dow = 0;
        var dout = [];
        var out = { D: date, T: time, u: 86400 * (v - date) - time, y: 0, m: 0, d: 0, H: 0, M: 0, S: 0, q: 0 };
        if (Math.abs(out.u) < 1e-6)
          out.u = 0;
        if (opts && opts.date1904)
          date += 1462;
        if (out.u > 0.9999) {
          out.u = 0;
          if (++time == 86400) {
            out.T = time = 0;
            ++date;
            ++out.D;
          }
        }
        if (date === 60) {
          dout = b2 ? [1317, 10, 29] : [1900, 2, 29];
          dow = 3;
        } else if (date === 0) {
          dout = b2 ? [1317, 8, 29] : [1900, 1, 0];
          dow = 6;
        } else {
          if (date > 60)
            --date;
          var d = new Date(1900, 0, 1);
          d.setDate(d.getDate() + date - 1);
          dout = [d.getFullYear(), d.getMonth() + 1, d.getDate()];
          dow = d.getDay();
          if (date < 60)
            dow = (dow + 6) % 7;
          if (b2)
            dow = fix_hijri();
        }
        out.y = dout[0];
        out.m = dout[1];
        out.d = dout[2];
        out.S = time % 60;
        time = Math.floor(time / 60);
        out.M = time % 60;
        time = Math.floor(time / 60);
        out.H = time;
        out.q = dow;
        return out;
      }
      SSF2.parse_date_code = parse_date_code;
      var basedate2 = new Date(1899, 11, 31, 0, 0, 0);
      var dnthresh2 = basedate2.getTime();
      var base1904 = new Date(1900, 2, 1, 0, 0, 0);
      function datenum_local(v, date1904) {
        var epoch = v.getTime();
        if (date1904)
          epoch -= 1461 * 24 * 60 * 60 * 1e3;
        else if (v >= base1904)
          epoch += 24 * 60 * 60 * 1e3;
        return (epoch - (dnthresh2 + (v.getTimezoneOffset() - basedate2.getTimezoneOffset()) * 6e4)) / (24 * 60 * 60 * 1e3);
      }
      function general_fmt_int(v) {
        return v.toString(10);
      }
      SSF2._general_int = general_fmt_int;
      var general_fmt_num = function make_general_fmt_num() {
        var gnr1 = /\.(\d*[1-9])0+$/, gnr2 = /\.0*$/, gnr4 = /\.(\d*[1-9])0+/, gnr5 = /\.0*[Ee]/, gnr6 = /(E[+-])(\d)$/;
        function gfn2(v) {
          var w = v < 0 ? 12 : 11;
          var o = gfn5(v.toFixed(12));
          if (o.length <= w)
            return o;
          o = v.toPrecision(10);
          if (o.length <= w)
            return o;
          return v.toExponential(5);
        }
        function gfn3(v) {
          var o = v.toFixed(11).replace(gnr1, ".$1");
          if (o.length > (v < 0 ? 12 : 11))
            o = v.toPrecision(6);
          return o;
        }
        function gfn4(o) {
          for (var i3 = 0; i3 != o.length; ++i3)
            if ((o.charCodeAt(i3) | 32) === 101)
              return o.replace(gnr4, ".$1").replace(gnr5, "E").replace("e", "E").replace(gnr6, "$10$2");
          return o;
        }
        function gfn5(o) {
          return o.indexOf(".") > -1 ? o.replace(gnr2, "").replace(gnr1, ".$1") : o;
        }
        return function general_fmt_num2(v) {
          var V = Math.floor(Math.log(Math.abs(v)) * Math.LOG10E), o;
          if (V >= -4 && V <= -1)
            o = v.toPrecision(10 + V);
          else if (Math.abs(V) <= 9)
            o = gfn2(v);
          else if (V === 10)
            o = v.toFixed(10).substr(0, 12);
          else
            o = gfn3(v);
          return gfn5(gfn4(o));
        };
      }();
      SSF2._general_num = general_fmt_num;
      function general_fmt(v, opts) {
        switch (typeof v) {
          case "string":
            return v;
          case "boolean":
            return v ? "TRUE" : "FALSE";
          case "number":
            return (v | 0) === v ? v.toString(10) : general_fmt_num(v);
          case "undefined":
            return "";
          case "object":
            if (v == null)
              return "";
            if (v instanceof Date)
              return format(14, datenum_local(v, opts && opts.date1904), opts);
        }
        throw new Error("unsupported value in General format: " + v);
      }
      SSF2._general = general_fmt;
      function fix_hijri() {
        return 0;
      }
      function write_date(type, fmt, val, ss0) {
        var o = "", ss = 0, tt = 0, y = val.y, out, outl = 0;
        switch (type) {
          case 98:
            y = val.y + 543;
          case 121:
            switch (fmt.length) {
              case 1:
              case 2:
                out = y % 100;
                outl = 2;
                break;
              default:
                out = y % 1e4;
                outl = 4;
                break;
            }
            break;
          case 109:
            switch (fmt.length) {
              case 1:
              case 2:
                out = val.m;
                outl = fmt.length;
                break;
              case 3:
                return months[val.m - 1][1];
              case 5:
                return months[val.m - 1][0];
              default:
                return months[val.m - 1][2];
            }
            break;
          case 100:
            switch (fmt.length) {
              case 1:
              case 2:
                out = val.d;
                outl = fmt.length;
                break;
              case 3:
                return days[val.q][0];
              default:
                return days[val.q][1];
            }
            break;
          case 104:
            switch (fmt.length) {
              case 1:
              case 2:
                out = 1 + (val.H + 11) % 12;
                outl = fmt.length;
                break;
              default:
                throw "bad hour format: " + fmt;
            }
            break;
          case 72:
            switch (fmt.length) {
              case 1:
              case 2:
                out = val.H;
                outl = fmt.length;
                break;
              default:
                throw "bad hour format: " + fmt;
            }
            break;
          case 77:
            switch (fmt.length) {
              case 1:
              case 2:
                out = val.M;
                outl = fmt.length;
                break;
              default:
                throw "bad minute format: " + fmt;
            }
            break;
          case 115:
            if (fmt != "s" && fmt != "ss" && fmt != ".0" && fmt != ".00" && fmt != ".000")
              throw "bad second format: " + fmt;
            if (val.u === 0 && (fmt == "s" || fmt == "ss"))
              return pad0(val.S, fmt.length);
            if (ss0 >= 2)
              tt = ss0 === 3 ? 1e3 : 100;
            else
              tt = ss0 === 1 ? 10 : 1;
            ss = Math.round(tt * (val.S + val.u));
            if (ss >= 60 * tt)
              ss = 0;
            if (fmt === "s")
              return ss === 0 ? "0" : "" + ss / tt;
            o = pad0(ss, 2 + ss0);
            if (fmt === "ss")
              return o.substr(0, 2);
            return "." + o.substr(2, fmt.length - 1);
          case 90:
            switch (fmt) {
              case "[h]":
              case "[hh]":
                out = val.D * 24 + val.H;
                break;
              case "[m]":
              case "[mm]":
                out = (val.D * 24 + val.H) * 60 + val.M;
                break;
              case "[s]":
              case "[ss]":
                out = ((val.D * 24 + val.H) * 60 + val.M) * 60 + Math.round(val.S + val.u);
                break;
              default:
                throw "bad abstime format: " + fmt;
            }
            outl = fmt.length === 3 ? 1 : 2;
            break;
          case 101:
            out = y;
            outl = 1;
        }
        if (outl > 0)
          return pad0(out, outl);
        else
          return "";
      }
      function commaify(s) {
        var w = 3;
        if (s.length <= w)
          return s;
        var j2 = s.length % w, o = s.substr(0, j2);
        for (; j2 != s.length; j2 += w)
          o += (o.length > 0 ? "," : "") + s.substr(j2, w);
        return o;
      }
      var write_num = function make_write_num() {
        var pct1 = /%/g;
        function write_num_pct(type, fmt, val) {
          var sfmt = fmt.replace(pct1, ""), mul = fmt.length - sfmt.length;
          return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill2("%", mul);
        }
        function write_num_cm(type, fmt, val) {
          var idx = fmt.length - 1;
          while (fmt.charCodeAt(idx - 1) === 44)
            --idx;
          return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));
        }
        function write_num_exp(fmt, val) {
          var o;
          var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
          if (fmt.match(/^#+0.0E\+0$/)) {
            if (val == 0)
              return "0.0E+0";
            else if (val < 0)
              return "-" + write_num_exp(fmt, -val);
            var period = fmt.indexOf(".");
            if (period === -1)
              period = fmt.indexOf("E");
            var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;
            if (ee < 0)
              ee += period;
            o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);
            if (o.indexOf("e") === -1) {
              var fakee = Math.floor(Math.log(val) * Math.LOG10E);
              if (o.indexOf(".") === -1)
                o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length + ee);
              else
                o += "E+" + (fakee - ee);
              while (o.substr(0, 2) === "0.") {
                o = o.charAt(0) + o.substr(2, period) + "." + o.substr(2 + period);
                o = o.replace(/^0+([1-9])/, "$1").replace(/^0+\./, "0.");
              }
              o = o.replace(/\+-/, "-");
            }
            o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, function($$, $1, $2, $3) {
              return $1 + $2 + $3.substr(0, (period + ee) % period) + "." + $3.substr(ee) + "E";
            });
          } else
            o = val.toExponential(idx);
          if (fmt.match(/E\+00$/) && o.match(/e[+-]\d$/))
            o = o.substr(0, o.length - 1) + "0" + o.charAt(o.length - 1);
          if (fmt.match(/E\-/) && o.match(/e\+/))
            o = o.replace(/e\+/, "e");
          return o.replace("e", "E");
        }
        var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
        function write_num_f1(r, aval, sign) {
          var den = parseInt(r[4], 10), rr = Math.round(aval * den), base = Math.floor(rr / den);
          var myn = rr - base * den, myd = den;
          return sign + (base === 0 ? "" : "" + base) + " " + (myn === 0 ? fill2(" ", r[1].length + 1 + r[4].length) : pad_(myn, r[1].length) + r[2] + "/" + r[3] + pad0(myd, r[4].length));
        }
        function write_num_f2(r, aval, sign) {
          return sign + (aval === 0 ? "" : "" + aval) + fill2(" ", r[1].length + 2 + r[4].length);
        }
        var dec1 = /^#*0*\.([0#]+)/;
        var closeparen = /\).*[0#]/;
        var phone = /\(###\) ###\\?-####/;
        function hashq(str) {
          var o = "", cc;
          for (var i3 = 0; i3 != str.length; ++i3)
            switch (cc = str.charCodeAt(i3)) {
              case 35:
                break;
              case 63:
                o += " ";
                break;
              case 48:
                o += "0";
                break;
              default:
                o += String.fromCharCode(cc);
            }
          return o;
        }
        function rnd(val, d) {
          var dd = Math.pow(10, d);
          return "" + Math.round(val * dd) / dd;
        }
        function dec(val, d) {
          if (d < ("" + Math.round((val - Math.floor(val)) * Math.pow(10, d))).length) {
            return 0;
          }
          return Math.round((val - Math.floor(val)) * Math.pow(10, d));
        }
        function carry(val, d) {
          if (d < ("" + Math.round((val - Math.floor(val)) * Math.pow(10, d))).length) {
            return 1;
          }
          return 0;
        }
        function flr(val) {
          if (val < 2147483647 && val > -2147483648)
            return "" + (val >= 0 ? val | 0 : val - 1 | 0);
          return "" + Math.floor(val);
        }
        function write_num_flt(type, fmt, val) {
          if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
            var ffmt = fmt.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, "");
            if (val >= 0)
              return write_num_flt("n", ffmt, val);
            return "(" + write_num_flt("n", ffmt, -val) + ")";
          }
          if (fmt.charCodeAt(fmt.length - 1) === 44)
            return write_num_cm(type, fmt, val);
          if (fmt.indexOf("%") !== -1)
            return write_num_pct(type, fmt, val);
          if (fmt.indexOf("E") !== -1)
            return write_num_exp(fmt, val);
          if (fmt.charCodeAt(0) === 36)
            return "$" + write_num_flt(type, fmt.substr(fmt.charAt(1) == " " ? 2 : 1), val);
          var o;
          var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
          if (fmt.match(/^00+$/))
            return sign + pad0r(aval, fmt.length);
          if (fmt.match(/^[#?]+$/)) {
            o = pad0r(val, 0);
            if (o === "0")
              o = "";
            return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;
          }
          if (r = fmt.match(frac1))
            return write_num_f1(r, aval, sign);
          if (fmt.match(/^#+0+$/))
            return sign + pad0r(aval, fmt.length - fmt.indexOf("0"));
          if (r = fmt.match(dec1)) {
            o = rnd(val, r[1].length).replace(/^([^\.]+)$/, "$1." + hashq(r[1])).replace(/\.$/, "." + hashq(r[1])).replace(/\.(\d*)$/, function($$, $1) {
              return "." + $1 + fill2("0", hashq(r[1]).length - $1.length);
            });
            return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./, ".");
          }
          fmt = fmt.replace(/^#+([0.])/, "$1");
          if (r = fmt.match(/^(0*)\.(#*)$/)) {
            return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, r[1].length ? "0." : ".");
          }
          if (r = fmt.match(/^#{1,3},##0(\.?)$/))
            return sign + commaify(pad0r(aval, 0));
          if (r = fmt.match(/^#,##0\.([#0]*0)$/)) {
            return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify("" + (Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length), r[1].length);
          }
          if (r = fmt.match(/^#,#*,#0/))
            return write_num_flt(type, fmt.replace(/^#,#*,/, ""), val);
          if (r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) {
            o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g, ""), val));
            ri = 0;
            return _strrev(_strrev(fmt.replace(/\\/g, "")).replace(/[0#]/g, function(x2) {
              return ri < o.length ? o.charAt(ri++) : x2 === "0" ? "0" : "";
            }));
          }
          if (fmt.match(phone)) {
            o = write_num_flt(type, "##########", val);
            return "(" + o.substr(0, 3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
          }
          var oa = "";
          if (r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) {
            ri = Math.min(r[4].length, 7);
            ff = frac(aval, Math.pow(10, ri) - 1, false);
            o = "" + sign;
            oa = write_num("n", r[1], ff[1]);
            if (oa.charAt(oa.length - 1) == " ")
              oa = oa.substr(0, oa.length - 1) + "0";
            o += oa + r[2] + "/" + r[3];
            oa = rpad_(ff[2], ri);
            if (oa.length < r[4].length)
              oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;
            o += oa;
            return o;
          }
          if (r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) {
            ri = Math.min(Math.max(r[1].length, r[4].length), 7);
            ff = frac(aval, Math.pow(10, ri) - 1, true);
            return sign + (ff[0] || (ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1], ri) + r[2] + "/" + r[3] + rpad_(ff[2], ri) : fill2(" ", 2 * ri + 1 + r[2].length + r[3].length));
          }
          if (r = fmt.match(/^[#0?]+$/)) {
            o = pad0r(val, 0);
            if (fmt.length <= o.length)
              return o;
            return hashq(fmt.substr(0, fmt.length - o.length)) + o;
          }
          if (r = fmt.match(/^([#0?]+)\.([#0]+)$/)) {
            o = "" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, "$1");
            ri = o.indexOf(".");
            var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
            return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));
          }
          if (r = fmt.match(/^00,000\.([#0]*0)$/)) {
            ri = dec(val, r[1].length);
            return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(flr(val)).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, function($$) {
              return "00," + ($$.length < 3 ? pad0(0, 3 - $$.length) : "") + $$;
            }) + "." + pad0(ri, r[1].length);
          }
          switch (fmt) {
            case "###,##0.00":
              return write_num_flt(type, "#,##0.00", val);
            case "###,###":
            case "##,###":
            case "#,###":
              var x = commaify(pad0r(aval, 0));
              return x !== "0" ? sign + x : "";
            case "###,###.00":
              return write_num_flt(type, "###,##0.00", val).replace(/^0\./, ".");
            case "#,###.00":
              return write_num_flt(type, "#,##0.00", val).replace(/^0\./, ".");
          }
          throw new Error("unsupported format |" + fmt + "|");
        }
        function write_num_cm2(type, fmt, val) {
          var idx = fmt.length - 1;
          while (fmt.charCodeAt(idx - 1) === 44)
            --idx;
          return write_num(type, fmt.substr(0, idx), val / Math.pow(10, 3 * (fmt.length - idx)));
        }
        function write_num_pct2(type, fmt, val) {
          var sfmt = fmt.replace(pct1, ""), mul = fmt.length - sfmt.length;
          return write_num(type, sfmt, val * Math.pow(10, 2 * mul)) + fill2("%", mul);
        }
        function write_num_exp2(fmt, val) {
          var o;
          var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
          if (fmt.match(/^#+0.0E\+0$/)) {
            if (val == 0)
              return "0.0E+0";
            else if (val < 0)
              return "-" + write_num_exp2(fmt, -val);
            var period = fmt.indexOf(".");
            if (period === -1)
              period = fmt.indexOf("E");
            var ee = Math.floor(Math.log(val) * Math.LOG10E) % period;
            if (ee < 0)
              ee += period;
            o = (val / Math.pow(10, ee)).toPrecision(idx + 1 + (period + ee) % period);
            if (!o.match(/[Ee]/)) {
              var fakee = Math.floor(Math.log(val) * Math.LOG10E);
              if (o.indexOf(".") === -1)
                o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length + ee);
              else
                o += "E+" + (fakee - ee);
              o = o.replace(/\+-/, "-");
            }
            o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/, function($$, $1, $2, $3) {
              return $1 + $2 + $3.substr(0, (period + ee) % period) + "." + $3.substr(ee) + "E";
            });
          } else
            o = val.toExponential(idx);
          if (fmt.match(/E\+00$/) && o.match(/e[+-]\d$/))
            o = o.substr(0, o.length - 1) + "0" + o.charAt(o.length - 1);
          if (fmt.match(/E\-/) && o.match(/e\+/))
            o = o.replace(/e\+/, "e");
          return o.replace("e", "E");
        }
        function write_num_int(type, fmt, val) {
          if (type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
            var ffmt = fmt.replace(/\( */, "").replace(/ \)/, "").replace(/\)/, "");
            if (val >= 0)
              return write_num_int("n", ffmt, val);
            return "(" + write_num_int("n", ffmt, -val) + ")";
          }
          if (fmt.charCodeAt(fmt.length - 1) === 44)
            return write_num_cm2(type, fmt, val);
          if (fmt.indexOf("%") !== -1)
            return write_num_pct2(type, fmt, val);
          if (fmt.indexOf("E") !== -1)
            return write_num_exp2(fmt, val);
          if (fmt.charCodeAt(0) === 36)
            return "$" + write_num_int(type, fmt.substr(fmt.charAt(1) == " " ? 2 : 1), val);
          var o;
          var r, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
          if (fmt.match(/^00+$/))
            return sign + pad0(aval, fmt.length);
          if (fmt.match(/^[#?]+$/)) {
            o = "" + val;
            if (val === 0)
              o = "";
            return o.length > fmt.length ? o : hashq(fmt.substr(0, fmt.length - o.length)) + o;
          }
          if (r = fmt.match(frac1))
            return write_num_f2(r, aval, sign);
          if (fmt.match(/^#+0+$/))
            return sign + pad0(aval, fmt.length - fmt.indexOf("0"));
          if (r = fmt.match(dec1)) {
            o = ("" + val).replace(/^([^\.]+)$/, "$1." + hashq(r[1])).replace(/\.$/, "." + hashq(r[1]));
            o = o.replace(/\.(\d*)$/, function($$, $1) {
              return "." + $1 + fill2("0", hashq(r[1]).length - $1.length);
            });
            return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./, ".");
          }
          fmt = fmt.replace(/^#+([0.])/, "$1");
          if (r = fmt.match(/^(0*)\.(#*)$/)) {
            return sign + ("" + aval).replace(/\.(\d*[1-9])0*$/, ".$1").replace(/^(-?\d*)$/, "$1.").replace(/^0\./, r[1].length ? "0." : ".");
          }
          if (r = fmt.match(/^#{1,3},##0(\.?)$/))
            return sign + commaify("" + aval);
          if (r = fmt.match(/^#,##0\.([#0]*0)$/)) {
            return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify("" + val) + "." + fill2("0", r[1].length);
          }
          if (r = fmt.match(/^#,#*,#0/))
            return write_num_int(type, fmt.replace(/^#,#*,/, ""), val);
          if (r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/)) {
            o = _strrev(write_num_int(type, fmt.replace(/[\\-]/g, ""), val));
            ri = 0;
            return _strrev(_strrev(fmt.replace(/\\/g, "")).replace(/[0#]/g, function(x2) {
              return ri < o.length ? o.charAt(ri++) : x2 === "0" ? "0" : "";
            }));
          }
          if (fmt.match(phone)) {
            o = write_num_int(type, "##########", val);
            return "(" + o.substr(0, 3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
          }
          var oa = "";
          if (r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/)) {
            ri = Math.min(r[4].length, 7);
            ff = frac(aval, Math.pow(10, ri) - 1, false);
            o = "" + sign;
            oa = write_num("n", r[1], ff[1]);
            if (oa.charAt(oa.length - 1) == " ")
              oa = oa.substr(0, oa.length - 1) + "0";
            o += oa + r[2] + "/" + r[3];
            oa = rpad_(ff[2], ri);
            if (oa.length < r[4].length)
              oa = hashq(r[4].substr(r[4].length - oa.length)) + oa;
            o += oa;
            return o;
          }
          if (r = fmt.match(/^# ([#0?]+)( ?)\/( ?)([#0?]+)/)) {
            ri = Math.min(Math.max(r[1].length, r[4].length), 7);
            ff = frac(aval, Math.pow(10, ri) - 1, true);
            return sign + (ff[0] || (ff[1] ? "" : "0")) + " " + (ff[1] ? pad_(ff[1], ri) + r[2] + "/" + r[3] + rpad_(ff[2], ri) : fill2(" ", 2 * ri + 1 + r[2].length + r[3].length));
          }
          if (r = fmt.match(/^[#0?]+$/)) {
            o = "" + val;
            if (fmt.length <= o.length)
              return o;
            return hashq(fmt.substr(0, fmt.length - o.length)) + o;
          }
          if (r = fmt.match(/^([#0]+)\.([#0]+)$/)) {
            o = "" + val.toFixed(Math.min(r[2].length, 10)).replace(/([^0])0+$/, "$1");
            ri = o.indexOf(".");
            var lres = fmt.indexOf(".") - ri, rres = fmt.length - o.length - lres;
            return hashq(fmt.substr(0, lres) + o + fmt.substr(fmt.length - rres));
          }
          if (r = fmt.match(/^00,000\.([#0]*0)$/)) {
            return val < 0 ? "-" + write_num_int(type, fmt, -val) : commaify("" + val).replace(/^\d,\d{3}$/, "0$&").replace(/^\d*$/, function($$) {
              return "00," + ($$.length < 3 ? pad0(0, 3 - $$.length) : "") + $$;
            }) + "." + pad0(0, r[1].length);
          }
          switch (fmt) {
            case "###,###":
            case "##,###":
            case "#,###":
              var x = commaify("" + aval);
              return x !== "0" ? sign + x : "";
            default:
              if (fmt.match(/\.[0#?]*$/))
                return write_num_int(type, fmt.slice(0, fmt.lastIndexOf(".")), val) + hashq(fmt.slice(fmt.lastIndexOf(".")));
          }
          throw new Error("unsupported format |" + fmt + "|");
        }
        return function write_num2(type, fmt, val) {
          return (val | 0) === val ? write_num_int(type, fmt, val) : write_num_flt(type, fmt, val);
        };
      }();
      function split_fmt(fmt) {
        var out = [];
        var in_str = false;
        for (var i3 = 0, j2 = 0; i3 < fmt.length; ++i3)
          switch (
            /*cc=*/
            fmt.charCodeAt(i3)
          ) {
            case 34:
              in_str = !in_str;
              break;
            case 95:
            case 42:
            case 92:
              ++i3;
              break;
            case 59:
              out[out.length] = fmt.substr(j2, i3 - j2);
              j2 = i3 + 1;
          }
        out[out.length] = fmt.substr(j2);
        if (in_str === true)
          throw new Error("Format |" + fmt + "| unterminated string ");
        return out;
      }
      SSF2._split = split_fmt;
      var abstime = /\[[HhMmSs]*\]/;
      function fmt_is_date(fmt) {
        var i3 = 0, c = "", o = "";
        while (i3 < fmt.length) {
          switch (c = fmt.charAt(i3)) {
            case "G":
              if (isgeneral(fmt, i3))
                i3 += 6;
              i3++;
              break;
            case '"':
              for (
                ;
                /*cc=*/
                fmt.charCodeAt(++i3) !== 34 && i3 < fmt.length;
              ) {
              }
              ++i3;
              break;
            case "\\":
              i3 += 2;
              break;
            case "_":
              i3 += 2;
              break;
            case "@":
              ++i3;
              break;
            case "B":
            case "b":
              if (fmt.charAt(i3 + 1) === "1" || fmt.charAt(i3 + 1) === "2")
                return true;
            case "M":
            case "D":
            case "Y":
            case "H":
            case "S":
            case "E":
            case "m":
            case "d":
            case "y":
            case "h":
            case "s":
            case "e":
            case "g":
              return true;
            case "A":
            case "a":
              if (fmt.substr(i3, 3).toUpperCase() === "A/P")
                return true;
              if (fmt.substr(i3, 5).toUpperCase() === "AM/PM")
                return true;
              ++i3;
              break;
            case "[":
              o = c;
              while (fmt.charAt(i3++) !== "]" && i3 < fmt.length)
                o += fmt.charAt(i3);
              if (o.match(abstime))
                return true;
              break;
            case ".":
            case "0":
            case "#":
              while (i3 < fmt.length && ("0#?.,E+-%".indexOf(c = fmt.charAt(++i3)) > -1 || c == "\\" && fmt.charAt(i3 + 1) == "-" && "0#".indexOf(fmt.charAt(i3 + 2)) > -1)) {
              }
              break;
            case "?":
              while (fmt.charAt(++i3) === c) {
              }
              break;
            case "*":
              ++i3;
              if (fmt.charAt(i3) == " " || fmt.charAt(i3) == "*")
                ++i3;
              break;
            case "(":
            case ")":
              ++i3;
              break;
            case "1":
            case "2":
            case "3":
            case "4":
            case "5":
            case "6":
            case "7":
            case "8":
            case "9":
              while (i3 < fmt.length && "0123456789".indexOf(fmt.charAt(++i3)) > -1) {
              }
              break;
            case " ":
              ++i3;
              break;
            default:
              ++i3;
              break;
          }
        }
        return false;
      }
      SSF2.is_date = fmt_is_date;
      function eval_fmt(fmt, v, opts, flen) {
        var out = [], o = "", i3 = 0, c = "", lst = "t", dt, j2, cc;
        var hr = "H";
        while (i3 < fmt.length) {
          switch (c = fmt.charAt(i3)) {
            case "G":
              if (!isgeneral(fmt, i3))
                throw new Error("unrecognized character " + c + " in " + fmt);
              out[out.length] = { t: "G", v: "General" };
              i3 += 7;
              break;
            case '"':
              for (o = ""; (cc = fmt.charCodeAt(++i3)) !== 34 && i3 < fmt.length; )
                o += String.fromCharCode(cc);
              out[out.length] = { t: "t", v: o };
              ++i3;
              break;
            case "\\":
              var w = fmt.charAt(++i3), t = w === "(" || w === ")" ? w : "t";
              out[out.length] = { t, v: w };
              ++i3;
              break;
            case "_":
              out[out.length] = { t: "t", v: " " };
              i3 += 2;
              break;
            case "@":
              out[out.length] = { t: "T", v };
              ++i3;
              break;
            case "B":
            case "b":
              if (fmt.charAt(i3 + 1) === "1" || fmt.charAt(i3 + 1) === "2") {
                if (dt == null) {
                  dt = parse_date_code(v, opts, fmt.charAt(i3 + 1) === "2");
                  if (dt == null)
                    return "";
                }
                out[out.length] = { t: "X", v: fmt.substr(i3, 2) };
                lst = c;
                i3 += 2;
                break;
              }
            case "M":
            case "D":
            case "Y":
            case "H":
            case "S":
            case "E":
              c = c.toLowerCase();
            case "m":
            case "d":
            case "y":
            case "h":
            case "s":
            case "e":
            case "g":
              if (v < 0)
                return "";
              if (dt == null) {
                dt = parse_date_code(v, opts);
                if (dt == null)
                  return "";
              }
              o = c;
              while (++i3 < fmt.length && fmt.charAt(i3).toLowerCase() === c)
                o += c;
              if (c === "m" && lst.toLowerCase() === "h")
                c = "M";
              if (c === "h")
                c = hr;
              out[out.length] = { t: c, v: o };
              lst = c;
              break;
            case "A":
            case "a":
              var q = { t: c, v: c };
              if (dt == null)
                dt = parse_date_code(v, opts);
              if (fmt.substr(i3, 3).toUpperCase() === "A/P") {
                if (dt != null)
                  q.v = dt.H >= 12 ? "P" : "A";
                q.t = "T";
                hr = "h";
                i3 += 3;
              } else if (fmt.substr(i3, 5).toUpperCase() === "AM/PM") {
                if (dt != null)
                  q.v = dt.H >= 12 ? "PM" : "AM";
                q.t = "T";
                i3 += 5;
                hr = "h";
              } else {
                q.t = "t";
                ++i3;
              }
              if (dt == null && q.t === "T")
                return "";
              out[out.length] = q;
              lst = c;
              break;
            case "[":
              o = c;
              while (fmt.charAt(i3++) !== "]" && i3 < fmt.length)
                o += fmt.charAt(i3);
              if (o.slice(-1) !== "]")
                throw 'unterminated "[" block: |' + o + "|";
              if (o.match(abstime)) {
                if (dt == null) {
                  dt = parse_date_code(v, opts);
                  if (dt == null)
                    return "";
                }
                out[out.length] = { t: "Z", v: o.toLowerCase() };
                lst = o.charAt(1);
              } else if (o.indexOf("$") > -1) {
                o = (o.match(/\$([^-\[\]]*)/) || [])[1] || "$";
                if (!fmt_is_date(fmt))
                  out[out.length] = { t: "t", v: o };
              }
              break;
            case ".":
              if (dt != null) {
                o = c;
                while (++i3 < fmt.length && (c = fmt.charAt(i3)) === "0")
                  o += c;
                out[out.length] = { t: "s", v: o };
                break;
              }
            case "0":
            case "#":
              o = c;
              while (++i3 < fmt.length && "0#?.,E+-%".indexOf(c = fmt.charAt(i3)) > -1 || c == "\\" && fmt.charAt(i3 + 1) == "-" && i3 < fmt.length - 2 && "0#".indexOf(fmt.charAt(i3 + 2)) > -1)
                o += c;
              out[out.length] = { t: "n", v: o };
              break;
            case "?":
              o = c;
              while (fmt.charAt(++i3) === c)
                o += c;
              out[out.length] = { t: c, v: o };
              lst = c;
              break;
            case "*":
              ++i3;
              if (fmt.charAt(i3) == " " || fmt.charAt(i3) == "*")
                ++i3;
              break;
            case "(":
            case ")":
              out[out.length] = { t: flen === 1 ? "t" : c, v: c };
              ++i3;
              break;
            case "1":
            case "2":
            case "3":
            case "4":
            case "5":
            case "6":
            case "7":
            case "8":
            case "9":
              o = c;
              while (i3 < fmt.length && "0123456789".indexOf(fmt.charAt(++i3)) > -1)
                o += fmt.charAt(i3);
              out[out.length] = { t: "D", v: o };
              break;
            case " ":
              out[out.length] = { t: c, v: c };
              ++i3;
              break;
            case "$":
              out[out.length] = { t: "t", v: "$" };
              ++i3;
              break;
            default:
              if (",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP".indexOf(c) === -1)
                throw new Error("unrecognized character " + c + " in " + fmt);
              out[out.length] = { t: "t", v: c };
              ++i3;
              break;
          }
        }
        var bt = 0, ss0 = 0, ssm;
        for (i3 = out.length - 1, lst = "t"; i3 >= 0; --i3) {
          switch (out[i3].t) {
            case "h":
            case "H":
              out[i3].t = hr;
              lst = "h";
              if (bt < 1)
                bt = 1;
              break;
            case "s":
              if (ssm = out[i3].v.match(/\.0+$/))
                ss0 = Math.max(ss0, ssm[0].length - 1);
              if (bt < 3)
                bt = 3;
            case "d":
            case "y":
            case "M":
            case "e":
              lst = out[i3].t;
              break;
            case "m":
              if (lst === "s") {
                out[i3].t = "M";
                if (bt < 2)
                  bt = 2;
              }
              break;
            case "X":
              break;
            case "Z":
              if (bt < 1 && out[i3].v.match(/[Hh]/))
                bt = 1;
              if (bt < 2 && out[i3].v.match(/[Mm]/))
                bt = 2;
              if (bt < 3 && out[i3].v.match(/[Ss]/))
                bt = 3;
          }
        }
        switch (bt) {
          case 0:
            break;
          case 1:
            if (dt.u >= 0.5) {
              dt.u = 0;
              ++dt.S;
            }
            if (dt.S >= 60) {
              dt.S = 0;
              ++dt.M;
            }
            if (dt.M >= 60) {
              dt.M = 0;
              ++dt.H;
            }
            break;
          case 2:
            if (dt.u >= 0.5) {
              dt.u = 0;
              ++dt.S;
            }
            if (dt.S >= 60) {
              dt.S = 0;
              ++dt.M;
            }
            break;
        }
        var nstr = "", jj;
        for (i3 = 0; i3 < out.length; ++i3) {
          switch (out[i3].t) {
            case "t":
            case "T":
            case " ":
            case "D":
              break;
            case "X":
              out[i3].v = "";
              out[i3].t = ";";
              break;
            case "d":
            case "m":
            case "y":
            case "h":
            case "H":
            case "M":
            case "s":
            case "e":
            case "b":
            case "Z":
              out[i3].v = write_date(out[i3].t.charCodeAt(0), out[i3].v, dt, ss0);
              out[i3].t = "t";
              break;
            case "n":
            case "(":
            case "?":
              jj = i3 + 1;
              while (out[jj] != null && ((c = out[jj].t) === "?" || c === "D" || (c === " " || c === "t") && out[jj + 1] != null && (out[jj + 1].t === "?" || out[jj + 1].t === "t" && out[jj + 1].v === "/") || out[i3].t === "(" && (c === " " || c === "n" || c === ")") || c === "t" && (out[jj].v === "/" || out[jj].v === " " && out[jj + 1] != null && out[jj + 1].t == "?"))) {
                out[i3].v += out[jj].v;
                out[jj] = { v: "", t: ";" };
                ++jj;
              }
              nstr += out[i3].v;
              i3 = jj - 1;
              break;
            case "G":
              out[i3].t = "t";
              out[i3].v = general_fmt(v, opts);
              break;
          }
        }
        var vv = "", myv, ostr;
        if (nstr.length > 0) {
          if (nstr.charCodeAt(0) == 40) {
            myv = v < 0 && nstr.charCodeAt(0) === 45 ? -v : v;
            ostr = write_num("(", nstr, myv);
          } else {
            myv = v < 0 && flen > 1 ? -v : v;
            ostr = write_num("n", nstr, myv);
            if (myv < 0 && out[0] && out[0].t == "t") {
              ostr = ostr.substr(1);
              out[0].v = "-" + out[0].v;
            }
          }
          jj = ostr.length - 1;
          var decpt = out.length;
          for (i3 = 0; i3 < out.length; ++i3)
            if (out[i3] != null && out[i3].t != "t" && out[i3].v.indexOf(".") > -1) {
              decpt = i3;
              break;
            }
          var lasti = out.length;
          if (decpt === out.length && ostr.indexOf("E") === -1) {
            for (i3 = out.length - 1; i3 >= 0; --i3) {
              if (out[i3] == null || "n?(".indexOf(out[i3].t) === -1)
                continue;
              if (jj >= out[i3].v.length - 1) {
                jj -= out[i3].v.length;
                out[i3].v = ostr.substr(jj + 1, out[i3].v.length);
              } else if (jj < 0)
                out[i3].v = "";
              else {
                out[i3].v = ostr.substr(0, jj + 1);
                jj = -1;
              }
              out[i3].t = "t";
              lasti = i3;
            }
            if (jj >= 0 && lasti < out.length)
              out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;
          } else if (decpt !== out.length && ostr.indexOf("E") === -1) {
            jj = ostr.indexOf(".") - 1;
            for (i3 = decpt; i3 >= 0; --i3) {
              if (out[i3] == null || "n?(".indexOf(out[i3].t) === -1)
                continue;
              j2 = out[i3].v.indexOf(".") > -1 && i3 === decpt ? out[i3].v.indexOf(".") - 1 : out[i3].v.length - 1;
              vv = out[i3].v.substr(j2 + 1);
              for (; j2 >= 0; --j2) {
                if (jj >= 0 && (out[i3].v.charAt(j2) === "0" || out[i3].v.charAt(j2) === "#"))
                  vv = ostr.charAt(jj--) + vv;
              }
              out[i3].v = vv;
              out[i3].t = "t";
              lasti = i3;
            }
            if (jj >= 0 && lasti < out.length)
              out[lasti].v = ostr.substr(0, jj + 1) + out[lasti].v;
            jj = ostr.indexOf(".") + 1;
            for (i3 = decpt; i3 < out.length; ++i3) {
              if (out[i3] == null || "n?(".indexOf(out[i3].t) === -1 && i3 !== decpt)
                continue;
              j2 = out[i3].v.indexOf(".") > -1 && i3 === decpt ? out[i3].v.indexOf(".") + 1 : 0;
              vv = out[i3].v.substr(0, j2);
              for (; j2 < out[i3].v.length; ++j2) {
                if (jj < ostr.length)
                  vv += ostr.charAt(jj++);
              }
              out[i3].v = vv;
              out[i3].t = "t";
              lasti = i3;
            }
          }
        }
        for (i3 = 0; i3 < out.length; ++i3)
          if (out[i3] != null && "n(?".indexOf(out[i3].t) > -1) {
            myv = flen > 1 && v < 0 && i3 > 0 && out[i3 - 1].v === "-" ? -v : v;
            out[i3].v = write_num(out[i3].t, out[i3].v, myv);
            out[i3].t = "t";
          }
        var retval = "";
        for (i3 = 0; i3 !== out.length; ++i3)
          if (out[i3] != null)
            retval += out[i3].v;
        return retval;
      }
      SSF2._eval = eval_fmt;
      var cfregex = /\[[=<>]/;
      var cfregex2 = /\[(=|>[=]?|<[>=]?)(-?\d+(?:\.\d*)?)\]/;
      function chkcond(v, rr) {
        if (rr == null)
          return false;
        var thresh = parseFloat(rr[2]);
        switch (rr[1]) {
          case "=":
            if (v == thresh)
              return true;
            break;
          case ">":
            if (v > thresh)
              return true;
            break;
          case "<":
            if (v < thresh)
              return true;
            break;
          case "<>":
            if (v != thresh)
              return true;
            break;
          case ">=":
            if (v >= thresh)
              return true;
            break;
          case "<=":
            if (v <= thresh)
              return true;
            break;
        }
        return false;
      }
      function choose_fmt(f, v) {
        var fmt = split_fmt(f);
        var l = fmt.length, lat = fmt[l - 1].indexOf("@");
        if (l < 4 && lat > -1)
          --l;
        if (fmt.length > 4)
          throw new Error("cannot find right format for |" + fmt.join("|") + "|");
        if (typeof v !== "number")
          return [4, fmt.length === 4 || lat > -1 ? fmt[fmt.length - 1] : "@"];
        switch (fmt.length) {
          case 1:
            fmt = lat > -1 ? ["General", "General", "General", fmt[0]] : [fmt[0], fmt[0], fmt[0], "@"];
            break;
          case 2:
            fmt = lat > -1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], "@"];
            break;
          case 3:
            fmt = lat > -1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], "@"];
            break;
        }
        var ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];
        if (fmt[0].indexOf("[") === -1 && fmt[1].indexOf("[") === -1)
          return [l, ff];
        if (fmt[0].match(cfregex) != null || fmt[1].match(cfregex) != null) {
          var m1 = fmt[0].match(cfregex2);
          var m2 = fmt[1].match(cfregex2);
          return chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];
        }
        return [l, ff];
      }
      function format(fmt, v, o) {
        if (o == null)
          o = {};
        var sfmt = "";
        switch (typeof fmt) {
          case "string":
            if (fmt == "m/d/yy" && o.dateNF)
              sfmt = o.dateNF;
            else
              sfmt = fmt;
            break;
          case "number":
            if (fmt == 14 && o.dateNF)
              sfmt = o.dateNF;
            else
              sfmt = (o.table != null ? o.table : table_fmt)[fmt];
            break;
        }
        if (isgeneral(sfmt, 0))
          return general_fmt(v, o);
        if (v instanceof Date)
          v = datenum_local(v, o.date1904);
        var f = choose_fmt(sfmt, v);
        if (isgeneral(f[1]))
          return general_fmt(v, o);
        if (v === true)
          v = "TRUE";
        else if (v === false)
          v = "FALSE";
        else if (v === "" || v == null)
          return "";
        return eval_fmt(f[1], v, o, f[0]);
      }
      function load_entry(fmt, idx) {
        if (typeof idx != "number") {
          idx = +idx || -1;
          for (var i3 = 0; i3 < 392; ++i3) {
            if (table_fmt[i3] == void 0) {
              if (idx < 0)
                idx = i3;
              continue;
            }
            if (table_fmt[i3] == fmt) {
              idx = i3;
              break;
            }
          }
          if (idx < 0)
            idx = 391;
        }
        table_fmt[idx] = fmt;
        return idx;
      }
      SSF2.load = load_entry;
      SSF2._table = table_fmt;
      SSF2.get_table = function get_table() {
        return table_fmt;
      };
      SSF2.load_table = function load_table(tbl) {
        for (var i3 = 0; i3 != 392; ++i3)
          if (tbl[i3] !== void 0)
            load_entry(tbl[i3], i3);
      };
      SSF2.init_table = init_table;
      SSF2.format = format;
    };
    make_ssf(SSF);
    var XLMLFormatMap = {
      "General Number": "General",
      "General Date": SSF._table[22],
      "Long Date": "dddd, mmmm dd, yyyy",
      "Medium Date": SSF._table[15],
      "Short Date": SSF._table[14],
      "Long Time": SSF._table[19],
      "Medium Time": SSF._table[18],
      "Short Time": SSF._table[20],
      "Currency": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
      "Fixed": SSF._table[2],
      "Standard": SSF._table[4],
      "Percent": SSF._table[10],
      "Scientific": SSF._table[11],
      "Yes/No": '"Yes";"Yes";"No";@',
      "True/False": '"True";"True";"False";@',
      "On/Off": '"Yes";"Yes";"No";@'
    };
    var SSFImplicit = {
      "5": '"$"#,##0_);\\("$"#,##0\\)',
      "6": '"$"#,##0_);[Red]\\("$"#,##0\\)',
      "7": '"$"#,##0.00_);\\("$"#,##0.00\\)',
      "8": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
      "23": "General",
      "24": "General",
      "25": "General",
      "26": "General",
      "27": "m/d/yy",
      "28": "m/d/yy",
      "29": "m/d/yy",
      "30": "m/d/yy",
      "31": "m/d/yy",
      "32": "h:mm:ss",
      "33": "h:mm:ss",
      "34": "h:mm:ss",
      "35": "h:mm:ss",
      "36": "m/d/yy",
      "41": '_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)',
      "42": '_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)',
      "43": '_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)',
      "44": '_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)',
      "50": "m/d/yy",
      "51": "m/d/yy",
      "52": "m/d/yy",
      "53": "m/d/yy",
      "54": "m/d/yy",
      "55": "m/d/yy",
      "56": "m/d/yy",
      "57": "m/d/yy",
      "58": "m/d/yy",
      "59": "0",
      "60": "0.00",
      "61": "#,##0",
      "62": "#,##0.00",
      "63": '"$"#,##0_);\\("$"#,##0\\)',
      "64": '"$"#,##0_);[Red]\\("$"#,##0\\)',
      "65": '"$"#,##0.00_);\\("$"#,##0.00\\)',
      "66": '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
      "67": "0%",
      "68": "0.00%",
      "69": "# ?/?",
      "70": "# ??/??",
      "71": "m/d/yy",
      "72": "m/d/yy",
      "73": "d-mmm-yy",
      "74": "d-mmm",
      "75": "mmm-yy",
      "76": "h:mm",
      "77": "h:mm:ss",
      "78": "m/d/yy h:mm",
      "79": "mm:ss",
      "80": "[h]:mm:ss",
      "81": "mmss.0"
    };
    var dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;
    function dateNF_regex(dateNF) {
      var fmt = typeof dateNF == "number" ? SSF._table[dateNF] : dateNF;
      fmt = fmt.replace(dateNFregex, "(\\d+)");
      return new RegExp("^" + fmt + "$");
    }
    function dateNF_fix(str, dateNF, match) {
      var Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;
      (dateNF.match(dateNFregex) || []).forEach(function(n, i3) {
        var v = parseInt(match[i3 + 1], 10);
        switch (n.toLowerCase().charAt(0)) {
          case "y":
            Y = v;
            break;
          case "d":
            d = v;
            break;
          case "h":
            H = v;
            break;
          case "s":
            S = v;
            break;
          case "m":
            if (H >= 0)
              M = v;
            else
              m = v;
            break;
        }
      });
      if (S >= 0 && M == -1 && m >= 0) {
        M = m;
        m = -1;
      }
      var datestr = ("" + (Y >= 0 ? Y : (/* @__PURE__ */ new Date()).getFullYear())).slice(-4) + "-" + ("00" + (m >= 1 ? m : 1)).slice(-2) + "-" + ("00" + (d >= 1 ? d : 1)).slice(-2);
      if (datestr.length == 7)
        datestr = "0" + datestr;
      if (datestr.length == 8)
        datestr = "20" + datestr;
      var timestr = ("00" + (H >= 0 ? H : 0)).slice(-2) + ":" + ("00" + (M >= 0 ? M : 0)).slice(-2) + ":" + ("00" + (S >= 0 ? S : 0)).slice(-2);
      if (H == -1 && M == -1 && S == -1)
        return datestr;
      if (Y == -1 && m == -1 && d == -1)
        return timestr;
      return datestr + "T" + timestr;
    }
    var DO_NOT_EXPORT_CFB = true;
    var CRC32;
    (function(factory) {
      factory(CRC32 = {});
    })(function(CRC322) {
      CRC322.version = "1.2.0";
      function signed_crc_table() {
        var c = 0, table = new Array(256);
        for (var n = 0; n != 256; ++n) {
          c = n;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          c = c & 1 ? -306674912 ^ c >>> 1 : c >>> 1;
          table[n] = c;
        }
        return typeof Int32Array !== "undefined" ? new Int32Array(table) : table;
      }
      var T = signed_crc_table();
      function crc32_bstr(bstr, seed) {
        var C = seed ^ -1, L = bstr.length - 1;
        for (var i3 = 0; i3 < L; ) {
          C = C >>> 8 ^ T[(C ^ bstr.charCodeAt(i3++)) & 255];
          C = C >>> 8 ^ T[(C ^ bstr.charCodeAt(i3++)) & 255];
        }
        if (i3 === L)
          C = C >>> 8 ^ T[(C ^ bstr.charCodeAt(i3)) & 255];
        return C ^ -1;
      }
      function crc32_buf(buf, seed) {
        if (buf.length > 1e4)
          return crc32_buf_8(buf, seed);
        var C = seed ^ -1, L = buf.length - 3;
        for (var i3 = 0; i3 < L; ) {
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
        }
        while (i3 < L + 3)
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
        return C ^ -1;
      }
      function crc32_buf_8(buf, seed) {
        var C = seed ^ -1, L = buf.length - 7;
        for (var i3 = 0; i3 < L; ) {
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
        }
        while (i3 < L + 7)
          C = C >>> 8 ^ T[(C ^ buf[i3++]) & 255];
        return C ^ -1;
      }
      function crc32_str(str, seed) {
        var C = seed ^ -1;
        for (var i3 = 0, L = str.length, c, d; i3 < L; ) {
          c = str.charCodeAt(i3++);
          if (c < 128) {
            C = C >>> 8 ^ T[(C ^ c) & 255];
          } else if (c < 2048) {
            C = C >>> 8 ^ T[(C ^ (192 | c >> 6 & 31)) & 255];
            C = C >>> 8 ^ T[(C ^ (128 | c & 63)) & 255];
          } else if (c >= 55296 && c < 57344) {
            c = (c & 1023) + 64;
            d = str.charCodeAt(i3++) & 1023;
            C = C >>> 8 ^ T[(C ^ (240 | c >> 8 & 7)) & 255];
            C = C >>> 8 ^ T[(C ^ (128 | c >> 2 & 63)) & 255];
            C = C >>> 8 ^ T[(C ^ (128 | d >> 6 & 15 | (c & 3) << 4)) & 255];
            C = C >>> 8 ^ T[(C ^ (128 | d & 63)) & 255];
          } else {
            C = C >>> 8 ^ T[(C ^ (224 | c >> 12 & 15)) & 255];
            C = C >>> 8 ^ T[(C ^ (128 | c >> 6 & 63)) & 255];
            C = C >>> 8 ^ T[(C ^ (128 | c & 63)) & 255];
          }
        }
        return C ^ -1;
      }
      CRC322.table = T;
      CRC322.bstr = crc32_bstr;
      CRC322.buf = crc32_buf;
      CRC322.str = crc32_str;
    });
    var CFB = function _CFB() {
      var exports2 = {};
      exports2.version = "1.1.4";
      function namecmp(l, r) {
        var L = l.split("/"), R = r.split("/");
        for (var i4 = 0, c = 0, Z = Math.min(L.length, R.length); i4 < Z; ++i4) {
          if (c = L[i4].length - R[i4].length)
            return c;
          if (L[i4] != R[i4])
            return L[i4] < R[i4] ? -1 : 1;
        }
        return L.length - R.length;
      }
      function dirname(p) {
        if (p.charAt(p.length - 1) == "/")
          return p.slice(0, -1).indexOf("/") === -1 ? p : dirname(p.slice(0, -1));
        var c = p.lastIndexOf("/");
        return c === -1 ? p : p.slice(0, c + 1);
      }
      function filename(p) {
        if (p.charAt(p.length - 1) == "/")
          return filename(p.slice(0, -1));
        var c = p.lastIndexOf("/");
        return c === -1 ? p : p.slice(c + 1);
      }
      function write_dos_date(buf, date) {
        if (typeof date === "string")
          date = new Date(date);
        var hms = date.getHours();
        hms = hms << 6 | date.getMinutes();
        hms = hms << 5 | date.getSeconds() >>> 1;
        buf.write_shift(2, hms);
        var ymd = date.getFullYear() - 1980;
        ymd = ymd << 4 | date.getMonth() + 1;
        ymd = ymd << 5 | date.getDate();
        buf.write_shift(2, ymd);
      }
      function parse_dos_date(buf) {
        var hms = buf.read_shift(2) & 65535;
        var ymd = buf.read_shift(2) & 65535;
        var val = /* @__PURE__ */ new Date();
        var d = ymd & 31;
        ymd >>>= 5;
        var m = ymd & 15;
        ymd >>>= 4;
        val.setMilliseconds(0);
        val.setFullYear(ymd + 1980);
        val.setMonth(m - 1);
        val.setDate(d);
        var S = hms & 31;
        hms >>>= 5;
        var M = hms & 63;
        hms >>>= 6;
        val.setHours(hms);
        val.setMinutes(M);
        val.setSeconds(S << 1);
        return val;
      }
      function parse_extra_field(blob) {
        prep_blob(blob, 0);
        var o = {};
        var flags = 0;
        while (blob.l <= blob.length - 4) {
          var type = blob.read_shift(2);
          var sz = blob.read_shift(2), tgt = blob.l + sz;
          var p = {};
          switch (type) {
            case 21589:
              {
                flags = blob.read_shift(1);
                if (flags & 1)
                  p.mtime = blob.read_shift(4);
                if (sz > 5) {
                  if (flags & 2)
                    p.atime = blob.read_shift(4);
                  if (flags & 4)
                    p.ctime = blob.read_shift(4);
                }
                if (p.mtime)
                  p.mt = new Date(p.mtime * 1e3);
              }
              break;
          }
          blob.l = tgt;
          o[type] = p;
        }
        return o;
      }
      var fs;
      function get_fs() {
        return fs || (fs = require$$4);
      }
      function parse(file, options) {
        if (file[0] == 80 && file[1] == 75)
          return parse_zip2(file, options);
        if (file.length < 512)
          throw new Error("CFB file size " + file.length + " < 512");
        var mver = 3;
        var ssz = 512;
        var nmfs = 0;
        var difat_sec_cnt = 0;
        var dir_start = 0;
        var minifat_start = 0;
        var difat_start = 0;
        var fat_addrs = [];
        var blob = file.slice(0, 512);
        prep_blob(blob, 0);
        var mv = check_get_mver(blob);
        mver = mv[0];
        switch (mver) {
          case 3:
            ssz = 512;
            break;
          case 4:
            ssz = 4096;
            break;
          case 0:
            if (mv[1] == 0)
              return parse_zip2(file, options);
          default:
            throw new Error("Major Version: Expected 3 or 4 saw " + mver);
        }
        if (ssz !== 512) {
          blob = file.slice(0, ssz);
          prep_blob(
            blob,
            28
            /* blob.l */
          );
        }
        var header = file.slice(0, ssz);
        check_shifts(blob, mver);
        var dir_cnt = blob.read_shift(4, "i");
        if (mver === 3 && dir_cnt !== 0)
          throw new Error("# Directory Sectors: Expected 0 saw " + dir_cnt);
        blob.l += 4;
        dir_start = blob.read_shift(4, "i");
        blob.l += 4;
        blob.chk("00100000", "Mini Stream Cutoff Size: ");
        minifat_start = blob.read_shift(4, "i");
        nmfs = blob.read_shift(4, "i");
        difat_start = blob.read_shift(4, "i");
        difat_sec_cnt = blob.read_shift(4, "i");
        for (var q2 = -1, j2 = 0; j2 < 109; ++j2) {
          q2 = blob.read_shift(4, "i");
          if (q2 < 0)
            break;
          fat_addrs[j2] = q2;
        }
        var sectors = sectorify(file, ssz);
        sleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);
        var sector_list = make_sector_list(sectors, dir_start, fat_addrs, ssz);
        sector_list[dir_start].name = "!Directory";
        if (nmfs > 0 && minifat_start !== ENDOFCHAIN)
          sector_list[minifat_start].name = "!MiniFAT";
        sector_list[fat_addrs[0]].name = "!FAT";
        sector_list.fat_addrs = fat_addrs;
        sector_list.ssz = ssz;
        var files = {}, Paths = [], FileIndex = [], FullPaths = [];
        read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);
        build_full_paths(FileIndex, FullPaths, Paths);
        Paths.shift();
        var o = {
          FileIndex,
          FullPaths
        };
        if (options && options.raw)
          o.raw = { header, sectors };
        return o;
      }
      function check_get_mver(blob) {
        if (blob[blob.l] == 80 && blob[blob.l + 1] == 75)
          return [0, 0];
        blob.chk(HEADER_SIGNATURE, "Header Signature: ");
        blob.l += 16;
        var mver = blob.read_shift(2, "u");
        return [blob.read_shift(2, "u"), mver];
      }
      function check_shifts(blob, mver) {
        var shift = 9;
        blob.l += 2;
        switch (shift = blob.read_shift(2)) {
          case 9:
            if (mver != 3)
              throw new Error("Sector Shift: Expected 9 saw " + shift);
            break;
          case 12:
            if (mver != 4)
              throw new Error("Sector Shift: Expected 12 saw " + shift);
            break;
          default:
            throw new Error("Sector Shift: Expected 9 or 12 saw " + shift);
        }
        blob.chk("0600", "Mini Sector Shift: ");
        blob.chk("000000000000", "Reserved: ");
      }
      function sectorify(file, ssz) {
        var nsectors = Math.ceil(file.length / ssz) - 1;
        var sectors = [];
        for (var i4 = 1; i4 < nsectors; ++i4)
          sectors[i4 - 1] = file.slice(i4 * ssz, (i4 + 1) * ssz);
        sectors[nsectors - 1] = file.slice(nsectors * ssz);
        return sectors;
      }
      function build_full_paths(FI, FP, Paths) {
        var i4 = 0, L = 0, R = 0, C = 0, j2 = 0, pl = Paths.length;
        var dad = [], q2 = [];
        for (; i4 < pl; ++i4) {
          dad[i4] = q2[i4] = i4;
          FP[i4] = Paths[i4];
        }
        for (; j2 < q2.length; ++j2) {
          i4 = q2[j2];
          L = FI[i4].L;
          R = FI[i4].R;
          C = FI[i4].C;
          if (dad[i4] === i4) {
            if (L !== -1 && dad[L] !== L)
              dad[i4] = dad[L];
            if (R !== -1 && dad[R] !== R)
              dad[i4] = dad[R];
          }
          if (C !== -1)
            dad[C] = i4;
          if (L !== -1 && i4 != dad[i4]) {
            dad[L] = dad[i4];
            if (q2.lastIndexOf(L) < j2)
              q2.push(L);
          }
          if (R !== -1 && i4 != dad[i4]) {
            dad[R] = dad[i4];
            if (q2.lastIndexOf(R) < j2)
              q2.push(R);
          }
        }
        for (i4 = 1; i4 < pl; ++i4)
          if (dad[i4] === i4) {
            if (R !== -1 && dad[R] !== R)
              dad[i4] = dad[R];
            else if (L !== -1 && dad[L] !== L)
              dad[i4] = dad[L];
          }
        for (i4 = 1; i4 < pl; ++i4) {
          if (FI[i4].type === 0)
            continue;
          j2 = i4;
          if (j2 != dad[j2])
            do {
              j2 = dad[j2];
              FP[i4] = FP[j2] + "/" + FP[i4];
            } while (j2 !== 0 && -1 !== dad[j2] && j2 != dad[j2]);
          dad[i4] = -1;
        }
        FP[0] += "/";
        for (i4 = 1; i4 < pl; ++i4) {
          if (FI[i4].type !== 2)
            FP[i4] += "/";
        }
      }
      function get_mfat_entry(entry, payload, mini) {
        var start = entry.start, size = entry.size;
        var o = [];
        var idx = start;
        while (mini && size > 0 && idx >= 0) {
          o.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));
          size -= MSSZ;
          idx = __readInt32LE(mini, idx * 4);
        }
        if (o.length === 0)
          return new_buf(0);
        return bconcat(o).slice(0, entry.size);
      }
      function sleuth_fat(idx, cnt, sectors, ssz, fat_addrs) {
        var q2 = ENDOFCHAIN;
        if (idx === ENDOFCHAIN) {
          if (cnt !== 0)
            throw new Error("DIFAT chain shorter than expected");
        } else if (idx !== -1) {
          var sector = sectors[idx], m = (ssz >>> 2) - 1;
          if (!sector)
            return;
          for (var i4 = 0; i4 < m; ++i4) {
            if ((q2 = __readInt32LE(sector, i4 * 4)) === ENDOFCHAIN)
              break;
            fat_addrs.push(q2);
          }
          sleuth_fat(__readInt32LE(sector, ssz - 4), cnt - 1, sectors, ssz, fat_addrs);
        }
      }
      function get_sector_list(sectors, start, fat_addrs, ssz, chkd) {
        var buf = [], buf_chain = [];
        if (!chkd)
          chkd = [];
        var modulus = ssz - 1, j2 = 0, jj = 0;
        for (j2 = start; j2 >= 0; ) {
          chkd[j2] = true;
          buf[buf.length] = j2;
          buf_chain.push(sectors[j2]);
          var addr = fat_addrs[Math.floor(j2 * 4 / ssz)];
          jj = j2 * 4 & modulus;
          if (ssz < 4 + jj)
            throw new Error("FAT boundary crossed: " + j2 + " 4 " + ssz);
          if (!sectors[addr])
            break;
          j2 = __readInt32LE(sectors[addr], jj);
        }
        return { nodes: buf, data: __toBuffer([buf_chain]) };
      }
      function make_sector_list(sectors, dir_start, fat_addrs, ssz) {
        var sl = sectors.length, sector_list = [];
        var chkd = [], buf = [], buf_chain = [];
        var modulus = ssz - 1, i4 = 0, j2 = 0, k = 0, jj = 0;
        for (i4 = 0; i4 < sl; ++i4) {
          buf = [];
          k = i4 + dir_start;
          if (k >= sl)
            k -= sl;
          if (chkd[k])
            continue;
          buf_chain = [];
          var seen = [];
          for (j2 = k; j2 >= 0; ) {
            seen[j2] = true;
            chkd[j2] = true;
            buf[buf.length] = j2;
            buf_chain.push(sectors[j2]);
            var addr = fat_addrs[Math.floor(j2 * 4 / ssz)];
            jj = j2 * 4 & modulus;
            if (ssz < 4 + jj)
              throw new Error("FAT boundary crossed: " + j2 + " 4 " + ssz);
            if (!sectors[addr])
              break;
            j2 = __readInt32LE(sectors[addr], jj);
            if (seen[j2])
              break;
          }
          sector_list[k] = { nodes: buf, data: __toBuffer([buf_chain]) };
        }
        return sector_list;
      }
      function read_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, mini) {
        var minifat_store = 0, pl = Paths.length ? 2 : 0;
        var sector = sector_list[dir_start].data;
        var i4 = 0, namelen = 0, name;
        for (; i4 < sector.length; i4 += 128) {
          var blob = sector.slice(i4, i4 + 128);
          prep_blob(blob, 64);
          namelen = blob.read_shift(2);
          name = __utf16le(blob, 0, namelen - pl);
          Paths.push(name);
          var o = {
            name,
            type: blob.read_shift(1),
            color: blob.read_shift(1),
            L: blob.read_shift(4, "i"),
            R: blob.read_shift(4, "i"),
            C: blob.read_shift(4, "i"),
            clsid: blob.read_shift(16),
            state: blob.read_shift(4, "i"),
            start: 0,
            size: 0
          };
          var ctime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
          if (ctime !== 0)
            o.ct = read_date(blob, blob.l - 8);
          var mtime = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);
          if (mtime !== 0)
            o.mt = read_date(blob, blob.l - 8);
          o.start = blob.read_shift(4, "i");
          o.size = blob.read_shift(4, "i");
          if (o.size < 0 && o.start < 0) {
            o.size = o.type = 0;
            o.start = ENDOFCHAIN;
            o.name = "";
          }
          if (o.type === 5) {
            minifat_store = o.start;
            if (nmfs > 0 && minifat_store !== ENDOFCHAIN)
              sector_list[minifat_store].name = "!StreamData";
          } else if (o.size >= 4096) {
            o.storage = "fat";
            if (sector_list[o.start] === void 0)
              sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);
            sector_list[o.start].name = o.name;
            o.content = sector_list[o.start].data.slice(0, o.size);
          } else {
            o.storage = "minifat";
            if (o.size < 0)
              o.size = 0;
            else if (minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {
              o.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini] || {}).data);
            }
          }
          if (o.content)
            prep_blob(o.content, 0);
          files[name] = o;
          FileIndex.push(o);
        }
      }
      function read_date(blob, offset) {
        return new Date((__readUInt32LE(blob, offset + 4) / 1e7 * Math.pow(2, 32) + __readUInt32LE(blob, offset) / 1e7 - 11644473600) * 1e3);
      }
      function read_file(filename2, options) {
        get_fs();
        return parse(fs.readFileSync(filename2), options);
      }
      function read(blob, options) {
        switch (options && options.type || "base64") {
          case "file":
            return read_file(blob, options);
          case "base64":
            return parse(s2a(Base64.decode(blob)), options);
          case "binary":
            return parse(s2a(blob), options);
        }
        return parse(blob, options);
      }
      function init_cfb(cfb, opts) {
        var o = opts || {}, root = o.root || "Root Entry";
        if (!cfb.FullPaths)
          cfb.FullPaths = [];
        if (!cfb.FileIndex)
          cfb.FileIndex = [];
        if (cfb.FullPaths.length !== cfb.FileIndex.length)
          throw new Error("inconsistent CFB structure");
        if (cfb.FullPaths.length === 0) {
          cfb.FullPaths[0] = root + "/";
          cfb.FileIndex[0] = { name: root, type: 5 };
        }
        if (o.CLSID)
          cfb.FileIndex[0].clsid = o.CLSID;
        seed_cfb(cfb);
      }
      function seed_cfb(cfb) {
        var nm = "Sh33tJ5";
        if (CFB.find(cfb, "/" + nm))
          return;
        var p = new_buf(4);
        p[0] = 55;
        p[1] = p[3] = 50;
        p[2] = 54;
        cfb.FileIndex.push({ name: nm, type: 2, content: p, size: 4, L: 69, R: 69, C: 69 });
        cfb.FullPaths.push(cfb.FullPaths[0] + nm);
        rebuild_cfb(cfb);
      }
      function rebuild_cfb(cfb, f) {
        init_cfb(cfb);
        var gc = false, s = false;
        for (var i4 = cfb.FullPaths.length - 1; i4 >= 0; --i4) {
          var _file = cfb.FileIndex[i4];
          switch (_file.type) {
            case 0:
              if (s)
                gc = true;
              else {
                cfb.FileIndex.pop();
                cfb.FullPaths.pop();
              }
              break;
            case 1:
            case 2:
            case 5:
              s = true;
              if (isNaN(_file.R * _file.L * _file.C))
                gc = true;
              if (_file.R > -1 && _file.L > -1 && _file.R == _file.L)
                gc = true;
              break;
            default:
              gc = true;
              break;
          }
        }
        if (!gc && !f)
          return;
        var now = new Date(1987, 1, 19), j2 = 0;
        var data = [];
        for (i4 = 0; i4 < cfb.FullPaths.length; ++i4) {
          if (cfb.FileIndex[i4].type === 0)
            continue;
          data.push([cfb.FullPaths[i4], cfb.FileIndex[i4]]);
        }
        for (i4 = 0; i4 < data.length; ++i4) {
          var dad = dirname(data[i4][0]);
          s = false;
          for (j2 = 0; j2 < data.length; ++j2)
            if (data[j2][0] === dad)
              s = true;
          if (!s)
            data.push([dad, {
              name: filename(dad).replace("/", ""),
              type: 1,
              clsid: HEADER_CLSID,
              ct: now,
              mt: now,
              content: null
            }]);
        }
        data.sort(function(x, y) {
          return namecmp(x[0], y[0]);
        });
        cfb.FullPaths = [];
        cfb.FileIndex = [];
        for (i4 = 0; i4 < data.length; ++i4) {
          cfb.FullPaths[i4] = data[i4][0];
          cfb.FileIndex[i4] = data[i4][1];
        }
        for (i4 = 0; i4 < data.length; ++i4) {
          var elt = cfb.FileIndex[i4];
          var nm = cfb.FullPaths[i4];
          elt.name = filename(nm).replace("/", "");
          elt.L = elt.R = elt.C = -(elt.color = 1);
          elt.size = elt.content ? elt.content.length : 0;
          elt.start = 0;
          elt.clsid = elt.clsid || HEADER_CLSID;
          if (i4 === 0) {
            elt.C = data.length > 1 ? 1 : -1;
            elt.size = 0;
            elt.type = 5;
          } else if (nm.slice(-1) == "/") {
            for (j2 = i4 + 1; j2 < data.length; ++j2)
              if (dirname(cfb.FullPaths[j2]) == nm)
                break;
            elt.C = j2 >= data.length ? -1 : j2;
            for (j2 = i4 + 1; j2 < data.length; ++j2)
              if (dirname(cfb.FullPaths[j2]) == dirname(nm))
                break;
            elt.R = j2 >= data.length ? -1 : j2;
            elt.type = 1;
          } else {
            if (dirname(cfb.FullPaths[i4 + 1] || "") == dirname(nm))
              elt.R = i4 + 1;
            elt.type = 2;
          }
        }
      }
      function _write(cfb, options) {
        var _opts = options || {};
        rebuild_cfb(cfb);
        if (_opts.fileType == "zip")
          return write_zip2(cfb, _opts);
        var L = function(cfb2) {
          var mini_size = 0, fat_size = 0;
          for (var i5 = 0; i5 < cfb2.FileIndex.length; ++i5) {
            var file2 = cfb2.FileIndex[i5];
            if (!file2.content)
              continue;
            var flen2 = file2.content.length;
            if (flen2 > 0) {
              if (flen2 < 4096)
                mini_size += flen2 + 63 >> 6;
              else
                fat_size += flen2 + 511 >> 9;
            }
          }
          var dir_cnt = cfb2.FullPaths.length + 3 >> 2;
          var mini_cnt = mini_size + 7 >> 3;
          var mfat_cnt = mini_size + 127 >> 7;
          var fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;
          var fat_cnt = fat_base + 127 >> 7;
          var difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt - 109) / 127);
          while (fat_base + fat_cnt + difat_cnt + 127 >> 7 > fat_cnt)
            difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt - 109) / 127);
          var L2 = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];
          cfb2.FileIndex[0].size = mini_size << 6;
          L2[7] = (cfb2.FileIndex[0].start = L2[0] + L2[1] + L2[2] + L2[3] + L2[4] + L2[5]) + (L2[6] + 7 >> 3);
          return L2;
        }(cfb);
        var o = new_buf(L[7] << 9);
        var i4 = 0, T = 0;
        {
          for (i4 = 0; i4 < 8; ++i4)
            o.write_shift(1, HEADER_SIG[i4]);
          for (i4 = 0; i4 < 8; ++i4)
            o.write_shift(2, 0);
          o.write_shift(2, 62);
          o.write_shift(2, 3);
          o.write_shift(2, 65534);
          o.write_shift(2, 9);
          o.write_shift(2, 6);
          for (i4 = 0; i4 < 3; ++i4)
            o.write_shift(2, 0);
          o.write_shift(4, 0);
          o.write_shift(4, L[2]);
          o.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);
          o.write_shift(4, 0);
          o.write_shift(4, 1 << 12);
          o.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1 : ENDOFCHAIN);
          o.write_shift(4, L[3]);
          o.write_shift(-4, L[1] ? L[0] - 1 : ENDOFCHAIN);
          o.write_shift(4, L[1]);
          for (i4 = 0; i4 < 109; ++i4)
            o.write_shift(-4, i4 < L[2] ? L[1] + i4 : -1);
        }
        if (L[1]) {
          for (T = 0; T < L[1]; ++T) {
            for (; i4 < 236 + T * 127; ++i4)
              o.write_shift(-4, i4 < L[2] ? L[1] + i4 : -1);
            o.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);
          }
        }
        var chainit = function(w) {
          for (T += w; i4 < T - 1; ++i4)
            o.write_shift(-4, i4 + 1);
          if (w) {
            ++i4;
            o.write_shift(-4, ENDOFCHAIN);
          }
        };
        T = i4 = 0;
        for (T += L[1]; i4 < T; ++i4)
          o.write_shift(-4, consts.DIFSECT);
        for (T += L[2]; i4 < T; ++i4)
          o.write_shift(-4, consts.FATSECT);
        chainit(L[3]);
        chainit(L[4]);
        var j2 = 0, flen = 0;
        var file = cfb.FileIndex[0];
        for (; j2 < cfb.FileIndex.length; ++j2) {
          file = cfb.FileIndex[j2];
          if (!file.content)
            continue;
          flen = file.content.length;
          if (flen < 4096)
            continue;
          file.start = T;
          chainit(flen + 511 >> 9);
        }
        chainit(L[6] + 7 >> 3);
        while (o.l & 511)
          o.write_shift(-4, consts.ENDOFCHAIN);
        T = i4 = 0;
        for (j2 = 0; j2 < cfb.FileIndex.length; ++j2) {
          file = cfb.FileIndex[j2];
          if (!file.content)
            continue;
          flen = file.content.length;
          if (!flen || flen >= 4096)
            continue;
          file.start = T;
          chainit(flen + 63 >> 6);
        }
        while (o.l & 511)
          o.write_shift(-4, consts.ENDOFCHAIN);
        for (i4 = 0; i4 < L[4] << 2; ++i4) {
          var nm = cfb.FullPaths[i4];
          if (!nm || nm.length === 0) {
            for (j2 = 0; j2 < 17; ++j2)
              o.write_shift(4, 0);
            for (j2 = 0; j2 < 3; ++j2)
              o.write_shift(4, -1);
            for (j2 = 0; j2 < 12; ++j2)
              o.write_shift(4, 0);
            continue;
          }
          file = cfb.FileIndex[i4];
          if (i4 === 0)
            file.start = file.size ? file.start - 1 : ENDOFCHAIN;
          var _nm = i4 === 0 && _opts.root || file.name;
          flen = 2 * (_nm.length + 1);
          o.write_shift(64, _nm, "utf16le");
          o.write_shift(2, flen);
          o.write_shift(1, file.type);
          o.write_shift(1, file.color);
          o.write_shift(-4, file.L);
          o.write_shift(-4, file.R);
          o.write_shift(-4, file.C);
          if (!file.clsid)
            for (j2 = 0; j2 < 4; ++j2)
              o.write_shift(4, 0);
          else
            o.write_shift(16, file.clsid, "hex");
          o.write_shift(4, file.state || 0);
          o.write_shift(4, 0);
          o.write_shift(4, 0);
          o.write_shift(4, 0);
          o.write_shift(4, 0);
          o.write_shift(4, file.start);
          o.write_shift(4, file.size);
          o.write_shift(4, 0);
        }
        for (i4 = 1; i4 < cfb.FileIndex.length; ++i4) {
          file = cfb.FileIndex[i4];
          if (file.size >= 4096) {
            o.l = file.start + 1 << 9;
            for (j2 = 0; j2 < file.size; ++j2)
              o.write_shift(1, file.content[j2]);
            for (; j2 & 511; ++j2)
              o.write_shift(1, 0);
          }
        }
        for (i4 = 1; i4 < cfb.FileIndex.length; ++i4) {
          file = cfb.FileIndex[i4];
          if (file.size > 0 && file.size < 4096) {
            for (j2 = 0; j2 < file.size; ++j2)
              o.write_shift(1, file.content[j2]);
            for (; j2 & 63; ++j2)
              o.write_shift(1, 0);
          }
        }
        while (o.l < o.length)
          o.write_shift(1, 0);
        return o;
      }
      function find(cfb, path) {
        var UCFullPaths = cfb.FullPaths.map(function(x) {
          return x.toUpperCase();
        });
        var UCPaths = UCFullPaths.map(function(x) {
          var y = x.split("/");
          return y[y.length - (x.slice(-1) == "/" ? 2 : 1)];
        });
        var k = false;
        if (path.charCodeAt(0) === 47) {
          k = true;
          path = UCFullPaths[0].slice(0, -1) + path;
        } else
          k = path.indexOf("/") !== -1;
        var UCPath = path.toUpperCase();
        var w = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);
        if (w !== -1)
          return cfb.FileIndex[w];
        var m = !UCPath.match(chr1);
        UCPath = UCPath.replace(chr0, "");
        if (m)
          UCPath = UCPath.replace(chr1, "!");
        for (w = 0; w < UCFullPaths.length; ++w) {
          if ((m ? UCFullPaths[w].replace(chr1, "!") : UCFullPaths[w]).replace(chr0, "") == UCPath)
            return cfb.FileIndex[w];
          if ((m ? UCPaths[w].replace(chr1, "!") : UCPaths[w]).replace(chr0, "") == UCPath)
            return cfb.FileIndex[w];
        }
        return null;
      }
      var MSSZ = 64;
      var ENDOFCHAIN = -2;
      var HEADER_SIGNATURE = "d0cf11e0a1b11ae1";
      var HEADER_SIG = [208, 207, 17, 224, 161, 177, 26, 225];
      var HEADER_CLSID = "00000000000000000000000000000000";
      var consts = {
        /* 2.1 Compund File Sector Numbers and Types */
        MAXREGSECT: -6,
        DIFSECT: -4,
        FATSECT: -3,
        ENDOFCHAIN,
        FREESECT: -1,
        /* 2.2 Compound File Header */
        HEADER_SIGNATURE,
        HEADER_MINOR_VERSION: "3e00",
        MAXREGSID: -6,
        NOSTREAM: -1,
        HEADER_CLSID,
        /* 2.6.1 Compound File Directory Entry */
        EntryTypes: ["unknown", "storage", "stream", "lockbytes", "property", "root"]
      };
      function write_file(cfb, filename2, options) {
        get_fs();
        var o = _write(cfb, options);
        fs.writeFileSync(filename2, o);
      }
      function a2s2(o) {
        var out = new Array(o.length);
        for (var i4 = 0; i4 < o.length; ++i4)
          out[i4] = String.fromCharCode(o[i4]);
        return out.join("");
      }
      function write(cfb, options) {
        var o = _write(cfb, options);
        switch (options && options.type) {
          case "file":
            get_fs();
            fs.writeFileSync(options.filename, o);
            return o;
          case "binary":
            return a2s2(o);
          case "base64":
            return Base64.encode(a2s2(o));
        }
        return o;
      }
      var _zlib;
      function use_zlib(zlib) {
        try {
          var InflateRaw = zlib.InflateRaw;
          var InflRaw = new InflateRaw();
          InflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);
          if (InflRaw.bytesRead)
            _zlib = zlib;
          else
            throw new Error("zlib does not expose bytesRead");
        } catch (e) {
          console.error("cannot use native zlib: " + (e.message || e));
        }
      }
      function _inflateRawSync(payload, usz) {
        if (!_zlib)
          return _inflate(payload, usz);
        var InflateRaw = _zlib.InflateRaw;
        var InflRaw = new InflateRaw();
        var out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);
        payload.l += InflRaw.bytesRead;
        return out;
      }
      function _deflateRawSync(payload) {
        return _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);
      }
      var CLEN_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
      var LEN_LN = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];
      var DST_LN = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];
      function bit_swap_8(n) {
        var t = (n << 1 | n << 11) & 139536 | (n << 5 | n << 15) & 558144;
        return (t >> 16 | t >> 8 | t) & 255;
      }
      var use_typed_arrays = typeof Uint8Array !== "undefined";
      var bitswap8 = use_typed_arrays ? new Uint8Array(1 << 8) : [];
      for (var q = 0; q < 1 << 8; ++q)
        bitswap8[q] = bit_swap_8(q);
      function bit_swap_n(n, b) {
        var rev = bitswap8[n & 255];
        if (b <= 8)
          return rev >>> 8 - b;
        rev = rev << 8 | bitswap8[n >> 8 & 255];
        if (b <= 16)
          return rev >>> 16 - b;
        rev = rev << 8 | bitswap8[n >> 16 & 255];
        return rev >>> 24 - b;
      }
      function read_bits_2(buf, bl) {
        var w = bl & 7, h = bl >>> 3;
        return (buf[h] | (w <= 6 ? 0 : buf[h + 1] << 8)) >>> w & 3;
      }
      function read_bits_3(buf, bl) {
        var w = bl & 7, h = bl >>> 3;
        return (buf[h] | (w <= 5 ? 0 : buf[h + 1] << 8)) >>> w & 7;
      }
      function read_bits_4(buf, bl) {
        var w = bl & 7, h = bl >>> 3;
        return (buf[h] | (w <= 4 ? 0 : buf[h + 1] << 8)) >>> w & 15;
      }
      function read_bits_5(buf, bl) {
        var w = bl & 7, h = bl >>> 3;
        return (buf[h] | (w <= 3 ? 0 : buf[h + 1] << 8)) >>> w & 31;
      }
      function read_bits_7(buf, bl) {
        var w = bl & 7, h = bl >>> 3;
        return (buf[h] | (w <= 1 ? 0 : buf[h + 1] << 8)) >>> w & 127;
      }
      function read_bits_n(buf, bl, n) {
        var w = bl & 7, h = bl >>> 3, f = (1 << n) - 1;
        var v = buf[h] >>> w;
        if (n < 8 - w)
          return v & f;
        v |= buf[h + 1] << 8 - w;
        if (n < 16 - w)
          return v & f;
        v |= buf[h + 2] << 16 - w;
        if (n < 24 - w)
          return v & f;
        v |= buf[h + 3] << 24 - w;
        return v & f;
      }
      function realloc(b, sz) {
        var L = b.length, M = 2 * L > sz ? 2 * L : sz + 5, i4 = 0;
        if (L >= sz)
          return b;
        if (has_buf) {
          var o = new_unsafe_buf(M);
          if (b.copy)
            b.copy(o);
          else
            for (; i4 < b.length; ++i4)
              o[i4] = b[i4];
          return o;
        } else if (use_typed_arrays) {
          var a = new Uint8Array(M);
          if (a.set)
            a.set(b);
          else
            for (; i4 < b.length; ++i4)
              a[i4] = b[i4];
          return a;
        }
        b.length = M;
        return b;
      }
      function zero_fill_array(n) {
        var o = new Array(n);
        for (var i4 = 0; i4 < n; ++i4)
          o[i4] = 0;
        return o;
      }
      var _deflate = function() {
        var _deflateRaw = function() {
          return function deflateRaw(data, out) {
            var boff = 0;
            while (boff < data.length) {
              var L = Math.min(65535, data.length - boff);
              var h = boff + L == data.length;
              out.write_shift(1, +h);
              out.write_shift(2, L);
              out.write_shift(2, ~L & 65535);
              while (L-- > 0)
                out[out.l++] = data[boff++];
            }
            return out.l;
          };
        }();
        return function(data) {
          var buf = new_buf(50 + Math.floor(data.length * 1.1));
          var off2 = _deflateRaw(data, buf);
          return buf.slice(0, off2);
        };
      }();
      function build_tree(clens, cmap, MAX) {
        var maxlen = 1, w = 0, i4 = 0, j2 = 0, ccode = 0, L = clens.length;
        var bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
        for (i4 = 0; i4 < 32; ++i4)
          bl_count[i4] = 0;
        for (i4 = L; i4 < MAX; ++i4)
          clens[i4] = 0;
        L = clens.length;
        var ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L);
        for (i4 = 0; i4 < L; ++i4) {
          bl_count[w = clens[i4]]++;
          if (maxlen < w)
            maxlen = w;
          ctree[i4] = 0;
        }
        bl_count[0] = 0;
        for (i4 = 1; i4 <= maxlen; ++i4)
          bl_count[i4 + 16] = ccode = ccode + bl_count[i4 - 1] << 1;
        for (i4 = 0; i4 < L; ++i4) {
          ccode = clens[i4];
          if (ccode != 0)
            ctree[i4] = bl_count[ccode + 16]++;
        }
        var cleni = 0;
        for (i4 = 0; i4 < L; ++i4) {
          cleni = clens[i4];
          if (cleni != 0) {
            ccode = bit_swap_n(ctree[i4], maxlen) >> maxlen - cleni;
            for (j2 = (1 << maxlen + 4 - cleni) - 1; j2 >= 0; --j2)
              cmap[ccode | j2 << cleni] = cleni & 15 | i4 << 4;
          }
        }
        return maxlen;
      }
      var fix_lmap = use_typed_arrays ? new Uint16Array(512) : zero_fill_array(512);
      var fix_dmap = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);
      if (!use_typed_arrays) {
        for (var i3 = 0; i3 < 512; ++i3)
          fix_lmap[i3] = 0;
        for (i3 = 0; i3 < 32; ++i3)
          fix_dmap[i3] = 0;
      }
      (function() {
        var dlens = [];
        var i4 = 0;
        for (; i4 < 32; i4++)
          dlens.push(5);
        build_tree(dlens, fix_dmap, 32);
        var clens = [];
        i4 = 0;
        for (; i4 <= 143; i4++)
          clens.push(8);
        for (; i4 <= 255; i4++)
          clens.push(9);
        for (; i4 <= 279; i4++)
          clens.push(7);
        for (; i4 <= 287; i4++)
          clens.push(8);
        build_tree(clens, fix_lmap, 288);
      })();
      var dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
      var dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);
      var dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);
      var dyn_len_1 = 1, dyn_len_2 = 1;
      function dyn(data, boff) {
        var _HLIT = read_bits_5(data, boff) + 257;
        boff += 5;
        var _HDIST = read_bits_5(data, boff) + 1;
        boff += 5;
        var _HCLEN = read_bits_4(data, boff) + 4;
        boff += 4;
        var w = 0;
        var clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);
        var ctree = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        var maxlen = 1;
        var bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
        var next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);
        var L = clens.length;
        for (var i4 = 0; i4 < _HCLEN; ++i4) {
          clens[CLEN_ORDER[i4]] = w = read_bits_3(data, boff);
          if (maxlen < w)
            maxlen = w;
          bl_count[w]++;
          boff += 3;
        }
        var ccode = 0;
        bl_count[0] = 0;
        for (i4 = 1; i4 <= maxlen; ++i4)
          next_code[i4] = ccode = ccode + bl_count[i4 - 1] << 1;
        for (i4 = 0; i4 < L; ++i4)
          if ((ccode = clens[i4]) != 0)
            ctree[i4] = next_code[ccode]++;
        var cleni = 0;
        for (i4 = 0; i4 < L; ++i4) {
          cleni = clens[i4];
          if (cleni != 0) {
            ccode = bitswap8[ctree[i4]] >> 8 - cleni;
            for (var j2 = (1 << 7 - cleni) - 1; j2 >= 0; --j2)
              dyn_cmap[ccode | j2 << cleni] = cleni & 7 | i4 << 3;
          }
        }
        var hcodes = [];
        maxlen = 1;
        for (; hcodes.length < _HLIT + _HDIST; ) {
          ccode = dyn_cmap[read_bits_7(data, boff)];
          boff += ccode & 7;
          switch (ccode >>>= 3) {
            case 16:
              w = 3 + read_bits_2(data, boff);
              boff += 2;
              ccode = hcodes[hcodes.length - 1];
              while (w-- > 0)
                hcodes.push(ccode);
              break;
            case 17:
              w = 3 + read_bits_3(data, boff);
              boff += 3;
              while (w-- > 0)
                hcodes.push(0);
              break;
            case 18:
              w = 11 + read_bits_7(data, boff);
              boff += 7;
              while (w-- > 0)
                hcodes.push(0);
              break;
            default:
              hcodes.push(ccode);
              if (maxlen < ccode)
                maxlen = ccode;
              break;
          }
        }
        var h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);
        for (i4 = _HLIT; i4 < 286; ++i4)
          h1[i4] = 0;
        for (i4 = _HDIST; i4 < 30; ++i4)
          h2[i4] = 0;
        dyn_len_1 = build_tree(h1, dyn_lmap, 286);
        dyn_len_2 = build_tree(h2, dyn_dmap, 30);
        return boff;
      }
      function inflate(data, usz) {
        if (data[0] == 3 && !(data[1] & 3)) {
          return [new_raw_buf(usz), 2];
        }
        var boff = 0;
        var header = 0;
        var outbuf = new_unsafe_buf(usz ? usz : 1 << 18);
        var woff = 0;
        var OL = outbuf.length >>> 0;
        var max_len_1 = 0, max_len_2 = 0;
        while ((header & 1) == 0) {
          header = read_bits_3(data, boff);
          boff += 3;
          if (header >>> 1 == 0) {
            if (boff & 7)
              boff += 8 - (boff & 7);
            var sz = data[boff >>> 3] | data[(boff >>> 3) + 1] << 8;
            boff += 32;
            if (!usz && OL < woff + sz) {
              outbuf = realloc(outbuf, woff + sz);
              OL = outbuf.length;
            }
            if (typeof data.copy === "function") {
              data.copy(outbuf, woff, boff >>> 3, (boff >>> 3) + sz);
              woff += sz;
              boff += 8 * sz;
            } else
              while (sz-- > 0) {
                outbuf[woff++] = data[boff >>> 3];
                boff += 8;
              }
            continue;
          } else if (header >>> 1 == 1) {
            max_len_1 = 9;
            max_len_2 = 5;
          } else {
            boff = dyn(data, boff);
            max_len_1 = dyn_len_1;
            max_len_2 = dyn_len_2;
          }
          if (!usz && OL < woff + 32767) {
            outbuf = realloc(outbuf, woff + 32767);
            OL = outbuf.length;
          }
          for (; ; ) {
            var bits = read_bits_n(data, boff, max_len_1);
            var code = header >>> 1 == 1 ? fix_lmap[bits] : dyn_lmap[bits];
            boff += code & 15;
            code >>>= 4;
            if ((code >>> 8 & 255) === 0)
              outbuf[woff++] = code;
            else if (code == 256)
              break;
            else {
              code -= 257;
              var len_eb = code < 8 ? 0 : code - 4 >> 2;
              if (len_eb > 5)
                len_eb = 0;
              var tgt = woff + LEN_LN[code];
              if (len_eb > 0) {
                tgt += read_bits_n(data, boff, len_eb);
                boff += len_eb;
              }
              bits = read_bits_n(data, boff, max_len_2);
              code = header >>> 1 == 1 ? fix_dmap[bits] : dyn_dmap[bits];
              boff += code & 15;
              code >>>= 4;
              var dst_eb = code < 4 ? 0 : code - 2 >> 1;
              var dst = DST_LN[code];
              if (dst_eb > 0) {
                dst += read_bits_n(data, boff, dst_eb);
                boff += dst_eb;
              }
              if (!usz && OL < tgt) {
                outbuf = realloc(outbuf, tgt);
                OL = outbuf.length;
              }
              while (woff < tgt) {
                outbuf[woff] = outbuf[woff - dst];
                ++woff;
              }
            }
          }
        }
        return [usz ? outbuf : outbuf.slice(0, woff), boff + 7 >>> 3];
      }
      function _inflate(payload, usz) {
        var data = payload.slice(payload.l || 0);
        var out = inflate(data, usz);
        payload.l += out[1];
        return out[0];
      }
      function warn_or_throw(wrn, msg) {
        if (wrn) {
          if (typeof console !== "undefined")
            console.error(msg);
        } else
          throw new Error(msg);
      }
      function parse_zip2(file, options) {
        var blob = file;
        prep_blob(blob, 0);
        var FileIndex = [], FullPaths = [];
        var o = {
          FileIndex,
          FullPaths
        };
        init_cfb(o, { root: options.root });
        var i4 = blob.length - 4;
        while ((blob[i4] != 80 || blob[i4 + 1] != 75 || blob[i4 + 2] != 5 || blob[i4 + 3] != 6) && i4 >= 0)
          --i4;
        blob.l = i4 + 4;
        blob.l += 4;
        var fcnt = blob.read_shift(2);
        blob.l += 6;
        var start_cd = blob.read_shift(4);
        blob.l = start_cd;
        for (i4 = 0; i4 < fcnt; ++i4) {
          blob.l += 20;
          var csz = blob.read_shift(4);
          var usz = blob.read_shift(4);
          var namelen = blob.read_shift(2);
          var efsz = blob.read_shift(2);
          var fcsz = blob.read_shift(2);
          blob.l += 8;
          var offset = blob.read_shift(4);
          var EF = parse_extra_field(blob.slice(blob.l + namelen, blob.l + namelen + efsz));
          blob.l += namelen + efsz + fcsz;
          var L = blob.l;
          blob.l = offset + 4;
          parse_local_file(blob, csz, usz, o, EF);
          blob.l = L;
        }
        return o;
      }
      function parse_local_file(blob, csz, usz, o, EF) {
        blob.l += 2;
        var flags = blob.read_shift(2);
        var meth = blob.read_shift(2);
        var date = parse_dos_date(blob);
        if (flags & 8257)
          throw new Error("Unsupported ZIP encryption");
        var crc32 = blob.read_shift(4);
        var _csz = blob.read_shift(4);
        var _usz = blob.read_shift(4);
        var namelen = blob.read_shift(2);
        var efsz = blob.read_shift(2);
        var name = "";
        for (var i4 = 0; i4 < namelen; ++i4)
          name += String.fromCharCode(blob[blob.l++]);
        if (efsz) {
          var ef = parse_extra_field(blob.slice(blob.l, blob.l + efsz));
          if ((ef[21589] || {}).mt)
            date = ef[21589].mt;
          if (((EF || {})[21589] || {}).mt)
            date = EF[21589].mt;
        }
        blob.l += efsz;
        var data = blob.slice(blob.l, blob.l + _csz);
        switch (meth) {
          case 8:
            data = _inflateRawSync(blob, _usz);
            break;
          case 0:
            break;
          default:
            throw new Error("Unsupported ZIP Compression method " + meth);
        }
        var wrn = false;
        if (flags & 8) {
          crc32 = blob.read_shift(4);
          if (crc32 == 134695760) {
            crc32 = blob.read_shift(4);
            wrn = true;
          }
          _csz = blob.read_shift(4);
          _usz = blob.read_shift(4);
        }
        if (_csz != csz)
          warn_or_throw(wrn, "Bad compressed size: " + csz + " != " + _csz);
        if (_usz != usz)
          warn_or_throw(wrn, "Bad uncompressed size: " + usz + " != " + _usz);
        var _crc32 = CRC32.buf(data, 0);
        if (crc32 >> 0 != _crc32 >> 0)
          warn_or_throw(wrn, "Bad CRC32 checksum: " + crc32 + " != " + _crc32);
        cfb_add(o, name, data, { unsafe: true, mt: date });
      }
      function write_zip2(cfb, options) {
        var _opts = options || {};
        var out = [], cdirs = [];
        var o = new_buf(1);
        var method = _opts.compression ? 8 : 0, flags = 0;
        var i4 = 0, j2 = 0;
        var start_cd = 0, fcnt = 0;
        var root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];
        var crcs = [];
        var sz_cd = 0;
        for (i4 = 1; i4 < cfb.FullPaths.length; ++i4) {
          fp = cfb.FullPaths[i4].slice(root.length);
          fi = cfb.FileIndex[i4];
          if (!fi.size || !fi.content || fp == "Sh33tJ5")
            continue;
          var start = start_cd;
          var namebuf = new_buf(fp.length);
          for (j2 = 0; j2 < fp.length; ++j2)
            namebuf.write_shift(1, fp.charCodeAt(j2) & 127);
          namebuf = namebuf.slice(0, namebuf.l);
          crcs[fcnt] = CRC32.buf(fi.content, 0);
          var outbuf = fi.content;
          if (method == 8)
            outbuf = _deflateRawSync(outbuf);
          o = new_buf(30);
          o.write_shift(4, 67324752);
          o.write_shift(2, 20);
          o.write_shift(2, flags);
          o.write_shift(2, method);
          if (fi.mt)
            write_dos_date(o, fi.mt);
          else
            o.write_shift(4, 0);
          o.write_shift(-4, crcs[fcnt]);
          o.write_shift(4, outbuf.length);
          o.write_shift(4, fi.content.length);
          o.write_shift(2, namebuf.length);
          o.write_shift(2, 0);
          start_cd += o.length;
          out.push(o);
          start_cd += namebuf.length;
          out.push(namebuf);
          start_cd += outbuf.length;
          out.push(outbuf);
          o = new_buf(46);
          o.write_shift(4, 33639248);
          o.write_shift(2, 0);
          o.write_shift(2, 20);
          o.write_shift(2, flags);
          o.write_shift(2, method);
          o.write_shift(4, 0);
          o.write_shift(-4, crcs[fcnt]);
          o.write_shift(4, outbuf.length);
          o.write_shift(4, fi.content.length);
          o.write_shift(2, namebuf.length);
          o.write_shift(2, 0);
          o.write_shift(2, 0);
          o.write_shift(2, 0);
          o.write_shift(2, 0);
          o.write_shift(4, 0);
          o.write_shift(4, start);
          sz_cd += o.l;
          cdirs.push(o);
          sz_cd += namebuf.length;
          cdirs.push(namebuf);
          ++fcnt;
        }
        o = new_buf(22);
        o.write_shift(4, 101010256);
        o.write_shift(2, 0);
        o.write_shift(2, 0);
        o.write_shift(2, fcnt);
        o.write_shift(2, fcnt);
        o.write_shift(4, sz_cd);
        o.write_shift(4, start_cd);
        o.write_shift(2, 0);
        return bconcat([bconcat(out), bconcat(cdirs), o]);
      }
      function cfb_new(opts) {
        var o = {};
        init_cfb(o, opts);
        return o;
      }
      function cfb_add(cfb, name, content, opts) {
        var unsafe = opts && opts.unsafe;
        if (!unsafe)
          init_cfb(cfb);
        var file = !unsafe && CFB.find(cfb, name);
        if (!file) {
          var fpath = cfb.FullPaths[0];
          if (name.slice(0, fpath.length) == fpath)
            fpath = name;
          else {
            if (fpath.slice(-1) != "/")
              fpath += "/";
            fpath = (fpath + name).replace("//", "/");
          }
          file = { name: filename(name), type: 2 };
          cfb.FileIndex.push(file);
          cfb.FullPaths.push(fpath);
          if (!unsafe)
            CFB.utils.cfb_gc(cfb);
        }
        file.content = content;
        file.size = content ? content.length : 0;
        if (opts) {
          if (opts.CLSID)
            file.clsid = opts.CLSID;
          if (opts.mt)
            file.mt = opts.mt;
          if (opts.ct)
            file.ct = opts.ct;
        }
        return file;
      }
      function cfb_del(cfb, name) {
        init_cfb(cfb);
        var file = CFB.find(cfb, name);
        if (file) {
          for (var j2 = 0; j2 < cfb.FileIndex.length; ++j2)
            if (cfb.FileIndex[j2] == file) {
              cfb.FileIndex.splice(j2, 1);
              cfb.FullPaths.splice(j2, 1);
              return true;
            }
        }
        return false;
      }
      function cfb_mov(cfb, old_name, new_name) {
        init_cfb(cfb);
        var file = CFB.find(cfb, old_name);
        if (file) {
          for (var j2 = 0; j2 < cfb.FileIndex.length; ++j2)
            if (cfb.FileIndex[j2] == file) {
              cfb.FileIndex[j2].name = filename(new_name);
              cfb.FullPaths[j2] = new_name;
              return true;
            }
        }
        return false;
      }
      function cfb_gc(cfb) {
        rebuild_cfb(cfb, true);
      }
      exports2.find = find;
      exports2.read = read;
      exports2.parse = parse;
      exports2.write = write;
      exports2.writeFile = write_file;
      exports2.utils = {
        cfb_new,
        cfb_add,
        cfb_del,
        cfb_mov,
        cfb_gc,
        ReadShift,
        CheckField,
        prep_blob,
        bconcat,
        use_zlib,
        _deflateRaw: _deflate,
        _inflateRaw: _inflate,
        consts
      };
      return exports2;
    }();
    if (typeof commonjsRequire !== "undefined" && true && typeof DO_NOT_EXPORT_CFB === "undefined") {
      module.exports = CFB;
    }
    var _fs;
    if (typeof commonjsRequire !== "undefined")
      try {
        _fs = require$$4;
      } catch (e) {
      }
    function blobify(data) {
      if (typeof data === "string")
        return s2ab(data);
      if (Array.isArray(data))
        return a2u(data);
      return data;
    }
    function write_dl(fname, payload, enc) {
      if (typeof _fs !== "undefined" && _fs.writeFileSync)
        return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);
      var data = enc == "utf8" ? utf8write(payload) : payload;
      if (typeof IE_SaveFile !== "undefined")
        return IE_SaveFile(data, fname);
      if (typeof Blob !== "undefined") {
        var blob = new Blob([blobify(data)], { type: "application/octet-stream" });
        if (typeof navigator !== "undefined" && navigator.msSaveBlob)
          return navigator.msSaveBlob(blob, fname);
        if (typeof saveAs !== "undefined")
          return saveAs(blob, fname);
        if (typeof URL !== "undefined" && typeof document !== "undefined" && document.createElement && URL.createObjectURL) {
          var url = URL.createObjectURL(blob);
          if (typeof chrome === "object" && typeof (chrome.downloads || {}).download == "function") {
            if (URL.revokeObjectURL && typeof setTimeout !== "undefined")
              setTimeout(function() {
                URL.revokeObjectURL(url);
              }, 6e4);
            return chrome.downloads.download({ url, filename: fname, saveAs: true });
          }
          var a = document.createElement("a");
          if (a.download != null) {
            a.download = fname;
            a.href = url;
            document.body.appendChild(a);
            a.click();
            document.body.removeChild(a);
            if (URL.revokeObjectURL && typeof setTimeout !== "undefined")
              setTimeout(function() {
                URL.revokeObjectURL(url);
              }, 6e4);
            return url;
          }
        }
      }
      if (typeof $ !== "undefined" && typeof File !== "undefined" && typeof Folder !== "undefined")
        try {
          var out = File(fname);
          out.open("w");
          out.encoding = "binary";
          if (Array.isArray(payload))
            payload = a2s(payload);
          out.write(payload);
          out.close();
          return payload;
        } catch (e) {
          if (!e.message || !e.message.match(/onstruct/))
            throw e;
        }
      throw new Error("cannot save file " + fname);
    }
    function read_binary(path) {
      if (typeof _fs !== "undefined")
        return _fs.readFileSync(path);
      if (typeof $ !== "undefined" && typeof File !== "undefined" && typeof Folder !== "undefined")
        try {
          var infile = File(path);
          infile.open("r");
          infile.encoding = "binary";
          var data = infile.read();
          infile.close();
          return data;
        } catch (e) {
          if (!e.message || !e.message.match(/onstruct/))
            throw e;
        }
      throw new Error("Cannot access file " + path);
    }
    function keys(o) {
      var ks = Object.keys(o), o2 = [];
      for (var i3 = 0; i3 < ks.length; ++i3)
        if (Object.prototype.hasOwnProperty.call(o, ks[i3]))
          o2.push(ks[i3]);
      return o2;
    }
    function evert_key(obj, key) {
      var o = [], K = keys(obj);
      for (var i3 = 0; i3 !== K.length; ++i3)
        if (o[obj[K[i3]][key]] == null)
          o[obj[K[i3]][key]] = K[i3];
      return o;
    }
    function evert(obj) {
      var o = [], K = keys(obj);
      for (var i3 = 0; i3 !== K.length; ++i3)
        o[obj[K[i3]]] = K[i3];
      return o;
    }
    function evert_num(obj) {
      var o = [], K = keys(obj);
      for (var i3 = 0; i3 !== K.length; ++i3)
        o[obj[K[i3]]] = parseInt(K[i3], 10);
      return o;
    }
    function evert_arr(obj) {
      var o = [], K = keys(obj);
      for (var i3 = 0; i3 !== K.length; ++i3) {
        if (o[obj[K[i3]]] == null)
          o[obj[K[i3]]] = [];
        o[obj[K[i3]]].push(K[i3]);
      }
      return o;
    }
    var basedate = new Date(1899, 11, 30, 0, 0, 0);
    var dnthresh = basedate.getTime() + ((/* @__PURE__ */ new Date()).getTimezoneOffset() - basedate.getTimezoneOffset()) * 6e4;
    function datenum(v, date1904) {
      var epoch = v.getTime();
      if (date1904)
        epoch -= 1462 * 24 * 60 * 60 * 1e3;
      return (epoch - dnthresh) / (24 * 60 * 60 * 1e3);
    }
    function numdate(v) {
      var out = /* @__PURE__ */ new Date();
      out.setTime(v * 24 * 60 * 60 * 1e3 + dnthresh);
      return out;
    }
    function parse_isodur(s) {
      var sec = 0, mt = 0, time = false;
      var m = s.match(/P([0-9\.]+Y)?([0-9\.]+M)?([0-9\.]+D)?T([0-9\.]+H)?([0-9\.]+M)?([0-9\.]+S)?/);
      if (!m)
        throw new Error("|" + s + "| is not an ISO8601 Duration");
      for (var i3 = 1; i3 != m.length; ++i3) {
        if (!m[i3])
          continue;
        mt = 1;
        if (i3 > 3)
          time = true;
        switch (m[i3].slice(m[i3].length - 1)) {
          case "Y":
            throw new Error("Unsupported ISO Duration Field: " + m[i3].slice(m[i3].length - 1));
          case "D":
            mt *= 24;
          case "H":
            mt *= 60;
          case "M":
            if (!time)
              throw new Error("Unsupported ISO Duration Field: M");
            else
              mt *= 60;
        }
        sec += mt * parseInt(m[i3], 10);
      }
      return sec;
    }
    var good_pd_date = /* @__PURE__ */ new Date("2017-02-19T19:06:09.000Z");
    if (isNaN(good_pd_date.getFullYear()))
      good_pd_date = /* @__PURE__ */ new Date("2/19/17");
    var good_pd = good_pd_date.getFullYear() == 2017;
    function parseDate(str, fixdate) {
      var d = new Date(str);
      if (good_pd) {
        if (fixdate > 0)
          d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1e3);
        else if (fixdate < 0)
          d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1e3);
        return d;
      }
      if (str instanceof Date)
        return str;
      if (good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {
        var s = d.getFullYear();
        if (str.indexOf("" + s) > -1)
          return d;
        d.setFullYear(d.getFullYear() + 100);
        return d;
      }
      var n = str.match(/\d+/g) || ["2017", "2", "19", "0", "0", "0"];
      var out = new Date(+n[0], +n[1] - 1, +n[2], +n[3] || 0, +n[4] || 0, +n[5] || 0);
      if (str.indexOf("Z") > -1)
        out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1e3);
      return out;
    }
    function cc2str(arr) {
      var o = "";
      for (var i3 = 0; i3 != arr.length; ++i3)
        o += String.fromCharCode(arr[i3]);
      return o;
    }
    function dup(o) {
      if (typeof JSON != "undefined" && !Array.isArray(o))
        return JSON.parse(JSON.stringify(o));
      if (typeof o != "object" || o == null)
        return o;
      if (o instanceof Date)
        return new Date(o.getTime());
      var out = {};
      for (var k in o)
        if (Object.prototype.hasOwnProperty.call(o, k))
          out[k] = dup(o[k]);
      return out;
    }
    function fill(c, l) {
      var o = "";
      while (o.length < l)
        o += c;
      return o;
    }
    function fuzzynum(s) {
      var v = Number(s);
      if (!isNaN(v))
        return v;
      var wt = 1;
      var ss = s.replace(/([\d]),([\d])/g, "$1$2").replace(/[$]/g, "").replace(/[%]/g, function() {
        wt *= 100;
        return "";
      });
      if (!isNaN(v = Number(ss)))
        return v / wt;
      ss = ss.replace(/[(](.*)[)]/, function($$, $1) {
        wt = -wt;
        return $1;
      });
      if (!isNaN(v = Number(ss)))
        return v / wt;
      return v;
    }
    function fuzzydate(s) {
      var o = new Date(s), n = /* @__PURE__ */ new Date(NaN);
      var y = o.getYear(), m = o.getMonth(), d = o.getDate();
      if (isNaN(d))
        return n;
      if (y < 0 || y > 8099)
        return n;
      if ((m > 0 || d > 1) && y != 101)
        return o;
      if (s.toLowerCase().match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/))
        return o;
      if (s.match(/[^-0-9:,\/\\]/))
        return n;
      return o;
    }
    var safe_split_regex = "abacaba".split(/(:?b)/i).length == 5;
    function split_regex(str, re, def) {
      if (safe_split_regex || typeof re == "string")
        return str.split(re);
      var p = str.split(re), o = [p[0]];
      for (var i3 = 1; i3 < p.length; ++i3) {
        o.push(def);
        o.push(p[i3]);
      }
      return o;
    }
    function getdatastr(data) {
      if (!data)
        return null;
      if (data.data)
        return debom(data.data);
      if (data.asNodeBuffer && has_buf)
        return debom(data.asNodeBuffer().toString("binary"));
      if (data.asBinary)
        return debom(data.asBinary());
      if (data._data && data._data.getContent)
        return debom(cc2str(Array.prototype.slice.call(data._data.getContent(), 0)));
      if (data.content && data.type)
        return debom(cc2str(data.content));
      return null;
    }
    function getdatabin(data) {
      if (!data)
        return null;
      if (data.data)
        return char_codes(data.data);
      if (data.asNodeBuffer && has_buf)
        return data.asNodeBuffer();
      if (data._data && data._data.getContent) {
        var o = data._data.getContent();
        if (typeof o == "string")
          return char_codes(o);
        return Array.prototype.slice.call(o);
      }
      if (data.content && data.type)
        return data.content;
      return null;
    }
    function getdata(data) {
      return data && data.name.slice(-4) === ".bin" ? getdatabin(data) : getdatastr(data);
    }
    function safegetzipfile(zip, file) {
      var k = zip.FullPaths || keys(zip.files);
      var f = file.toLowerCase(), g = f.replace(/\//g, "\\");
      for (var i3 = 0; i3 < k.length; ++i3) {
        var n = k[i3].toLowerCase();
        if (f == n || g == n)
          return zip.files[k[i3]];
      }
      return null;
    }
    function getzipfile(zip, file) {
      var o = safegetzipfile(zip, file);
      if (o == null)
        throw new Error("Cannot find file " + file + " in zip");
      return o;
    }
    function getzipdata(zip, file, safe) {
      if (!safe)
        return getdata(getzipfile(zip, file));
      if (!file)
        return null;
      try {
        return getzipdata(zip, file);
      } catch (e) {
        return null;
      }
    }
    function getzipstr(zip, file, safe) {
      if (!safe)
        return getdatastr(getzipfile(zip, file));
      if (!file)
        return null;
      try {
        return getzipstr(zip, file);
      } catch (e) {
        return null;
      }
    }
    function zipentries(zip) {
      var k = zip.FullPaths || keys(zip.files), o = [];
      for (var i3 = 0; i3 < k.length; ++i3)
        if (k[i3].slice(-1) != "/")
          o.push(k[i3]);
      return o.sort();
    }
    function zip_add_file(zip, path, content) {
      if (zip.FullPaths)
        CFB.utils.cfb_add(zip, path, content);
      else
        zip.file(path, content);
    }
    var jszip2;
    if (typeof JSZipSync !== "undefined")
      jszip2 = JSZipSync;
    {
      if (module.exports) {
        if (typeof jszip2 === "undefined")
          jszip2 = requireJszip();
      }
    }
    function zip_new() {
      if (!jszip2)
        return CFB.utils.cfb_new();
      return new jszip2();
    }
    function zip_read(d, o) {
      var zip;
      if (jszip2)
        switch (o.type) {
          case "base64":
            zip = new jszip2(d, { base64: true });
            break;
          case "binary":
          case "array":
            zip = new jszip2(d, { base64: false });
            break;
          case "buffer":
            zip = new jszip2(d);
            break;
          default:
            throw new Error("Unrecognized type " + o.type);
        }
      else
        switch (o.type) {
          case "base64":
            zip = CFB.read(d, { type: "base64" });
            break;
          case "binary":
            zip = CFB.read(d, { type: "binary" });
            break;
          case "buffer":
          case "array":
            zip = CFB.read(d, { type: "buffer" });
            break;
          default:
            throw new Error("Unrecognized type " + o.type);
        }
      return zip;
    }
    function resolve_path(path, base) {
      if (path.charAt(0) == "/")
        return path.slice(1);
      var result = base.split("/");
      if (base.slice(-1) != "/")
        result.pop();
      var target = path.split("/");
      while (target.length !== 0) {
        var step = target.shift();
        if (step === "..")
          result.pop();
        else if (step !== ".")
          result.push(step);
      }
      return result.join("/");
    }
    var XML_HEADER = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r\n';
    var attregexg = /([^"\s?>\/]+)\s*=\s*((?:")([^"]*)(?:")|(?:')([^']*)(?:')|([^'">\s]+))/g;
    var tagregex = /<[\/\?]?[a-zA-Z0-9:_-]+(?:\s+[^"\s?>\/]+\s*=\s*(?:"[^"]*"|'[^']*'|[^'">\s=]+))*\s?[\/\?]?>/g;
    if (!XML_HEADER.match(tagregex))
      tagregex = /<[^>]*>/g;
    var nsregex = /<\w*:/, nsregex2 = /<(\/?)\w+:/;
    function parsexmltag(tag, skip_root, skip_LC) {
      var z = {};
      var eq = 0, c = 0;
      for (; eq !== tag.length; ++eq)
        if ((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13)
          break;
      if (!skip_root)
        z[0] = tag.slice(0, eq);
      if (eq === tag.length)
        return z;
      var m = tag.match(attregexg), j2 = 0, v = "", i3 = 0, q = "", cc = "", quot = 1;
      if (m)
        for (i3 = 0; i3 != m.length; ++i3) {
          cc = m[i3];
          for (c = 0; c != cc.length; ++c)
            if (cc.charCodeAt(c) === 61)
              break;
          q = cc.slice(0, c).trim();
          while (cc.charCodeAt(c + 1) == 32)
            ++c;
          quot = (eq = cc.charCodeAt(c + 1)) == 34 || eq == 39 ? 1 : 0;
          v = cc.slice(c + 1 + quot, cc.length - quot);
          for (j2 = 0; j2 != q.length; ++j2)
            if (q.charCodeAt(j2) === 58)
              break;
          if (j2 === q.length) {
            if (q.indexOf("_") > 0)
              q = q.slice(0, q.indexOf("_"));
            z[q] = v;
            if (!skip_LC)
              z[q.toLowerCase()] = v;
          } else {
            var k = (j2 === 5 && q.slice(0, 5) === "xmlns" ? "xmlns" : "") + q.slice(j2 + 1);
            if (z[k] && q.slice(j2 - 3, j2) == "ext")
              continue;
            z[k] = v;
            if (!skip_LC)
              z[k.toLowerCase()] = v;
          }
        }
      return z;
    }
    function strip_ns(x) {
      return x.replace(nsregex2, "<$1");
    }
    var encodings = {
      "&quot;": '"',
      "&apos;": "'",
      "&gt;": ">",
      "&lt;": "<",
      "&amp;": "&"
    };
    var rencoding = evert(encodings);
    var unescapexml = function() {
      var encregex = /&(?:quot|apos|gt|lt|amp|#x?([\da-fA-F]+));/ig, coderegex = /_x([\da-fA-F]{4})_/ig;
      return function unescapexml2(text) {
        var s = text + "", i3 = s.indexOf("<![CDATA[");
        if (i3 == -1)
          return s.replace(encregex, function($$, $1) {
            return encodings[$$] || String.fromCharCode(parseInt($1, $$.indexOf("x") > -1 ? 16 : 10)) || $$;
          }).replace(coderegex, function(m, c) {
            return String.fromCharCode(parseInt(c, 16));
          });
        var j2 = s.indexOf("]]>");
        return unescapexml2(s.slice(0, i3)) + s.slice(i3 + 9, j2) + unescapexml2(s.slice(j2 + 3));
      };
    }();
    var decregex = /[&<>'"]/g, charegex = /[\u0000-\u0008\u000b-\u001f]/g;
    function escapexml(text) {
      var s = text + "";
      return s.replace(decregex, function(y) {
        return rencoding[y];
      }).replace(charegex, function(s2) {
        return "_x" + ("000" + s2.charCodeAt(0).toString(16)).slice(-4) + "_";
      });
    }
    function escapexmltag(text) {
      return escapexml(text).replace(/ /g, "_x0020_");
    }
    var htmlcharegex = /[\u0000-\u001f]/g;
    function escapehtml(text) {
      var s = text + "";
      return s.replace(decregex, function(y) {
        return rencoding[y];
      }).replace(/\n/g, "<br/>").replace(htmlcharegex, function(s2) {
        return "&#x" + ("000" + s2.charCodeAt(0).toString(16)).slice(-4) + ";";
      });
    }
    function escapexlml(text) {
      var s = text + "";
      return s.replace(decregex, function(y) {
        return rencoding[y];
      }).replace(htmlcharegex, function(s2) {
        return "&#x" + s2.charCodeAt(0).toString(16).toUpperCase() + ";";
      });
    }
    var xlml_fixstr = function() {
      var entregex = /&#(\d+);/g;
      function entrepl($$, $1) {
        return String.fromCharCode(parseInt($1, 10));
      }
      return function xlml_fixstr2(str) {
        return str.replace(entregex, entrepl);
      };
    }();
    var xlml_unfixstr = function() {
      return function xlml_unfixstr2(str) {
        return str.replace(/(\r\n|[\r\n])/g, "&#10;");
      };
    }();
    function parsexmlbool(value) {
      switch (value) {
        case 1:
        case true:
        case "1":
        case "true":
        case "TRUE":
          return true;
        default:
          return false;
      }
    }
    var utf8read = function utf8reada(orig) {
      var out = "", i3 = 0, c = 0, d = 0, e = 0, f = 0, w = 0;
      while (i3 < orig.length) {
        c = orig.charCodeAt(i3++);
        if (c < 128) {
          out += String.fromCharCode(c);
          continue;
        }
        d = orig.charCodeAt(i3++);
        if (c > 191 && c < 224) {
          f = (c & 31) << 6;
          f |= d & 63;
          out += String.fromCharCode(f);
          continue;
        }
        e = orig.charCodeAt(i3++);
        if (c < 240) {
          out += String.fromCharCode((c & 15) << 12 | (d & 63) << 6 | e & 63);
          continue;
        }
        f = orig.charCodeAt(i3++);
        w = ((c & 7) << 18 | (d & 63) << 12 | (e & 63) << 6 | f & 63) - 65536;
        out += String.fromCharCode(55296 + (w >>> 10 & 1023));
        out += String.fromCharCode(56320 + (w & 1023));
      }
      return out;
    };
    var utf8write = function(orig) {
      var out = [], i3 = 0, c = 0, d = 0;
      while (i3 < orig.length) {
        c = orig.charCodeAt(i3++);
        switch (true) {
          case c < 128:
            out.push(String.fromCharCode(c));
            break;
          case c < 2048:
            out.push(String.fromCharCode(192 + (c >> 6)));
            out.push(String.fromCharCode(128 + (c & 63)));
            break;
          case (c >= 55296 && c < 57344):
            c -= 55296;
            d = orig.charCodeAt(i3++) - 56320 + (c << 10);
            out.push(String.fromCharCode(240 + (d >> 18 & 7)));
            out.push(String.fromCharCode(144 + (d >> 12 & 63)));
            out.push(String.fromCharCode(128 + (d >> 6 & 63)));
            out.push(String.fromCharCode(128 + (d & 63)));
            break;
          default:
            out.push(String.fromCharCode(224 + (c >> 12)));
            out.push(String.fromCharCode(128 + (c >> 6 & 63)));
            out.push(String.fromCharCode(128 + (c & 63)));
        }
      }
      return out.join("");
    };
    if (has_buf) {
      var utf8readb = function utf8readb2(data) {
        var out = Buffer.alloc(2 * data.length), w, i3, j2 = 1, k = 0, ww = 0, c;
        for (i3 = 0; i3 < data.length; i3 += j2) {
          j2 = 1;
          if ((c = data.charCodeAt(i3)) < 128)
            w = c;
          else if (c < 224) {
            w = (c & 31) * 64 + (data.charCodeAt(i3 + 1) & 63);
            j2 = 2;
          } else if (c < 240) {
            w = (c & 15) * 4096 + (data.charCodeAt(i3 + 1) & 63) * 64 + (data.charCodeAt(i3 + 2) & 63);
            j2 = 3;
          } else {
            j2 = 4;
            w = (c & 7) * 262144 + (data.charCodeAt(i3 + 1) & 63) * 4096 + (data.charCodeAt(i3 + 2) & 63) * 64 + (data.charCodeAt(i3 + 3) & 63);
            w -= 65536;
            ww = 55296 + (w >>> 10 & 1023);
            w = 56320 + (w & 1023);
          }
          if (ww !== 0) {
            out[k++] = ww & 255;
            out[k++] = ww >>> 8;
            ww = 0;
          }
          out[k++] = w % 256;
          out[k++] = w >>> 8;
        }
        return out.slice(0, k).toString("ucs2");
      };
      var corpus = "foo bar baz☃🍣";
      if (utf8read(corpus) == utf8readb(corpus))
        utf8read = utf8readb;
      var utf8readc = function utf8readc2(data) {
        return Buffer_from(data, "binary").toString("utf8");
      };
      if (utf8read(corpus) == utf8readc(corpus))
        utf8read = utf8readc;
      utf8write = function(data) {
        return Buffer_from(data, "utf8").toString("binary");
      };
    }
    var matchtag = function() {
      var mtcache = {};
      return function matchtag2(f, g) {
        var t = f + "|" + (g || "");
        if (mtcache[t])
          return mtcache[t];
        return mtcache[t] = new RegExp("<(?:\\w+:)?" + f + '(?: xml:space="preserve")?(?:[^>]*)>([\\s\\S]*?)</(?:\\w+:)?' + f + ">", g || "");
      };
    }();
    var htmldecode = function() {
      var entities = [
        ["nbsp", " "],
        ["middot", "·"],
        ["quot", '"'],
        ["apos", "'"],
        ["gt", ">"],
        ["lt", "<"],
        ["amp", "&"]
      ].map(function(x) {
        return [new RegExp("&" + x[0] + ";", "ig"), x[1]];
      });
      return function htmldecode2(str) {
        var o = str.replace(/^[\t\n\r ]+/, "").replace(/[\t\n\r ]+$/, "").replace(/>\s+/g, ">").replace(/\s+</g, "<").replace(/[\t\n\r ]+/g, " ").replace(/<\s*[bB][rR]\s*\/?>/g, "\n").replace(/<[^>]*>/g, "");
        for (var i3 = 0; i3 < entities.length; ++i3)
          o = o.replace(entities[i3][0], entities[i3][1]);
        return o;
      };
    }();
    var vtregex = function() {
      var vt_cache = {};
      return function vt_regex(bt) {
        if (vt_cache[bt] !== void 0)
          return vt_cache[bt];
        return vt_cache[bt] = new RegExp("<(?:vt:)?" + bt + ">([\\s\\S]*?)</(?:vt:)?" + bt + ">", "g");
      };
    }();
    var vtvregex = /<\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\s\S]*)</;
    function parseVector(data, opts) {
      var h = parsexmltag(data);
      var matches = data.match(vtregex(h.baseType)) || [];
      var res = [];
      if (matches.length != h.size) {
        if (opts.WTF)
          throw new Error("unexpected vector length " + matches.length + " != " + h.size);
        return res;
      }
      matches.forEach(function(x) {
        var v = x.replace(vtvregex, "").match(vtmregex);
        if (v)
          res.push({ v: utf8read(v[2]), t: v[1] });
      });
      return res;
    }
    var wtregex = /(^\s|\s$|\n)/;
    function writetag(f, g) {
      return "<" + f + (g.match(wtregex) ? ' xml:space="preserve"' : "") + ">" + g + "</" + f + ">";
    }
    function wxt_helper(h) {
      return keys(h).map(function(k) {
        return " " + k + '="' + h[k] + '"';
      }).join("");
    }
    function writextag(f, g, h) {
      return "<" + f + (h != null ? wxt_helper(h) : "") + (g != null ? (g.match(wtregex) ? ' xml:space="preserve"' : "") + ">" + g + "</" + f : "/") + ">";
    }
    function write_w3cdtf(d, t) {
      try {
        return d.toISOString().replace(/\.\d*/, "");
      } catch (e) {
        if (t)
          throw e;
      }
      return "";
    }
    function write_vt(s) {
      switch (typeof s) {
        case "string":
          return writextag("vt:lpwstr", escapexml(s));
        case "number":
          return writextag((s | 0) == s ? "vt:i4" : "vt:r8", escapexml(String(s)));
        case "boolean":
          return writextag("vt:bool", s ? "true" : "false");
      }
      if (s instanceof Date)
        return writextag("vt:filetime", write_w3cdtf(s));
      throw new Error("Unable to serialize " + s);
    }
    var XMLNS = {
      "dc": "http://purl.org/dc/elements/1.1/",
      "dcterms": "http://purl.org/dc/terms/",
      "dcmitype": "http://purl.org/dc/dcmitype/",
      "mx": "http://schemas.microsoft.com/office/mac/excel/2008/main",
      "r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships",
      "sjs": "http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties",
      "vt": "http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes",
      "xsi": "http://www.w3.org/2001/XMLSchema-instance",
      "xsd": "http://www.w3.org/2001/XMLSchema"
    };
    XMLNS.main = [
      "http://schemas.openxmlformats.org/spreadsheetml/2006/main",
      "http://purl.oclc.org/ooxml/spreadsheetml/main",
      "http://schemas.microsoft.com/office/excel/2006/main",
      "http://schemas.microsoft.com/office/excel/2006/2"
    ];
    var XLMLNS = {
      "o": "urn:schemas-microsoft-com:office:office",
      "x": "urn:schemas-microsoft-com:office:excel",
      "ss": "urn:schemas-microsoft-com:office:spreadsheet",
      "dt": "uuid:C2F41010-65B3-11d1-A29F-00AA00C14882",
      "mv": "http://macVmlSchemaUri",
      "v": "urn:schemas-microsoft-com:vml",
      "html": "http://www.w3.org/TR/REC-html40"
    };
    function read_double_le(b, idx) {
      var s = 1 - 2 * (b[idx + 7] >>> 7);
      var e = ((b[idx + 7] & 127) << 4) + (b[idx + 6] >>> 4 & 15);
      var m = b[idx + 6] & 15;
      for (var i3 = 5; i3 >= 0; --i3)
        m = m * 256 + b[idx + i3];
      if (e == 2047)
        return m == 0 ? s * Infinity : NaN;
      if (e == 0)
        e = -1022;
      else {
        e -= 1023;
        m += Math.pow(2, 52);
      }
      return s * Math.pow(2, e - 52) * m;
    }
    function write_double_le(b, v, idx) {
      var bs = (v < 0 || 1 / v == -Infinity ? 1 : 0) << 7, e = 0, m = 0;
      var av = bs ? -v : v;
      if (!isFinite(av)) {
        e = 2047;
        m = isNaN(v) ? 26985 : 0;
      } else if (av == 0)
        e = m = 0;
      else {
        e = Math.floor(Math.log(av) / Math.LN2);
        m = av * Math.pow(2, 52 - e);
        if (e <= -1023 && (!isFinite(m) || m < Math.pow(2, 52))) {
          e = -1022;
        } else {
          m -= Math.pow(2, 52);
          e += 1023;
        }
      }
      for (var i3 = 0; i3 <= 5; ++i3, m /= 256)
        b[idx + i3] = m & 255;
      b[idx + 6] = (e & 15) << 4 | m & 15;
      b[idx + 7] = e >> 4 | bs;
    }
    var __toBuffer = function(bufs) {
      var x = [], w = 10240;
      for (var i3 = 0; i3 < bufs[0].length; ++i3)
        if (bufs[0][i3])
          for (var j2 = 0, L = bufs[0][i3].length; j2 < L; j2 += w)
            x.push.apply(x, bufs[0][i3].slice(j2, j2 + w));
      return x;
    };
    var ___toBuffer = __toBuffer;
    var __utf16le = function(b, s, e) {
      var ss = [];
      for (var i3 = s; i3 < e; i3 += 2)
        ss.push(String.fromCharCode(__readUInt16LE(b, i3)));
      return ss.join("").replace(chr0, "");
    };
    var ___utf16le = __utf16le;
    var __hexlify = function(b, s, l) {
      var ss = [];
      for (var i3 = s; i3 < s + l; ++i3)
        ss.push(("0" + b[i3].toString(16)).slice(-2));
      return ss.join("");
    };
    var ___hexlify = __hexlify;
    var __utf8 = function(b, s, e) {
      var ss = [];
      for (var i3 = s; i3 < e; i3++)
        ss.push(String.fromCharCode(__readUInt8(b, i3)));
      return ss.join("");
    };
    var ___utf8 = __utf8;
    var __lpstr = function(b, i3) {
      var len = __readUInt32LE(b, i3);
      return len > 0 ? __utf8(b, i3 + 4, i3 + 4 + len - 1) : "";
    };
    var ___lpstr = __lpstr;
    var __cpstr = function(b, i3) {
      var len = __readUInt32LE(b, i3);
      return len > 0 ? __utf8(b, i3 + 4, i3 + 4 + len - 1) : "";
    };
    var ___cpstr = __cpstr;
    var __lpwstr = function(b, i3) {
      var len = 2 * __readUInt32LE(b, i3);
      return len > 0 ? __utf8(b, i3 + 4, i3 + 4 + len - 1) : "";
    };
    var ___lpwstr = __lpwstr;
    var __lpp4, ___lpp4;
    __lpp4 = ___lpp4 = function lpp4_(b, i3) {
      var len = __readUInt32LE(b, i3);
      return len > 0 ? __utf16le(b, i3 + 4, i3 + 4 + len) : "";
    };
    var __8lpp4 = function(b, i3) {
      var len = __readUInt32LE(b, i3);
      return len > 0 ? __utf8(b, i3 + 4, i3 + 4 + len) : "";
    };
    var ___8lpp4 = __8lpp4;
    var __double, ___double;
    __double = ___double = function(b, idx) {
      return read_double_le(b, idx);
    };
    var is_buf = function is_buf_a(a) {
      return Array.isArray(a);
    };
    if (has_buf) {
      __utf16le = function(b, s, e) {
        if (!Buffer.isBuffer(b))
          return ___utf16le(b, s, e);
        return b.toString("utf16le", s, e).replace(chr0, "");
      };
      __hexlify = function(b, s, l) {
        return Buffer.isBuffer(b) ? b.toString("hex", s, s + l) : ___hexlify(b, s, l);
      };
      __lpstr = function lpstr_b(b, i3) {
        if (!Buffer.isBuffer(b))
          return ___lpstr(b, i3);
        var len = b.readUInt32LE(i3);
        return len > 0 ? b.toString("utf8", i3 + 4, i3 + 4 + len - 1) : "";
      };
      __cpstr = function cpstr_b(b, i3) {
        if (!Buffer.isBuffer(b))
          return ___cpstr(b, i3);
        var len = b.readUInt32LE(i3);
        return len > 0 ? b.toString("utf8", i3 + 4, i3 + 4 + len - 1) : "";
      };
      __lpwstr = function lpwstr_b(b, i3) {
        if (!Buffer.isBuffer(b))
          return ___lpwstr(b, i3);
        var len = 2 * b.readUInt32LE(i3);
        return b.toString("utf16le", i3 + 4, i3 + 4 + len - 1);
      };
      __lpp4 = function lpp4_b(b, i3) {
        if (!Buffer.isBuffer(b))
          return ___lpp4(b, i3);
        var len = b.readUInt32LE(i3);
        return b.toString("utf16le", i3 + 4, i3 + 4 + len);
      };
      __8lpp4 = function lpp4_8b(b, i3) {
        if (!Buffer.isBuffer(b))
          return ___8lpp4(b, i3);
        var len = b.readUInt32LE(i3);
        return b.toString("utf8", i3 + 4, i3 + 4 + len);
      };
      __utf8 = function utf8_b(b, s, e) {
        return Buffer.isBuffer(b) ? b.toString("utf8", s, e) : ___utf8(b, s, e);
      };
      __toBuffer = function(bufs) {
        return bufs[0].length > 0 && Buffer.isBuffer(bufs[0][0]) ? Buffer.concat(bufs[0]) : ___toBuffer(bufs);
      };
      bconcat = function(bufs) {
        return Buffer.isBuffer(bufs[0]) ? Buffer.concat(bufs) : [].concat.apply([], bufs);
      };
      __double = function double_(b, i3) {
        if (Buffer.isBuffer(b))
          return b.readDoubleLE(i3);
        return ___double(b, i3);
      };
      is_buf = function is_buf_b(a) {
        return Buffer.isBuffer(a) || Array.isArray(a);
      };
    }
    if (typeof cptable !== "undefined") {
      __utf16le = function(b, s, e) {
        return cptable.utils.decode(1200, b.slice(s, e)).replace(chr0, "");
      };
      __utf8 = function(b, s, e) {
        return cptable.utils.decode(65001, b.slice(s, e));
      };
      __lpstr = function(b, i3) {
        var len = __readUInt32LE(b, i3);
        return len > 0 ? cptable.utils.decode(current_ansi, b.slice(i3 + 4, i3 + 4 + len - 1)) : "";
      };
      __cpstr = function(b, i3) {
        var len = __readUInt32LE(b, i3);
        return len > 0 ? cptable.utils.decode(current_codepage, b.slice(i3 + 4, i3 + 4 + len - 1)) : "";
      };
      __lpwstr = function(b, i3) {
        var len = 2 * __readUInt32LE(b, i3);
        return len > 0 ? cptable.utils.decode(1200, b.slice(i3 + 4, i3 + 4 + len - 1)) : "";
      };
      __lpp4 = function(b, i3) {
        var len = __readUInt32LE(b, i3);
        return len > 0 ? cptable.utils.decode(1200, b.slice(i3 + 4, i3 + 4 + len)) : "";
      };
      __8lpp4 = function(b, i3) {
        var len = __readUInt32LE(b, i3);
        return len > 0 ? cptable.utils.decode(65001, b.slice(i3 + 4, i3 + 4 + len)) : "";
      };
    }
    var __readUInt8 = function(b, idx) {
      return b[idx];
    };
    var __readUInt16LE = function(b, idx) {
      return b[idx + 1] * (1 << 8) + b[idx];
    };
    var __readInt16LE = function(b, idx) {
      var u = b[idx + 1] * (1 << 8) + b[idx];
      return u < 32768 ? u : (65535 - u + 1) * -1;
    };
    var __readUInt32LE = function(b, idx) {
      return b[idx + 3] * (1 << 24) + (b[idx + 2] << 16) + (b[idx + 1] << 8) + b[idx];
    };
    var __readInt32LE = function(b, idx) {
      return b[idx + 3] << 24 | b[idx + 2] << 16 | b[idx + 1] << 8 | b[idx];
    };
    var __readInt32BE = function(b, idx) {
      return b[idx] << 24 | b[idx + 1] << 16 | b[idx + 2] << 8 | b[idx + 3];
    };
    function ReadShift(size, t) {
      var o = "", oI, oR, oo = [], w, vv, i3, loc;
      switch (t) {
        case "dbcs":
          loc = this.l;
          if (has_buf && Buffer.isBuffer(this))
            o = this.slice(this.l, this.l + 2 * size).toString("utf16le");
          else
            for (i3 = 0; i3 < size; ++i3) {
              o += String.fromCharCode(__readUInt16LE(this, loc));
              loc += 2;
            }
          size *= 2;
          break;
        case "utf8":
          o = __utf8(this, this.l, this.l + size);
          break;
        case "utf16le":
          size *= 2;
          o = __utf16le(this, this.l, this.l + size);
          break;
        case "wstr":
          if (typeof cptable !== "undefined")
            o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + 2 * size));
          else
            return ReadShift.call(this, size, "dbcs");
          size = 2 * size;
          break;
        case "lpstr-ansi":
          o = __lpstr(this, this.l);
          size = 4 + __readUInt32LE(this, this.l);
          break;
        case "lpstr-cp":
          o = __cpstr(this, this.l);
          size = 4 + __readUInt32LE(this, this.l);
          break;
        case "lpwstr":
          o = __lpwstr(this, this.l);
          size = 4 + 2 * __readUInt32LE(this, this.l);
          break;
        case "lpp4":
          size = 4 + __readUInt32LE(this, this.l);
          o = __lpp4(this, this.l);
          if (size & 2)
            size += 2;
          break;
        case "8lpp4":
          size = 4 + __readUInt32LE(this, this.l);
          o = __8lpp4(this, this.l);
          if (size & 3)
            size += 4 - (size & 3);
          break;
        case "cstr":
          size = 0;
          o = "";
          while ((w = __readUInt8(this, this.l + size++)) !== 0)
            oo.push(_getchar(w));
          o = oo.join("");
          break;
        case "_wstr":
          size = 0;
          o = "";
          while ((w = __readUInt16LE(this, this.l + size)) !== 0) {
            oo.push(_getchar(w));
            size += 2;
          }
          size += 2;
          o = oo.join("");
          break;
        case "dbcs-cont":
          o = "";
          loc = this.l;
          for (i3 = 0; i3 < size; ++i3) {
            if (this.lens && this.lens.indexOf(loc) !== -1) {
              w = __readUInt8(this, loc);
              this.l = loc + 1;
              vv = ReadShift.call(this, size - i3, w ? "dbcs-cont" : "sbcs-cont");
              return oo.join("") + vv;
            }
            oo.push(_getchar(__readUInt16LE(this, loc)));
            loc += 2;
          }
          o = oo.join("");
          size *= 2;
          break;
        case "cpstr":
          if (typeof cptable !== "undefined") {
            o = cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));
            break;
          }
        case "sbcs-cont":
          o = "";
          loc = this.l;
          for (i3 = 0; i3 != size; ++i3) {
            if (this.lens && this.lens.indexOf(loc) !== -1) {
              w = __readUInt8(this, loc);
              this.l = loc + 1;
              vv = ReadShift.call(this, size - i3, w ? "dbcs-cont" : "sbcs-cont");
              return oo.join("") + vv;
            }
            oo.push(_getchar(__readUInt8(this, loc)));
            loc += 1;
          }
          o = oo.join("");
          break;
        default:
          switch (size) {
            case 1:
              oI = __readUInt8(this, this.l);
              this.l++;
              return oI;
            case 2:
              oI = (t === "i" ? __readInt16LE : __readUInt16LE)(this, this.l);
              this.l += 2;
              return oI;
            case 4:
            case -4:
              if (t === "i" || (this[this.l + 3] & 128) === 0) {
                oI = (size > 0 ? __readInt32LE : __readInt32BE)(this, this.l);
                this.l += 4;
                return oI;
              } else {
                oR = __readUInt32LE(this, this.l);
                this.l += 4;
              }
              return oR;
            case 8:
            case -8:
              if (t === "f") {
                if (size == 8)
                  oR = __double(this, this.l);
                else
                  oR = __double([this[this.l + 7], this[this.l + 6], this[this.l + 5], this[this.l + 4], this[this.l + 3], this[this.l + 2], this[this.l + 1], this[this.l + 0]], 0);
                this.l += 8;
                return oR;
              } else
                size = 8;
            case 16:
              o = __hexlify(this, this.l, size);
              break;
          }
      }
      this.l += size;
      return o;
    }
    var __writeUInt32LE = function(b, val, idx) {
      b[idx] = val & 255;
      b[idx + 1] = val >>> 8 & 255;
      b[idx + 2] = val >>> 16 & 255;
      b[idx + 3] = val >>> 24 & 255;
    };
    var __writeInt32LE = function(b, val, idx) {
      b[idx] = val & 255;
      b[idx + 1] = val >> 8 & 255;
      b[idx + 2] = val >> 16 & 255;
      b[idx + 3] = val >> 24 & 255;
    };
    var __writeUInt16LE = function(b, val, idx) {
      b[idx] = val & 255;
      b[idx + 1] = val >>> 8 & 255;
    };
    function WriteShift(t, val, f) {
      var size = 0, i3 = 0;
      if (f === "dbcs") {
        for (i3 = 0; i3 != val.length; ++i3)
          __writeUInt16LE(this, val.charCodeAt(i3), this.l + 2 * i3);
        size = 2 * val.length;
      } else if (f === "sbcs") {
        if (typeof cptable !== "undefined" && current_ansi == 874) {
          for (i3 = 0; i3 != val.length; ++i3) {
            var cppayload = cptable.utils.encode(current_ansi, val.charAt(i3));
            this[this.l + i3] = cppayload[0];
          }
        } else {
          val = val.replace(/[^\x00-\x7F]/g, "_");
          for (i3 = 0; i3 != val.length; ++i3)
            this[this.l + i3] = val.charCodeAt(i3) & 255;
        }
        size = val.length;
      } else if (f === "hex") {
        for (; i3 < t; ++i3) {
          this[this.l++] = parseInt(val.slice(2 * i3, 2 * i3 + 2), 16) || 0;
        }
        return this;
      } else if (f === "utf16le") {
        var end = Math.min(this.l + t, this.length);
        for (i3 = 0; i3 < Math.min(val.length, t); ++i3) {
          var cc = val.charCodeAt(i3);
          this[this.l++] = cc & 255;
          this[this.l++] = cc >> 8;
        }
        while (this.l < end)
          this[this.l++] = 0;
        return this;
      } else
        switch (t) {
          case 1:
            size = 1;
            this[this.l] = val & 255;
            break;
          case 2:
            size = 2;
            this[this.l] = val & 255;
            val >>>= 8;
            this[this.l + 1] = val & 255;
            break;
          case 3:
            size = 3;
            this[this.l] = val & 255;
            val >>>= 8;
            this[this.l + 1] = val & 255;
            val >>>= 8;
            this[this.l + 2] = val & 255;
            break;
          case 4:
            size = 4;
            __writeUInt32LE(this, val, this.l);
            break;
          case 8:
            size = 8;
            if (f === "f") {
              write_double_le(this, val, this.l);
              break;
            }
          case 16:
            break;
          case -4:
            size = 4;
            __writeInt32LE(this, val, this.l);
            break;
        }
      this.l += size;
      return this;
    }
    function CheckField(hexstr, fld) {
      var m = __hexlify(this, this.l, hexstr.length >> 1);
      if (m !== hexstr)
        throw new Error(fld + "Expected " + hexstr + " saw " + m);
      this.l += hexstr.length >> 1;
    }
    function prep_blob(blob, pos) {
      blob.l = pos;
      blob.read_shift = ReadShift;
      blob.chk = CheckField;
      blob.write_shift = WriteShift;
    }
    function parsenoop(blob, length) {
      blob.l += length;
    }
    function new_buf(sz) {
      var o = new_raw_buf(sz);
      prep_blob(o, 0);
      return o;
    }
    function recordhopper(data, cb, opts) {
      if (!data)
        return;
      var tmpbyte, cntbyte, length;
      prep_blob(data, data.l || 0);
      var L = data.length, RT = 0, tgt = 0;
      while (data.l < L) {
        RT = data.read_shift(1);
        if (RT & 128)
          RT = (RT & 127) + ((data.read_shift(1) & 127) << 7);
        var R = XLSBRecordEnum[RT] || XLSBRecordEnum[65535];
        tmpbyte = data.read_shift(1);
        length = tmpbyte & 127;
        for (cntbyte = 1; cntbyte < 4 && tmpbyte & 128; ++cntbyte)
          length += ((tmpbyte = data.read_shift(1)) & 127) << 7 * cntbyte;
        tgt = data.l + length;
        var d = (R.f || parsenoop)(data, length, opts);
        data.l = tgt;
        if (cb(d, R.n, RT))
          return;
      }
    }
    function buf_array() {
      var bufs = [], blksz = has_buf ? 256 : 2048;
      var newblk = function ba_newblk(sz) {
        var o = new_buf(sz);
        prep_blob(o, 0);
        return o;
      };
      var curbuf = newblk(blksz);
      var endbuf = function ba_endbuf() {
        if (!curbuf)
          return;
        if (curbuf.length > curbuf.l) {
          curbuf = curbuf.slice(0, curbuf.l);
          curbuf.l = curbuf.length;
        }
        if (curbuf.length > 0)
          bufs.push(curbuf);
        curbuf = null;
      };
      var next = function ba_next(sz) {
        if (curbuf && sz < curbuf.length - curbuf.l)
          return curbuf;
        endbuf();
        return curbuf = newblk(Math.max(sz + 1, blksz));
      };
      var end = function ba_end() {
        endbuf();
        return __toBuffer([bufs]);
      };
      var push = function ba_push(buf) {
        endbuf();
        curbuf = buf;
        if (curbuf.l == null)
          curbuf.l = curbuf.length;
        next(blksz);
      };
      return { next, push, end, _bufs: bufs };
    }
    function write_record(ba, type, payload, length) {
      var t = +XLSBRE[type], l;
      if (isNaN(t))
        return;
      if (!length)
        length = XLSBRecordEnum[t].p || (payload || []).length || 0;
      l = 1 + (t >= 128 ? 1 : 0) + 1;
      if (length >= 128)
        ++l;
      if (length >= 16384)
        ++l;
      if (length >= 2097152)
        ++l;
      var o = ba.next(l);
      if (t <= 127)
        o.write_shift(1, t);
      else {
        o.write_shift(1, (t & 127) + 128);
        o.write_shift(1, t >> 7);
      }
      for (var i3 = 0; i3 != 4; ++i3) {
        if (length >= 128) {
          o.write_shift(1, (length & 127) + 128);
          length >>= 7;
        } else {
          o.write_shift(1, length);
          break;
        }
      }
      if (length > 0 && is_buf(payload))
        ba.push(payload);
    }
    function shift_cell_xls(cell, tgt, opts) {
      var out = dup(cell);
      if (tgt.s) {
        if (out.cRel)
          out.c += tgt.s.c;
        if (out.rRel)
          out.r += tgt.s.r;
      } else {
        if (out.cRel)
          out.c += tgt.c;
        if (out.rRel)
          out.r += tgt.r;
      }
      if (!opts || opts.biff < 12) {
        while (out.c >= 256)
          out.c -= 256;
        while (out.r >= 65536)
          out.r -= 65536;
      }
      return out;
    }
    function shift_range_xls(cell, range, opts) {
      var out = dup(cell);
      out.s = shift_cell_xls(out.s, range.s, opts);
      out.e = shift_cell_xls(out.e, range.s, opts);
      return out;
    }
    function encode_cell_xls(c, biff) {
      if (c.cRel && c.c < 0) {
        c = dup(c);
        while (c.c < 0)
          c.c += biff > 8 ? 16384 : 256;
      }
      if (c.rRel && c.r < 0) {
        c = dup(c);
        while (c.r < 0)
          c.r += biff > 8 ? 1048576 : biff > 5 ? 65536 : 16384;
      }
      var s = encode_cell(c);
      if (!c.cRel && c.cRel != null)
        s = fix_col(s);
      if (!c.rRel && c.rRel != null)
        s = fix_row(s);
      return s;
    }
    function encode_range_xls(r, opts) {
      if (r.s.r == 0 && !r.s.rRel) {
        if (r.e.r == (opts.biff >= 12 ? 1048575 : opts.biff >= 8 ? 65536 : 16384) && !r.e.rRel) {
          return (r.s.cRel ? "" : "$") + encode_col(r.s.c) + ":" + (r.e.cRel ? "" : "$") + encode_col(r.e.c);
        }
      }
      if (r.s.c == 0 && !r.s.cRel) {
        if (r.e.c == (opts.biff >= 12 ? 16383 : 255) && !r.e.cRel) {
          return (r.s.rRel ? "" : "$") + encode_row(r.s.r) + ":" + (r.e.rRel ? "" : "$") + encode_row(r.e.r);
        }
      }
      return encode_cell_xls(r.s, opts.biff) + ":" + encode_cell_xls(r.e, opts.biff);
    }
    var OFFCRYPTO = {};
    var make_offcrypto = function(O, _crypto) {
      var crypto2;
      if (typeof _crypto !== "undefined")
        crypto2 = _crypto;
      else if (typeof commonjsRequire !== "undefined") {
        try {
          crypto2 = require$$4;
        } catch (e) {
          crypto2 = null;
        }
      }
      O.rc4 = function(key, data) {
        var S = new Array(256);
        var c = 0, i3 = 0, j2 = 0, t = 0;
        for (i3 = 0; i3 != 256; ++i3)
          S[i3] = i3;
        for (i3 = 0; i3 != 256; ++i3) {
          j2 = j2 + S[i3] + key[i3 % key.length].charCodeAt(0) & 255;
          t = S[i3];
          S[i3] = S[j2];
          S[j2] = t;
        }
        i3 = j2 = 0;
        var out = Buffer(data.length);
        for (c = 0; c != data.length; ++c) {
          i3 = i3 + 1 & 255;
          j2 = (j2 + S[i3]) % 256;
          t = S[i3];
          S[i3] = S[j2];
          S[j2] = t;
          out[c] = data[c] ^ S[S[i3] + S[j2] & 255];
        }
        return out;
      };
      O.md5 = function(hex) {
        if (!crypto2)
          throw new Error("Unsupported crypto");
        return crypto2.createHash("md5").update(hex).digest("hex");
      };
    };
    make_offcrypto(OFFCRYPTO, typeof crypto !== "undefined" ? crypto : void 0);
    function decode_row(rowstr) {
      return parseInt(unfix_row(rowstr), 10) - 1;
    }
    function encode_row(row) {
      return "" + (row + 1);
    }
    function fix_row(cstr) {
      return cstr.replace(/([A-Z]|^)(\d+)$/, "$1$$$2");
    }
    function unfix_row(cstr) {
      return cstr.replace(/\$(\d+)$/, "$1");
    }
    function decode_col(colstr) {
      var c = unfix_col(colstr), d = 0, i3 = 0;
      for (; i3 !== c.length; ++i3)
        d = 26 * d + c.charCodeAt(i3) - 64;
      return d - 1;
    }
    function encode_col(col) {
      if (col < 0)
        throw new Error("invalid column " + col);
      var s = "";
      for (++col; col; col = Math.floor((col - 1) / 26))
        s = String.fromCharCode((col - 1) % 26 + 65) + s;
      return s;
    }
    function fix_col(cstr) {
      return cstr.replace(/^([A-Z])/, "$$$1");
    }
    function unfix_col(cstr) {
      return cstr.replace(/^\$([A-Z])/, "$1");
    }
    function split_cell(cstr) {
      return cstr.replace(/(\$?[A-Z]*)(\$?\d*)/, "$1,$2").split(",");
    }
    function decode_cell(cstr) {
      var splt = split_cell(cstr);
      return { c: decode_col(splt[0]), r: decode_row(splt[1]) };
    }
    function encode_cell(cell) {
      return encode_col(cell.c) + encode_row(cell.r);
    }
    function decode_range(range) {
      var x = range.split(":").map(decode_cell);
      return { s: x[0], e: x[x.length - 1] };
    }
    function encode_range(cs, ce) {
      if (typeof ce === "undefined" || typeof ce === "number") {
        return encode_range(cs.s, cs.e);
      }
      if (typeof cs !== "string")
        cs = encode_cell(cs);
      if (typeof ce !== "string")
        ce = encode_cell(ce);
      return cs == ce ? cs : cs + ":" + ce;
    }
    function safe_decode_range(range) {
      var o = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };
      var idx = 0, i3 = 0, cc = 0;
      var len = range.length;
      for (idx = 0; i3 < len; ++i3) {
        if ((cc = range.charCodeAt(i3) - 64) < 1 || cc > 26)
          break;
        idx = 26 * idx + cc;
      }
      o.s.c = --idx;
      for (idx = 0; i3 < len; ++i3) {
        if ((cc = range.charCodeAt(i3) - 48) < 0 || cc > 9)
          break;
        idx = 10 * idx + cc;
      }
      o.s.r = --idx;
      if (i3 === len || range.charCodeAt(++i3) === 58) {
        o.e.c = o.s.c;
        o.e.r = o.s.r;
        return o;
      }
      for (idx = 0; i3 != len; ++i3) {
        if ((cc = range.charCodeAt(i3) - 64) < 1 || cc > 26)
          break;
        idx = 26 * idx + cc;
      }
      o.e.c = --idx;
      for (idx = 0; i3 != len; ++i3) {
        if ((cc = range.charCodeAt(i3) - 48) < 0 || cc > 9)
          break;
        idx = 10 * idx + cc;
      }
      o.e.r = --idx;
      return o;
    }
    function safe_format_cell(cell, v) {
      var q = cell.t == "d" && v instanceof Date;
      if (cell.z != null)
        try {
          return cell.w = SSF.format(cell.z, q ? datenum(v) : v);
        } catch (e) {
        }
      try {
        return cell.w = SSF.format((cell.XF || {}).numFmtId || (q ? 14 : 0), q ? datenum(v) : v);
      } catch (e) {
        return "" + v;
      }
    }
    function format_cell(cell, v, o) {
      if (cell == null || cell.t == null || cell.t == "z")
        return "";
      if (cell.w !== void 0)
        return cell.w;
      if (cell.t == "d" && !cell.z && o && o.dateNF)
        cell.z = o.dateNF;
      if (v == void 0)
        return safe_format_cell(cell, cell.v);
      return safe_format_cell(cell, v);
    }
    function sheet_to_workbook(sheet, opts) {
      var n = opts && opts.sheet ? opts.sheet : "Sheet1";
      var sheets = {};
      sheets[n] = sheet;
      return { SheetNames: [n], Sheets: sheets };
    }
    function sheet_add_aoa(_ws, data, opts) {
      var o = opts || {};
      var dense = _ws ? Array.isArray(_ws) : o.dense;
      var ws = _ws || (dense ? [] : {});
      var _R = 0, _C = 0;
      if (ws && o.origin != null) {
        if (typeof o.origin == "number")
          _R = o.origin;
        else {
          var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
          _R = _origin.r;
          _C = _origin.c;
        }
      }
      var range = { s: { c: 1e7, r: 1e7 }, e: { c: 0, r: 0 } };
      if (ws["!ref"]) {
        var _range = safe_decode_range(ws["!ref"]);
        range.s.c = _range.s.c;
        range.s.r = _range.s.r;
        range.e.c = Math.max(range.e.c, _range.e.c);
        range.e.r = Math.max(range.e.r, _range.e.r);
        if (_R == -1)
          range.e.r = _R = _range.e.r + 1;
      }
      for (var R = 0; R != data.length; ++R) {
        if (!data[R])
          continue;
        if (!Array.isArray(data[R]))
          throw new Error("aoa_to_sheet expects an array of arrays");
        for (var C = 0; C != data[R].length; ++C) {
          if (typeof data[R][C] === "undefined")
            continue;
          var cell = { v: data[R][C] };
          var __R = _R + R, __C = _C + C;
          if (range.s.r > __R)
            range.s.r = __R;
          if (range.s.c > __C)
            range.s.c = __C;
          if (range.e.r < __R)
            range.e.r = __R;
          if (range.e.c < __C)
            range.e.c = __C;
          if (data[R][C] && typeof data[R][C] === "object" && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date))
            cell = data[R][C];
          else {
            if (Array.isArray(cell.v)) {
              cell.f = data[R][C][1];
              cell.v = cell.v[0];
            }
            if (cell.v === null) {
              if (cell.f)
                cell.t = "n";
              else if (!o.sheetStubs)
                continue;
              else
                cell.t = "z";
            } else if (typeof cell.v === "number")
              cell.t = "n";
            else if (typeof cell.v === "boolean")
              cell.t = "b";
            else if (cell.v instanceof Date) {
              cell.z = o.dateNF || SSF._table[14];
              if (o.cellDates) {
                cell.t = "d";
                cell.w = SSF.format(cell.z, datenum(cell.v));
              } else {
                cell.t = "n";
                cell.v = datenum(cell.v);
                cell.w = SSF.format(cell.z, cell.v);
              }
            } else
              cell.t = "s";
          }
          if (dense) {
            if (!ws[__R])
              ws[__R] = [];
            if (ws[__R][__C] && ws[__R][__C].z)
              cell.z = ws[__R][__C].z;
            ws[__R][__C] = cell;
          } else {
            var cell_ref = encode_cell({ c: __C, r: __R });
            if (ws[cell_ref] && ws[cell_ref].z)
              cell.z = ws[cell_ref].z;
            ws[cell_ref] = cell;
          }
        }
      }
      if (range.s.c < 1e7)
        ws["!ref"] = encode_range(range);
      return ws;
    }
    function aoa_to_sheet(data, opts) {
      return sheet_add_aoa(null, data, opts);
    }
    function write_UInt32LE(x, o) {
      if (!o)
        o = new_buf(4);
      o.write_shift(4, x);
      return o;
    }
    function parse_XLWideString(data) {
      var cchCharacters = data.read_shift(4);
      return cchCharacters === 0 ? "" : data.read_shift(cchCharacters, "dbcs");
    }
    function write_XLWideString(data, o) {
      var _null = false;
      if (o == null) {
        _null = true;
        o = new_buf(4 + 2 * data.length);
      }
      o.write_shift(4, data.length);
      if (data.length > 0)
        o.write_shift(0, data, "dbcs");
      return _null ? o.slice(0, o.l) : o;
    }
    function parse_StrRun(data) {
      return { ich: data.read_shift(2), ifnt: data.read_shift(2) };
    }
    function write_StrRun(run, o) {
      if (!o)
        o = new_buf(4);
      o.write_shift(2, run.ich || 0);
      o.write_shift(2, run.ifnt || 0);
      return o;
    }
    function parse_RichStr(data, length) {
      var start = data.l;
      var flags = data.read_shift(1);
      var str = parse_XLWideString(data);
      var rgsStrRun = [];
      var z = { t: str, h: str };
      if ((flags & 1) !== 0) {
        var dwSizeStrRun = data.read_shift(4);
        for (var i3 = 0; i3 != dwSizeStrRun; ++i3)
          rgsStrRun.push(parse_StrRun(data));
        z.r = rgsStrRun;
      } else
        z.r = [{ ich: 0, ifnt: 0 }];
      data.l = start + length;
      return z;
    }
    function write_RichStr(str, o) {
      var _null = false;
      if (o == null) {
        _null = true;
        o = new_buf(15 + 4 * str.t.length);
      }
      o.write_shift(1, 0);
      write_XLWideString(str.t, o);
      return _null ? o.slice(0, o.l) : o;
    }
    var parse_BrtCommentText = parse_RichStr;
    function write_BrtCommentText(str, o) {
      var _null = false;
      if (o == null) {
        _null = true;
        o = new_buf(23 + 4 * str.t.length);
      }
      o.write_shift(1, 1);
      write_XLWideString(str.t, o);
      o.write_shift(4, 1);
      write_StrRun({ ich: 0, ifnt: 0 }, o);
      return _null ? o.slice(0, o.l) : o;
    }
    function parse_XLSBCell(data) {
      var col = data.read_shift(4);
      var iStyleRef = data.read_shift(2);
      iStyleRef += data.read_shift(1) << 16;
      data.l++;
      return { c: col, iStyleRef };
    }
    function write_XLSBCell(cell, o) {
      if (o == null)
        o = new_buf(8);
      o.write_shift(-4, cell.c);
      o.write_shift(3, cell.iStyleRef || cell.s);
      o.write_shift(1, 0);
      return o;
    }
    var parse_XLSBCodeName = parse_XLWideString;
    var write_XLSBCodeName = write_XLWideString;
    function parse_XLNullableWideString(data) {
      var cchCharacters = data.read_shift(4);
      return cchCharacters === 0 || cchCharacters === 4294967295 ? "" : data.read_shift(cchCharacters, "dbcs");
    }
    function write_XLNullableWideString(data, o) {
      var _null = false;
      if (o == null) {
        _null = true;
        o = new_buf(127);
      }
      o.write_shift(4, data.length > 0 ? data.length : 4294967295);
      if (data.length > 0)
        o.write_shift(0, data, "dbcs");
      return _null ? o.slice(0, o.l) : o;
    }
    var parse_XLNameWideString = parse_XLWideString;
    var parse_RelID = parse_XLNullableWideString;
    var write_RelID = write_XLNullableWideString;
    function parse_RkNumber(data) {
      var b = data.slice(data.l, data.l + 4);
      var fX100 = b[0] & 1, fInt = b[0] & 2;
      data.l += 4;
      b[0] &= 252;
      var RK = fInt === 0 ? __double([0, 0, 0, 0, b[0], b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2;
      return fX100 ? RK / 100 : RK;
    }
    function write_RkNumber(data, o) {
      if (o == null)
        o = new_buf(4);
      var fX100 = 0, fInt = 0, d100 = data * 100;
      if (data == (data | 0) && data >= -(1 << 29) && data < 1 << 29) {
        fInt = 1;
      } else if (d100 == (d100 | 0) && d100 >= -(1 << 29) && d100 < 1 << 29) {
        fInt = 1;
        fX100 = 1;
      }
      if (fInt)
        o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2));
      else
        throw new Error("unsupported RkNumber " + data);
    }
    function parse_RfX(data) {
      var cell = { s: {}, e: {} };
      cell.s.r = data.read_shift(4);
      cell.e.r = data.read_shift(4);
      cell.s.c = data.read_shift(4);
      cell.e.c = data.read_shift(4);
      return cell;
    }
    function write_RfX(r, o) {
      if (!o)
        o = new_buf(16);
      o.write_shift(4, r.s.r);
      o.write_shift(4, r.e.r);
      o.write_shift(4, r.s.c);
      o.write_shift(4, r.e.c);
      return o;
    }
    var parse_UncheckedRfX = parse_RfX;
    var write_UncheckedRfX = write_RfX;
    function parse_Xnum(data) {
      return data.read_shift(8, "f");
    }
    function write_Xnum(data, o) {
      return (o || new_buf(8)).write_shift(8, data, "f");
    }
    var BErr = {
      0: "#NULL!",
      7: "#DIV/0!",
      15: "#VALUE!",
      23: "#REF!",
      29: "#NAME?",
      36: "#NUM!",
      42: "#N/A",
      43: "#GETTING_DATA",
      255: "#WTF?"
    };
    var RBErr = evert_num(BErr);
    function parse_BrtColor(data) {
      var out = {};
      var d = data.read_shift(1);
      var xColorType = d >>> 1;
      var index2 = data.read_shift(1);
      var nTS = data.read_shift(2, "i");
      var bR = data.read_shift(1);
      var bG = data.read_shift(1);
      var bB = data.read_shift(1);
      data.l++;
      switch (xColorType) {
        case 0:
          out.auto = 1;
          break;
        case 1:
          out.index = index2;
          var icv = XLSIcv[index2];
          if (icv)
            out.rgb = rgb2Hex(icv);
          break;
        case 2:
          out.rgb = rgb2Hex([bR, bG, bB]);
          break;
        case 3:
          out.theme = index2;
          break;
      }
      if (nTS != 0)
        out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768;
      return out;
    }
    function write_BrtColor(color, o) {
      if (!o)
        o = new_buf(8);
      if (!color || color.auto) {
        o.write_shift(4, 0);
        o.write_shift(4, 0);
        return o;
      }
      if (color.index != null) {
        o.write_shift(1, 2);
        o.write_shift(1, color.index);
      } else if (color.theme != null) {
        o.write_shift(1, 6);
        o.write_shift(1, color.theme);
      } else {
        o.write_shift(1, 5);
        o.write_shift(1, 0);
      }
      var nTS = color.tint || 0;
      if (nTS > 0)
        nTS *= 32767;
      else if (nTS < 0)
        nTS *= 32768;
      o.write_shift(2, nTS);
      if (!color.rgb || color.theme != null) {
        o.write_shift(2, 0);
        o.write_shift(1, 0);
        o.write_shift(1, 0);
      } else {
        var rgb = color.rgb || "FFFFFF";
        if (typeof rgb == "number")
          rgb = ("000000" + rgb.toString(16)).slice(-6);
        o.write_shift(1, parseInt(rgb.slice(0, 2), 16));
        o.write_shift(1, parseInt(rgb.slice(2, 4), 16));
        o.write_shift(1, parseInt(rgb.slice(4, 6), 16));
        o.write_shift(1, 255);
      }
      return o;
    }
    function parse_FontFlags(data) {
      var d = data.read_shift(1);
      data.l++;
      var out = {
        fBold: d & 1,
        fItalic: d & 2,
        fUnderline: d & 4,
        fStrikeout: d & 8,
        fOutline: d & 16,
        fShadow: d & 32,
        fCondense: d & 64,
        fExtend: d & 128
      };
      return out;
    }
    function write_FontFlags(font, o) {
      if (!o)
        o = new_buf(2);
      var grbit = (font.italic ? 2 : 0) | (font.strike ? 8 : 0) | (font.outline ? 16 : 0) | (font.shadow ? 32 : 0) | (font.condense ? 64 : 0) | (font.extend ? 128 : 0);
      o.write_shift(1, grbit);
      o.write_shift(1, 0);
      return o;
    }
    function parse_ClipboardFormatOrString(o, w) {
      var ClipFmt = { 2: "BITMAP", 3: "METAFILEPICT", 8: "DIB", 14: "ENHMETAFILE" };
      var m = o.read_shift(4);
      switch (m) {
        case 0:
          return "";
        case 4294967295:
        case 4294967294:
          return ClipFmt[o.read_shift(4)] || "";
      }
      if (m > 400)
        throw new Error("Unsupported Clipboard: " + m.toString(16));
      o.l -= 4;
      return o.read_shift(0, w == 1 ? "lpstr" : "lpwstr");
    }
    function parse_ClipboardFormatOrAnsiString(o) {
      return parse_ClipboardFormatOrString(o, 1);
    }
    function parse_ClipboardFormatOrUnicodeString(o) {
      return parse_ClipboardFormatOrString(o, 2);
    }
    var VT_I2 = 2;
    var VT_I4 = 3;
    var VT_BOOL = 11;
    var VT_VARIANT = 12;
    var VT_UI4 = 19;
    var VT_LPSTR = 30;
    var VT_FILETIME = 64;
    var VT_BLOB = 65;
    var VT_CF = 71;
    var VT_VECTOR = 4096;
    var VT_STRING = 80;
    var VT_USTR = 81;
    var VT_CUSTOM = [VT_STRING, VT_USTR];
    var DocSummaryPIDDSI = {
      1: { n: "CodePage", t: VT_I2 },
      2: { n: "Category", t: VT_STRING },
      3: { n: "PresentationFormat", t: VT_STRING },
      4: { n: "ByteCount", t: VT_I4 },
      5: { n: "LineCount", t: VT_I4 },
      6: { n: "ParagraphCount", t: VT_I4 },
      7: { n: "SlideCount", t: VT_I4 },
      8: { n: "NoteCount", t: VT_I4 },
      9: { n: "HiddenCount", t: VT_I4 },
      10: { n: "MultimediaClipCount", t: VT_I4 },
      11: { n: "ScaleCrop", t: VT_BOOL },
      12: { n: "HeadingPairs", t: VT_VECTOR | VT_VARIANT },
      13: { n: "TitlesOfParts", t: VT_VECTOR | VT_LPSTR },
      14: { n: "Manager", t: VT_STRING },
      15: { n: "Company", t: VT_STRING },
      16: { n: "LinksUpToDate", t: VT_BOOL },
      17: { n: "CharacterCount", t: VT_I4 },
      19: { n: "SharedDoc", t: VT_BOOL },
      22: { n: "HyperlinksChanged", t: VT_BOOL },
      23: { n: "AppVersion", t: VT_I4, p: "version" },
      24: { n: "DigSig", t: VT_BLOB },
      26: { n: "ContentType", t: VT_STRING },
      27: { n: "ContentStatus", t: VT_STRING },
      28: { n: "Language", t: VT_STRING },
      29: { n: "Version", t: VT_STRING },
      255: {}
    };
    var SummaryPIDSI = {
      1: { n: "CodePage", t: VT_I2 },
      2: { n: "Title", t: VT_STRING },
      3: { n: "Subject", t: VT_STRING },
      4: { n: "Author", t: VT_STRING },
      5: { n: "Keywords", t: VT_STRING },
      6: { n: "Comments", t: VT_STRING },
      7: { n: "Template", t: VT_STRING },
      8: { n: "LastAuthor", t: VT_STRING },
      9: { n: "RevNumber", t: VT_STRING },
      10: { n: "EditTime", t: VT_FILETIME },
      11: { n: "LastPrinted", t: VT_FILETIME },
      12: { n: "CreatedDate", t: VT_FILETIME },
      13: { n: "ModifiedDate", t: VT_FILETIME },
      14: { n: "PageCount", t: VT_I4 },
      15: { n: "WordCount", t: VT_I4 },
      16: { n: "CharCount", t: VT_I4 },
      17: { n: "Thumbnail", t: VT_CF },
      18: { n: "Application", t: VT_STRING },
      19: { n: "DocSecurity", t: VT_I4 },
      255: {}
    };
    var SpecialProperties = {
      2147483648: { n: "Locale", t: VT_UI4 },
      2147483651: { n: "Behavior", t: VT_UI4 },
      1919054434: {}
    };
    (function() {
      for (var y in SpecialProperties)
        if (Object.prototype.hasOwnProperty.call(SpecialProperties, y))
          DocSummaryPIDDSI[y] = SummaryPIDSI[y] = SpecialProperties[y];
    })();
    var DocSummaryRE = evert_key(DocSummaryPIDDSI, "n");
    var SummaryRE = evert_key(SummaryPIDSI, "n");
    var CountryEnum = {
      1: "US",
      // United States
      2: "CA",
      // Canada
      3: "",
      // Latin America (except Brazil)
      7: "RU",
      // Russia
      20: "EG",
      // Egypt
      30: "GR",
      // Greece
      31: "NL",
      // Netherlands
      32: "BE",
      // Belgium
      33: "FR",
      // France
      34: "ES",
      // Spain
      36: "HU",
      // Hungary
      39: "IT",
      // Italy
      41: "CH",
      // Switzerland
      43: "AT",
      // Austria
      44: "GB",
      // United Kingdom
      45: "DK",
      // Denmark
      46: "SE",
      // Sweden
      47: "NO",
      // Norway
      48: "PL",
      // Poland
      49: "DE",
      // Germany
      52: "MX",
      // Mexico
      55: "BR",
      // Brazil
      61: "AU",
      // Australia
      64: "NZ",
      // New Zealand
      66: "TH",
      // Thailand
      81: "JP",
      // Japan
      82: "KR",
      // Korea
      84: "VN",
      // Viet Nam
      86: "CN",
      // China
      90: "TR",
      // Turkey
      105: "JS",
      // Ramastan
      213: "DZ",
      // Algeria
      216: "MA",
      // Morocco
      218: "LY",
      // Libya
      351: "PT",
      // Portugal
      354: "IS",
      // Iceland
      358: "FI",
      // Finland
      420: "CZ",
      // Czech Republic
      886: "TW",
      // Taiwan
      961: "LB",
      // Lebanon
      962: "JO",
      // Jordan
      963: "SY",
      // Syria
      964: "IQ",
      // Iraq
      965: "KW",
      // Kuwait
      966: "SA",
      // Saudi Arabia
      971: "AE",
      // United Arab Emirates
      972: "IL",
      // Israel
      974: "QA",
      // Qatar
      981: "IR",
      // Iran
      65535: "US"
      // United States
    };
    var XLSFillPattern = [
      null,
      "solid",
      "mediumGray",
      "darkGray",
      "lightGray",
      "darkHorizontal",
      "darkVertical",
      "darkDown",
      "darkUp",
      "darkGrid",
      "darkTrellis",
      "lightHorizontal",
      "lightVertical",
      "lightDown",
      "lightUp",
      "lightGrid",
      "lightTrellis",
      "gray125",
      "gray0625"
    ];
    function rgbify(arr) {
      return arr.map(function(x) {
        return [x >> 16 & 255, x >> 8 & 255, x & 255];
      });
    }
    var _XLSIcv = rgbify([
      /* Color Constants */
      0,
      16777215,
      16711680,
      65280,
      255,
      16776960,
      16711935,
      65535,
      /* Overridable Defaults */
      0,
      16777215,
      16711680,
      65280,
      255,
      16776960,
      16711935,
      65535,
      8388608,
      32768,
      128,
      8421376,
      8388736,
      32896,
      12632256,
      8421504,
      10066431,
      10040166,
      16777164,
      13434879,
      6684774,
      16744576,
      26316,
      13421823,
      128,
      16711935,
      16776960,
      65535,
      8388736,
      8388608,
      32896,
      255,
      52479,
      13434879,
      13434828,
      16777113,
      10079487,
      16751052,
      13408767,
      16764057,
      3368703,
      3394764,
      10079232,
      16763904,
      16750848,
      16737792,
      6710937,
      9868950,
      13158,
      3381606,
      13056,
      3355392,
      10040064,
      10040166,
      3355545,
      3355443,
      /* Other entries to appease BIFF8/12 */
      16777215,
      /* 0x40 icvForeground ?? */
      0,
      /* 0x41 icvBackground ?? */
      0,
      /* 0x42 icvFrame ?? */
      0,
      /* 0x43 icv3D ?? */
      0,
      /* 0x44 icv3DText ?? */
      0,
      /* 0x45 icv3DHilite ?? */
      0,
      /* 0x46 icv3DShadow ?? */
      0,
      /* 0x47 icvHilite ?? */
      0,
      /* 0x48 icvCtlText ?? */
      0,
      /* 0x49 icvCtlScrl ?? */
      0,
      /* 0x4A icvCtlInv ?? */
      0,
      /* 0x4B icvCtlBody ?? */
      0,
      /* 0x4C icvCtlFrame ?? */
      0,
      /* 0x4D icvCtlFore ?? */
      0,
      /* 0x4E icvCtlBack ?? */
      0,
      /* 0x4F icvCtlNeutral */
      0,
      /* 0x50 icvInfoBk ?? */
      0
      /* 0x51 icvInfoText ?? */
    ]);
    var XLSIcv = dup(_XLSIcv);
    var ct2type = {
      /* Workbook */
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml": "workbooks",
      /* Worksheet */
      "application/vnd.ms-excel.binIndexWs": "TODO",
      /* Binary Index */
      /* Macrosheet */
      "application/vnd.ms-excel.intlmacrosheet": "TODO",
      "application/vnd.ms-excel.binIndexMs": "TODO",
      /* Binary Index */
      /* File Properties */
      "application/vnd.openxmlformats-package.core-properties+xml": "coreprops",
      "application/vnd.openxmlformats-officedocument.custom-properties+xml": "custprops",
      "application/vnd.openxmlformats-officedocument.extended-properties+xml": "extprops",
      /* Custom Data Properties */
      "application/vnd.openxmlformats-officedocument.customXmlProperties+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty": "TODO",
      /* PivotTable */
      "application/vnd.ms-excel.pivotTable": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml": "TODO",
      /* Chart Objects */
      "application/vnd.openxmlformats-officedocument.drawingml.chart+xml": "TODO",
      /* Chart Colors */
      "application/vnd.ms-office.chartcolorstyle+xml": "TODO",
      /* Chart Style */
      "application/vnd.ms-office.chartstyle+xml": "TODO",
      /* Chart Advanced */
      "application/vnd.ms-office.chartex+xml": "TODO",
      /* Calculation Chain */
      "application/vnd.ms-excel.calcChain": "calcchains",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml": "calcchains",
      /* Printer Settings */
      "application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings": "TODO",
      /* ActiveX */
      "application/vnd.ms-office.activeX": "TODO",
      "application/vnd.ms-office.activeX+xml": "TODO",
      /* Custom Toolbars */
      "application/vnd.ms-excel.attachedToolbars": "TODO",
      /* External Data Connections */
      "application/vnd.ms-excel.connections": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml": "TODO",
      /* External Links */
      "application/vnd.ms-excel.externalLink": "links",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml": "links",
      /* Metadata */
      "application/vnd.ms-excel.sheetMetadata": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml": "TODO",
      /* PivotCache */
      "application/vnd.ms-excel.pivotCacheDefinition": "TODO",
      "application/vnd.ms-excel.pivotCacheRecords": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml": "TODO",
      /* Query Table */
      "application/vnd.ms-excel.queryTable": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml": "TODO",
      /* Shared Workbook */
      "application/vnd.ms-excel.userNames": "TODO",
      "application/vnd.ms-excel.revisionHeaders": "TODO",
      "application/vnd.ms-excel.revisionLog": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml": "TODO",
      /* Single Cell Table */
      "application/vnd.ms-excel.tableSingleCells": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml": "TODO",
      /* Slicer */
      "application/vnd.ms-excel.slicer": "TODO",
      "application/vnd.ms-excel.slicerCache": "TODO",
      "application/vnd.ms-excel.slicer+xml": "TODO",
      "application/vnd.ms-excel.slicerCache+xml": "TODO",
      /* Sort Map */
      "application/vnd.ms-excel.wsSortMap": "TODO",
      /* Table */
      "application/vnd.ms-excel.table": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml": "TODO",
      /* Themes */
      "application/vnd.openxmlformats-officedocument.theme+xml": "themes",
      /* Theme Override */
      "application/vnd.openxmlformats-officedocument.themeOverride+xml": "TODO",
      /* Timeline */
      "application/vnd.ms-excel.Timeline+xml": "TODO",
      /* verify */
      "application/vnd.ms-excel.TimelineCache+xml": "TODO",
      /* verify */
      /* VBA */
      "application/vnd.ms-office.vbaProject": "vba",
      "application/vnd.ms-office.vbaProjectSignature": "vba",
      /* Volatile Dependencies */
      "application/vnd.ms-office.volatileDependencies": "TODO",
      "application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml": "TODO",
      /* Control Properties */
      "application/vnd.ms-excel.controlproperties+xml": "TODO",
      /* Data Model */
      "application/vnd.openxmlformats-officedocument.model+data": "TODO",
      /* Survey */
      "application/vnd.ms-excel.Survey+xml": "TODO",
      /* Drawing */
      "application/vnd.openxmlformats-officedocument.drawing+xml": "drawings",
      "application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml": "TODO",
      "application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml": "TODO",
      /* VML */
      "application/vnd.openxmlformats-officedocument.vmlDrawing": "TODO",
      "application/vnd.openxmlformats-package.relationships+xml": "rels",
      "application/vnd.openxmlformats-officedocument.oleObject": "TODO",
      /* Image */
      "image/png": "TODO",
      "sheet": "js"
    };
    var CT_LIST = function() {
      var o = {
        workbooks: {
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
          xlsm: "application/vnd.ms-excel.sheet.macroEnabled.main+xml",
          xlsb: "application/vnd.ms-excel.sheet.binary.macroEnabled.main",
          xlam: "application/vnd.ms-excel.addin.macroEnabled.main+xml",
          xltx: "application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml"
        },
        strs: {
          /* Shared Strings */
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
          xlsb: "application/vnd.ms-excel.sharedStrings"
        },
        comments: {
          /* Comments */
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
          xlsb: "application/vnd.ms-excel.comments"
        },
        sheets: {
          /* Worksheet */
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
          xlsb: "application/vnd.ms-excel.worksheet"
        },
        charts: {
          /* Chartsheet */
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml",
          xlsb: "application/vnd.ms-excel.chartsheet"
        },
        dialogs: {
          /* Dialogsheet */
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml",
          xlsb: "application/vnd.ms-excel.dialogsheet"
        },
        macros: {
          /* Macrosheet (Excel 4.0 Macros) */
          xlsx: "application/vnd.ms-excel.macrosheet+xml",
          xlsb: "application/vnd.ms-excel.macrosheet"
        },
        styles: {
          /* Styles */
          xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
          xlsb: "application/vnd.ms-excel.styles"
        }
      };
      keys(o).forEach(function(k) {
        ["xlsm", "xlam"].forEach(function(v) {
          if (!o[k][v])
            o[k][v] = o[k].xlsx;
        });
      });
      keys(o).forEach(function(k) {
        keys(o[k]).forEach(function(v) {
          ct2type[o[k][v]] = k;
        });
      });
      return o;
    }();
    var type2ct = evert_arr(ct2type);
    XMLNS.CT = "http://schemas.openxmlformats.org/package/2006/content-types";
    function new_ct() {
      return {
        workbooks: [],
        sheets: [],
        charts: [],
        dialogs: [],
        macros: [],
        rels: [],
        strs: [],
        comments: [],
        links: [],
        coreprops: [],
        extprops: [],
        custprops: [],
        themes: [],
        styles: [],
        calcchains: [],
        vba: [],
        drawings: [],
        TODO: [],
        xmlns: ""
      };
    }
    function parse_ct(data) {
      var ct = new_ct();
      if (!data || !data.match)
        return ct;
      var ctext = {};
      (data.match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        switch (y[0].replace(nsregex, "<")) {
          case "<?xml":
            break;
          case "<Types":
            ct.xmlns = y["xmlns" + (y[0].match(/<(\w+):/) || ["", ""])[1]];
            break;
          case "<Default":
            ctext[y.Extension] = y.ContentType;
            break;
          case "<Override":
            if (ct[ct2type[y.ContentType]] !== void 0)
              ct[ct2type[y.ContentType]].push(y.PartName);
            break;
        }
      });
      if (ct.xmlns !== XMLNS.CT)
        throw new Error("Unknown Namespace: " + ct.xmlns);
      ct.calcchain = ct.calcchains.length > 0 ? ct.calcchains[0] : "";
      ct.sst = ct.strs.length > 0 ? ct.strs[0] : "";
      ct.style = ct.styles.length > 0 ? ct.styles[0] : "";
      ct.defaults = ctext;
      delete ct.calcchains;
      return ct;
    }
    var CTYPE_XML_ROOT = writextag("Types", null, {
      "xmlns": XMLNS.CT,
      "xmlns:xsd": XMLNS.xsd,
      "xmlns:xsi": XMLNS.xsi
    });
    var CTYPE_DEFAULTS = [
      ["xml", "application/xml"],
      ["bin", "application/vnd.ms-excel.sheet.binary.macroEnabled.main"],
      ["vml", "application/vnd.openxmlformats-officedocument.vmlDrawing"],
      ["data", "application/vnd.openxmlformats-officedocument.model+data"],
      /* from test files */
      ["bmp", "image/bmp"],
      ["png", "image/png"],
      ["gif", "image/gif"],
      ["emf", "image/x-emf"],
      ["wmf", "image/x-wmf"],
      ["jpg", "image/jpeg"],
      ["jpeg", "image/jpeg"],
      ["tif", "image/tiff"],
      ["tiff", "image/tiff"],
      ["pdf", "application/pdf"],
      ["rels", type2ct.rels[0]]
    ].map(function(x) {
      return writextag("Default", null, { "Extension": x[0], "ContentType": x[1] });
    });
    function write_ct(ct, opts) {
      var o = [], v;
      o[o.length] = XML_HEADER;
      o[o.length] = CTYPE_XML_ROOT;
      o = o.concat(CTYPE_DEFAULTS);
      var f1 = function(w) {
        if (ct[w] && ct[w].length > 0) {
          v = ct[w][0];
          o[o.length] = writextag("Override", null, {
            "PartName": (v[0] == "/" ? "" : "/") + v,
            "ContentType": CT_LIST[w][opts.bookType || "xlsx"]
          });
        }
      };
      var f2 = function(w) {
        (ct[w] || []).forEach(function(v2) {
          o[o.length] = writextag("Override", null, {
            "PartName": (v2[0] == "/" ? "" : "/") + v2,
            "ContentType": CT_LIST[w][opts.bookType || "xlsx"]
          });
        });
      };
      var f3 = function(t) {
        (ct[t] || []).forEach(function(v2) {
          o[o.length] = writextag("Override", null, {
            "PartName": (v2[0] == "/" ? "" : "/") + v2,
            "ContentType": type2ct[t][0]
          });
        });
      };
      f1("workbooks");
      f2("sheets");
      f2("charts");
      f3("themes");
      ["strs", "styles"].forEach(f1);
      ["coreprops", "extprops", "custprops"].forEach(f3);
      f3("vba");
      f3("comments");
      f3("drawings");
      if (o.length > 2) {
        o[o.length] = "</Types>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    var RELS = {
      WB: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
      SHEET: "http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
      HLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
      VML: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
      XPATH: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath",
      XMISS: "http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing",
      XLINK: "http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink",
      VBA: "http://schemas.microsoft.com/office/2006/relationships/vbaProject"
    };
    function get_rels_path(file) {
      var n = file.lastIndexOf("/");
      return file.slice(0, n + 1) + "_rels/" + file.slice(n + 1) + ".rels";
    }
    function parse_rels(data, currentFilePath) {
      var rels = { "!id": {} };
      if (!data)
        return rels;
      if (currentFilePath.charAt(0) !== "/") {
        currentFilePath = "/" + currentFilePath;
      }
      var hash = {};
      (data.match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        if (y[0] === "<Relationship") {
          var rel = {};
          rel.Type = y.Type;
          rel.Target = y.Target;
          rel.Id = y.Id;
          rel.TargetMode = y.TargetMode;
          var canonictarget = y.TargetMode === "External" ? y.Target : resolve_path(y.Target, currentFilePath);
          rels[canonictarget] = rel;
          hash[y.Id] = rel;
        }
      });
      rels["!id"] = hash;
      return rels;
    }
    XMLNS.RELS = "http://schemas.openxmlformats.org/package/2006/relationships";
    var RELS_ROOT = writextag("Relationships", null, {
      //'xmlns:ns0': XMLNS.RELS,
      "xmlns": XMLNS.RELS
    });
    function write_rels(rels) {
      var o = [XML_HEADER, RELS_ROOT];
      keys(rels["!id"]).forEach(function(rid) {
        o[o.length] = writextag("Relationship", null, rels["!id"][rid]);
      });
      if (o.length > 2) {
        o[o.length] = "</Relationships>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    var RELS_EXTERN = [RELS.HLINK, RELS.XPATH, RELS.XMISS];
    function add_rels(rels, rId, f, type, relobj, targetmode) {
      if (!relobj)
        relobj = {};
      if (!rels["!id"])
        rels["!id"] = {};
      if (rId < 0)
        for (rId = 1; rels["!id"]["rId" + rId]; ++rId) {
        }
      relobj.Id = "rId" + rId;
      relobj.Type = type;
      relobj.Target = f;
      if (targetmode)
        relobj.TargetMode = targetmode;
      else if (RELS_EXTERN.indexOf(relobj.Type) > -1)
        relobj.TargetMode = "External";
      if (rels["!id"][relobj.Id])
        throw new Error("Cannot rewrite rId " + rId);
      rels["!id"][relobj.Id] = relobj;
      rels[("/" + relobj.Target).replace("//", "/")] = relobj;
      return rId;
    }
    var CT_ODS = "application/vnd.oasis.opendocument.spreadsheet";
    function parse_manifest(d, opts) {
      var str = xlml_normalize(d);
      var Rn;
      var FEtag;
      while (Rn = xlmlregex.exec(str))
        switch (Rn[3]) {
          case "manifest":
            break;
          case "file-entry":
            FEtag = parsexmltag(Rn[0], false);
            if (FEtag.path == "/" && FEtag.type !== CT_ODS)
              throw new Error("This OpenDocument is not a spreadsheet");
            break;
          case "encryption-data":
          case "algorithm":
          case "start-key-generation":
          case "key-derivation":
            throw new Error("Unsupported ODS Encryption");
          default:
            if (opts && opts.WTF)
              throw Rn;
        }
    }
    function write_manifest(manifest) {
      var o = [XML_HEADER];
      o.push('<manifest:manifest xmlns:manifest="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" manifest:version="1.2">\n');
      o.push('  <manifest:file-entry manifest:full-path="/" manifest:version="1.2" manifest:media-type="application/vnd.oasis.opendocument.spreadsheet"/>\n');
      for (var i3 = 0; i3 < manifest.length; ++i3)
        o.push('  <manifest:file-entry manifest:full-path="' + manifest[i3][0] + '" manifest:media-type="' + manifest[i3][1] + '"/>\n');
      o.push("</manifest:manifest>");
      return o.join("");
    }
    function write_rdf_type(file, res, tag) {
      return [
        '  <rdf:Description rdf:about="' + file + '">\n',
        '    <rdf:type rdf:resource="http://docs.oasis-open.org/ns/office/1.2/meta/' + (tag || "odf") + "#" + res + '"/>\n',
        "  </rdf:Description>\n"
      ].join("");
    }
    function write_rdf_has(base, file) {
      return [
        '  <rdf:Description rdf:about="' + base + '">\n',
        '    <ns0:hasPart xmlns:ns0="http://docs.oasis-open.org/ns/office/1.2/meta/pkg#" rdf:resource="' + file + '"/>\n',
        "  </rdf:Description>\n"
      ].join("");
    }
    function write_rdf(rdf) {
      var o = [XML_HEADER];
      o.push('<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">\n');
      for (var i3 = 0; i3 != rdf.length; ++i3) {
        o.push(write_rdf_type(rdf[i3][0], rdf[i3][1]));
        o.push(write_rdf_has("", rdf[i3][0]));
      }
      o.push(write_rdf_type("", "Document", "pkg"));
      o.push("</rdf:RDF>");
      return o.join("");
    }
    var write_meta_ods = function() {
      var payload = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?><office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xlink="http://www.w3.org/1999/xlink" office:version="1.2"><office:meta><meta:generator>SheetJS ' + XLSX.version + "</meta:generator></office:meta></office:document-meta>";
      return function wmo() {
        return payload;
      };
    }();
    var CORE_PROPS = [
      ["cp:category", "Category"],
      ["cp:contentStatus", "ContentStatus"],
      ["cp:keywords", "Keywords"],
      ["cp:lastModifiedBy", "LastAuthor"],
      ["cp:lastPrinted", "LastPrinted"],
      ["cp:revision", "RevNumber"],
      ["cp:version", "Version"],
      ["dc:creator", "Author"],
      ["dc:description", "Comments"],
      ["dc:identifier", "Identifier"],
      ["dc:language", "Language"],
      ["dc:subject", "Subject"],
      ["dc:title", "Title"],
      ["dcterms:created", "CreatedDate", "date"],
      ["dcterms:modified", "ModifiedDate", "date"]
    ];
    XMLNS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
    RELS.CORE_PROPS = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
    var CORE_PROPS_REGEX = function() {
      var r = new Array(CORE_PROPS.length);
      for (var i3 = 0; i3 < CORE_PROPS.length; ++i3) {
        var f = CORE_PROPS[i3];
        var g = "(?:" + f[0].slice(0, f[0].indexOf(":")) + ":)" + f[0].slice(f[0].indexOf(":") + 1);
        r[i3] = new RegExp("<" + g + "[^>]*>([\\s\\S]*?)</" + g + ">");
      }
      return r;
    }();
    function parse_core_props(data) {
      var p = {};
      data = utf8read(data);
      for (var i3 = 0; i3 < CORE_PROPS.length; ++i3) {
        var f = CORE_PROPS[i3], cur = data.match(CORE_PROPS_REGEX[i3]);
        if (cur != null && cur.length > 0)
          p[f[1]] = unescapexml(cur[1]);
        if (f[2] === "date" && p[f[1]])
          p[f[1]] = parseDate(p[f[1]]);
      }
      return p;
    }
    var CORE_PROPS_XML_ROOT = writextag("cp:coreProperties", null, {
      //'xmlns': XMLNS.CORE_PROPS,
      "xmlns:cp": XMLNS.CORE_PROPS,
      "xmlns:dc": XMLNS.dc,
      "xmlns:dcterms": XMLNS.dcterms,
      "xmlns:dcmitype": XMLNS.dcmitype,
      "xmlns:xsi": XMLNS.xsi
    });
    function cp_doit(f, g, h, o, p) {
      if (p[f] != null || g == null || g === "")
        return;
      p[f] = g;
      g = escapexml(g);
      o[o.length] = h ? writextag(f, g, h) : writetag(f, g);
    }
    function write_core_props(cp, _opts) {
      var opts = _opts || {};
      var o = [XML_HEADER, CORE_PROPS_XML_ROOT], p = {};
      if (!cp && !opts.Props)
        return o.join("");
      if (cp) {
        if (cp.CreatedDate != null)
          cp_doit("dcterms:created", typeof cp.CreatedDate === "string" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), { "xsi:type": "dcterms:W3CDTF" }, o, p);
        if (cp.ModifiedDate != null)
          cp_doit("dcterms:modified", typeof cp.ModifiedDate === "string" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), { "xsi:type": "dcterms:W3CDTF" }, o, p);
      }
      for (var i3 = 0; i3 != CORE_PROPS.length; ++i3) {
        var f = CORE_PROPS[i3];
        var v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;
        if (v === true)
          v = "1";
        else if (v === false)
          v = "0";
        else if (typeof v == "number")
          v = String(v);
        if (v != null)
          cp_doit(f[0], v, null, o, p);
      }
      if (o.length > 2) {
        o[o.length] = "</cp:coreProperties>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    var EXT_PROPS = [
      ["Application", "Application", "string"],
      ["AppVersion", "AppVersion", "string"],
      ["Company", "Company", "string"],
      ["DocSecurity", "DocSecurity", "string"],
      ["Manager", "Manager", "string"],
      ["HyperlinksChanged", "HyperlinksChanged", "bool"],
      ["SharedDoc", "SharedDoc", "bool"],
      ["LinksUpToDate", "LinksUpToDate", "bool"],
      ["ScaleCrop", "ScaleCrop", "bool"],
      ["HeadingPairs", "HeadingPairs", "raw"],
      ["TitlesOfParts", "TitlesOfParts", "raw"]
    ];
    XMLNS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
    RELS.EXT_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties";
    var PseudoPropsPairs = [
      "Worksheets",
      "SheetNames",
      "NamedRanges",
      "DefinedNames",
      "Chartsheets",
      "ChartNames"
    ];
    function load_props_pairs(HP, TOP, props, opts) {
      var v = [];
      if (typeof HP == "string")
        v = parseVector(HP, opts);
      else
        for (var j2 = 0; j2 < HP.length; ++j2)
          v = v.concat(HP[j2].map(function(hp) {
            return { v: hp };
          }));
      var parts = typeof TOP == "string" ? parseVector(TOP, opts).map(function(x) {
        return x.v;
      }) : TOP;
      var idx = 0, len = 0;
      if (parts.length > 0)
        for (var i3 = 0; i3 !== v.length; i3 += 2) {
          len = +v[i3 + 1].v;
          switch (v[i3].v) {
            case "Worksheets":
            case "工作表":
            case "Листы":
            case "أوراق العمل":
            case "ワークシート":
            case "גליונות עבודה":
            case "Arbeitsblätter":
            case "Çalışma Sayfaları":
            case "Feuilles de calcul":
            case "Fogli di lavoro":
            case "Folhas de cálculo":
            case "Planilhas":
            case "Regneark":
            case "Hojas de cálculo":
            case "Werkbladen":
              props.Worksheets = len;
              props.SheetNames = parts.slice(idx, idx + len);
              break;
            case "Named Ranges":
            case "Rangos con nombre":
            case "名前付き一覧":
            case "Benannte Bereiche":
            case "Navngivne områder":
              props.NamedRanges = len;
              props.DefinedNames = parts.slice(idx, idx + len);
              break;
            case "Charts":
            case "Diagramme":
              props.Chartsheets = len;
              props.ChartNames = parts.slice(idx, idx + len);
              break;
          }
          idx += len;
        }
    }
    function parse_ext_props(data, p, opts) {
      var q = {};
      if (!p)
        p = {};
      data = utf8read(data);
      EXT_PROPS.forEach(function(f) {
        var xml = (data.match(matchtag(f[0])) || [])[1];
        switch (f[2]) {
          case "string":
            p[f[1]] = unescapexml(xml || "");
            break;
          case "bool":
            p[f[1]] = xml === "true";
            break;
          case "raw":
            var cur = data.match(new RegExp("<" + f[0] + "[^>]*>([\\s\\S]*?)</" + f[0] + ">"));
            if (cur && cur.length > 0)
              q[f[1]] = cur[1];
            break;
        }
      });
      if (q.HeadingPairs && q.TitlesOfParts)
        load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);
      return p;
    }
    var EXT_PROPS_XML_ROOT = writextag("Properties", null, {
      "xmlns": XMLNS.EXT_PROPS,
      "xmlns:vt": XMLNS.vt
    });
    function write_ext_props(cp) {
      var o = [], W = writextag;
      if (!cp)
        cp = {};
      cp.Application = "SheetJS";
      o[o.length] = XML_HEADER;
      o[o.length] = EXT_PROPS_XML_ROOT;
      EXT_PROPS.forEach(function(f) {
        if (cp[f[1]] === void 0)
          return;
        var v;
        switch (f[2]) {
          case "string":
            v = escapexml(String(cp[f[1]]));
            break;
          case "bool":
            v = cp[f[1]] ? "true" : "false";
            break;
        }
        if (v !== void 0)
          o[o.length] = W(f[0], v);
      });
      o[o.length] = W("HeadingPairs", W("vt:vector", W("vt:variant", "<vt:lpstr>Worksheets</vt:lpstr>") + W("vt:variant", W("vt:i4", String(cp.Worksheets))), { size: 2, baseType: "variant" }));
      o[o.length] = W("TitlesOfParts", W("vt:vector", cp.SheetNames.map(function(s) {
        return "<vt:lpstr>" + escapexml(s) + "</vt:lpstr>";
      }).join(""), { size: cp.Worksheets, baseType: "lpstr" }));
      if (o.length > 2) {
        o[o.length] = "</Properties>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    XMLNS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/custom-properties";
    RELS.CUST_PROPS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties";
    var custregex = /<[^>]+>[^<]*/g;
    function parse_cust_props(data, opts) {
      var p = {}, name = "";
      var m = data.match(custregex);
      if (m)
        for (var i3 = 0; i3 != m.length; ++i3) {
          var x = m[i3], y = parsexmltag(x);
          switch (y[0]) {
            case "<?xml":
              break;
            case "<Properties":
              break;
            case "<property":
              name = unescapexml(y.name);
              break;
            case "</property>":
              name = null;
              break;
            default:
              if (x.indexOf("<vt:") === 0) {
                var toks = x.split(">");
                var type = toks[0].slice(4), text = toks[1];
                switch (type) {
                  case "lpstr":
                  case "bstr":
                  case "lpwstr":
                    p[name] = unescapexml(text);
                    break;
                  case "bool":
                    p[name] = parsexmlbool(text);
                    break;
                  case "i1":
                  case "i2":
                  case "i4":
                  case "i8":
                  case "int":
                  case "uint":
                    p[name] = parseInt(text, 10);
                    break;
                  case "r4":
                  case "r8":
                  case "decimal":
                    p[name] = parseFloat(text);
                    break;
                  case "filetime":
                  case "date":
                    p[name] = parseDate(text);
                    break;
                  case "cy":
                  case "error":
                    p[name] = unescapexml(text);
                    break;
                  default:
                    if (type.slice(-1) == "/")
                      break;
                    if (opts.WTF && typeof console !== "undefined")
                      console.warn("Unexpected", x, type, toks);
                }
              } else if (x.slice(0, 2) === "</")
                ;
              else if (opts.WTF)
                throw new Error(x);
          }
        }
      return p;
    }
    var CUST_PROPS_XML_ROOT = writextag("Properties", null, {
      "xmlns": XMLNS.CUST_PROPS,
      "xmlns:vt": XMLNS.vt
    });
    function write_cust_props(cp) {
      var o = [XML_HEADER, CUST_PROPS_XML_ROOT];
      if (!cp)
        return o.join("");
      var pid = 1;
      keys(cp).forEach(function custprop(k) {
        ++pid;
        o[o.length] = writextag("property", write_vt(cp[k]), {
          "fmtid": "{D5CDD505-2E9C-101B-9397-08002B2CF9AE}",
          "pid": pid,
          "name": escapexml(k)
        });
      });
      if (o.length > 2) {
        o[o.length] = "</Properties>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    var XLMLDocPropsMap = {
      Title: "Title",
      Subject: "Subject",
      Author: "Author",
      Keywords: "Keywords",
      Comments: "Description",
      LastAuthor: "LastAuthor",
      RevNumber: "Revision",
      Application: "AppName",
      /* TotalTime: 'TotalTime', */
      LastPrinted: "LastPrinted",
      CreatedDate: "Created",
      ModifiedDate: "LastSaved",
      /* Pages */
      /* Words */
      /* Characters */
      Category: "Category",
      /* PresentationFormat */
      Manager: "Manager",
      Company: "Company",
      /* Guid */
      /* HyperlinkBase */
      /* Bytes */
      /* Lines */
      /* Paragraphs */
      /* CharactersWithSpaces */
      AppVersion: "Version",
      ContentStatus: "ContentStatus",
      /* NOTE: missing from schema */
      Identifier: "Identifier",
      /* NOTE: missing from schema */
      Language: "Language"
      /* NOTE: missing from schema */
    };
    var evert_XLMLDPM = evert(XLMLDocPropsMap);
    function xlml_set_prop(Props, tag, val) {
      tag = evert_XLMLDPM[tag] || tag;
      Props[tag] = val;
    }
    function xlml_write_docprops(Props, opts) {
      var o = [];
      keys(XLMLDocPropsMap).map(function(m) {
        for (var i3 = 0; i3 < CORE_PROPS.length; ++i3)
          if (CORE_PROPS[i3][1] == m)
            return CORE_PROPS[i3];
        for (i3 = 0; i3 < EXT_PROPS.length; ++i3)
          if (EXT_PROPS[i3][1] == m)
            return EXT_PROPS[i3];
        throw m;
      }).forEach(function(p) {
        if (Props[p[1]] == null)
          return;
        var m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]];
        switch (p[2]) {
          case "date":
            m = new Date(m).toISOString().replace(/\.\d*Z/, "Z");
            break;
        }
        if (typeof m == "number")
          m = String(m);
        else if (m === true || m === false) {
          m = m ? "1" : "0";
        } else if (m instanceof Date)
          m = new Date(m).toISOString().replace(/\.\d*Z/, "");
        o.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m));
      });
      return writextag("DocumentProperties", o.join(""), { xmlns: XLMLNS.o });
    }
    function xlml_write_custprops(Props, Custprops) {
      var BLACKLIST = ["Worksheets", "SheetNames"];
      var T = "CustomDocumentProperties";
      var o = [];
      if (Props)
        keys(Props).forEach(function(k) {
          if (!Object.prototype.hasOwnProperty.call(Props, k))
            return;
          for (var i3 = 0; i3 < CORE_PROPS.length; ++i3)
            if (k == CORE_PROPS[i3][1])
              return;
          for (i3 = 0; i3 < EXT_PROPS.length; ++i3)
            if (k == EXT_PROPS[i3][1])
              return;
          for (i3 = 0; i3 < BLACKLIST.length; ++i3)
            if (k == BLACKLIST[i3])
              return;
          var m = Props[k];
          var t = "string";
          if (typeof m == "number") {
            t = "float";
            m = String(m);
          } else if (m === true || m === false) {
            t = "boolean";
            m = m ? "1" : "0";
          } else
            m = String(m);
          o.push(writextag(escapexmltag(k), m, { "dt:dt": t }));
        });
      if (Custprops)
        keys(Custprops).forEach(function(k) {
          if (!Object.prototype.hasOwnProperty.call(Custprops, k))
            return;
          if (Props && Object.prototype.hasOwnProperty.call(Props, k))
            return;
          var m = Custprops[k];
          var t = "string";
          if (typeof m == "number") {
            t = "float";
            m = String(m);
          } else if (m === true || m === false) {
            t = "boolean";
            m = m ? "1" : "0";
          } else if (m instanceof Date) {
            t = "dateTime.tz";
            m = m.toISOString();
          } else
            m = String(m);
          o.push(writextag(escapexmltag(k), m, { "dt:dt": t }));
        });
      return "<" + T + ' xmlns="' + XLMLNS.o + '">' + o.join("") + "</" + T + ">";
    }
    function parse_FILETIME(blob) {
      var dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);
      return new Date((dwHighDateTime / 1e7 * Math.pow(2, 32) + dwLowDateTime / 1e7 - 11644473600) * 1e3).toISOString().replace(/\.000/, "");
    }
    function write_FILETIME(time) {
      var date = typeof time == "string" ? new Date(Date.parse(time)) : time;
      var t = date.getTime() / 1e3 + 11644473600;
      var l = t % Math.pow(2, 32), h = (t - l) / Math.pow(2, 32);
      l *= 1e7;
      h *= 1e7;
      var w = l / Math.pow(2, 32) | 0;
      if (w > 0) {
        l = l % Math.pow(2, 32);
        h += w;
      }
      var o = new_buf(8);
      o.write_shift(4, l);
      o.write_shift(4, h);
      return o;
    }
    function parse_lpstr(blob, type, pad) {
      var start = blob.l;
      var str = blob.read_shift(0, "lpstr-cp");
      if (pad)
        while (blob.l - start & 3)
          ++blob.l;
      return str;
    }
    function parse_lpwstr(blob, type, pad) {
      var str = blob.read_shift(0, "lpwstr");
      if (pad)
        blob.l += 4 - (str.length + 1 & 3) & 3;
      return str;
    }
    function parse_VtStringBase(blob, stringType, pad) {
      if (stringType === 31)
        return parse_lpwstr(blob);
      return parse_lpstr(blob, stringType, pad);
    }
    function parse_VtString(blob, t, pad) {
      return parse_VtStringBase(blob, t, pad === false ? 0 : 4);
    }
    function parse_VtUnalignedString(blob, t) {
      if (!t)
        throw new Error("VtUnalignedString must have positive length");
      return parse_VtStringBase(blob, t, 0);
    }
    function parse_VtVecUnalignedLpstrValue(blob) {
      var length = blob.read_shift(4);
      var ret = [];
      for (var i3 = 0; i3 != length; ++i3)
        ret[i3] = blob.read_shift(0, "lpstr-cp").replace(chr0, "");
      return ret;
    }
    function parse_VtVecUnalignedLpstr(blob) {
      return parse_VtVecUnalignedLpstrValue(blob);
    }
    function parse_VtHeadingPair(blob) {
      var headingString = parse_TypedPropertyValue(blob, VT_USTR);
      var headerParts = parse_TypedPropertyValue(blob, VT_I4);
      return [headingString, headerParts];
    }
    function parse_VtVecHeadingPairValue(blob) {
      var cElements = blob.read_shift(4);
      var out = [];
      for (var i3 = 0; i3 != cElements / 2; ++i3)
        out.push(parse_VtHeadingPair(blob));
      return out;
    }
    function parse_VtVecHeadingPair(blob) {
      return parse_VtVecHeadingPairValue(blob);
    }
    function parse_dictionary(blob, CodePage) {
      var cnt = blob.read_shift(4);
      var dict = {};
      for (var j2 = 0; j2 != cnt; ++j2) {
        var pid = blob.read_shift(4);
        var len = blob.read_shift(4);
        dict[pid] = blob.read_shift(len, CodePage === 1200 ? "utf16le" : "utf8").replace(chr0, "").replace(chr1, "!");
        if (CodePage === 1200 && len % 2)
          blob.l += 2;
      }
      if (blob.l & 3)
        blob.l = blob.l >> 2 + 1 << 2;
      return dict;
    }
    function parse_BLOB(blob) {
      var size = blob.read_shift(4);
      var bytes = blob.slice(blob.l, blob.l + size);
      blob.l += size;
      if ((size & 3) > 0)
        blob.l += 4 - (size & 3) & 3;
      return bytes;
    }
    function parse_ClipboardData(blob) {
      var o = {};
      o.Size = blob.read_shift(4);
      blob.l += o.Size + 3 - (o.Size - 1) % 4;
      return o;
    }
    function parse_TypedPropertyValue(blob, type, _opts) {
      var t = blob.read_shift(2), ret, opts = _opts || {};
      blob.l += 2;
      if (type !== VT_VARIANT) {
        if (t !== type && VT_CUSTOM.indexOf(type) === -1)
          throw new Error("Expected type " + type + " saw " + t);
      }
      switch (type === VT_VARIANT ? t : type) {
        case 2:
          ret = blob.read_shift(2, "i");
          if (!opts.raw)
            blob.l += 2;
          return ret;
        case 3:
          ret = blob.read_shift(4, "i");
          return ret;
        case 11:
          return blob.read_shift(4) !== 0;
        case 19:
          ret = blob.read_shift(4);
          return ret;
        case 30:
          return parse_lpstr(blob, t, 4).replace(chr0, "");
        case 31:
          return parse_lpwstr(blob);
        case 64:
          return parse_FILETIME(blob);
        case 65:
          return parse_BLOB(blob);
        case 71:
          return parse_ClipboardData(blob);
        case 80:
          return parse_VtString(blob, t, !opts.raw).replace(chr0, "");
        case 81:
          return parse_VtUnalignedString(
            blob,
            t
            /*, 4*/
          ).replace(chr0, "");
        case 4108:
          return parse_VtVecHeadingPair(blob);
        case 4126:
          return parse_VtVecUnalignedLpstr(blob);
        default:
          throw new Error("TypedPropertyValue unrecognized type " + type + " " + t);
      }
    }
    function write_TypedPropertyValue(type, value) {
      var o = new_buf(4), p = new_buf(4);
      o.write_shift(4, type == 80 ? 31 : type);
      switch (type) {
        case 3:
          p.write_shift(-4, value);
          break;
        case 5:
          p = new_buf(8);
          p.write_shift(8, value, "f");
          break;
        case 11:
          p.write_shift(4, value ? 1 : 0);
          break;
        case 64:
          p = write_FILETIME(value);
          break;
        case 31:
        case 80:
          p = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));
          p.write_shift(4, value.length + 1);
          p.write_shift(0, value, "dbcs");
          while (p.l != p.length)
            p.write_shift(1, 0);
          break;
        default:
          throw new Error("TypedPropertyValue unrecognized type " + type + " " + value);
      }
      return bconcat([o, p]);
    }
    function parse_PropertySet(blob, PIDSI) {
      var start_addr = blob.l;
      var size = blob.read_shift(4);
      var NumProps = blob.read_shift(4);
      var Props = [], i3 = 0;
      var CodePage = 0;
      var Dictionary = -1, DictObj = {};
      for (i3 = 0; i3 != NumProps; ++i3) {
        var PropID = blob.read_shift(4);
        var Offset = blob.read_shift(4);
        Props[i3] = [PropID, Offset + start_addr];
      }
      Props.sort(function(x, y) {
        return x[1] - y[1];
      });
      var PropH = {};
      for (i3 = 0; i3 != NumProps; ++i3) {
        if (blob.l !== Props[i3][1]) {
          var fail = true;
          if (i3 > 0 && PIDSI)
            switch (PIDSI[Props[i3 - 1][0]].t) {
              case 2:
                if (blob.l + 2 === Props[i3][1]) {
                  blob.l += 2;
                  fail = false;
                }
                break;
              case 80:
                if (blob.l <= Props[i3][1]) {
                  blob.l = Props[i3][1];
                  fail = false;
                }
                break;
              case 4108:
                if (blob.l <= Props[i3][1]) {
                  blob.l = Props[i3][1];
                  fail = false;
                }
                break;
            }
          if ((!PIDSI || i3 == 0) && blob.l <= Props[i3][1]) {
            fail = false;
            blob.l = Props[i3][1];
          }
          if (fail)
            throw new Error("Read Error: Expected address " + Props[i3][1] + " at " + blob.l + " :" + i3);
        }
        if (PIDSI) {
          var piddsi = PIDSI[Props[i3][0]];
          PropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, { raw: true });
          if (piddsi.p === "version")
            PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + "." + ("0000" + String(PropH[piddsi.n] & 65535)).slice(-4);
          if (piddsi.n == "CodePage")
            switch (PropH[piddsi.n]) {
              case 0:
                PropH[piddsi.n] = 1252;
              case 874:
              case 932:
              case 936:
              case 949:
              case 950:
              case 1250:
              case 1251:
              case 1253:
              case 1254:
              case 1255:
              case 1256:
              case 1257:
              case 1258:
              case 1e4:
              case 1200:
              case 1201:
              case 1252:
              case 65e3:
              case -536:
              case 65001:
              case -535:
                set_cp(CodePage = PropH[piddsi.n] >>> 0 & 65535);
                break;
              default:
                throw new Error("Unsupported CodePage: " + PropH[piddsi.n]);
            }
        } else {
          if (Props[i3][0] === 1) {
            CodePage = PropH.CodePage = parse_TypedPropertyValue(blob, VT_I2);
            set_cp(CodePage);
            if (Dictionary !== -1) {
              var oldpos = blob.l;
              blob.l = Props[Dictionary][1];
              DictObj = parse_dictionary(blob, CodePage);
              blob.l = oldpos;
            }
          } else if (Props[i3][0] === 0) {
            if (CodePage === 0) {
              Dictionary = i3;
              blob.l = Props[i3 + 1][1];
              continue;
            }
            DictObj = parse_dictionary(blob, CodePage);
          } else {
            var name = DictObj[Props[i3][0]];
            var val;
            switch (blob[blob.l]) {
              case 65:
                blob.l += 4;
                val = parse_BLOB(blob);
                break;
              case 30:
                blob.l += 4;
                val = parse_VtString(blob, blob[blob.l - 4]).replace(/\u0000+$/, "");
                break;
              case 31:
                blob.l += 4;
                val = parse_VtString(blob, blob[blob.l - 4]).replace(/\u0000+$/, "");
                break;
              case 3:
                blob.l += 4;
                val = blob.read_shift(4, "i");
                break;
              case 19:
                blob.l += 4;
                val = blob.read_shift(4);
                break;
              case 5:
                blob.l += 4;
                val = blob.read_shift(8, "f");
                break;
              case 11:
                blob.l += 4;
                val = parsebool(blob, 4);
                break;
              case 64:
                blob.l += 4;
                val = parseDate(parse_FILETIME(blob));
                break;
              default:
                throw new Error("unparsed value: " + blob[blob.l]);
            }
            PropH[name] = val;
          }
        }
      }
      blob.l = start_addr + size;
      return PropH;
    }
    var XLSPSSkip = ["CodePage", "Thumbnail", "_PID_LINKBASE", "_PID_HLINKS", "SystemIdentifier", "FMTID"].concat(PseudoPropsPairs);
    function guess_property_type(val) {
      switch (typeof val) {
        case "boolean":
          return 11;
        case "number":
          return (val | 0) == val ? 3 : 5;
        case "string":
          return 31;
        case "object":
          if (val instanceof Date)
            return 64;
          break;
      }
      return -1;
    }
    function write_PropertySet(entries, RE, PIDSI) {
      var hdr = new_buf(8), piao = [], prop = [];
      var sz = 8, i3 = 0;
      var pr = new_buf(8), pio = new_buf(8);
      pr.write_shift(4, 2);
      pr.write_shift(4, 1200);
      pio.write_shift(4, 1);
      prop.push(pr);
      piao.push(pio);
      sz += 8 + pr.length;
      if (!RE) {
        pio = new_buf(8);
        pio.write_shift(4, 0);
        piao.unshift(pio);
        var bufs = [new_buf(4)];
        bufs[0].write_shift(4, entries.length);
        for (i3 = 0; i3 < entries.length; ++i3) {
          var value = entries[i3][0];
          pr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));
          pr.write_shift(4, i3 + 2);
          pr.write_shift(4, value.length + 1);
          pr.write_shift(0, value, "dbcs");
          while (pr.l != pr.length)
            pr.write_shift(1, 0);
          bufs.push(pr);
        }
        pr = bconcat(bufs);
        prop.unshift(pr);
        sz += 8 + pr.length;
      }
      for (i3 = 0; i3 < entries.length; ++i3) {
        if (RE && !RE[entries[i3][0]])
          continue;
        if (XLSPSSkip.indexOf(entries[i3][0]) > -1)
          continue;
        if (entries[i3][1] == null)
          continue;
        var val = entries[i3][1], idx = 0;
        if (RE) {
          idx = +RE[entries[i3][0]];
          var pinfo = PIDSI[idx];
          if (pinfo.p == "version" && typeof val == "string") {
            var arr = val.split(".");
            val = (+arr[0] << 16) + (+arr[1] || 0);
          }
          pr = write_TypedPropertyValue(pinfo.t, val);
        } else {
          var T = guess_property_type(val);
          if (T == -1) {
            T = 31;
            val = String(val);
          }
          pr = write_TypedPropertyValue(T, val);
        }
        prop.push(pr);
        pio = new_buf(8);
        pio.write_shift(4, !RE ? 2 + i3 : idx);
        piao.push(pio);
        sz += 8 + pr.length;
      }
      var w = 8 * (prop.length + 1);
      for (i3 = 0; i3 < prop.length; ++i3) {
        piao[i3].write_shift(4, w);
        w += prop[i3].length;
      }
      hdr.write_shift(4, sz);
      hdr.write_shift(4, prop.length);
      return bconcat([hdr].concat(piao).concat(prop));
    }
    function parse_PropertySetStream(file, PIDSI, clsid) {
      var blob = file.content;
      if (!blob)
        return {};
      prep_blob(blob, 0);
      var NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;
      blob.chk("feff", "Byte Order: ");
      blob.read_shift(2);
      var SystemIdentifier = blob.read_shift(4);
      var CLSID = blob.read_shift(16);
      if (CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid)
        throw new Error("Bad PropertySet CLSID " + CLSID);
      NumSets = blob.read_shift(4);
      if (NumSets !== 1 && NumSets !== 2)
        throw new Error("Unrecognized #Sets: " + NumSets);
      FMTID0 = blob.read_shift(16);
      Offset0 = blob.read_shift(4);
      if (NumSets === 1 && Offset0 !== blob.l)
        throw new Error("Length mismatch: " + Offset0 + " !== " + blob.l);
      else if (NumSets === 2) {
        FMTID1 = blob.read_shift(16);
        Offset1 = blob.read_shift(4);
      }
      var PSet0 = parse_PropertySet(blob, PIDSI);
      var rval = { SystemIdentifier };
      for (var y in PSet0)
        rval[y] = PSet0[y];
      rval.FMTID = FMTID0;
      if (NumSets === 1)
        return rval;
      if (Offset1 - blob.l == 2)
        blob.l += 2;
      if (blob.l !== Offset1)
        throw new Error("Length mismatch 2: " + blob.l + " !== " + Offset1);
      var PSet1;
      try {
        PSet1 = parse_PropertySet(blob, null);
      } catch (e) {
      }
      for (y in PSet1)
        rval[y] = PSet1[y];
      rval.FMTID = [FMTID0, FMTID1];
      return rval;
    }
    function write_PropertySetStream(entries, clsid, RE, PIDSI, entries2, clsid2) {
      var hdr = new_buf(entries2 ? 68 : 48);
      var bufs = [hdr];
      hdr.write_shift(2, 65534);
      hdr.write_shift(2, 0);
      hdr.write_shift(4, 842412599);
      hdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, "hex");
      hdr.write_shift(4, entries2 ? 2 : 1);
      hdr.write_shift(16, clsid, "hex");
      hdr.write_shift(4, entries2 ? 68 : 48);
      var ps0 = write_PropertySet(entries, RE, PIDSI);
      bufs.push(ps0);
      if (entries2) {
        var ps1 = write_PropertySet(entries2, null, null);
        hdr.write_shift(16, clsid2, "hex");
        hdr.write_shift(4, 68 + ps0.length);
        bufs.push(ps1);
      }
      return bconcat(bufs);
    }
    function parsenoop2(blob, length) {
      blob.read_shift(length);
      return null;
    }
    function writezeroes(n, o) {
      if (!o)
        o = new_buf(n);
      for (var j2 = 0; j2 < n; ++j2)
        o.write_shift(1, 0);
      return o;
    }
    function parslurp(blob, length, cb) {
      var arr = [], target = blob.l + length;
      while (blob.l < target)
        arr.push(cb(blob, target - blob.l));
      if (target !== blob.l)
        throw new Error("Slurp error");
      return arr;
    }
    function parsebool(blob, length) {
      return blob.read_shift(length) === 1;
    }
    function writebool(v, o) {
      if (!o)
        o = new_buf(2);
      o.write_shift(2, +!!v);
      return o;
    }
    function parseuint16(blob) {
      return blob.read_shift(2, "u");
    }
    function writeuint16(v, o) {
      if (!o)
        o = new_buf(2);
      o.write_shift(2, v);
      return o;
    }
    function parseuint16a(blob, length) {
      return parslurp(blob, length, parseuint16);
    }
    function parse_Bes(blob) {
      var v = blob.read_shift(1), t = blob.read_shift(1);
      return t === 1 ? v : v === 1;
    }
    function write_Bes(v, t, o) {
      if (!o)
        o = new_buf(2);
      o.write_shift(1, +v);
      o.write_shift(1, t == "e" ? 1 : 0);
      return o;
    }
    function parse_ShortXLUnicodeString(blob, length, opts) {
      var cch = blob.read_shift(opts && opts.biff >= 12 ? 2 : 1);
      var encoding = "sbcs-cont";
      var cp = current_codepage;
      if (opts && opts.biff >= 8)
        current_codepage = 1200;
      if (!opts || opts.biff == 8) {
        var fHighByte = blob.read_shift(1);
        if (fHighByte) {
          encoding = "dbcs-cont";
        }
      } else if (opts.biff == 12) {
        encoding = "wstr";
      }
      if (opts.biff >= 2 && opts.biff <= 5)
        encoding = "cpstr";
      var o = cch ? blob.read_shift(cch, encoding) : "";
      current_codepage = cp;
      return o;
    }
    function parse_XLUnicodeRichExtendedString(blob) {
      var cp = current_codepage;
      current_codepage = 1200;
      var cch = blob.read_shift(2), flags = blob.read_shift(1);
      var fExtSt = flags & 4, fRichSt = flags & 8;
      var width = 1 + (flags & 1);
      var cRun = 0, cbExtRst;
      var z = {};
      if (fRichSt)
        cRun = blob.read_shift(2);
      if (fExtSt)
        cbExtRst = blob.read_shift(4);
      var encoding = width == 2 ? "dbcs-cont" : "sbcs-cont";
      var msg = cch === 0 ? "" : blob.read_shift(cch, encoding);
      if (fRichSt)
        blob.l += 4 * cRun;
      if (fExtSt)
        blob.l += cbExtRst;
      z.t = msg;
      if (!fRichSt) {
        z.raw = "<t>" + z.t + "</t>";
        z.r = z.t;
      }
      current_codepage = cp;
      return z;
    }
    function parse_XLUnicodeStringNoCch(blob, cch, opts) {
      var retval;
      if (opts) {
        if (opts.biff >= 2 && opts.biff <= 5)
          return blob.read_shift(cch, "cpstr");
        if (opts.biff >= 12)
          return blob.read_shift(cch, "dbcs-cont");
      }
      var fHighByte = blob.read_shift(1);
      if (fHighByte === 0) {
        retval = blob.read_shift(cch, "sbcs-cont");
      } else {
        retval = blob.read_shift(cch, "dbcs-cont");
      }
      return retval;
    }
    function parse_XLUnicodeString(blob, length, opts) {
      var cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
      if (cch === 0) {
        blob.l++;
        return "";
      }
      return parse_XLUnicodeStringNoCch(blob, cch, opts);
    }
    function parse_XLUnicodeString2(blob, length, opts) {
      if (opts.biff > 5)
        return parse_XLUnicodeString(blob, length, opts);
      var cch = blob.read_shift(1);
      if (cch === 0) {
        blob.l++;
        return "";
      }
      return blob.read_shift(cch, opts.biff <= 4 || !blob.lens ? "cpstr" : "sbcs-cont");
    }
    function write_XLUnicodeString(str, opts, o) {
      if (!o)
        o = new_buf(3 + 2 * str.length);
      o.write_shift(2, str.length);
      o.write_shift(1, 1);
      o.write_shift(31, str, "utf16le");
      return o;
    }
    function parse_ControlInfo(blob) {
      var flags = blob.read_shift(1);
      blob.l++;
      var accel = blob.read_shift(2);
      blob.l += 2;
      return [flags, accel];
    }
    function parse_URLMoniker(blob) {
      var len = blob.read_shift(4), start = blob.l;
      var extra = false;
      if (len > 24) {
        blob.l += len - 24;
        if (blob.read_shift(16) === "795881f43b1d7f48af2c825dc4852763")
          extra = true;
        blob.l = start;
      }
      var url = blob.read_shift((extra ? len - 24 : len) >> 1, "utf16le").replace(chr0, "");
      if (extra)
        blob.l += 24;
      return url;
    }
    function parse_FileMoniker(blob) {
      blob.l += 2;
      var ansiPath = blob.read_shift(0, "lpstr-ansi");
      blob.l += 2;
      if (blob.read_shift(2) != 57005)
        throw new Error("Bad FileMoniker");
      var sz = blob.read_shift(4);
      if (sz === 0)
        return ansiPath.replace(/\\/g, "/");
      var bytes = blob.read_shift(4);
      if (blob.read_shift(2) != 3)
        throw new Error("Bad FileMoniker");
      var unicodePath = blob.read_shift(bytes >> 1, "utf16le").replace(chr0, "");
      return unicodePath;
    }
    function parse_HyperlinkMoniker(blob, length) {
      var clsid = blob.read_shift(16);
      switch (clsid) {
        case "e0c9ea79f9bace118c8200aa004ba90b":
          return parse_URLMoniker(blob);
        case "0303000000000000c000000000000046":
          return parse_FileMoniker(blob);
        default:
          throw new Error("Unsupported Moniker " + clsid);
      }
    }
    function parse_HyperlinkString(blob) {
      var len = blob.read_shift(4);
      var o = len > 0 ? blob.read_shift(len, "utf16le").replace(chr0, "") : "";
      return o;
    }
    function parse_Hyperlink(blob, length) {
      var end = blob.l + length;
      var sVer = blob.read_shift(4);
      if (sVer !== 2)
        throw new Error("Unrecognized streamVersion: " + sVer);
      var flags = blob.read_shift(2);
      blob.l += 2;
      var displayName, targetFrameName, moniker, oleMoniker, Loc = "", guid, fileTime;
      if (flags & 16)
        displayName = parse_HyperlinkString(blob, end - blob.l);
      if (flags & 128)
        targetFrameName = parse_HyperlinkString(blob, end - blob.l);
      if ((flags & 257) === 257)
        moniker = parse_HyperlinkString(blob, end - blob.l);
      if ((flags & 257) === 1)
        oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);
      if (flags & 8)
        Loc = parse_HyperlinkString(blob, end - blob.l);
      if (flags & 32)
        guid = blob.read_shift(16);
      if (flags & 64)
        fileTime = parse_FILETIME(
          blob
          /*, 8*/
        );
      blob.l = end;
      var target = targetFrameName || moniker || oleMoniker || "";
      if (target && Loc)
        target += "#" + Loc;
      if (!target)
        target = "#" + Loc;
      var out = { Target: target };
      if (guid)
        out.guid = guid;
      if (fileTime)
        out.time = fileTime;
      if (displayName)
        out.Tooltip = displayName;
      return out;
    }
    function write_Hyperlink(hl) {
      var out = new_buf(512), i3 = 0;
      var Target = hl.Target;
      var F = Target.indexOf("#") > -1 ? 31 : 23;
      switch (Target.charAt(0)) {
        case "#":
          F = 28;
          break;
        case ".":
          F &= ~2;
          break;
      }
      out.write_shift(4, 2);
      out.write_shift(4, F);
      var data = [8, 6815827, 6619237, 4849780, 83];
      for (i3 = 0; i3 < data.length; ++i3)
        out.write_shift(4, data[i3]);
      if (F == 28) {
        Target = Target.slice(1);
        out.write_shift(4, Target.length + 1);
        for (i3 = 0; i3 < Target.length; ++i3)
          out.write_shift(2, Target.charCodeAt(i3));
        out.write_shift(2, 0);
      } else if (F & 2) {
        data = "e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
        for (i3 = 0; i3 < data.length; ++i3)
          out.write_shift(1, parseInt(data[i3], 16));
        out.write_shift(4, 2 * (Target.length + 1));
        for (i3 = 0; i3 < Target.length; ++i3)
          out.write_shift(2, Target.charCodeAt(i3));
        out.write_shift(2, 0);
      } else {
        data = "03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46".split(" ");
        for (i3 = 0; i3 < data.length; ++i3)
          out.write_shift(1, parseInt(data[i3], 16));
        var P = 0;
        while (Target.slice(P * 3, P * 3 + 3) == "../" || Target.slice(P * 3, P * 3 + 3) == "..\\")
          ++P;
        out.write_shift(2, P);
        out.write_shift(4, Target.length + 1);
        for (i3 = 0; i3 < Target.length; ++i3)
          out.write_shift(1, Target.charCodeAt(i3) & 255);
        out.write_shift(1, 0);
        out.write_shift(2, 65535);
        out.write_shift(2, 57005);
        for (i3 = 0; i3 < 6; ++i3)
          out.write_shift(4, 0);
      }
      return out.slice(0, out.l);
    }
    function parse_LongRGBA(blob) {
      var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1);
      return [r, g, b, a];
    }
    function parse_LongRGB(blob, length) {
      var x = parse_LongRGBA(blob);
      x[3] = 0;
      return x;
    }
    function parse_XLSCell(blob) {
      var rw = blob.read_shift(2);
      var col = blob.read_shift(2);
      var ixfe = blob.read_shift(2);
      return { r: rw, c: col, ixfe };
    }
    function write_XLSCell(R, C, ixfe, o) {
      if (!o)
        o = new_buf(6);
      o.write_shift(2, R);
      o.write_shift(2, C);
      o.write_shift(2, ixfe || 0);
      return o;
    }
    function parse_frtHeader(blob) {
      var rt = blob.read_shift(2);
      var flags = blob.read_shift(2);
      blob.l += 8;
      return { type: rt, flags };
    }
    function parse_OptXLUnicodeString(blob, length, opts) {
      return length === 0 ? "" : parse_XLUnicodeString2(blob, length, opts);
    }
    function parse_XTI(blob, length, opts) {
      var w = opts.biff > 8 ? 4 : 2;
      var iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w, "i"), itabLast = blob.read_shift(w, "i");
      return [iSupBook, itabFirst, itabLast];
    }
    function parse_RkRec(blob) {
      var ixfe = blob.read_shift(2);
      var RK = parse_RkNumber(blob);
      return [ixfe, RK];
    }
    function parse_AddinUdf(blob, length, opts) {
      blob.l += 4;
      length -= 4;
      var l = blob.l + length;
      var udfName = parse_ShortXLUnicodeString(blob, length, opts);
      var cb = blob.read_shift(2);
      l -= blob.l;
      if (cb !== l)
        throw new Error("Malformed AddinUdf: padding = " + l + " != " + cb);
      blob.l += cb;
      return udfName;
    }
    function parse_Ref8U(blob) {
      var rwFirst = blob.read_shift(2);
      var rwLast = blob.read_shift(2);
      var colFirst = blob.read_shift(2);
      var colLast = blob.read_shift(2);
      return { s: { c: colFirst, r: rwFirst }, e: { c: colLast, r: rwLast } };
    }
    function write_Ref8U(r, o) {
      if (!o)
        o = new_buf(8);
      o.write_shift(2, r.s.r);
      o.write_shift(2, r.e.r);
      o.write_shift(2, r.s.c);
      o.write_shift(2, r.e.c);
      return o;
    }
    function parse_RefU(blob) {
      var rwFirst = blob.read_shift(2);
      var rwLast = blob.read_shift(2);
      var colFirst = blob.read_shift(1);
      var colLast = blob.read_shift(1);
      return { s: { c: colFirst, r: rwFirst }, e: { c: colLast, r: rwLast } };
    }
    var parse_Ref = parse_RefU;
    function parse_FtCmo(blob) {
      blob.l += 4;
      var ot = blob.read_shift(2);
      var id = blob.read_shift(2);
      var flags = blob.read_shift(2);
      blob.l += 12;
      return [id, ot, flags];
    }
    function parse_FtNts(blob) {
      var out = {};
      blob.l += 4;
      blob.l += 16;
      out.fSharedNote = blob.read_shift(2);
      blob.l += 4;
      return out;
    }
    function parse_FtCf(blob) {
      var out = {};
      blob.l += 4;
      blob.cf = blob.read_shift(2);
      return out;
    }
    function parse_FtSkip(blob) {
      blob.l += 2;
      blob.l += blob.read_shift(2);
    }
    var FtTab = {
      0: parse_FtSkip,
      /* FtEnd */
      4: parse_FtSkip,
      /* FtMacro */
      5: parse_FtSkip,
      /* FtButton */
      6: parse_FtSkip,
      /* FtGmo */
      7: parse_FtCf,
      /* FtCf */
      8: parse_FtSkip,
      /* FtPioGrbit */
      9: parse_FtSkip,
      /* FtPictFmla */
      10: parse_FtSkip,
      /* FtCbls */
      11: parse_FtSkip,
      /* FtRbo */
      12: parse_FtSkip,
      /* FtSbs */
      13: parse_FtNts,
      /* FtNts */
      14: parse_FtSkip,
      /* FtSbsFmla */
      15: parse_FtSkip,
      /* FtGboData */
      16: parse_FtSkip,
      /* FtEdoData */
      17: parse_FtSkip,
      /* FtRboData */
      18: parse_FtSkip,
      /* FtCblsData */
      19: parse_FtSkip,
      /* FtLbsData */
      20: parse_FtSkip,
      /* FtCblsFmla */
      21: parse_FtCmo
    };
    function parse_FtArray(blob, length) {
      var tgt = blob.l + length;
      var fts = [];
      while (blob.l < tgt) {
        var ft = blob.read_shift(2);
        blob.l -= 2;
        try {
          fts.push(FtTab[ft](blob, tgt - blob.l));
        } catch (e) {
          blob.l = tgt;
          return fts;
        }
      }
      if (blob.l != tgt)
        blob.l = tgt;
      return fts;
    }
    function parse_BOF(blob, length) {
      var o = { BIFFVer: 0, dt: 0 };
      o.BIFFVer = blob.read_shift(2);
      length -= 2;
      if (length >= 2) {
        o.dt = blob.read_shift(2);
        blob.l -= 2;
      }
      switch (o.BIFFVer) {
        case 1536:
        case 1280:
        case 1024:
        case 768:
        case 512:
        case 2:
        case 7:
          break;
        default:
          if (length > 6)
            throw new Error("Unexpected BIFF Ver " + o.BIFFVer);
      }
      blob.read_shift(length);
      return o;
    }
    function write_BOF(wb, t, o) {
      var h = 1536, w = 16;
      switch (o.bookType) {
        case "biff8":
          break;
        case "biff5":
          h = 1280;
          w = 8;
          break;
        case "biff4":
          h = 4;
          w = 6;
          break;
        case "biff3":
          h = 3;
          w = 6;
          break;
        case "biff2":
          h = 2;
          w = 4;
          break;
        case "xla":
          break;
        default:
          throw new Error("unsupported BIFF version");
      }
      var out = new_buf(w);
      out.write_shift(2, h);
      out.write_shift(2, t);
      if (w > 4)
        out.write_shift(2, 29282);
      if (w > 6)
        out.write_shift(2, 1997);
      if (w > 8) {
        out.write_shift(2, 49161);
        out.write_shift(2, 1);
        out.write_shift(2, 1798);
        out.write_shift(2, 0);
      }
      return out;
    }
    function parse_InterfaceHdr(blob, length) {
      if (length === 0)
        return 1200;
      if (blob.read_shift(2) !== 1200)
        ;
      return 1200;
    }
    function parse_WriteAccess(blob, length, opts) {
      if (opts.enc) {
        blob.l += length;
        return "";
      }
      var l = blob.l;
      var UserName = parse_XLUnicodeString2(blob, 0, opts);
      blob.read_shift(length + l - blob.l);
      return UserName;
    }
    function write_WriteAccess(s, opts) {
      var b8 = !opts || opts.biff == 8;
      var o = new_buf(b8 ? 112 : 54);
      o.write_shift(opts.biff == 8 ? 2 : 1, 7);
      if (b8)
        o.write_shift(1, 0);
      o.write_shift(4, 859007059);
      o.write_shift(4, 5458548 | (b8 ? 0 : 536870912));
      while (o.l < o.length)
        o.write_shift(1, b8 ? 0 : 32);
      return o;
    }
    function parse_WsBool(blob, length, opts) {
      var flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);
      return { fDialog: flags & 16 };
    }
    function parse_BoundSheet8(blob, length, opts) {
      var pos = blob.read_shift(4);
      var hidden = blob.read_shift(1) & 3;
      var dt = blob.read_shift(1);
      switch (dt) {
        case 0:
          dt = "Worksheet";
          break;
        case 1:
          dt = "Macrosheet";
          break;
        case 2:
          dt = "Chartsheet";
          break;
        case 6:
          dt = "VBAModule";
          break;
      }
      var name = parse_ShortXLUnicodeString(blob, 0, opts);
      if (name.length === 0)
        name = "Sheet1";
      return { pos, hs: hidden, dt, name };
    }
    function write_BoundSheet8(data, opts) {
      var w = !opts || opts.biff >= 8 ? 2 : 1;
      var o = new_buf(8 + w * data.name.length);
      o.write_shift(4, data.pos);
      o.write_shift(1, data.hs || 0);
      o.write_shift(1, data.dt);
      o.write_shift(1, data.name.length);
      if (opts.biff >= 8)
        o.write_shift(1, 1);
      o.write_shift(w * data.name.length, data.name, opts.biff < 8 ? "sbcs" : "utf16le");
      var out = o.slice(0, o.l);
      out.l = o.l;
      return out;
    }
    function parse_SST(blob, length) {
      var end = blob.l + length;
      var cnt = blob.read_shift(4);
      var ucnt = blob.read_shift(4);
      var strs2 = [];
      for (var i3 = 0; i3 != ucnt && blob.l < end; ++i3) {
        strs2.push(parse_XLUnicodeRichExtendedString(blob));
      }
      strs2.Count = cnt;
      strs2.Unique = ucnt;
      return strs2;
    }
    function parse_ExtSST(blob, length) {
      var extsst = {};
      extsst.dsst = blob.read_shift(2);
      blob.l += length - 2;
      return extsst;
    }
    function parse_Row(blob) {
      var z = {};
      z.r = blob.read_shift(2);
      z.c = blob.read_shift(2);
      z.cnt = blob.read_shift(2) - z.c;
      var miyRw = blob.read_shift(2);
      blob.l += 4;
      var flags = blob.read_shift(1);
      blob.l += 3;
      if (flags & 7)
        z.level = flags & 7;
      if (flags & 32)
        z.hidden = true;
      if (flags & 64)
        z.hpt = miyRw / 20;
      return z;
    }
    function parse_ForceFullCalculation(blob) {
      var header = parse_frtHeader(blob);
      if (header.type != 2211)
        throw new Error("Invalid Future Record " + header.type);
      var fullcalc = blob.read_shift(4);
      return fullcalc !== 0;
    }
    function parse_RecalcId(blob) {
      blob.read_shift(2);
      return blob.read_shift(4);
    }
    function parse_DefaultRowHeight(blob, length, opts) {
      var f = 0;
      if (!(opts && opts.biff == 2)) {
        f = blob.read_shift(2);
      }
      var miyRw = blob.read_shift(2);
      if (opts && opts.biff == 2) {
        f = 1 - (miyRw >> 15);
        miyRw &= 32767;
      }
      var fl = { Unsynced: f & 1, DyZero: (f & 2) >> 1, ExAsc: (f & 4) >> 2, ExDsc: (f & 8) >> 3 };
      return [fl, miyRw];
    }
    function parse_Window1(blob) {
      var xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);
      var flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);
      var ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);
      return {
        Pos: [xWn, yWn],
        Dim: [dxWn, dyWn],
        Flags: flags,
        CurTab: iTabCur,
        FirstTab: iTabFirst,
        Selected: ctabSel,
        TabRatio: wTabRatio
      };
    }
    function write_Window1() {
      var o = new_buf(18);
      o.write_shift(2, 0);
      o.write_shift(2, 0);
      o.write_shift(2, 29280);
      o.write_shift(2, 17600);
      o.write_shift(2, 56);
      o.write_shift(2, 0);
      o.write_shift(2, 0);
      o.write_shift(2, 1);
      o.write_shift(2, 500);
      return o;
    }
    function parse_Window2(blob, length, opts) {
      if (opts && opts.biff >= 2 && opts.biff < 5)
        return {};
      var f = blob.read_shift(2);
      return { RTL: f & 64 };
    }
    function write_Window2(view) {
      var o = new_buf(18), f = 1718;
      if (view && view.RTL)
        f |= 64;
      o.write_shift(2, f);
      o.write_shift(4, 0);
      o.write_shift(4, 64);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      return o;
    }
    function parse_Pane() {
    }
    function parse_Font(blob, length, opts) {
      var o = {
        dyHeight: blob.read_shift(2),
        fl: blob.read_shift(2)
      };
      switch (opts && opts.biff || 8) {
        case 2:
          break;
        case 3:
        case 4:
          blob.l += 2;
          break;
        default:
          blob.l += 10;
          break;
      }
      o.name = parse_ShortXLUnicodeString(blob, 0, opts);
      return o;
    }
    function write_Font(data, opts) {
      var name = data.name || "Arial";
      var b5 = opts && opts.biff == 5, w = b5 ? 15 + name.length : 16 + 2 * name.length;
      var o = new_buf(w);
      o.write_shift(2, (data.sz || 12) * 20);
      o.write_shift(4, 0);
      o.write_shift(2, 400);
      o.write_shift(4, 0);
      o.write_shift(2, 0);
      o.write_shift(1, name.length);
      if (!b5)
        o.write_shift(1, 1);
      o.write_shift((b5 ? 1 : 2) * name.length, name, b5 ? "sbcs" : "utf16le");
      return o;
    }
    function parse_LabelSst(blob) {
      var cell = parse_XLSCell(blob);
      cell.isst = blob.read_shift(4);
      return cell;
    }
    function parse_Label(blob, length, opts) {
      var target = blob.l + length;
      var cell = parse_XLSCell(blob);
      if (opts.biff == 2)
        blob.l++;
      var str = parse_XLUnicodeString(blob, target - blob.l, opts);
      cell.val = str;
      return cell;
    }
    function write_Label(R, C, v, os, opts) {
      var b8 = !opts || opts.biff == 8;
      var o = new_buf(6 + 2 + +b8 + (1 + b8) * v.length);
      write_XLSCell(R, C, os, o);
      o.write_shift(2, v.length);
      if (b8)
        o.write_shift(1, 1);
      o.write_shift((1 + b8) * v.length, v, b8 ? "utf16le" : "sbcs");
      return o;
    }
    function parse_Format(blob, length, opts) {
      var numFmtId = blob.read_shift(2);
      var fmtstr = parse_XLUnicodeString2(blob, 0, opts);
      return [numFmtId, fmtstr];
    }
    function write_Format(i3, f, opts, o) {
      var b5 = opts && opts.biff == 5;
      if (!o)
        o = new_buf(b5 ? 3 + f.length : 5 + 2 * f.length);
      o.write_shift(2, i3);
      o.write_shift(b5 ? 1 : 2, f.length);
      if (!b5)
        o.write_shift(1, 1);
      o.write_shift((b5 ? 1 : 2) * f.length, f, b5 ? "sbcs" : "utf16le");
      var out = o.length > o.l ? o.slice(0, o.l) : o;
      if (out.l == null)
        out.l = out.length;
      return out;
    }
    var parse_BIFF2Format = parse_XLUnicodeString2;
    function parse_Dimensions(blob, length, opts) {
      var end = blob.l + length;
      var w = opts.biff == 8 || !opts.biff ? 4 : 2;
      var r = blob.read_shift(w), R = blob.read_shift(w);
      var c = blob.read_shift(2), C = blob.read_shift(2);
      blob.l = end;
      return { s: { r, c }, e: { r: R, c: C } };
    }
    function write_Dimensions(range, opts) {
      var w = opts.biff == 8 || !opts.biff ? 4 : 2;
      var o = new_buf(2 * w + 6);
      o.write_shift(w, range.s.r);
      o.write_shift(w, range.e.r + 1);
      o.write_shift(2, range.s.c);
      o.write_shift(2, range.e.c + 1);
      o.write_shift(2, 0);
      return o;
    }
    function parse_RK(blob) {
      var rw = blob.read_shift(2), col = blob.read_shift(2);
      var rkrec = parse_RkRec(blob);
      return { r: rw, c: col, ixfe: rkrec[0], rknum: rkrec[1] };
    }
    function parse_MulRk(blob, length) {
      var target = blob.l + length - 2;
      var rw = blob.read_shift(2), col = blob.read_shift(2);
      var rkrecs = [];
      while (blob.l < target)
        rkrecs.push(parse_RkRec(blob));
      if (blob.l !== target)
        throw new Error("MulRK read error");
      var lastcol = blob.read_shift(2);
      if (rkrecs.length != lastcol - col + 1)
        throw new Error("MulRK length mismatch");
      return { r: rw, c: col, C: lastcol, rkrec: rkrecs };
    }
    function parse_MulBlank(blob, length) {
      var target = blob.l + length - 2;
      var rw = blob.read_shift(2), col = blob.read_shift(2);
      var ixfes = [];
      while (blob.l < target)
        ixfes.push(blob.read_shift(2));
      if (blob.l !== target)
        throw new Error("MulBlank read error");
      var lastcol = blob.read_shift(2);
      if (ixfes.length != lastcol - col + 1)
        throw new Error("MulBlank length mismatch");
      return { r: rw, c: col, C: lastcol, ixfe: ixfes };
    }
    function parse_CellStyleXF(blob, length, style, opts) {
      var o = {};
      var a = blob.read_shift(4), b = blob.read_shift(4);
      var c = blob.read_shift(4), d = blob.read_shift(2);
      o.patternType = XLSFillPattern[c >> 26];
      if (!opts.cellStyles)
        return o;
      o.alc = a & 7;
      o.fWrap = a >> 3 & 1;
      o.alcV = a >> 4 & 7;
      o.fJustLast = a >> 7 & 1;
      o.trot = a >> 8 & 255;
      o.cIndent = a >> 16 & 15;
      o.fShrinkToFit = a >> 20 & 1;
      o.iReadOrder = a >> 22 & 2;
      o.fAtrNum = a >> 26 & 1;
      o.fAtrFnt = a >> 27 & 1;
      o.fAtrAlc = a >> 28 & 1;
      o.fAtrBdr = a >> 29 & 1;
      o.fAtrPat = a >> 30 & 1;
      o.fAtrProt = a >> 31 & 1;
      o.dgLeft = b & 15;
      o.dgRight = b >> 4 & 15;
      o.dgTop = b >> 8 & 15;
      o.dgBottom = b >> 12 & 15;
      o.icvLeft = b >> 16 & 127;
      o.icvRight = b >> 23 & 127;
      o.grbitDiag = b >> 30 & 3;
      o.icvTop = c & 127;
      o.icvBottom = c >> 7 & 127;
      o.icvDiag = c >> 14 & 127;
      o.dgDiag = c >> 21 & 15;
      o.icvFore = d & 127;
      o.icvBack = d >> 7 & 127;
      o.fsxButton = d >> 14 & 1;
      return o;
    }
    function parse_XF(blob, length, opts) {
      var o = {};
      o.ifnt = blob.read_shift(2);
      o.numFmtId = blob.read_shift(2);
      o.flags = blob.read_shift(2);
      o.fStyle = o.flags >> 2 & 1;
      length -= 6;
      o.data = parse_CellStyleXF(blob, length, o.fStyle, opts);
      return o;
    }
    function write_XF(data, ixfeP, opts, o) {
      var b5 = opts && opts.biff == 5;
      if (!o)
        o = new_buf(b5 ? 16 : 20);
      o.write_shift(2, 0);
      if (data.style) {
        o.write_shift(2, data.numFmtId || 0);
        o.write_shift(2, 65524);
      } else {
        o.write_shift(2, data.numFmtId || 0);
        o.write_shift(2, ixfeP << 4);
      }
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      if (!b5)
        o.write_shift(4, 0);
      o.write_shift(2, 0);
      return o;
    }
    function parse_Guts(blob) {
      blob.l += 4;
      var out = [blob.read_shift(2), blob.read_shift(2)];
      if (out[0] !== 0)
        out[0]--;
      if (out[1] !== 0)
        out[1]--;
      if (out[0] > 7 || out[1] > 7)
        throw new Error("Bad Gutters: " + out.join("|"));
      return out;
    }
    function write_Guts(guts) {
      var o = new_buf(8);
      o.write_shift(4, 0);
      o.write_shift(2, guts[0] ? guts[0] + 1 : 0);
      o.write_shift(2, guts[1] ? guts[1] + 1 : 0);
      return o;
    }
    function parse_BoolErr(blob, length, opts) {
      var cell = parse_XLSCell(blob);
      if (opts.biff == 2)
        ++blob.l;
      var val = parse_Bes(blob);
      cell.val = val;
      cell.t = val === true || val === false ? "b" : "e";
      return cell;
    }
    function write_BoolErr(R, C, v, os, opts, t) {
      var o = new_buf(8);
      write_XLSCell(R, C, os, o);
      write_Bes(v, t, o);
      return o;
    }
    function parse_Number(blob) {
      var cell = parse_XLSCell(blob);
      var xnum = parse_Xnum(blob);
      cell.val = xnum;
      return cell;
    }
    function write_Number(R, C, v, os) {
      var o = new_buf(14);
      write_XLSCell(R, C, os, o);
      write_Xnum(v, o);
      return o;
    }
    var parse_XLHeaderFooter = parse_OptXLUnicodeString;
    function parse_SupBook(blob, length, opts) {
      var end = blob.l + length;
      var ctab = blob.read_shift(2);
      var cch = blob.read_shift(2);
      opts.sbcch = cch;
      if (cch == 1025 || cch == 14849)
        return [cch, ctab];
      if (cch < 1 || cch > 255)
        throw new Error("Unexpected SupBook type: " + cch);
      var virtPath = parse_XLUnicodeStringNoCch(blob, cch);
      var rgst = [];
      while (end > blob.l)
        rgst.push(parse_XLUnicodeString(blob));
      return [cch, ctab, virtPath, rgst];
    }
    function parse_ExternName(blob, length, opts) {
      var flags = blob.read_shift(2);
      var body;
      var o = {
        fBuiltIn: flags & 1,
        fWantAdvise: flags >>> 1 & 1,
        fWantPict: flags >>> 2 & 1,
        fOle: flags >>> 3 & 1,
        fOleLink: flags >>> 4 & 1,
        cf: flags >>> 5 & 1023,
        fIcon: flags >>> 15 & 1
      };
      if (opts.sbcch === 14849)
        body = parse_AddinUdf(blob, length - 2, opts);
      o.body = body || blob.read_shift(length - 2);
      if (typeof body === "string")
        o.Name = body;
      return o;
    }
    var XLSLblBuiltIn = [
      "_xlnm.Consolidate_Area",
      "_xlnm.Auto_Open",
      "_xlnm.Auto_Close",
      "_xlnm.Extract",
      "_xlnm.Database",
      "_xlnm.Criteria",
      "_xlnm.Print_Area",
      "_xlnm.Print_Titles",
      "_xlnm.Recorder",
      "_xlnm.Data_Form",
      "_xlnm.Auto_Activate",
      "_xlnm.Auto_Deactivate",
      "_xlnm.Sheet_Title",
      "_xlnm._FilterDatabase"
    ];
    function parse_Lbl(blob, length, opts) {
      var target = blob.l + length;
      var flags = blob.read_shift(2);
      var chKey = blob.read_shift(1);
      var cch = blob.read_shift(1);
      var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
      var itab = 0;
      if (!opts || opts.biff >= 5) {
        if (opts.biff != 5)
          blob.l += 2;
        itab = blob.read_shift(2);
        if (opts.biff == 5)
          blob.l += 2;
        blob.l += 4;
      }
      var name = parse_XLUnicodeStringNoCch(blob, cch, opts);
      if (flags & 32)
        name = XLSLblBuiltIn[name.charCodeAt(0)];
      var npflen = target - blob.l;
      if (opts && opts.biff == 2)
        --npflen;
      var rgce = target == blob.l || cce === 0 ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);
      return {
        chKey,
        Name: name,
        itab,
        rgce
      };
    }
    function parse_ExternSheet(blob, length, opts) {
      if (opts.biff < 8)
        return parse_BIFF5ExternSheet(blob, length, opts);
      var o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);
      while (len-- !== 0)
        o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));
      if (blob.l != target)
        throw new Error("Bad ExternSheet: " + blob.l + " != " + target);
      return o;
    }
    function parse_BIFF5ExternSheet(blob, length, opts) {
      if (blob[blob.l + 1] == 3)
        blob[blob.l]++;
      var o = parse_ShortXLUnicodeString(blob, length, opts);
      return o.charCodeAt(0) == 3 ? o.slice(1) : o;
    }
    function parse_NameCmt(blob, length, opts) {
      if (opts.biff < 8) {
        blob.l += length;
        return;
      }
      var cchName = blob.read_shift(2);
      var cchComment = blob.read_shift(2);
      var name = parse_XLUnicodeStringNoCch(blob, cchName, opts);
      var comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts);
      return [name, comment];
    }
    function parse_ShrFmla(blob, length, opts) {
      var ref2 = parse_RefU(blob);
      blob.l++;
      var cUse = blob.read_shift(1);
      length -= 8;
      return [parse_SharedParsedFormula(blob, length, opts), cUse, ref2];
    }
    function parse_Array(blob, length, opts) {
      var ref2 = parse_Ref(blob);
      switch (opts.biff) {
        case 2:
          blob.l++;
          length -= 7;
          break;
        case 3:
        case 4:
          blob.l += 2;
          length -= 8;
          break;
        default:
          blob.l += 6;
          length -= 12;
      }
      return [ref2, parse_ArrayParsedFormula(blob, length, opts)];
    }
    function parse_MTRSettings(blob) {
      var fMTREnabled = blob.read_shift(4) !== 0;
      var fUserSetThreadCount = blob.read_shift(4) !== 0;
      var cUserThreadCount = blob.read_shift(4);
      return [fMTREnabled, fUserSetThreadCount, cUserThreadCount];
    }
    function parse_NoteSh(blob, length, opts) {
      if (opts.biff < 8)
        return;
      var row = blob.read_shift(2), col = blob.read_shift(2);
      var flags = blob.read_shift(2), idObj = blob.read_shift(2);
      var stAuthor = parse_XLUnicodeString2(blob, 0, opts);
      if (opts.biff < 8)
        blob.read_shift(1);
      return [{ r: row, c: col }, stAuthor, idObj, flags];
    }
    function parse_Note(blob, length, opts) {
      return parse_NoteSh(blob, length, opts);
    }
    function parse_MergeCells(blob, length) {
      var merges = [];
      var cmcs = blob.read_shift(2);
      while (cmcs--)
        merges.push(parse_Ref8U(blob));
      return merges;
    }
    function write_MergeCells(merges) {
      var o = new_buf(2 + merges.length * 8);
      o.write_shift(2, merges.length);
      for (var i3 = 0; i3 < merges.length; ++i3)
        write_Ref8U(merges[i3], o);
      return o;
    }
    function parse_Obj(blob, length, opts) {
      if (opts && opts.biff < 8)
        return parse_BIFF5Obj(blob, length, opts);
      var cmo = parse_FtCmo(blob);
      var fts = parse_FtArray(blob, length - 22, cmo[1]);
      return { cmo, ft: fts };
    }
    var parse_BIFF5OT = [];
    parse_BIFF5OT[8] = function(blob, length) {
      var tgt = blob.l + length;
      blob.l += 10;
      var cf = blob.read_shift(2);
      blob.l += 4;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 4;
      var cchName = blob.read_shift(1);
      blob.l += cchName;
      blob.l = tgt;
      return { fmt: cf };
    };
    function parse_BIFF5Obj(blob, length, opts) {
      blob.l += 4;
      var ot = blob.read_shift(2);
      var id = blob.read_shift(2);
      var grbit = blob.read_shift(2);
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 2;
      blob.l += 6;
      length -= 36;
      var fts = [];
      fts.push((parse_BIFF5OT[ot] || parsenoop)(blob, length, opts));
      return { cmo: [id, ot, grbit], ft: fts };
    }
    function parse_TxO(blob, length, opts) {
      var s = blob.l;
      var texts = "";
      try {
        blob.l += 4;
        var ot = (opts.lastobj || { cmo: [0, 0] }).cmo[1];
        var controlInfo;
        if ([0, 5, 7, 11, 12, 14].indexOf(ot) == -1)
          blob.l += 6;
        else
          controlInfo = parse_ControlInfo(blob, 6, opts);
        var cchText = blob.read_shift(2);
        blob.read_shift(2);
        parseuint16(blob, 2);
        var len = blob.read_shift(2);
        blob.l += len;
        for (var i3 = 1; i3 < blob.lens.length - 1; ++i3) {
          if (blob.l - s != blob.lens[i3])
            throw new Error("TxO: bad continue record");
          var hdr = blob[blob.l];
          var t = parse_XLUnicodeStringNoCch(blob, blob.lens[i3 + 1] - blob.lens[i3] - 1);
          texts += t;
          if (texts.length >= (hdr ? cchText : 2 * cchText))
            break;
        }
        if (texts.length !== cchText && texts.length !== cchText * 2) {
          throw new Error("cchText: " + cchText + " != " + texts.length);
        }
        blob.l = s + length;
        return { t: texts };
      } catch (e) {
        blob.l = s + length;
        return { t: texts };
      }
    }
    function parse_HLink(blob, length) {
      var ref2 = parse_Ref8U(blob);
      blob.l += 16;
      var hlink = parse_Hyperlink(blob, length - 24);
      return [ref2, hlink];
    }
    function write_HLink(hl) {
      var O = new_buf(24);
      var ref2 = decode_cell(hl[0]);
      O.write_shift(2, ref2.r);
      O.write_shift(2, ref2.r);
      O.write_shift(2, ref2.c);
      O.write_shift(2, ref2.c);
      var clsid = "d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b".split(" ");
      for (var i3 = 0; i3 < 16; ++i3)
        O.write_shift(1, parseInt(clsid[i3], 16));
      return bconcat([O, write_Hyperlink(hl[1])]);
    }
    function parse_HLinkTooltip(blob, length) {
      blob.read_shift(2);
      var ref2 = parse_Ref8U(blob);
      var wzTooltip = blob.read_shift((length - 10) / 2, "dbcs-cont");
      wzTooltip = wzTooltip.replace(chr0, "");
      return [ref2, wzTooltip];
    }
    function write_HLinkTooltip(hl) {
      var TT = hl[1].Tooltip;
      var O = new_buf(10 + 2 * (TT.length + 1));
      O.write_shift(2, 2048);
      var ref2 = decode_cell(hl[0]);
      O.write_shift(2, ref2.r);
      O.write_shift(2, ref2.r);
      O.write_shift(2, ref2.c);
      O.write_shift(2, ref2.c);
      for (var i3 = 0; i3 < TT.length; ++i3)
        O.write_shift(2, TT.charCodeAt(i3));
      O.write_shift(2, 0);
      return O;
    }
    function parse_Country(blob) {
      var o = [0, 0], d;
      d = blob.read_shift(2);
      o[0] = CountryEnum[d] || d;
      d = blob.read_shift(2);
      o[1] = CountryEnum[d] || d;
      return o;
    }
    function write_Country(o) {
      if (!o)
        o = new_buf(4);
      o.write_shift(2, 1);
      o.write_shift(2, 1);
      return o;
    }
    function parse_ClrtClient(blob) {
      var ccv = blob.read_shift(2);
      var o = [];
      while (ccv-- > 0)
        o.push(parse_LongRGB(blob));
      return o;
    }
    function parse_Palette(blob) {
      var ccv = blob.read_shift(2);
      var o = [];
      while (ccv-- > 0)
        o.push(parse_LongRGB(blob));
      return o;
    }
    function parse_XFCRC(blob) {
      blob.l += 2;
      var o = { cxfs: 0, crc: 0 };
      o.cxfs = blob.read_shift(2);
      o.crc = blob.read_shift(4);
      return o;
    }
    function parse_ColInfo(blob, length, opts) {
      if (!opts.cellStyles)
        return parsenoop(blob, length);
      var w = opts && opts.biff >= 12 ? 4 : 2;
      var colFirst = blob.read_shift(w);
      var colLast = blob.read_shift(w);
      var coldx = blob.read_shift(w);
      var ixfe = blob.read_shift(w);
      var flags = blob.read_shift(2);
      if (w == 2)
        blob.l += 2;
      var o = { s: colFirst, e: colLast, w: coldx, ixfe, flags };
      if (opts.biff >= 5 || !opts.biff)
        o.level = flags >> 8 & 7;
      return o;
    }
    function parse_Setup(blob, length) {
      var o = {};
      if (length < 32)
        return o;
      blob.l += 16;
      o.header = parse_Xnum(blob);
      o.footer = parse_Xnum(blob);
      blob.l += 2;
      return o;
    }
    function parse_ShtProps(blob, length, opts) {
      var def = { area: false };
      if (opts.biff != 5) {
        blob.l += length;
        return def;
      }
      var d = blob.read_shift(1);
      blob.l += 3;
      if (d & 16)
        def.area = true;
      return def;
    }
    function write_RRTabId(n) {
      var out = new_buf(2 * n);
      for (var i3 = 0; i3 < n; ++i3)
        out.write_shift(2, i3 + 1);
      return out;
    }
    var parse_Blank = parse_XLSCell;
    var parse_Scl = parseuint16a;
    var parse_String = parse_XLUnicodeString;
    function parse_ImData(blob) {
      var cf = blob.read_shift(2);
      var env = blob.read_shift(2);
      var lcb = blob.read_shift(4);
      var o = { fmt: cf, env, len: lcb, data: blob.slice(blob.l, blob.l + lcb) };
      blob.l += lcb;
      return o;
    }
    function parse_BIFF2STR(blob, length, opts) {
      var cell = parse_XLSCell(blob);
      ++blob.l;
      var str = parse_XLUnicodeString2(blob, length - 7, opts);
      cell.t = "str";
      cell.val = str;
      return cell;
    }
    function parse_BIFF2NUM(blob) {
      var cell = parse_XLSCell(blob);
      ++blob.l;
      var num = parse_Xnum(blob);
      cell.t = "n";
      cell.val = num;
      return cell;
    }
    function write_BIFF2NUM(r, c, val) {
      var out = new_buf(15);
      write_BIFF2Cell(out, r, c);
      out.write_shift(8, val, "f");
      return out;
    }
    function parse_BIFF2INT(blob) {
      var cell = parse_XLSCell(blob);
      ++blob.l;
      var num = blob.read_shift(2);
      cell.t = "n";
      cell.val = num;
      return cell;
    }
    function write_BIFF2INT(r, c, val) {
      var out = new_buf(9);
      write_BIFF2Cell(out, r, c);
      out.write_shift(2, val);
      return out;
    }
    function parse_BIFF2STRING(blob) {
      var cch = blob.read_shift(1);
      if (cch === 0) {
        blob.l++;
        return "";
      }
      return blob.read_shift(cch, "sbcs-cont");
    }
    function parse_BIFF2FONTXTRA(blob, length) {
      blob.l += 6;
      blob.l += 2;
      blob.l += 1;
      blob.l += 3;
      blob.l += 1;
      blob.l += length - 13;
    }
    function parse_RString(blob, length, opts) {
      var end = blob.l + length;
      var cell = parse_XLSCell(blob);
      var cch = blob.read_shift(2);
      var str = parse_XLUnicodeStringNoCch(blob, cch, opts);
      blob.l = end;
      cell.t = "str";
      cell.val = str;
      return cell;
    }
    var DBF = function() {
      var dbf_codepage_map = {
        /* Code Pages Supported by Visual FoxPro */
        1: 437,
        2: 850,
        3: 1252,
        4: 1e4,
        100: 852,
        101: 866,
        102: 865,
        103: 861,
        104: 895,
        105: 620,
        106: 737,
        107: 857,
        120: 950,
        121: 949,
        122: 936,
        123: 932,
        124: 874,
        125: 1255,
        126: 1256,
        150: 10007,
        151: 10029,
        152: 10006,
        200: 1250,
        201: 1251,
        202: 1254,
        203: 1253,
        /* shapefile DBF extension */
        0: 20127,
        8: 865,
        9: 437,
        10: 850,
        11: 437,
        13: 437,
        14: 850,
        15: 437,
        16: 850,
        17: 437,
        18: 850,
        19: 932,
        20: 850,
        21: 437,
        22: 850,
        23: 865,
        24: 437,
        25: 437,
        26: 850,
        27: 437,
        28: 863,
        29: 850,
        31: 852,
        34: 852,
        35: 852,
        36: 860,
        37: 850,
        38: 866,
        55: 850,
        64: 852,
        77: 936,
        78: 949,
        79: 950,
        80: 874,
        87: 1252,
        88: 1252,
        89: 1252,
        255: 16969
      };
      var dbf_reverse_map = evert({
        1: 437,
        2: 850,
        3: 1252,
        4: 1e4,
        100: 852,
        101: 866,
        102: 865,
        103: 861,
        104: 895,
        105: 620,
        106: 737,
        107: 857,
        120: 950,
        121: 949,
        122: 936,
        123: 932,
        124: 874,
        125: 1255,
        126: 1256,
        150: 10007,
        151: 10029,
        152: 10006,
        200: 1250,
        201: 1251,
        202: 1254,
        203: 1253,
        0: 20127
      });
      function dbf_to_aoa(buf, opts) {
        var out = [];
        var d = new_raw_buf(1);
        switch (opts.type) {
          case "base64":
            d = s2a(Base64.decode(buf));
            break;
          case "binary":
            d = s2a(buf);
            break;
          case "buffer":
          case "array":
            d = buf;
            break;
        }
        prep_blob(d, 0);
        var ft = d.read_shift(1);
        var memo = false;
        var vfp = false, l7 = false;
        switch (ft) {
          case 2:
          case 3:
            break;
          case 48:
            vfp = true;
            memo = true;
            break;
          case 49:
            vfp = true;
            break;
          case 131:
            memo = true;
            break;
          case 139:
            memo = true;
            break;
          case 140:
            memo = true;
            l7 = true;
            break;
          case 245:
            memo = true;
            break;
          default:
            throw new Error("DBF Unsupported Version: " + ft.toString(16));
        }
        var nrow = 0, fpos = 0;
        if (ft == 2)
          nrow = d.read_shift(2);
        d.l += 3;
        if (ft != 2)
          nrow = d.read_shift(4);
        if (ft != 2)
          fpos = d.read_shift(2);
        var rlen = d.read_shift(2);
        var current_cp = 1252;
        if (ft != 2) {
          d.l += 16;
          d.read_shift(1);
          if (d[d.l] !== 0)
            current_cp = dbf_codepage_map[d[d.l]];
          d.l += 1;
          d.l += 2;
        }
        if (l7)
          d.l += 36;
        var fields = [], field = {};
        var hend = fpos - 10 - (vfp ? 264 : 0), ww = l7 ? 32 : 11;
        while (ft == 2 ? d.l < d.length && d[d.l] != 13 : d.l < hend) {
          field = {};
          field.name = cptable.utils.decode(current_cp, d.slice(d.l, d.l + ww)).replace(/[\u0000\r\n].*$/g, "");
          d.l += ww;
          field.type = String.fromCharCode(d.read_shift(1));
          if (ft != 2 && !l7)
            field.offset = d.read_shift(4);
          field.len = d.read_shift(1);
          if (ft == 2)
            field.offset = d.read_shift(2);
          field.dec = d.read_shift(1);
          if (field.name.length)
            fields.push(field);
          if (ft != 2)
            d.l += l7 ? 13 : 14;
          switch (field.type) {
            case "B":
              if ((!vfp || field.len != 8) && opts.WTF)
                console.log("Skipping " + field.name + ":" + field.type);
              break;
            case "G":
            case "P":
              if (opts.WTF)
                console.log("Skipping " + field.name + ":" + field.type);
              break;
            case "C":
            case "D":
            case "F":
            case "I":
            case "L":
            case "M":
            case "N":
            case "O":
            case "T":
            case "Y":
            case "0":
            case "@":
            case "+":
              break;
            default:
              throw new Error("Unknown Field Type: " + field.type);
          }
        }
        if (d[d.l] !== 13)
          d.l = fpos - 1;
        else if (ft == 2)
          d.l = 521;
        if (ft != 2) {
          if (d.read_shift(1) !== 13)
            throw new Error("DBF Terminator not found " + d.l + " " + d[d.l]);
          d.l = fpos;
        }
        var R = 0, C = 0;
        out[0] = [];
        for (C = 0; C != fields.length; ++C)
          out[0][C] = fields[C].name;
        while (nrow-- > 0) {
          if (d[d.l] === 42) {
            d.l += rlen;
            continue;
          }
          ++d.l;
          out[++R] = [];
          C = 0;
          for (C = 0; C != fields.length; ++C) {
            var dd = d.slice(d.l, d.l + fields[C].len);
            d.l += fields[C].len;
            prep_blob(dd, 0);
            var s = cptable.utils.decode(current_cp, dd);
            switch (fields[C].type) {
              case "C":
                out[R][C] = cptable.utils.decode(current_cp, dd);
                out[R][C] = out[R][C].trim();
                break;
              case "D":
                if (s.length === 8)
                  out[R][C] = new Date(+s.slice(0, 4), +s.slice(4, 6) - 1, +s.slice(6, 8));
                else
                  out[R][C] = s;
                break;
              case "F":
                out[R][C] = parseFloat(s.trim());
                break;
              case "+":
              case "I":
                out[R][C] = l7 ? dd.read_shift(-4, "i") ^ 2147483648 : dd.read_shift(4, "i");
                break;
              case "L":
                switch (s.toUpperCase()) {
                  case "Y":
                  case "T":
                    out[R][C] = true;
                    break;
                  case "N":
                  case "F":
                    out[R][C] = false;
                    break;
                  case " ":
                  case "?":
                    out[R][C] = false;
                    break;
                  default:
                    throw new Error("DBF Unrecognized L:|" + s + "|");
                }
                break;
              case "M":
                if (!memo)
                  throw new Error("DBF Unexpected MEMO for type " + ft.toString(16));
                out[R][C] = "##MEMO##" + (l7 ? parseInt(s.trim(), 10) : dd.read_shift(4));
                break;
              case "N":
                out[R][C] = +s.replace(/\u0000/g, "").trim();
                break;
              case "@":
                out[R][C] = new Date(dd.read_shift(-8, "f") - 621356832e5);
                break;
              case "T":
                out[R][C] = new Date((dd.read_shift(4) - 2440588) * 864e5 + dd.read_shift(4));
                break;
              case "Y":
                out[R][C] = dd.read_shift(4, "i") / 1e4;
                break;
              case "O":
                out[R][C] = -dd.read_shift(-8, "f");
                break;
              case "B":
                if (vfp && fields[C].len == 8) {
                  out[R][C] = dd.read_shift(8, "f");
                  break;
                }
              case "G":
              case "P":
                dd.l += fields[C].len;
                break;
              case "0":
                if (fields[C].name === "_NullFlags")
                  break;
              default:
                throw new Error("DBF Unsupported data type " + fields[C].type);
            }
          }
        }
        if (ft != 2) {
          if (d.l < d.length && d[d.l++] != 26)
            throw new Error("DBF EOF Marker missing " + (d.l - 1) + " of " + d.length + " " + d[d.l - 1].toString(16));
        }
        if (opts && opts.sheetRows)
          out = out.slice(0, opts.sheetRows);
        return out;
      }
      function dbf_to_sheet(buf, opts) {
        var o = opts || {};
        if (!o.dateNF)
          o.dateNF = "yyyymmdd";
        return aoa_to_sheet(dbf_to_aoa(buf, o), o);
      }
      function dbf_to_workbook(buf, opts) {
        try {
          return sheet_to_workbook(dbf_to_sheet(buf, opts), opts);
        } catch (e) {
          if (opts && opts.WTF)
            throw e;
        }
        return { SheetNames: [], Sheets: {} };
      }
      var _RLEN = { "B": 8, "C": 250, "L": 1, "D": 8, "?": 0, "": 0 };
      function sheet_to_dbf(ws, opts) {
        var o = opts || {};
        if (+o.codepage >= 0)
          set_cp(+o.codepage);
        if (o.type == "string")
          throw new Error("Cannot write DBF to JS string");
        var ba = buf_array();
        var aoa = sheet_to_json(ws, { header: 1, raw: true, cellDates: true });
        var headers = aoa[0], data = aoa.slice(1);
        var i3 = 0, j2 = 0, hcnt = 0, rlen = 1;
        for (i3 = 0; i3 < headers.length; ++i3) {
          if (i3 == null)
            continue;
          ++hcnt;
          if (typeof headers[i3] === "number")
            headers[i3] = headers[i3].toString(10);
          if (typeof headers[i3] !== "string")
            throw new Error("DBF Invalid column name " + headers[i3] + " |" + typeof headers[i3] + "|");
          if (headers.indexOf(headers[i3]) !== i3) {
            for (j2 = 0; j2 < 1024; ++j2)
              if (headers.indexOf(headers[i3] + "_" + j2) == -1) {
                headers[i3] += "_" + j2;
                break;
              }
          }
        }
        var range = safe_decode_range(ws["!ref"]);
        var coltypes = [];
        for (i3 = 0; i3 <= range.e.c - range.s.c; ++i3) {
          var col = [];
          for (j2 = 0; j2 < data.length; ++j2) {
            if (data[j2][i3] != null)
              col.push(data[j2][i3]);
          }
          if (col.length == 0 || headers[i3] == null) {
            coltypes[i3] = "?";
            continue;
          }
          var guess = "", _guess = "";
          for (j2 = 0; j2 < col.length; ++j2) {
            switch (typeof col[j2]) {
              case "number":
                _guess = "B";
                break;
              case "string":
                _guess = "C";
                break;
              case "boolean":
                _guess = "L";
                break;
              case "object":
                _guess = col[j2] instanceof Date ? "D" : "C";
                break;
              default:
                _guess = "C";
            }
            guess = guess && guess != _guess ? "C" : _guess;
            if (guess == "C")
              break;
          }
          rlen += _RLEN[guess] || 0;
          coltypes[i3] = guess;
        }
        var h = ba.next(32);
        h.write_shift(4, 318902576);
        h.write_shift(4, data.length);
        h.write_shift(2, 296 + 32 * hcnt);
        h.write_shift(2, rlen);
        for (i3 = 0; i3 < 4; ++i3)
          h.write_shift(4, 0);
        h.write_shift(4, 0 | (+dbf_reverse_map[current_ansi] || 3) << 8);
        for (i3 = 0, j2 = 0; i3 < headers.length; ++i3) {
          if (headers[i3] == null)
            continue;
          var hf = ba.next(32);
          var _f = (headers[i3].slice(-10) + "\0\0\0\0\0\0\0\0\0\0\0").slice(0, 11);
          hf.write_shift(1, _f, "sbcs");
          hf.write_shift(1, coltypes[i3] == "?" ? "C" : coltypes[i3], "sbcs");
          hf.write_shift(4, j2);
          hf.write_shift(1, _RLEN[coltypes[i3]] || 0);
          hf.write_shift(1, 0);
          hf.write_shift(1, 2);
          hf.write_shift(4, 0);
          hf.write_shift(1, 0);
          hf.write_shift(4, 0);
          hf.write_shift(4, 0);
          j2 += _RLEN[coltypes[i3]] || 0;
        }
        var hb = ba.next(264);
        hb.write_shift(4, 13);
        for (i3 = 0; i3 < 65; ++i3)
          hb.write_shift(4, 0);
        for (i3 = 0; i3 < data.length; ++i3) {
          var rout = ba.next(rlen);
          rout.write_shift(1, 0);
          for (j2 = 0; j2 < headers.length; ++j2) {
            if (headers[j2] == null)
              continue;
            switch (coltypes[j2]) {
              case "L":
                rout.write_shift(1, data[i3][j2] == null ? 63 : data[i3][j2] ? 84 : 70);
                break;
              case "B":
                rout.write_shift(8, data[i3][j2] || 0, "f");
                break;
              case "D":
                if (!data[i3][j2])
                  rout.write_shift(8, "00000000", "sbcs");
                else {
                  rout.write_shift(4, ("0000" + data[i3][j2].getFullYear()).slice(-4), "sbcs");
                  rout.write_shift(2, ("00" + (data[i3][j2].getMonth() + 1)).slice(-2), "sbcs");
                  rout.write_shift(2, ("00" + data[i3][j2].getDate()).slice(-2), "sbcs");
                }
                break;
              case "C":
                var _s = String(data[i3][j2] || "");
                rout.write_shift(1, _s, "sbcs");
                for (hcnt = 0; hcnt < 250 - _s.length; ++hcnt)
                  rout.write_shift(1, 32);
                break;
            }
          }
        }
        ba.next(1).write_shift(1, 26);
        return ba.end();
      }
      return {
        to_workbook: dbf_to_workbook,
        to_sheet: dbf_to_sheet,
        from_sheet: sheet_to_dbf
      };
    }();
    var SYLK = function() {
      var sylk_escapes = {
        AA: "À",
        BA: "Á",
        CA: "Â",
        DA: 195,
        HA: "Ä",
        JA: 197,
        AE: "È",
        BE: "É",
        CE: "Ê",
        HE: "Ë",
        AI: "Ì",
        BI: "Í",
        CI: "Î",
        HI: "Ï",
        AO: "Ò",
        BO: "Ó",
        CO: "Ô",
        DO: 213,
        HO: "Ö",
        AU: "Ù",
        BU: "Ú",
        CU: "Û",
        HU: "Ü",
        Aa: "à",
        Ba: "á",
        Ca: "â",
        Da: 227,
        Ha: "ä",
        Ja: 229,
        Ae: "è",
        Be: "é",
        Ce: "ê",
        He: "ë",
        Ai: "ì",
        Bi: "í",
        Ci: "î",
        Hi: "ï",
        Ao: "ò",
        Bo: "ó",
        Co: "ô",
        Do: 245,
        Ho: "ö",
        Au: "ù",
        Bu: "ú",
        Cu: "û",
        Hu: "ü",
        KC: "Ç",
        Kc: "ç",
        q: "æ",
        z: "œ",
        a: "Æ",
        j: "Œ",
        DN: 209,
        Dn: 241,
        Hy: 255,
        S: 169,
        c: 170,
        R: 174,
        B: 180,
        0: 176,
        1: 177,
        2: 178,
        3: 179,
        5: 181,
        6: 182,
        7: 183,
        Q: 185,
        k: 186,
        b: 208,
        i: 216,
        l: 222,
        s: 240,
        y: 248,
        "!": 161,
        '"': 162,
        "#": 163,
        "(": 164,
        "%": 165,
        "'": 167,
        "H ": 168,
        "+": 171,
        ";": 187,
        "<": 188,
        "=": 189,
        ">": 190,
        "?": 191,
        "{": 223
      };
      var sylk_char_regex = new RegExp("\x1BN(" + keys(sylk_escapes).join("|").replace(/\|\|\|/, "|\\||").replace(/([?()+])/g, "\\$1") + "|\\|)", "gm");
      var sylk_char_fn = function(_, $1) {
        var o = sylk_escapes[$1];
        return typeof o == "number" ? _getansi(o) : o;
      };
      var decode_sylk_char = function($$, $1, $2) {
        var newcc = $1.charCodeAt(0) - 32 << 4 | $2.charCodeAt(0) - 48;
        return newcc == 59 ? $$ : _getansi(newcc);
      };
      sylk_escapes["|"] = 254;
      function sylk_to_aoa(d, opts) {
        switch (opts.type) {
          case "base64":
            return sylk_to_aoa_str(Base64.decode(d), opts);
          case "binary":
            return sylk_to_aoa_str(d, opts);
          case "buffer":
            return sylk_to_aoa_str(d.toString("binary"), opts);
          case "array":
            return sylk_to_aoa_str(cc2str(d), opts);
        }
        throw new Error("Unrecognized type " + opts.type);
      }
      function sylk_to_aoa_str(str, opts) {
        var records = str.split(/[\n\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr = [];
        var formats = [];
        var next_cell_format = null;
        var sht = {}, rowinfo = [], colinfo = [], cw = [];
        var Mval = 0, j2;
        if (+opts.codepage >= 0)
          set_cp(+opts.codepage);
        for (; ri !== records.length; ++ri) {
          Mval = 0;
          var rstr = records[ri].trim().replace(/\x1B([\x20-\x2F])([\x30-\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);
          var record = rstr.replace(/;;/g, "\0").split(";").map(function(x) {
            return x.replace(/\u0000/g, ";");
          });
          var RT = record[0], val;
          if (rstr.length > 0)
            switch (RT) {
              case "ID":
                break;
              case "E":
                break;
              case "B":
                break;
              case "O":
                break;
              case "P":
                if (record[1].charAt(0) == "P")
                  formats.push(rstr.slice(3).replace(/;;/g, ";"));
                break;
              case "C":
                var C_seen_K = false, C_seen_X = false;
                for (rj = 1; rj < record.length; ++rj)
                  switch (record[rj].charAt(0)) {
                    case "X":
                      C = parseInt(record[rj].slice(1)) - 1;
                      C_seen_X = true;
                      break;
                    case "Y":
                      R = parseInt(record[rj].slice(1)) - 1;
                      if (!C_seen_X)
                        C = 0;
                      for (j2 = arr.length; j2 <= R; ++j2)
                        arr[j2] = [];
                      break;
                    case "K":
                      val = record[rj].slice(1);
                      if (val.charAt(0) === '"')
                        val = val.slice(1, val.length - 1);
                      else if (val === "TRUE")
                        val = true;
                      else if (val === "FALSE")
                        val = false;
                      else if (!isNaN(fuzzynum(val))) {
                        val = fuzzynum(val);
                        if (next_cell_format !== null && SSF.is_date(next_cell_format))
                          val = numdate(val);
                      } else if (!isNaN(fuzzydate(val).getDate())) {
                        val = parseDate(val);
                      }
                      if (typeof cptable !== "undefined" && typeof val == "string" && (opts || {}).type != "string" && (opts || {}).codepage)
                        val = cptable.utils.decode(opts.codepage, val);
                      C_seen_K = true;
                      break;
                    case "E":
                      var formula = rc_to_a1(record[rj].slice(1), { r: R, c: C });
                      arr[R][C] = [arr[R][C], formula];
                      break;
                    default:
                      if (opts && opts.WTF)
                        throw new Error("SYLK bad record " + rstr);
                  }
                if (C_seen_K) {
                  arr[R][C] = val;
                  next_cell_format = null;
                }
                break;
              case "F":
                var F_seen = 0;
                for (rj = 1; rj < record.length; ++rj)
                  switch (record[rj].charAt(0)) {
                    case "X":
                      C = parseInt(record[rj].slice(1)) - 1;
                      ++F_seen;
                      break;
                    case "Y":
                      R = parseInt(record[rj].slice(1)) - 1;
                      for (j2 = arr.length; j2 <= R; ++j2)
                        arr[j2] = [];
                      break;
                    case "M":
                      Mval = parseInt(record[rj].slice(1)) / 20;
                      break;
                    case "F":
                      break;
                    case "G":
                      break;
                    case "P":
                      next_cell_format = formats[parseInt(record[rj].slice(1))];
                      break;
                    case "S":
                      break;
                    case "D":
                      break;
                    case "N":
                      break;
                    case "W":
                      cw = record[rj].slice(1).split(" ");
                      for (j2 = parseInt(cw[0], 10); j2 <= parseInt(cw[1], 10); ++j2) {
                        Mval = parseInt(cw[2], 10);
                        colinfo[j2 - 1] = Mval === 0 ? { hidden: true } : { wch: Mval };
                        process_col(colinfo[j2 - 1]);
                      }
                      break;
                    case "C":
                      C = parseInt(record[rj].slice(1)) - 1;
                      if (!colinfo[C])
                        colinfo[C] = {};
                      break;
                    case "R":
                      R = parseInt(record[rj].slice(1)) - 1;
                      if (!rowinfo[R])
                        rowinfo[R] = {};
                      if (Mval > 0) {
                        rowinfo[R].hpt = Mval;
                        rowinfo[R].hpx = pt2px(Mval);
                      } else if (Mval === 0)
                        rowinfo[R].hidden = true;
                      break;
                    default:
                      if (opts && opts.WTF)
                        throw new Error("SYLK bad record " + rstr);
                  }
                if (F_seen < 1)
                  next_cell_format = null;
                break;
              default:
                if (opts && opts.WTF)
                  throw new Error("SYLK bad record " + rstr);
            }
        }
        if (rowinfo.length > 0)
          sht["!rows"] = rowinfo;
        if (colinfo.length > 0)
          sht["!cols"] = colinfo;
        if (opts && opts.sheetRows)
          arr = arr.slice(0, opts.sheetRows);
        return [arr, sht];
      }
      function sylk_to_sheet(d, opts) {
        var aoasht = sylk_to_aoa(d, opts);
        var aoa = aoasht[0], ws = aoasht[1];
        var o = aoa_to_sheet(aoa, opts);
        keys(ws).forEach(function(k) {
          o[k] = ws[k];
        });
        return o;
      }
      function sylk_to_workbook(d, opts) {
        return sheet_to_workbook(sylk_to_sheet(d, opts), opts);
      }
      function write_ws_cell_sylk(cell, ws, R, C) {
        var o = "C;Y" + (R + 1) + ";X" + (C + 1) + ";K";
        switch (cell.t) {
          case "n":
            o += cell.v || 0;
            if (cell.f && !cell.F)
              o += ";E" + a1_to_rc(cell.f, { r: R, c: C });
            break;
          case "b":
            o += cell.v ? "TRUE" : "FALSE";
            break;
          case "e":
            o += cell.w || cell.v;
            break;
          case "d":
            o += '"' + (cell.w || cell.v) + '"';
            break;
          case "s":
            o += '"' + cell.v.replace(/"/g, "") + '"';
            break;
        }
        return o;
      }
      function write_ws_cols_sylk(out, cols) {
        cols.forEach(function(col, i3) {
          var rec = "F;W" + (i3 + 1) + " " + (i3 + 1) + " ";
          if (col.hidden)
            rec += "0";
          else {
            if (typeof col.width == "number")
              col.wpx = width2px(col.width);
            if (typeof col.wpx == "number")
              col.wch = px2char(col.wpx);
            if (typeof col.wch == "number")
              rec += Math.round(col.wch);
          }
          if (rec.charAt(rec.length - 1) != " ")
            out.push(rec);
        });
      }
      function write_ws_rows_sylk(out, rows) {
        rows.forEach(function(row, i3) {
          var rec = "F;";
          if (row.hidden)
            rec += "M0;";
          else if (row.hpt)
            rec += "M" + 20 * row.hpt + ";";
          else if (row.hpx)
            rec += "M" + 20 * px2pt(row.hpx) + ";";
          if (rec.length > 2)
            out.push(rec + "R" + (i3 + 1));
        });
      }
      function sheet_to_sylk(ws, opts) {
        var preamble = ["ID;PWXL;N;E"], o = [];
        var r = safe_decode_range(ws["!ref"]), cell;
        var dense = Array.isArray(ws);
        var RS = "\r\n";
        preamble.push("P;PGeneral");
        preamble.push("F;P0;DG0G8;M255");
        if (ws["!cols"])
          write_ws_cols_sylk(preamble, ws["!cols"]);
        if (ws["!rows"])
          write_ws_rows_sylk(preamble, ws["!rows"]);
        preamble.push("B;Y" + (r.e.r - r.s.r + 1) + ";X" + (r.e.c - r.s.c + 1) + ";D" + [r.s.c, r.s.r, r.e.c, r.e.r].join(" "));
        for (var R = r.s.r; R <= r.e.r; ++R) {
          for (var C = r.s.c; C <= r.e.c; ++C) {
            var coord = encode_cell({ r: R, c: C });
            cell = dense ? (ws[R] || [])[C] : ws[coord];
            if (!cell || cell.v == null && (!cell.f || cell.F))
              continue;
            o.push(write_ws_cell_sylk(cell, ws, R, C));
          }
        }
        return preamble.join(RS) + RS + o.join(RS) + RS + "E" + RS;
      }
      return {
        to_workbook: sylk_to_workbook,
        to_sheet: sylk_to_sheet,
        from_sheet: sheet_to_sylk
      };
    }();
    var DIF = function() {
      function dif_to_aoa(d, opts) {
        switch (opts.type) {
          case "base64":
            return dif_to_aoa_str(Base64.decode(d), opts);
          case "binary":
            return dif_to_aoa_str(d, opts);
          case "buffer":
            return dif_to_aoa_str(d.toString("binary"), opts);
          case "array":
            return dif_to_aoa_str(cc2str(d), opts);
        }
        throw new Error("Unrecognized type " + opts.type);
      }
      function dif_to_aoa_str(str, opts) {
        var records = str.split("\n"), R = -1, C = -1, ri = 0, arr = [];
        for (; ri !== records.length; ++ri) {
          if (records[ri].trim() === "BOT") {
            arr[++R] = [];
            C = 0;
            continue;
          }
          if (R < 0)
            continue;
          var metadata = records[ri].trim().split(",");
          var type = metadata[0], value = metadata[1];
          ++ri;
          var data = records[ri].trim();
          switch (+type) {
            case -1:
              if (data === "BOT") {
                arr[++R] = [];
                C = 0;
                continue;
              } else if (data !== "EOD")
                throw new Error("Unrecognized DIF special command " + data);
              break;
            case 0:
              if (data === "TRUE")
                arr[R][C] = true;
              else if (data === "FALSE")
                arr[R][C] = false;
              else if (!isNaN(fuzzynum(value)))
                arr[R][C] = fuzzynum(value);
              else if (!isNaN(fuzzydate(value).getDate()))
                arr[R][C] = parseDate(value);
              else
                arr[R][C] = value;
              ++C;
              break;
            case 1:
              data = data.slice(1, data.length - 1);
              arr[R][C++] = data !== "" ? data : null;
              break;
          }
          if (data === "EOD")
            break;
        }
        if (opts && opts.sheetRows)
          arr = arr.slice(0, opts.sheetRows);
        return arr;
      }
      function dif_to_sheet(str, opts) {
        return aoa_to_sheet(dif_to_aoa(str, opts), opts);
      }
      function dif_to_workbook(str, opts) {
        return sheet_to_workbook(dif_to_sheet(str, opts), opts);
      }
      var sheet_to_dif = function() {
        var push_field = function pf(o, topic, v, n, s) {
          o.push(topic);
          o.push(v + "," + n);
          o.push('"' + s.replace(/"/g, '""') + '"');
        };
        var push_value = function po(o, type, v, s) {
          o.push(type + "," + v);
          o.push(type == 1 ? '"' + s.replace(/"/g, '""') + '"' : s);
        };
        return function sheet_to_dif2(ws) {
          var o = [];
          var r = safe_decode_range(ws["!ref"]), cell;
          var dense = Array.isArray(ws);
          push_field(o, "TABLE", 0, 1, "sheetjs");
          push_field(o, "VECTORS", 0, r.e.r - r.s.r + 1, "");
          push_field(o, "TUPLES", 0, r.e.c - r.s.c + 1, "");
          push_field(o, "DATA", 0, 0, "");
          for (var R = r.s.r; R <= r.e.r; ++R) {
            push_value(o, -1, 0, "BOT");
            for (var C = r.s.c; C <= r.e.c; ++C) {
              var coord = encode_cell({ r: R, c: C });
              cell = dense ? (ws[R] || [])[C] : ws[coord];
              if (!cell) {
                push_value(o, 1, 0, "");
                continue;
              }
              switch (cell.t) {
                case "n":
                  var val = cell.w;
                  if (!val && cell.v != null)
                    val = cell.v;
                  if (val == null) {
                    if (cell.f && !cell.F)
                      push_value(o, 1, 0, "=" + cell.f);
                    else
                      push_value(o, 1, 0, "");
                  } else
                    push_value(o, 0, val, "V");
                  break;
                case "b":
                  push_value(o, 0, cell.v ? 1 : 0, cell.v ? "TRUE" : "FALSE");
                  break;
                case "s":
                  push_value(o, 1, 0, isNaN(cell.v) ? cell.v : '="' + cell.v + '"');
                  break;
                case "d":
                  if (!cell.w)
                    cell.w = SSF.format(cell.z || SSF._table[14], datenum(parseDate(cell.v)));
                  push_value(o, 0, cell.w, "V");
                  break;
                default:
                  push_value(o, 1, 0, "");
              }
            }
          }
          push_value(o, -1, 0, "EOD");
          var RS = "\r\n";
          var oo = o.join(RS);
          return oo;
        };
      }();
      return {
        to_workbook: dif_to_workbook,
        to_sheet: dif_to_sheet,
        from_sheet: sheet_to_dif
      };
    }();
    var ETH = function() {
      function decode(s) {
        return s.replace(/\\b/g, "\\").replace(/\\c/g, ":").replace(/\\n/g, "\n");
      }
      function encode(s) {
        return s.replace(/\\/g, "\\b").replace(/:/g, "\\c").replace(/\n/g, "\\n");
      }
      function eth_to_aoa(str, opts) {
        var records = str.split("\n"), R = -1, C = -1, ri = 0, arr = [];
        for (; ri !== records.length; ++ri) {
          var record = records[ri].trim().split(":");
          if (record[0] !== "cell")
            continue;
          var addr = decode_cell(record[1]);
          if (arr.length <= addr.r) {
            for (R = arr.length; R <= addr.r; ++R)
              if (!arr[R])
                arr[R] = [];
          }
          R = addr.r;
          C = addr.c;
          switch (record[2]) {
            case "t":
              arr[R][C] = decode(record[3]);
              break;
            case "v":
              arr[R][C] = +record[3];
              break;
            case "vtf":
              var _f = record[record.length - 1];
            case "vtc":
              switch (record[3]) {
                case "nl":
                  arr[R][C] = +record[4] ? true : false;
                  break;
                default:
                  arr[R][C] = +record[4];
                  break;
              }
              if (record[2] == "vtf")
                arr[R][C] = [arr[R][C], _f];
          }
        }
        if (opts && opts.sheetRows)
          arr = arr.slice(0, opts.sheetRows);
        return arr;
      }
      function eth_to_sheet(d, opts) {
        return aoa_to_sheet(eth_to_aoa(d, opts), opts);
      }
      function eth_to_workbook(d, opts) {
        return sheet_to_workbook(eth_to_sheet(d, opts), opts);
      }
      var header = [
        "socialcalc:version:1.5",
        "MIME-Version: 1.0",
        "Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave"
      ].join("\n");
      var sep = [
        "--SocialCalcSpreadsheetControlSave",
        "Content-type: text/plain; charset=UTF-8"
      ].join("\n") + "\n";
      var meta = [
        "# SocialCalc Spreadsheet Control Save",
        "part:sheet"
      ].join("\n");
      var end = "--SocialCalcSpreadsheetControlSave--";
      function sheet_to_eth_data(ws) {
        if (!ws || !ws["!ref"])
          return "";
        var o = [], oo = [], cell, coord = "";
        var r = decode_range(ws["!ref"]);
        var dense = Array.isArray(ws);
        for (var R = r.s.r; R <= r.e.r; ++R) {
          for (var C = r.s.c; C <= r.e.c; ++C) {
            coord = encode_cell({ r: R, c: C });
            cell = dense ? (ws[R] || [])[C] : ws[coord];
            if (!cell || cell.v == null || cell.t === "z")
              continue;
            oo = ["cell", coord, "t"];
            switch (cell.t) {
              case "s":
              case "str":
                oo.push(encode(cell.v));
                break;
              case "n":
                if (!cell.f) {
                  oo[2] = "v";
                  oo[3] = cell.v;
                } else {
                  oo[2] = "vtf";
                  oo[3] = "n";
                  oo[4] = cell.v;
                  oo[5] = encode(cell.f);
                }
                break;
              case "b":
                oo[2] = "vt" + (cell.f ? "f" : "c");
                oo[3] = "nl";
                oo[4] = cell.v ? "1" : "0";
                oo[5] = encode(cell.f || (cell.v ? "TRUE" : "FALSE"));
                break;
              case "d":
                var t = datenum(parseDate(cell.v));
                oo[2] = "vtc";
                oo[3] = "nd";
                oo[4] = "" + t;
                oo[5] = cell.w || SSF.format(cell.z || SSF._table[14], t);
                break;
              case "e":
                continue;
            }
            o.push(oo.join(":"));
          }
        }
        o.push("sheet:c:" + (r.e.c - r.s.c + 1) + ":r:" + (r.e.r - r.s.r + 1) + ":tvf:1");
        o.push("valueformat:1:text-wiki");
        return o.join("\n");
      }
      function sheet_to_eth(ws) {
        return [header, sep, meta, sep, sheet_to_eth_data(ws), end].join("\n");
      }
      return {
        to_workbook: eth_to_workbook,
        to_sheet: eth_to_sheet,
        from_sheet: sheet_to_eth
      };
    }();
    var PRN = function() {
      function set_text_arr(data, arr, R, C, o) {
        if (o.raw)
          arr[R][C] = data;
        else if (data === "TRUE")
          arr[R][C] = true;
        else if (data === "FALSE")
          arr[R][C] = false;
        else if (data === "")
          ;
        else if (!isNaN(fuzzynum(data)))
          arr[R][C] = fuzzynum(data);
        else if (!isNaN(fuzzydate(data).getDate()))
          arr[R][C] = parseDate(data);
        else
          arr[R][C] = data;
      }
      function prn_to_aoa_str(f, opts) {
        var o = opts || {};
        var arr = [];
        if (!f || f.length === 0)
          return arr;
        var lines = f.split(/[\r\n]/);
        var L = lines.length - 1;
        while (L >= 0 && lines[L].length === 0)
          --L;
        var start = 10, idx = 0;
        var R = 0;
        for (; R <= L; ++R) {
          idx = lines[R].indexOf(" ");
          if (idx == -1)
            idx = lines[R].length;
          else
            idx++;
          start = Math.max(start, idx);
        }
        for (R = 0; R <= L; ++R) {
          arr[R] = [];
          var C = 0;
          set_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);
          for (C = 1; C <= (lines[R].length - start) / 10 + 1; ++C)
            set_text_arr(lines[R].slice(start + (C - 1) * 10, start + C * 10).trim(), arr, R, C, o);
        }
        if (o.sheetRows)
          arr = arr.slice(0, o.sheetRows);
        return arr;
      }
      var guess_seps = {
        44: ",",
        9: "	",
        59: ";"
      };
      var guess_sep_weights = {
        44: 3,
        9: 2,
        59: 1
      };
      function guess_sep(str) {
        var cnt = {}, instr = false, end = 0, cc = 0;
        for (; end < str.length; ++end) {
          if ((cc = str.charCodeAt(end)) == 34)
            instr = !instr;
          else if (!instr && cc in guess_seps)
            cnt[cc] = (cnt[cc] || 0) + 1;
        }
        cc = [];
        for (end in cnt)
          if (Object.prototype.hasOwnProperty.call(cnt, end)) {
            cc.push([cnt[end], end]);
          }
        if (!cc.length) {
          cnt = guess_sep_weights;
          for (end in cnt)
            if (Object.prototype.hasOwnProperty.call(cnt, end)) {
              cc.push([cnt[end], end]);
            }
        }
        cc.sort(function(a, b) {
          return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]];
        });
        return guess_seps[cc.pop()[1]];
      }
      function dsv_to_sheet_str(str, opts) {
        var o = opts || {};
        var sep = "";
        var ws = o.dense ? [] : {};
        var range = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };
        if (str.slice(0, 4) == "sep=" && str.charCodeAt(5) == 10) {
          sep = str.charAt(4);
          str = str.slice(6);
        } else
          sep = guess_sep(str.slice(0, 1024));
        var R = 0, C = 0, v = 0;
        var start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc = 0;
        str = str.replace(/\r\n/mg, "\n");
        var _re = o.dateNF != null ? dateNF_regex(o.dateNF) : null;
        function finish_cell() {
          var s = str.slice(start, end);
          var cell = {};
          if (s.charAt(0) == '"' && s.charAt(s.length - 1) == '"')
            s = s.slice(1, -1).replace(/""/g, '"');
          if (s.length === 0)
            cell.t = "z";
          else if (o.raw) {
            cell.t = "s";
            cell.v = s;
          } else if (s.trim().length === 0) {
            cell.t = "s";
            cell.v = s;
          } else if (s.charCodeAt(0) == 61) {
            if (s.charCodeAt(1) == 34 && s.charCodeAt(s.length - 1) == 34) {
              cell.t = "s";
              cell.v = s.slice(2, -1).replace(/""/g, '"');
            } else if (fuzzyfmla(s)) {
              cell.t = "n";
              cell.f = s.slice(1);
            } else {
              cell.t = "s";
              cell.v = s;
            }
          } else if (s == "TRUE") {
            cell.t = "b";
            cell.v = true;
          } else if (s == "FALSE") {
            cell.t = "b";
            cell.v = false;
          } else if (!isNaN(v = fuzzynum(s))) {
            cell.t = "n";
            if (o.cellText !== false)
              cell.w = s;
            cell.v = v;
          } else if (!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {
            cell.z = o.dateNF || SSF._table[14];
            var k = 0;
            if (_re && s.match(_re)) {
              s = dateNF_fix(s, o.dateNF, s.match(_re) || []);
              k = 1;
            }
            if (o.cellDates) {
              cell.t = "d";
              cell.v = parseDate(s, k);
            } else {
              cell.t = "n";
              cell.v = datenum(parseDate(s, k));
            }
            if (o.cellText !== false)
              cell.w = SSF.format(cell.z, cell.v instanceof Date ? datenum(cell.v) : cell.v);
            if (!o.cellNF)
              delete cell.z;
          } else {
            cell.t = "s";
            cell.v = s;
          }
          if (cell.t == "z")
            ;
          else if (o.dense) {
            if (!ws[R])
              ws[R] = [];
            ws[R][C] = cell;
          } else
            ws[encode_cell({ c: C, r: R })] = cell;
          start = end + 1;
          if (range.e.c < C)
            range.e.c = C;
          if (range.e.r < R)
            range.e.r = R;
          if (cc == sepcc)
            ++C;
          else {
            C = 0;
            ++R;
            if (o.sheetRows && o.sheetRows <= R)
              return true;
          }
        }
        outer:
          for (; end < str.length; ++end)
            switch (cc = str.charCodeAt(end)) {
              case 34:
                instr = !instr;
                break;
              case sepcc:
              case 10:
              case 13:
                if (!instr && finish_cell())
                  break outer;
                break;
            }
        if (end - start > 0)
          finish_cell();
        ws["!ref"] = encode_range(range);
        return ws;
      }
      function prn_to_sheet_str(str, opts) {
        if (str.slice(0, 4) == "sep=")
          return dsv_to_sheet_str(str, opts);
        if (str.indexOf("	") >= 0 || str.indexOf(",") >= 0 || str.indexOf(";") >= 0)
          return dsv_to_sheet_str(str, opts);
        return aoa_to_sheet(prn_to_aoa_str(str, opts), opts);
      }
      function prn_to_sheet(d, opts) {
        var str = "", bytes = opts.type == "string" ? [0, 0, 0, 0] : firstbyte(d, opts);
        switch (opts.type) {
          case "base64":
            str = Base64.decode(d);
            break;
          case "binary":
            str = d;
            break;
          case "buffer":
            if (opts.codepage == 65001)
              str = d.toString("utf8");
            else if (opts.codepage && typeof cptable !== "undefined")
              str = cptable.utils.decode(opts.codepage, d);
            else
              str = d.toString("binary");
            break;
          case "array":
            str = cc2str(d);
            break;
          case "string":
            str = d;
            break;
          default:
            throw new Error("Unrecognized type " + opts.type);
        }
        if (bytes[0] == 239 && bytes[1] == 187 && bytes[2] == 191)
          str = utf8read(str.slice(3));
        else if (opts.type == "binary" && typeof cptable !== "undefined" && opts.codepage)
          str = cptable.utils.decode(opts.codepage, cptable.utils.encode(1252, str));
        if (str.slice(0, 19) == "socialcalc:version:")
          return ETH.to_sheet(opts.type == "string" ? str : utf8read(str), opts);
        return prn_to_sheet_str(str, opts);
      }
      function prn_to_workbook(d, opts) {
        return sheet_to_workbook(prn_to_sheet(d, opts), opts);
      }
      function sheet_to_prn(ws) {
        var o = [];
        var r = safe_decode_range(ws["!ref"]), cell;
        var dense = Array.isArray(ws);
        for (var R = r.s.r; R <= r.e.r; ++R) {
          var oo = [];
          for (var C = r.s.c; C <= r.e.c; ++C) {
            var coord = encode_cell({ r: R, c: C });
            cell = dense ? (ws[R] || [])[C] : ws[coord];
            if (!cell || cell.v == null) {
              oo.push("          ");
              continue;
            }
            var w = (cell.w || (format_cell(cell), cell.w) || "").slice(0, 10);
            while (w.length < 10)
              w += " ";
            oo.push(w + (C === 0 ? " " : ""));
          }
          o.push(oo.join(""));
        }
        return o.join("\n");
      }
      return {
        to_workbook: prn_to_workbook,
        to_sheet: prn_to_sheet,
        from_sheet: sheet_to_prn
      };
    }();
    function read_wb_ID(d, opts) {
      var o = opts || {}, OLD_WTF = !!o.WTF;
      o.WTF = true;
      try {
        var out = SYLK.to_workbook(d, o);
        o.WTF = OLD_WTF;
        return out;
      } catch (e) {
        o.WTF = OLD_WTF;
        if (!e.message.match(/SYLK bad record ID/) && OLD_WTF)
          throw e;
        return PRN.to_workbook(d, opts);
      }
    }
    var WK_ = function() {
      function lotushopper(data, cb, opts) {
        if (!data)
          return;
        prep_blob(data, data.l || 0);
        var Enum = opts.Enum || WK1Enum;
        while (data.l < data.length) {
          var RT = data.read_shift(2);
          var R = Enum[RT] || Enum[255];
          var length = data.read_shift(2);
          var tgt = data.l + length;
          var d = (R.f || parsenoop)(data, length, opts);
          data.l = tgt;
          if (cb(d, R.n, RT))
            return;
        }
      }
      function lotus_to_workbook(d, opts) {
        switch (opts.type) {
          case "base64":
            return lotus_to_workbook_buf(s2a(Base64.decode(d)), opts);
          case "binary":
            return lotus_to_workbook_buf(s2a(d), opts);
          case "buffer":
          case "array":
            return lotus_to_workbook_buf(d, opts);
        }
        throw "Unsupported type " + opts.type;
      }
      function lotus_to_workbook_buf(d, opts) {
        if (!d)
          return d;
        var o = opts || {};
        var s = o.dense ? [] : {}, n = "Sheet1", sidx = 0;
        var sheets = {}, snames = [n];
        var refguess = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
        var sheetRows = o.sheetRows || 0;
        if (d[2] == 2)
          o.Enum = WK1Enum;
        else if (d[2] == 26)
          o.Enum = WK3Enum;
        else if (d[2] == 14) {
          o.Enum = WK3Enum;
          o.qpro = true;
          d.l = 0;
        } else
          throw new Error("Unrecognized LOTUS BOF " + d[2]);
        lotushopper(d, function(val, Rn, RT) {
          if (d[2] == 2)
            switch (RT) {
              case 0:
                o.vers = val;
                if (val >= 4096)
                  o.qpro = true;
                break;
              case 6:
                refguess = val;
                break;
              case 15:
                if (!o.qpro)
                  val[1].v = val[1].v.slice(1);
              case 13:
              case 14:
              case 16:
              case 51:
                if (RT == 14 && (val[2] & 112) == 112 && (val[2] & 15) > 1 && (val[2] & 15) < 15) {
                  val[1].z = o.dateNF || SSF._table[14];
                  if (o.cellDates) {
                    val[1].t = "d";
                    val[1].v = numdate(val[1].v);
                  }
                }
                if (o.dense) {
                  if (!s[val[0].r])
                    s[val[0].r] = [];
                  s[val[0].r][val[0].c] = val[1];
                } else
                  s[encode_cell(val[0])] = val[1];
                break;
            }
          else
            switch (RT) {
              case 22:
                val[1].v = val[1].v.slice(1);
              case 23:
              case 24:
              case 25:
              case 37:
              case 39:
              case 40:
                if (val[3] > sidx) {
                  s["!ref"] = encode_range(refguess);
                  sheets[n] = s;
                  s = o.dense ? [] : {};
                  refguess = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
                  sidx = val[3];
                  n = "Sheet" + (sidx + 1);
                  snames.push(n);
                }
                if (sheetRows > 0 && val[0].r >= sheetRows)
                  break;
                if (o.dense) {
                  if (!s[val[0].r])
                    s[val[0].r] = [];
                  s[val[0].r][val[0].c] = val[1];
                } else
                  s[encode_cell(val[0])] = val[1];
                if (refguess.e.c < val[0].c)
                  refguess.e.c = val[0].c;
                if (refguess.e.r < val[0].r)
                  refguess.e.r = val[0].r;
                break;
            }
        }, o);
        s["!ref"] = encode_range(refguess);
        sheets[n] = s;
        return { SheetNames: snames, Sheets: sheets };
      }
      function parse_RANGE(blob) {
        var o = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };
        o.s.c = blob.read_shift(2);
        o.s.r = blob.read_shift(2);
        o.e.c = blob.read_shift(2);
        o.e.r = blob.read_shift(2);
        if (o.s.c == 65535)
          o.s.c = o.e.c = o.s.r = o.e.r = 0;
        return o;
      }
      function parse_cell(blob, length, opts) {
        var o = [{ c: 0, r: 0 }, { t: "n", v: 0 }, 0];
        if (opts.qpro && opts.vers != 20768) {
          o[0].c = blob.read_shift(1);
          blob.l++;
          o[0].r = blob.read_shift(2);
          blob.l += 2;
        } else {
          o[2] = blob.read_shift(1);
          o[0].c = blob.read_shift(2);
          o[0].r = blob.read_shift(2);
        }
        return o;
      }
      function parse_LABEL(blob, length, opts) {
        var tgt = blob.l + length;
        var o = parse_cell(blob, length, opts);
        o[1].t = "s";
        if (opts.vers == 20768) {
          blob.l++;
          var len = blob.read_shift(1);
          o[1].v = blob.read_shift(len, "utf8");
          return o;
        }
        if (opts.qpro)
          blob.l++;
        o[1].v = blob.read_shift(tgt - blob.l, "cstr");
        return o;
      }
      function parse_INTEGER(blob, length, opts) {
        var o = parse_cell(blob, length, opts);
        o[1].v = blob.read_shift(2, "i");
        return o;
      }
      function parse_NUMBER(blob, length, opts) {
        var o = parse_cell(blob, length, opts);
        o[1].v = blob.read_shift(8, "f");
        return o;
      }
      function parse_FORMULA(blob, length, opts) {
        var tgt = blob.l + length;
        var o = parse_cell(blob, length, opts);
        o[1].v = blob.read_shift(8, "f");
        if (opts.qpro)
          blob.l = tgt;
        else {
          var flen = blob.read_shift(2);
          blob.l += flen;
        }
        return o;
      }
      function parse_cell_3(blob) {
        var o = [{ c: 0, r: 0 }, { t: "n", v: 0 }, 0];
        o[0].r = blob.read_shift(2);
        o[3] = blob[blob.l++];
        o[0].c = blob[blob.l++];
        return o;
      }
      function parse_LABEL_16(blob, length) {
        var o = parse_cell_3(blob);
        o[1].t = "s";
        o[1].v = blob.read_shift(length - 4, "cstr");
        return o;
      }
      function parse_NUMBER_18(blob, length) {
        var o = parse_cell_3(blob);
        o[1].v = blob.read_shift(2);
        var v = o[1].v >> 1;
        if (o[1].v & 1) {
          switch (v & 7) {
            case 1:
              v = (v >> 3) * 500;
              break;
            case 2:
              v = (v >> 3) / 20;
              break;
            case 4:
              v = (v >> 3) / 2e3;
              break;
            case 6:
              v = (v >> 3) / 16;
              break;
            case 7:
              v = (v >> 3) / 64;
              break;
            default:
              throw "unknown NUMBER_18 encoding " + (v & 7);
          }
        }
        o[1].v = v;
        return o;
      }
      function parse_NUMBER_17(blob, length) {
        var o = parse_cell_3(blob);
        var v1 = blob.read_shift(4);
        var v2 = blob.read_shift(4);
        var e = blob.read_shift(2);
        if (e == 65535) {
          o[1].v = 0;
          return o;
        }
        var s = e & 32768;
        e = (e & 32767) - 16446;
        o[1].v = (s * 2 - 1) * ((e > 0 ? v2 << e : v2 >>> -e) + (e > -32 ? v1 << e + 32 : v1 >>> -(e + 32)));
        return o;
      }
      function parse_FORMULA_19(blob, length) {
        var o = parse_NUMBER_17(blob);
        blob.l += length - 14;
        return o;
      }
      function parse_NUMBER_25(blob, length) {
        var o = parse_cell_3(blob);
        var v1 = blob.read_shift(4);
        o[1].v = v1 >> 6;
        return o;
      }
      function parse_NUMBER_27(blob, length) {
        var o = parse_cell_3(blob);
        var v1 = blob.read_shift(8, "f");
        o[1].v = v1;
        return o;
      }
      function parse_FORMULA_28(blob, length) {
        var o = parse_NUMBER_27(blob);
        blob.l += length - 10;
        return o;
      }
      var WK1Enum = {
        0: { n: "BOF", f: parseuint16 },
        1: { n: "EOF" },
        2: { n: "CALCMODE" },
        3: { n: "CALCORDER" },
        4: { n: "SPLIT" },
        5: { n: "SYNC" },
        6: { n: "RANGE", f: parse_RANGE },
        7: { n: "WINDOW1" },
        8: { n: "COLW1" },
        9: { n: "WINTWO" },
        10: { n: "COLW2" },
        11: { n: "NAME" },
        12: { n: "BLANK" },
        13: { n: "INTEGER", f: parse_INTEGER },
        14: { n: "NUMBER", f: parse_NUMBER },
        15: { n: "LABEL", f: parse_LABEL },
        16: { n: "FORMULA", f: parse_FORMULA },
        24: { n: "TABLE" },
        25: { n: "ORANGE" },
        26: { n: "PRANGE" },
        27: { n: "SRANGE" },
        28: { n: "FRANGE" },
        29: { n: "KRANGE1" },
        32: { n: "HRANGE" },
        35: { n: "KRANGE2" },
        36: { n: "PROTEC" },
        37: { n: "FOOTER" },
        38: { n: "HEADER" },
        39: { n: "SETUP" },
        40: { n: "MARGINS" },
        41: { n: "LABELFMT" },
        42: { n: "TITLES" },
        43: { n: "SHEETJS" },
        45: { n: "GRAPH" },
        46: { n: "NGRAPH" },
        47: { n: "CALCCOUNT" },
        48: { n: "UNFORMATTED" },
        49: { n: "CURSORW12" },
        50: { n: "WINDOW" },
        51: { n: "STRING", f: parse_LABEL },
        55: { n: "PASSWORD" },
        56: { n: "LOCKED" },
        60: { n: "QUERY" },
        61: { n: "QUERYNAME" },
        62: { n: "PRINT" },
        63: { n: "PRINTNAME" },
        64: { n: "GRAPH2" },
        65: { n: "GRAPHNAME" },
        66: { n: "ZOOM" },
        67: { n: "SYMSPLIT" },
        68: { n: "NSROWS" },
        69: { n: "NSCOLS" },
        70: { n: "RULER" },
        71: { n: "NNAME" },
        72: { n: "ACOMM" },
        73: { n: "AMACRO" },
        74: { n: "PARSE" },
        255: { n: "", f: parsenoop }
      };
      var WK3Enum = {
        0: { n: "BOF" },
        1: { n: "EOF" },
        3: { n: "??" },
        4: { n: "??" },
        5: { n: "??" },
        6: { n: "??" },
        7: { n: "??" },
        9: { n: "??" },
        10: { n: "??" },
        11: { n: "??" },
        12: { n: "??" },
        14: { n: "??" },
        15: { n: "??" },
        16: { n: "??" },
        17: { n: "??" },
        18: { n: "??" },
        19: { n: "??" },
        21: { n: "??" },
        22: { n: "LABEL16", f: parse_LABEL_16 },
        23: { n: "NUMBER17", f: parse_NUMBER_17 },
        24: { n: "NUMBER18", f: parse_NUMBER_18 },
        25: { n: "FORMULA19", f: parse_FORMULA_19 },
        26: { n: "??" },
        27: { n: "??" },
        28: { n: "??" },
        29: { n: "??" },
        30: { n: "??" },
        31: { n: "??" },
        33: { n: "??" },
        37: { n: "NUMBER25", f: parse_NUMBER_25 },
        39: { n: "NUMBER27", f: parse_NUMBER_27 },
        40: { n: "FORMULA28", f: parse_FORMULA_28 },
        255: { n: "", f: parsenoop }
      };
      return {
        to_workbook: lotus_to_workbook
      };
    }();
    function parse_rpr(rpr) {
      var font = {}, m = rpr.match(tagregex), i3 = 0;
      var pass = false;
      if (m)
        for (; i3 != m.length; ++i3) {
          var y = parsexmltag(m[i3]);
          switch (y[0].replace(/\w*:/g, "")) {
            case "<condense":
              break;
            case "<extend":
              break;
            case "<shadow":
              if (!y.val)
                break;
            case "<shadow>":
            case "<shadow/>":
              font.shadow = 1;
              break;
            case "</shadow>":
              break;
            case "<charset":
              if (y.val == "1")
                break;
              font.cp = CS2CP[parseInt(y.val, 10)];
              break;
            case "<outline":
              if (!y.val)
                break;
            case "<outline>":
            case "<outline/>":
              font.outline = 1;
              break;
            case "</outline>":
              break;
            case "<rFont":
              font.name = y.val;
              break;
            case "<sz":
              font.sz = y.val;
              break;
            case "<strike":
              if (!y.val)
                break;
            case "<strike>":
            case "<strike/>":
              font.strike = 1;
              break;
            case "</strike>":
              break;
            case "<u":
              if (!y.val)
                break;
              switch (y.val) {
                case "double":
                  font.uval = "double";
                  break;
                case "singleAccounting":
                  font.uval = "single-accounting";
                  break;
                case "doubleAccounting":
                  font.uval = "double-accounting";
                  break;
              }
            case "<u>":
            case "<u/>":
              font.u = 1;
              break;
            case "</u>":
              break;
            case "<b":
              if (y.val == "0")
                break;
            case "<b>":
            case "<b/>":
              font.b = 1;
              break;
            case "</b>":
              break;
            case "<i":
              if (y.val == "0")
                break;
            case "<i>":
            case "<i/>":
              font.i = 1;
              break;
            case "</i>":
              break;
            case "<color":
              if (y.rgb)
                font.color = y.rgb.slice(2, 8);
              break;
            case "<family":
              font.family = y.val;
              break;
            case "<vertAlign":
              font.valign = y.val;
              break;
            case "<scheme":
              break;
            case "<extLst":
            case "<extLst>":
            case "</extLst>":
              break;
            case "<ext":
              pass = true;
              break;
            case "</ext>":
              pass = false;
              break;
            default:
              if (y[0].charCodeAt(1) !== 47 && !pass)
                throw new Error("Unrecognized rich format " + y[0]);
          }
        }
      return font;
    }
    var parse_rs = function() {
      var tregex = matchtag("t"), rpregex = matchtag("rPr");
      function parse_r(r) {
        var t = r.match(tregex);
        if (!t)
          return { t: "s", v: "" };
        var o = { t: "s", v: unescapexml(t[1]) };
        var rpr = r.match(rpregex);
        if (rpr)
          o.s = parse_rpr(rpr[1]);
        return o;
      }
      var rregex = /<(?:\w+:)?r>/g, rend = /<\/(?:\w+:)?r>/;
      return function parse_rs2(rs) {
        return rs.replace(rregex, "").split(rend).map(parse_r).filter(function(r) {
          return r.v;
        });
      };
    }();
    var rs_to_html = function parse_rs_factory() {
      var nlregex = /(\r\n|\n)/g;
      function parse_rpr2(font, intro, outro) {
        var style = [];
        if (font.u)
          style.push("text-decoration: underline;");
        if (font.uval)
          style.push("text-underline-style:" + font.uval + ";");
        if (font.sz)
          style.push("font-size:" + font.sz + "pt;");
        if (font.outline)
          style.push("text-effect: outline;");
        if (font.shadow)
          style.push("text-shadow: auto;");
        intro.push('<span style="' + style.join("") + '">');
        if (font.b) {
          intro.push("<b>");
          outro.push("</b>");
        }
        if (font.i) {
          intro.push("<i>");
          outro.push("</i>");
        }
        if (font.strike) {
          intro.push("<s>");
          outro.push("</s>");
        }
        var align = font.valign || "";
        if (align == "superscript" || align == "super")
          align = "sup";
        else if (align == "subscript")
          align = "sub";
        if (align != "") {
          intro.push("<" + align + ">");
          outro.push("</" + align + ">");
        }
        outro.push("</span>");
        return font;
      }
      function r_to_html(r) {
        var terms = [[], r.v, []];
        if (!r.v)
          return "";
        if (r.s)
          parse_rpr2(r.s, terms[0], terms[2]);
        return terms[0].join("") + terms[1].replace(nlregex, "<br/>") + terms[2].join("");
      }
      return function parse_rs2(rs) {
        return rs.map(r_to_html).join("");
      };
    }();
    var sitregex = /<(?:\w+:)?t[^>]*>([^<]*)<\/(?:\w+:)?t>/g, sirregex = /<(?:\w+:)?r>/;
    var sirphregex = /<(?:\w+:)?rPh.*?>([\s\S]*?)<\/(?:\w+:)?rPh>/g;
    function parse_si(x, opts) {
      var html = opts ? opts.cellHTML : true;
      var z = {};
      if (!x)
        return null;
      if (x.match(/^\s*<(?:\w+:)?t[^>]*>/)) {
        z.t = unescapexml(utf8read(x.slice(x.indexOf(">") + 1).split(/<\/(?:\w+:)?t>/)[0] || ""));
        z.r = utf8read(x);
        if (html)
          z.h = escapehtml(z.t);
      } else if (
        /*y = */
        x.match(sirregex)
      ) {
        z.r = utf8read(x);
        z.t = unescapexml(utf8read((x.replace(sirphregex, "").match(sitregex) || []).join("").replace(tagregex, "")));
        if (html)
          z.h = rs_to_html(parse_rs(z.r));
      }
      return z;
    }
    var sstr0 = /<(?:\w+:)?sst([^>]*)>([\s\S]*)<\/(?:\w+:)?sst>/;
    var sstr1 = /<(?:\w+:)?(?:si|sstItem)>/g;
    var sstr2 = /<\/(?:\w+:)?(?:si|sstItem)>/;
    function parse_sst_xml(data, opts) {
      var s = [], ss = "";
      if (!data)
        return s;
      var sst = data.match(sstr0);
      if (sst) {
        ss = sst[2].replace(sstr1, "").split(sstr2);
        for (var i3 = 0; i3 != ss.length; ++i3) {
          var o = parse_si(ss[i3].trim(), opts);
          if (o != null)
            s[s.length] = o;
        }
        sst = parsexmltag(sst[1]);
        s.Count = sst.count;
        s.Unique = sst.uniqueCount;
      }
      return s;
    }
    RELS.SST = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings";
    var straywsregex = /^\s|\s$|[\t\n\r]/;
    function write_sst_xml(sst, opts) {
      if (!opts.bookSST)
        return "";
      var o = [XML_HEADER];
      o[o.length] = writextag("sst", null, {
        xmlns: XMLNS.main[0],
        count: sst.Count,
        uniqueCount: sst.Unique
      });
      for (var i3 = 0; i3 != sst.length; ++i3) {
        if (sst[i3] == null)
          continue;
        var s = sst[i3];
        var sitag = "<si>";
        if (s.r)
          sitag += s.r;
        else {
          sitag += "<t";
          if (!s.t)
            s.t = "";
          if (s.t.match(straywsregex))
            sitag += ' xml:space="preserve"';
          sitag += ">" + escapexml(s.t) + "</t>";
        }
        sitag += "</si>";
        o[o.length] = sitag;
      }
      if (o.length > 2) {
        o[o.length] = "</sst>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    function parse_BrtBeginSst(data) {
      return [data.read_shift(4), data.read_shift(4)];
    }
    function parse_sst_bin(data, opts) {
      var s = [];
      var pass = false;
      recordhopper(data, function hopper_sst(val, R_n, RT) {
        switch (RT) {
          case 159:
            s.Count = val[0];
            s.Unique = val[1];
            break;
          case 19:
            s.push(val);
            break;
          case 160:
            return true;
          case 35:
            pass = true;
            break;
          case 36:
            pass = false;
            break;
          default:
            if (R_n.indexOf("Begin") > 0)
              ;
            else if (R_n.indexOf("End") > 0)
              ;
            if (!pass || opts.WTF)
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      });
      return s;
    }
    function write_BrtBeginSst(sst, o) {
      if (!o)
        o = new_buf(8);
      o.write_shift(4, sst.Count);
      o.write_shift(4, sst.Unique);
      return o;
    }
    var write_BrtSSTItem = write_RichStr;
    function write_sst_bin(sst) {
      var ba = buf_array();
      write_record(ba, "BrtBeginSst", write_BrtBeginSst(sst));
      for (var i3 = 0; i3 < sst.length; ++i3)
        write_record(ba, "BrtSSTItem", write_BrtSSTItem(sst[i3]));
      write_record(ba, "BrtEndSst");
      return ba.end();
    }
    function _JS2ANSI(str) {
      if (typeof cptable !== "undefined")
        return cptable.utils.encode(current_ansi, str);
      var o = [], oo = str.split("");
      for (var i3 = 0; i3 < oo.length; ++i3)
        o[i3] = oo[i3].charCodeAt(0);
      return o;
    }
    function parse_CRYPTOVersion(blob, length) {
      var o = {};
      o.Major = blob.read_shift(2);
      o.Minor = blob.read_shift(2);
      if (length >= 4)
        blob.l += length - 4;
      return o;
    }
    function parse_DataSpaceVersionInfo(blob) {
      var o = {};
      o.id = blob.read_shift(0, "lpp4");
      o.R = parse_CRYPTOVersion(blob, 4);
      o.U = parse_CRYPTOVersion(blob, 4);
      o.W = parse_CRYPTOVersion(blob, 4);
      return o;
    }
    function parse_DataSpaceMapEntry(blob) {
      var len = blob.read_shift(4);
      var end = blob.l + len - 4;
      var o = {};
      var cnt = blob.read_shift(4);
      var comps = [];
      while (cnt-- > 0)
        comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, "lpp4") });
      o.name = blob.read_shift(0, "lpp4");
      o.comps = comps;
      if (blob.l != end)
        throw new Error("Bad DataSpaceMapEntry: " + blob.l + " != " + end);
      return o;
    }
    function parse_DataSpaceMap(blob) {
      var o = [];
      blob.l += 4;
      var cnt = blob.read_shift(4);
      while (cnt-- > 0)
        o.push(parse_DataSpaceMapEntry(blob));
      return o;
    }
    function parse_DataSpaceDefinition(blob) {
      var o = [];
      blob.l += 4;
      var cnt = blob.read_shift(4);
      while (cnt-- > 0)
        o.push(blob.read_shift(0, "lpp4"));
      return o;
    }
    function parse_TransformInfoHeader(blob) {
      var o = {};
      blob.read_shift(4);
      blob.l += 4;
      o.id = blob.read_shift(0, "lpp4");
      o.name = blob.read_shift(0, "lpp4");
      o.R = parse_CRYPTOVersion(blob, 4);
      o.U = parse_CRYPTOVersion(blob, 4);
      o.W = parse_CRYPTOVersion(blob, 4);
      return o;
    }
    function parse_Primary(blob) {
      var hdr = parse_TransformInfoHeader(blob);
      hdr.ename = blob.read_shift(0, "8lpp4");
      hdr.blksz = blob.read_shift(4);
      hdr.cmode = blob.read_shift(4);
      if (blob.read_shift(4) != 4)
        throw new Error("Bad !Primary record");
      return hdr;
    }
    function parse_EncryptionHeader(blob, length) {
      var tgt = blob.l + length;
      var o = {};
      o.Flags = blob.read_shift(4) & 63;
      blob.l += 4;
      o.AlgID = blob.read_shift(4);
      var valid = false;
      switch (o.AlgID) {
        case 26126:
        case 26127:
        case 26128:
          valid = o.Flags == 36;
          break;
        case 26625:
          valid = o.Flags == 4;
          break;
        case 0:
          valid = o.Flags == 16 || o.Flags == 4 || o.Flags == 36;
          break;
        default:
          throw "Unrecognized encryption algorithm: " + o.AlgID;
      }
      if (!valid)
        throw new Error("Encryption Flags/AlgID mismatch");
      o.AlgIDHash = blob.read_shift(4);
      o.KeySize = blob.read_shift(4);
      o.ProviderType = blob.read_shift(4);
      blob.l += 8;
      o.CSPName = blob.read_shift(tgt - blob.l >> 1, "utf16le");
      blob.l = tgt;
      return o;
    }
    function parse_EncryptionVerifier(blob, length) {
      var o = {}, tgt = blob.l + length;
      blob.l += 4;
      o.Salt = blob.slice(blob.l, blob.l + 16);
      blob.l += 16;
      o.Verifier = blob.slice(blob.l, blob.l + 16);
      blob.l += 16;
      blob.read_shift(4);
      o.VerifierHash = blob.slice(blob.l, tgt);
      blob.l = tgt;
      return o;
    }
    function parse_EncryptionInfo(blob) {
      var vers = parse_CRYPTOVersion(blob);
      switch (vers.Minor) {
        case 2:
          return [vers.Minor, parse_EncInfoStd(blob)];
        case 3:
          return [vers.Minor, parse_EncInfoExt()];
        case 4:
          return [vers.Minor, parse_EncInfoAgl(blob)];
      }
      throw new Error("ECMA-376 Encrypted file unrecognized Version: " + vers.Minor);
    }
    function parse_EncInfoStd(blob) {
      var flags = blob.read_shift(4);
      if ((flags & 63) != 36)
        throw new Error("EncryptionInfo mismatch");
      var sz = blob.read_shift(4);
      var hdr = parse_EncryptionHeader(blob, sz);
      var verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);
      return { t: "Std", h: hdr, v: verifier };
    }
    function parse_EncInfoExt() {
      throw new Error("File is password-protected: ECMA-376 Extensible");
    }
    function parse_EncInfoAgl(blob) {
      var KeyData = ["saltSize", "blockSize", "keyBits", "hashSize", "cipherAlgorithm", "cipherChaining", "hashAlgorithm", "saltValue"];
      blob.l += 4;
      var xml = blob.read_shift(blob.length - blob.l, "utf8");
      var o = {};
      xml.replace(tagregex, function xml_agile(x) {
        var y = parsexmltag(x);
        switch (strip_ns(y[0])) {
          case "<?xml":
            break;
          case "<encryption":
          case "</encryption>":
            break;
          case "<keyData":
            KeyData.forEach(function(k) {
              o[k] = y[k];
            });
            break;
          case "<dataIntegrity":
            o.encryptedHmacKey = y.encryptedHmacKey;
            o.encryptedHmacValue = y.encryptedHmacValue;
            break;
          case "<keyEncryptors>":
          case "<keyEncryptors":
            o.encs = [];
            break;
          case "</keyEncryptors>":
            break;
          case "<keyEncryptor":
            o.uri = y.uri;
            break;
          case "</keyEncryptor>":
            break;
          case "<encryptedKey":
            o.encs.push(y);
            break;
          default:
            throw y[0];
        }
      });
      return o;
    }
    function parse_RC4CryptoHeader(blob, length) {
      var o = {};
      var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);
      length -= 4;
      if (vers.Minor != 2)
        throw new Error("unrecognized minor version code: " + vers.Minor);
      if (vers.Major > 4 || vers.Major < 2)
        throw new Error("unrecognized major version code: " + vers.Major);
      o.Flags = blob.read_shift(4);
      length -= 4;
      var sz = blob.read_shift(4);
      length -= 4;
      o.EncryptionHeader = parse_EncryptionHeader(blob, sz);
      length -= sz;
      o.EncryptionVerifier = parse_EncryptionVerifier(blob, length);
      return o;
    }
    function parse_RC4Header(blob) {
      var o = {};
      var vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);
      if (vers.Major != 1 || vers.Minor != 1)
        throw "unrecognized version code " + vers.Major + " : " + vers.Minor;
      o.Salt = blob.read_shift(16);
      o.EncryptedVerifier = blob.read_shift(16);
      o.EncryptedVerifierHash = blob.read_shift(16);
      return o;
    }
    function crypto_CreatePasswordVerifier_Method1(Password) {
      var Verifier = 0, PasswordArray;
      var PasswordDecoded = _JS2ANSI(Password);
      var len = PasswordDecoded.length + 1, i3, PasswordByte;
      var Intermediate1, Intermediate2, Intermediate3;
      PasswordArray = new_raw_buf(len);
      PasswordArray[0] = PasswordDecoded.length;
      for (i3 = 1; i3 != len; ++i3)
        PasswordArray[i3] = PasswordDecoded[i3 - 1];
      for (i3 = len - 1; i3 >= 0; --i3) {
        PasswordByte = PasswordArray[i3];
        Intermediate1 = (Verifier & 16384) === 0 ? 0 : 1;
        Intermediate2 = Verifier << 1 & 32767;
        Intermediate3 = Intermediate1 | Intermediate2;
        Verifier = Intermediate3 ^ PasswordByte;
      }
      return Verifier ^ 52811;
    }
    var crypto_CreateXorArray_Method1 = function() {
      var PadArray = [187, 255, 255, 186, 255, 255, 185, 128, 0, 190, 15, 0, 191, 15, 0];
      var InitialCode = [57840, 7439, 52380, 33984, 4364, 3600, 61902, 12606, 6258, 57657, 54287, 34041, 10252, 43370, 20163];
      var XorMatrix = [44796, 19929, 39858, 10053, 20106, 40212, 10761, 31585, 63170, 64933, 60267, 50935, 40399, 11199, 17763, 35526, 1453, 2906, 5812, 11624, 23248, 885, 1770, 3540, 7080, 14160, 28320, 56640, 55369, 41139, 20807, 41614, 21821, 43642, 17621, 28485, 56970, 44341, 19019, 38038, 14605, 29210, 60195, 50791, 40175, 10751, 21502, 43004, 24537, 18387, 36774, 3949, 7898, 15796, 31592, 63184, 47201, 24803, 49606, 37805, 14203, 28406, 56812, 17824, 35648, 1697, 3394, 6788, 13576, 27152, 43601, 17539, 35078, 557, 1114, 2228, 4456, 30388, 60776, 51953, 34243, 7079, 14158, 28316, 14128, 28256, 56512, 43425, 17251, 34502, 7597, 13105, 26210, 52420, 35241, 883, 1766, 3532, 4129, 8258, 16516, 33032, 4657, 9314, 18628];
      var Ror = function(Byte) {
        return (Byte / 2 | Byte * 128) & 255;
      };
      var XorRor = function(byte1, byte2) {
        return Ror(byte1 ^ byte2);
      };
      var CreateXorKey_Method1 = function(Password) {
        var XorKey = InitialCode[Password.length - 1];
        var CurrentElement = 104;
        for (var i3 = Password.length - 1; i3 >= 0; --i3) {
          var Char = Password[i3];
          for (var j2 = 0; j2 != 7; ++j2) {
            if (Char & 64)
              XorKey ^= XorMatrix[CurrentElement];
            Char *= 2;
            --CurrentElement;
          }
        }
        return XorKey;
      };
      return function(password) {
        var Password = _JS2ANSI(password);
        var XorKey = CreateXorKey_Method1(Password);
        var Index = Password.length;
        var ObfuscationArray = new_raw_buf(16);
        for (var i3 = 0; i3 != 16; ++i3)
          ObfuscationArray[i3] = 0;
        var Temp, PasswordLastChar, PadIndex;
        if ((Index & 1) === 1) {
          Temp = XorKey >> 8;
          ObfuscationArray[Index] = XorRor(PadArray[0], Temp);
          --Index;
          Temp = XorKey & 255;
          PasswordLastChar = Password[Password.length - 1];
          ObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);
        }
        while (Index > 0) {
          --Index;
          Temp = XorKey >> 8;
          ObfuscationArray[Index] = XorRor(Password[Index], Temp);
          --Index;
          Temp = XorKey & 255;
          ObfuscationArray[Index] = XorRor(Password[Index], Temp);
        }
        Index = 15;
        PadIndex = 15 - Password.length;
        while (PadIndex > 0) {
          Temp = XorKey >> 8;
          ObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);
          --Index;
          --PadIndex;
          Temp = XorKey & 255;
          ObfuscationArray[Index] = XorRor(Password[Index], Temp);
          --Index;
          --PadIndex;
        }
        return ObfuscationArray;
      };
    }();
    var crypto_DecryptData_Method1 = function(password, Data, XorArrayIndex, XorArray, O) {
      if (!O)
        O = Data;
      if (!XorArray)
        XorArray = crypto_CreateXorArray_Method1(password);
      var Index, Value;
      for (Index = 0; Index != Data.length; ++Index) {
        Value = Data[Index];
        Value ^= XorArray[XorArrayIndex];
        Value = (Value >> 5 | Value << 3) & 255;
        O[Index] = Value;
        ++XorArrayIndex;
      }
      return [O, XorArrayIndex, XorArray];
    };
    var crypto_MakeXorDecryptor = function(password) {
      var XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);
      return function(Data) {
        var O = crypto_DecryptData_Method1("", Data, XorArrayIndex, XorArray);
        XorArrayIndex = O[1];
        return O[0];
      };
    };
    function parse_XORObfuscation(blob, length, opts, out) {
      var o = { key: parseuint16(blob), verificationBytes: parseuint16(blob) };
      if (opts.password)
        o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);
      out.valid = o.verificationBytes === o.verifier;
      if (out.valid)
        out.insitu = crypto_MakeXorDecryptor(opts.password);
      return o;
    }
    function parse_FilePassHeader(blob, length, oo) {
      var o = oo || {};
      o.Info = blob.read_shift(2);
      blob.l -= 2;
      if (o.Info === 1)
        o.Data = parse_RC4Header(blob);
      else
        o.Data = parse_RC4CryptoHeader(blob, length);
      return o;
    }
    function parse_FilePass(blob, length, opts) {
      var o = { Type: opts.biff >= 8 ? blob.read_shift(2) : 0 };
      if (o.Type)
        parse_FilePassHeader(blob, length - 2, o);
      else
        parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o);
      return o;
    }
    var RTF = function() {
      function rtf_to_sheet(d, opts) {
        switch (opts.type) {
          case "base64":
            return rtf_to_sheet_str(Base64.decode(d), opts);
          case "binary":
            return rtf_to_sheet_str(d, opts);
          case "buffer":
            return rtf_to_sheet_str(d.toString("binary"), opts);
          case "array":
            return rtf_to_sheet_str(cc2str(d), opts);
        }
        throw new Error("Unrecognized type " + opts.type);
      }
      function rtf_to_sheet_str(str, opts) {
        var o = opts || {};
        var ws = o.dense ? [] : {};
        var range = { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } };
        if (!str.match(/\\trowd/))
          throw new Error("RTF missing table");
        ws["!ref"] = encode_range(range);
        return ws;
      }
      function rtf_to_workbook(d, opts) {
        return sheet_to_workbook(rtf_to_sheet(d, opts), opts);
      }
      function sheet_to_rtf(ws) {
        var o = ["{\\rtf1\\ansi"];
        var r = safe_decode_range(ws["!ref"]), cell;
        var dense = Array.isArray(ws);
        for (var R = r.s.r; R <= r.e.r; ++R) {
          o.push("\\trowd\\trautofit1");
          for (var C = r.s.c; C <= r.e.c; ++C)
            o.push("\\cellx" + (C + 1));
          o.push("\\pard\\intbl");
          for (C = r.s.c; C <= r.e.c; ++C) {
            var coord = encode_cell({ r: R, c: C });
            cell = dense ? (ws[R] || [])[C] : ws[coord];
            if (!cell || cell.v == null && (!cell.f || cell.F))
              continue;
            o.push(" " + (cell.w || (format_cell(cell), cell.w)));
            o.push("\\cell");
          }
          o.push("\\pard\\intbl\\row");
        }
        return o.join("") + "}";
      }
      return {
        to_workbook: rtf_to_workbook,
        to_sheet: rtf_to_sheet,
        from_sheet: sheet_to_rtf
      };
    }();
    function hex2RGB(h) {
      var o = h.slice(h[0] === "#" ? 1 : 0).slice(0, 6);
      return [parseInt(o.slice(0, 2), 16), parseInt(o.slice(2, 4), 16), parseInt(o.slice(4, 6), 16)];
    }
    function rgb2Hex(rgb) {
      for (var i3 = 0, o = 1; i3 != 3; ++i3)
        o = o * 256 + (rgb[i3] > 255 ? 255 : rgb[i3] < 0 ? 0 : rgb[i3]);
      return o.toString(16).toUpperCase().slice(1);
    }
    function rgb2HSL(rgb) {
      var R = rgb[0] / 255, G = rgb[1] / 255, B = rgb[2] / 255;
      var M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;
      if (C === 0)
        return [0, 0, R];
      var H6 = 0, S = 0, L2 = M + m;
      S = C / (L2 > 1 ? 2 - L2 : L2);
      switch (M) {
        case R:
          H6 = ((G - B) / C + 6) % 6;
          break;
        case G:
          H6 = (B - R) / C + 2;
          break;
        case B:
          H6 = (R - G) / C + 4;
          break;
      }
      return [H6 / 6, S, L2 / 2];
    }
    function hsl2RGB(hsl) {
      var H = hsl[0], S = hsl[1], L = hsl[2];
      var C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C / 2;
      var rgb = [m, m, m], h6 = 6 * H;
      var X;
      if (S !== 0)
        switch (h6 | 0) {
          case 0:
          case 6:
            X = C * h6;
            rgb[0] += C;
            rgb[1] += X;
            break;
          case 1:
            X = C * (2 - h6);
            rgb[0] += X;
            rgb[1] += C;
            break;
          case 2:
            X = C * (h6 - 2);
            rgb[1] += C;
            rgb[2] += X;
            break;
          case 3:
            X = C * (4 - h6);
            rgb[1] += X;
            rgb[2] += C;
            break;
          case 4:
            X = C * (h6 - 4);
            rgb[2] += C;
            rgb[0] += X;
            break;
          case 5:
            X = C * (6 - h6);
            rgb[2] += X;
            rgb[0] += C;
            break;
        }
      for (var i3 = 0; i3 != 3; ++i3)
        rgb[i3] = Math.round(rgb[i3] * 255);
      return rgb;
    }
    function rgb_tint(hex, tint) {
      if (tint === 0)
        return hex;
      var hsl = rgb2HSL(hex2RGB(hex));
      if (tint < 0)
        hsl[2] = hsl[2] * (1 + tint);
      else
        hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);
      return rgb2Hex(hsl2RGB(hsl));
    }
    var DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;
    function width2px(width) {
      return Math.floor((width + Math.round(128 / MDW) / 256) * MDW);
    }
    function px2char(px) {
      return Math.floor((px - 5) / MDW * 100 + 0.5) / 100;
    }
    function char2width(chr) {
      return Math.round((chr * MDW + 5) / MDW * 256) / 256;
    }
    function cycle_width(collw) {
      return char2width(px2char(width2px(collw)));
    }
    function find_mdw_colw(collw) {
      var delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW;
      if (delta > 5e-3) {
        for (MDW = MIN_MDW; MDW < MAX_MDW; ++MDW)
          if (Math.abs(collw - cycle_width(collw)) <= delta) {
            delta = Math.abs(collw - cycle_width(collw));
            _MDW = MDW;
          }
      }
      MDW = _MDW;
    }
    function process_col(coll) {
      if (coll.width) {
        coll.wpx = width2px(coll.width);
        coll.wch = px2char(coll.wpx);
        coll.MDW = MDW;
      } else if (coll.wpx) {
        coll.wch = px2char(coll.wpx);
        coll.width = char2width(coll.wch);
        coll.MDW = MDW;
      } else if (typeof coll.wch == "number") {
        coll.width = char2width(coll.wch);
        coll.wpx = width2px(coll.width);
        coll.MDW = MDW;
      }
      if (coll.customWidth)
        delete coll.customWidth;
    }
    var DEF_PPI = 96, PPI = DEF_PPI;
    function px2pt(px) {
      return px * 96 / PPI;
    }
    function pt2px(pt) {
      return pt * PPI / 96;
    }
    var XLMLPatternTypeMap = {
      "None": "none",
      "Solid": "solid",
      "Gray50": "mediumGray",
      "Gray75": "darkGray",
      "Gray25": "lightGray",
      "HorzStripe": "darkHorizontal",
      "VertStripe": "darkVertical",
      "ReverseDiagStripe": "darkDown",
      "DiagStripe": "darkUp",
      "DiagCross": "darkGrid",
      "ThickDiagCross": "darkTrellis",
      "ThinHorzStripe": "lightHorizontal",
      "ThinVertStripe": "lightVertical",
      "ThinReverseDiagStripe": "lightDown",
      "ThinHorzCross": "lightGrid"
    };
    function parse_borders(t, styles, themes, opts) {
      styles.Borders = [];
      var border = {};
      var pass = false;
      (t[0].match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        switch (strip_ns(y[0])) {
          case "<borders":
          case "<borders>":
          case "</borders>":
            break;
          case "<border":
          case "<border>":
          case "<border/>":
            border = {};
            if (y.diagonalUp)
              border.diagonalUp = parsexmlbool(y.diagonalUp);
            if (y.diagonalDown)
              border.diagonalDown = parsexmlbool(y.diagonalDown);
            styles.Borders.push(border);
            break;
          case "</border>":
            break;
          case "<left/>":
            break;
          case "<left":
          case "<left>":
            break;
          case "</left>":
            break;
          case "<right/>":
            break;
          case "<right":
          case "<right>":
            break;
          case "</right>":
            break;
          case "<top/>":
            break;
          case "<top":
          case "<top>":
            break;
          case "</top>":
            break;
          case "<bottom/>":
            break;
          case "<bottom":
          case "<bottom>":
            break;
          case "</bottom>":
            break;
          case "<diagonal":
          case "<diagonal>":
          case "<diagonal/>":
            break;
          case "</diagonal>":
            break;
          case "<horizontal":
          case "<horizontal>":
          case "<horizontal/>":
            break;
          case "</horizontal>":
            break;
          case "<vertical":
          case "<vertical>":
          case "<vertical/>":
            break;
          case "</vertical>":
            break;
          case "<start":
          case "<start>":
          case "<start/>":
            break;
          case "</start>":
            break;
          case "<end":
          case "<end>":
          case "<end/>":
            break;
          case "</end>":
            break;
          case "<color":
          case "<color>":
            break;
          case "<color/>":
          case "</color>":
            break;
          case "<extLst":
          case "<extLst>":
          case "</extLst>":
            break;
          case "<ext":
            pass = true;
            break;
          case "</ext>":
            pass = false;
            break;
          default:
            if (opts && opts.WTF) {
              if (!pass)
                throw new Error("unrecognized " + y[0] + " in borders");
            }
        }
      });
    }
    function parse_fills(t, styles, themes, opts) {
      styles.Fills = [];
      var fill2 = {};
      var pass = false;
      (t[0].match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        switch (strip_ns(y[0])) {
          case "<fills":
          case "<fills>":
          case "</fills>":
            break;
          case "<fill>":
          case "<fill":
          case "<fill/>":
            fill2 = {};
            styles.Fills.push(fill2);
            break;
          case "</fill>":
            break;
          case "<gradientFill>":
            break;
          case "<gradientFill":
          case "</gradientFill>":
            styles.Fills.push(fill2);
            fill2 = {};
            break;
          case "<patternFill":
          case "<patternFill>":
            if (y.patternType)
              fill2.patternType = y.patternType;
            break;
          case "<patternFill/>":
          case "</patternFill>":
            break;
          case "<bgColor":
            if (!fill2.bgColor)
              fill2.bgColor = {};
            if (y.indexed)
              fill2.bgColor.indexed = parseInt(y.indexed, 10);
            if (y.theme)
              fill2.bgColor.theme = parseInt(y.theme, 10);
            if (y.tint)
              fill2.bgColor.tint = parseFloat(y.tint);
            if (y.rgb)
              fill2.bgColor.rgb = y.rgb.slice(-6);
            break;
          case "<bgColor/>":
          case "</bgColor>":
            break;
          case "<fgColor":
            if (!fill2.fgColor)
              fill2.fgColor = {};
            if (y.theme)
              fill2.fgColor.theme = parseInt(y.theme, 10);
            if (y.tint)
              fill2.fgColor.tint = parseFloat(y.tint);
            if (y.rgb != null)
              fill2.fgColor.rgb = y.rgb.slice(-6);
            break;
          case "<fgColor/>":
          case "</fgColor>":
            break;
          case "<stop":
          case "<stop/>":
            break;
          case "</stop>":
            break;
          case "<color":
          case "<color/>":
            break;
          case "</color>":
            break;
          case "<extLst":
          case "<extLst>":
          case "</extLst>":
            break;
          case "<ext":
            pass = true;
            break;
          case "</ext>":
            pass = false;
            break;
          default:
            if (opts && opts.WTF) {
              if (!pass)
                throw new Error("unrecognized " + y[0] + " in fills");
            }
        }
      });
    }
    function parse_fonts(t, styles, themes, opts) {
      styles.Fonts = [];
      var font = {};
      var pass = false;
      (t[0].match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        switch (strip_ns(y[0])) {
          case "<fonts":
          case "<fonts>":
          case "</fonts>":
            break;
          case "<font":
          case "<font>":
            break;
          case "</font>":
          case "<font/>":
            styles.Fonts.push(font);
            font = {};
            break;
          case "<name":
            if (y.val)
              font.name = utf8read(y.val);
            break;
          case "<name/>":
          case "</name>":
            break;
          case "<b":
            font.bold = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<b/>":
            font.bold = 1;
            break;
          case "<i":
            font.italic = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<i/>":
            font.italic = 1;
            break;
          case "<u":
            switch (y.val) {
              case "none":
                font.underline = 0;
                break;
              case "single":
                font.underline = 1;
                break;
              case "double":
                font.underline = 2;
                break;
              case "singleAccounting":
                font.underline = 33;
                break;
              case "doubleAccounting":
                font.underline = 34;
                break;
            }
            break;
          case "<u/>":
            font.underline = 1;
            break;
          case "<strike":
            font.strike = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<strike/>":
            font.strike = 1;
            break;
          case "<outline":
            font.outline = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<outline/>":
            font.outline = 1;
            break;
          case "<shadow":
            font.shadow = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<shadow/>":
            font.shadow = 1;
            break;
          case "<condense":
            font.condense = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<condense/>":
            font.condense = 1;
            break;
          case "<extend":
            font.extend = y.val ? parsexmlbool(y.val) : 1;
            break;
          case "<extend/>":
            font.extend = 1;
            break;
          case "<sz":
            if (y.val)
              font.sz = +y.val;
            break;
          case "<sz/>":
          case "</sz>":
            break;
          case "<vertAlign":
            if (y.val)
              font.vertAlign = y.val;
            break;
          case "<vertAlign/>":
          case "</vertAlign>":
            break;
          case "<family":
            if (y.val)
              font.family = parseInt(y.val, 10);
            break;
          case "<family/>":
          case "</family>":
            break;
          case "<scheme":
            if (y.val)
              font.scheme = y.val;
            break;
          case "<scheme/>":
          case "</scheme>":
            break;
          case "<charset":
            if (y.val == "1")
              break;
            y.codepage = CS2CP[parseInt(y.val, 10)];
            break;
          case "<color":
            if (!font.color)
              font.color = {};
            if (y.auto)
              font.color.auto = parsexmlbool(y.auto);
            if (y.rgb)
              font.color.rgb = y.rgb.slice(-6);
            else if (y.indexed) {
              font.color.index = parseInt(y.indexed, 10);
              var icv = XLSIcv[font.color.index];
              if (font.color.index == 81)
                icv = XLSIcv[1];
              if (!icv)
                throw new Error(x);
              font.color.rgb = icv[0].toString(16) + icv[1].toString(16) + icv[2].toString(16);
            } else if (y.theme) {
              font.color.theme = parseInt(y.theme, 10);
              if (y.tint)
                font.color.tint = parseFloat(y.tint);
              if (y.theme && themes.themeElements && themes.themeElements.clrScheme) {
                font.color.rgb = rgb_tint(themes.themeElements.clrScheme[font.color.theme].rgb, font.color.tint || 0);
              }
            }
            break;
          case "<color/>":
          case "</color>":
            break;
          case "<AlternateContent":
            pass = true;
            break;
          case "</AlternateContent>":
            pass = false;
            break;
          case "<extLst":
          case "<extLst>":
          case "</extLst>":
            break;
          case "<ext":
            pass = true;
            break;
          case "</ext>":
            pass = false;
            break;
          default:
            if (opts && opts.WTF) {
              if (!pass)
                throw new Error("unrecognized " + y[0] + " in fonts");
            }
        }
      });
    }
    function parse_numFmts(t, styles, opts) {
      styles.NumberFmt = [];
      var k = keys(SSF._table);
      for (var i3 = 0; i3 < k.length; ++i3)
        styles.NumberFmt[k[i3]] = SSF._table[k[i3]];
      var m = t[0].match(tagregex);
      if (!m)
        return;
      for (i3 = 0; i3 < m.length; ++i3) {
        var y = parsexmltag(m[i3]);
        switch (strip_ns(y[0])) {
          case "<numFmts":
          case "</numFmts>":
          case "<numFmts/>":
          case "<numFmts>":
            break;
          case "<numFmt":
            {
              var f = unescapexml(utf8read(y.formatCode)), j2 = parseInt(y.numFmtId, 10);
              styles.NumberFmt[j2] = f;
              if (j2 > 0) {
                if (j2 > 392) {
                  for (j2 = 392; j2 > 60; --j2)
                    if (styles.NumberFmt[j2] == null)
                      break;
                  styles.NumberFmt[j2] = f;
                }
                SSF.load(f, j2);
              }
            }
            break;
          case "</numFmt>":
            break;
          default:
            if (opts.WTF)
              throw new Error("unrecognized " + y[0] + " in numFmts");
        }
      }
    }
    function write_numFmts(NF) {
      var o = ["<numFmts>"];
      [[5, 8], [23, 26], [41, 44], [
        /*63*/
        50,
        /*66],[164,*/
        392
      ]].forEach(function(r) {
        for (var i3 = r[0]; i3 <= r[1]; ++i3)
          if (NF[i3] != null)
            o[o.length] = writextag("numFmt", null, { numFmtId: i3, formatCode: escapexml(NF[i3]) });
      });
      if (o.length === 1)
        return "";
      o[o.length] = "</numFmts>";
      o[0] = writextag("numFmts", null, { count: o.length - 2 }).replace("/>", ">");
      return o.join("");
    }
    var cellXF_uint = ["numFmtId", "fillId", "fontId", "borderId", "xfId"];
    var cellXF_bool = ["applyAlignment", "applyBorder", "applyFill", "applyFont", "applyNumberFormat", "applyProtection", "pivotButton", "quotePrefix"];
    function parse_cellXfs(t, styles, opts) {
      styles.CellXf = [];
      var xf;
      var pass = false;
      (t[0].match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x), i3 = 0;
        switch (strip_ns(y[0])) {
          case "<cellXfs":
          case "<cellXfs>":
          case "<cellXfs/>":
          case "</cellXfs>":
            break;
          case "<xf":
          case "<xf/>":
            xf = y;
            delete xf[0];
            for (i3 = 0; i3 < cellXF_uint.length; ++i3)
              if (xf[cellXF_uint[i3]])
                xf[cellXF_uint[i3]] = parseInt(xf[cellXF_uint[i3]], 10);
            for (i3 = 0; i3 < cellXF_bool.length; ++i3)
              if (xf[cellXF_bool[i3]])
                xf[cellXF_bool[i3]] = parsexmlbool(xf[cellXF_bool[i3]]);
            if (xf.numFmtId > 392) {
              for (i3 = 392; i3 > 60; --i3)
                if (styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i3]) {
                  xf.numFmtId = i3;
                  break;
                }
            }
            styles.CellXf.push(xf);
            break;
          case "</xf>":
            break;
          case "<alignment":
          case "<alignment/>":
            var alignment = {};
            if (y.vertical)
              alignment.vertical = y.vertical;
            if (y.horizontal)
              alignment.horizontal = y.horizontal;
            if (y.textRotation != null)
              alignment.textRotation = y.textRotation;
            if (y.indent)
              alignment.indent = y.indent;
            if (y.wrapText)
              alignment.wrapText = parsexmlbool(y.wrapText);
            xf.alignment = alignment;
            break;
          case "</alignment>":
            break;
          case "<protection":
            break;
          case "</protection>":
          case "<protection/>":
            break;
          case "<AlternateContent":
            pass = true;
            break;
          case "</AlternateContent>":
            pass = false;
            break;
          case "<extLst":
          case "<extLst>":
          case "</extLst>":
            break;
          case "<ext":
            pass = true;
            break;
          case "</ext>":
            pass = false;
            break;
          default:
            if (opts && opts.WTF) {
              if (!pass)
                throw new Error("unrecognized " + y[0] + " in cellXfs");
            }
        }
      });
    }
    function write_cellXfs(cellXfs) {
      var o = [];
      o[o.length] = writextag("cellXfs", null);
      cellXfs.forEach(function(c) {
        o[o.length] = writextag("xf", null, c);
      });
      o[o.length] = "</cellXfs>";
      if (o.length === 2)
        return "";
      o[0] = writextag("cellXfs", null, { count: o.length - 2 }).replace("/>", ">");
      return o.join("");
    }
    var parse_sty_xml = function make_pstyx() {
      var numFmtRegex = /<(?:\w+:)?numFmts([^>]*)>[\S\s]*?<\/(?:\w+:)?numFmts>/;
      var cellXfRegex = /<(?:\w+:)?cellXfs([^>]*)>[\S\s]*?<\/(?:\w+:)?cellXfs>/;
      var fillsRegex = /<(?:\w+:)?fills([^>]*)>[\S\s]*?<\/(?:\w+:)?fills>/;
      var fontsRegex = /<(?:\w+:)?fonts([^>]*)>[\S\s]*?<\/(?:\w+:)?fonts>/;
      var bordersRegex = /<(?:\w+:)?borders([^>]*)>[\S\s]*?<\/(?:\w+:)?borders>/;
      return function parse_sty_xml2(data, themes, opts) {
        var styles = {};
        if (!data)
          return styles;
        data = data.replace(/<!--([\s\S]*?)-->/mg, "").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm, "");
        var t;
        if (t = data.match(numFmtRegex))
          parse_numFmts(t, styles, opts);
        if (t = data.match(fontsRegex))
          parse_fonts(t, styles, themes, opts);
        if (t = data.match(fillsRegex))
          parse_fills(t, styles, themes, opts);
        if (t = data.match(bordersRegex))
          parse_borders(t, styles, themes, opts);
        if (t = data.match(cellXfRegex))
          parse_cellXfs(t, styles, opts);
        return styles;
      };
    }();
    var STYLES_XML_ROOT = writextag("styleSheet", null, {
      "xmlns": XMLNS.main[0],
      "xmlns:vt": XMLNS.vt
    });
    RELS.STY = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles";
    function write_sty_xml(wb, opts) {
      var o = [XML_HEADER, STYLES_XML_ROOT], w;
      if (wb.SSF && (w = write_numFmts(wb.SSF)) != null)
        o[o.length] = w;
      o[o.length] = '<fonts count="1"><font><sz val="12"/><color theme="1"/><name val="Calibri"/><family val="2"/><scheme val="minor"/></font></fonts>';
      o[o.length] = '<fills count="2"><fill><patternFill patternType="none"/></fill><fill><patternFill patternType="gray125"/></fill></fills>';
      o[o.length] = '<borders count="1"><border><left/><right/><top/><bottom/><diagonal/></border></borders>';
      o[o.length] = '<cellStyleXfs count="1"><xf numFmtId="0" fontId="0" fillId="0" borderId="0"/></cellStyleXfs>';
      if (w = write_cellXfs(opts.cellXfs))
        o[o.length] = w;
      o[o.length] = '<cellStyles count="1"><cellStyle name="Normal" xfId="0" builtinId="0"/></cellStyles>';
      o[o.length] = '<dxfs count="0"/>';
      o[o.length] = '<tableStyles count="0" defaultTableStyle="TableStyleMedium9" defaultPivotStyle="PivotStyleMedium4"/>';
      if (o.length > 2) {
        o[o.length] = "</styleSheet>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    function parse_BrtFmt(data, length) {
      var numFmtId = data.read_shift(2);
      var stFmtCode = parse_XLWideString(data);
      return [numFmtId, stFmtCode];
    }
    function write_BrtFmt(i3, f, o) {
      if (!o)
        o = new_buf(6 + 4 * f.length);
      o.write_shift(2, i3);
      write_XLWideString(f, o);
      var out = o.length > o.l ? o.slice(0, o.l) : o;
      if (o.l == null)
        o.l = o.length;
      return out;
    }
    function parse_BrtFont(data, length, opts) {
      var out = {};
      out.sz = data.read_shift(2) / 20;
      var grbit = parse_FontFlags(data);
      if (grbit.fItalic)
        out.italic = 1;
      if (grbit.fCondense)
        out.condense = 1;
      if (grbit.fExtend)
        out.extend = 1;
      if (grbit.fShadow)
        out.shadow = 1;
      if (grbit.fOutline)
        out.outline = 1;
      if (grbit.fStrikeout)
        out.strike = 1;
      var bls = data.read_shift(2);
      if (bls === 700)
        out.bold = 1;
      switch (data.read_shift(2)) {
        case 1:
          out.vertAlign = "superscript";
          break;
        case 2:
          out.vertAlign = "subscript";
          break;
      }
      var underline = data.read_shift(1);
      if (underline != 0)
        out.underline = underline;
      var family = data.read_shift(1);
      if (family > 0)
        out.family = family;
      var bCharSet = data.read_shift(1);
      if (bCharSet > 0)
        out.charset = bCharSet;
      data.l++;
      out.color = parse_BrtColor(data);
      switch (data.read_shift(1)) {
        case 1:
          out.scheme = "major";
          break;
        case 2:
          out.scheme = "minor";
          break;
      }
      out.name = parse_XLWideString(data);
      return out;
    }
    function write_BrtFont(font, o) {
      if (!o)
        o = new_buf(25 + 4 * 32);
      o.write_shift(2, font.sz * 20);
      write_FontFlags(font, o);
      o.write_shift(2, font.bold ? 700 : 400);
      var sss = 0;
      if (font.vertAlign == "superscript")
        sss = 1;
      else if (font.vertAlign == "subscript")
        sss = 2;
      o.write_shift(2, sss);
      o.write_shift(1, font.underline || 0);
      o.write_shift(1, font.family || 0);
      o.write_shift(1, font.charset || 0);
      o.write_shift(1, 0);
      write_BrtColor(font.color, o);
      var scheme = 0;
      if (font.scheme == "major")
        scheme = 1;
      if (font.scheme == "minor")
        scheme = 2;
      o.write_shift(1, scheme);
      write_XLWideString(font.name, o);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    var XLSBFillPTNames = [
      "none",
      "solid",
      "mediumGray",
      "darkGray",
      "lightGray",
      "darkHorizontal",
      "darkVertical",
      "darkDown",
      "darkUp",
      "darkGrid",
      "darkTrellis",
      "lightHorizontal",
      "lightVertical",
      "lightDown",
      "lightUp",
      "lightGrid",
      "lightTrellis",
      "gray125",
      "gray0625"
    ];
    var rev_XLSBFillPTNames = evert(XLSBFillPTNames);
    var parse_BrtFill = parsenoop;
    function write_BrtFill(fill2, o) {
      if (!o)
        o = new_buf(4 * 3 + 8 * 7 + 16 * 1);
      var fls = rev_XLSBFillPTNames[fill2.patternType];
      if (fls == null)
        fls = 40;
      o.write_shift(4, fls);
      var j2 = 0;
      if (fls != 40) {
        write_BrtColor({ auto: 1 }, o);
        write_BrtColor({ auto: 1 }, o);
        for (; j2 < 12; ++j2)
          o.write_shift(4, 0);
      } else {
        for (; j2 < 4; ++j2)
          o.write_shift(4, 0);
        for (; j2 < 12; ++j2)
          o.write_shift(4, 0);
      }
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function parse_BrtXF(data, length) {
      var tgt = data.l + length;
      var ixfeParent = data.read_shift(2);
      var ifmt = data.read_shift(2);
      data.l = tgt;
      return { ixfe: ixfeParent, numFmtId: ifmt };
    }
    function write_BrtXF(data, ixfeP, o) {
      if (!o)
        o = new_buf(16);
      o.write_shift(2, ixfeP || 0);
      o.write_shift(2, data.numFmtId || 0);
      o.write_shift(2, 0);
      o.write_shift(2, 0);
      o.write_shift(2, 0);
      o.write_shift(1, 0);
      o.write_shift(1, 0);
      var flow = 0;
      o.write_shift(1, flow);
      o.write_shift(1, 0);
      o.write_shift(1, 0);
      o.write_shift(1, 0);
      return o;
    }
    function write_Blxf(data, o) {
      if (!o)
        o = new_buf(10);
      o.write_shift(1, 0);
      o.write_shift(1, 0);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      return o;
    }
    var parse_BrtBorder = parsenoop;
    function write_BrtBorder(border, o) {
      if (!o)
        o = new_buf(51);
      o.write_shift(1, 0);
      write_Blxf(null, o);
      write_Blxf(null, o);
      write_Blxf(null, o);
      write_Blxf(null, o);
      write_Blxf(null, o);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function write_BrtStyle(style, o) {
      if (!o)
        o = new_buf(12 + 4 * 10);
      o.write_shift(4, style.xfId);
      o.write_shift(2, 1);
      o.write_shift(1, +style.builtinId);
      o.write_shift(1, 0);
      write_XLNullableWideString(style.name || "", o);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {
      var o = new_buf(4 + 256 * 2 * 4);
      o.write_shift(4, cnt);
      write_XLNullableWideString(defTableStyle, o);
      write_XLNullableWideString(defPivotStyle, o);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function parse_sty_bin(data, themes, opts) {
      var styles = {};
      styles.NumberFmt = [];
      for (var y in SSF._table)
        styles.NumberFmt[y] = SSF._table[y];
      styles.CellXf = [];
      styles.Fonts = [];
      var state = [];
      var pass = false;
      recordhopper(data, function hopper_sty(val, R_n, RT) {
        switch (RT) {
          case 44:
            styles.NumberFmt[val[0]] = val[1];
            SSF.load(val[1], val[0]);
            break;
          case 43:
            styles.Fonts.push(val);
            if (val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) {
              val.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0);
            }
            break;
          case 1025:
            break;
          case 45:
            break;
          case 46:
            break;
          case 47:
            if (state[state.length - 1] == "BrtBeginCellXFs") {
              styles.CellXf.push(val);
            }
            break;
          case 48:
          case 507:
          case 572:
          case 475:
            break;
          case 1171:
          case 2102:
          case 1130:
          case 512:
          case 2095:
          case 3072:
            break;
          case 35:
            pass = true;
            break;
          case 36:
            pass = false;
            break;
          case 37:
            state.push(R_n);
            pass = true;
            break;
          case 38:
            state.pop();
            pass = false;
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              state.push(R_n);
            else if ((R_n || "").indexOf("End") > 0)
              state.pop();
            else if (!pass || opts.WTF && state[state.length - 1] != "BrtACBegin")
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      });
      return styles;
    }
    function write_FMTS_bin(ba, NF) {
      if (!NF)
        return;
      var cnt = 0;
      [[5, 8], [23, 26], [41, 44], [
        /*63*/
        50,
        /*66],[164,*/
        392
      ]].forEach(function(r) {
        for (var i3 = r[0]; i3 <= r[1]; ++i3)
          if (NF[i3] != null)
            ++cnt;
      });
      if (cnt == 0)
        return;
      write_record(ba, "BrtBeginFmts", write_UInt32LE(cnt));
      [[5, 8], [23, 26], [41, 44], [
        /*63*/
        50,
        /*66],[164,*/
        392
      ]].forEach(function(r) {
        for (var i3 = r[0]; i3 <= r[1]; ++i3)
          if (NF[i3] != null)
            write_record(ba, "BrtFmt", write_BrtFmt(i3, NF[i3]));
      });
      write_record(ba, "BrtEndFmts");
    }
    function write_FONTS_bin(ba) {
      var cnt = 1;
      write_record(ba, "BrtBeginFonts", write_UInt32LE(cnt));
      write_record(ba, "BrtFont", write_BrtFont({
        sz: 12,
        color: { theme: 1 },
        name: "Calibri",
        family: 2,
        scheme: "minor"
      }));
      write_record(ba, "BrtEndFonts");
    }
    function write_FILLS_bin(ba) {
      var cnt = 2;
      write_record(ba, "BrtBeginFills", write_UInt32LE(cnt));
      write_record(ba, "BrtFill", write_BrtFill({ patternType: "none" }));
      write_record(ba, "BrtFill", write_BrtFill({ patternType: "gray125" }));
      write_record(ba, "BrtEndFills");
    }
    function write_BORDERS_bin(ba) {
      var cnt = 1;
      write_record(ba, "BrtBeginBorders", write_UInt32LE(cnt));
      write_record(ba, "BrtBorder", write_BrtBorder());
      write_record(ba, "BrtEndBorders");
    }
    function write_CELLSTYLEXFS_bin(ba) {
      var cnt = 1;
      write_record(ba, "BrtBeginCellStyleXFs", write_UInt32LE(cnt));
      write_record(ba, "BrtXF", write_BrtXF({
        numFmtId: 0,
        fontId: 0,
        fillId: 0,
        borderId: 0
      }, 65535));
      write_record(ba, "BrtEndCellStyleXFs");
    }
    function write_CELLXFS_bin(ba, data) {
      write_record(ba, "BrtBeginCellXFs", write_UInt32LE(data.length));
      data.forEach(function(c) {
        write_record(ba, "BrtXF", write_BrtXF(c, 0));
      });
      write_record(ba, "BrtEndCellXFs");
    }
    function write_STYLES_bin(ba) {
      var cnt = 1;
      write_record(ba, "BrtBeginStyles", write_UInt32LE(cnt));
      write_record(ba, "BrtStyle", write_BrtStyle({
        xfId: 0,
        builtinId: 0,
        name: "Normal"
      }));
      write_record(ba, "BrtEndStyles");
    }
    function write_DXFS_bin(ba) {
      var cnt = 0;
      write_record(ba, "BrtBeginDXFs", write_UInt32LE(cnt));
      write_record(ba, "BrtEndDXFs");
    }
    function write_TABLESTYLES_bin(ba) {
      var cnt = 0;
      write_record(ba, "BrtBeginTableStyles", write_BrtBeginTableStyles(cnt, "TableStyleMedium9", "PivotStyleMedium4"));
      write_record(ba, "BrtEndTableStyles");
    }
    function write_sty_bin(wb, opts) {
      var ba = buf_array();
      write_record(ba, "BrtBeginStyleSheet");
      write_FMTS_bin(ba, wb.SSF);
      write_FONTS_bin(ba);
      write_FILLS_bin(ba);
      write_BORDERS_bin(ba);
      write_CELLSTYLEXFS_bin(ba);
      write_CELLXFS_bin(ba, opts.cellXfs);
      write_STYLES_bin(ba);
      write_DXFS_bin(ba);
      write_TABLESTYLES_bin(ba);
      write_record(ba, "BrtEndStyleSheet");
      return ba.end();
    }
    RELS.THEME = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme";
    var XLSXThemeClrScheme = [
      "</a:lt1>",
      "</a:dk1>",
      "</a:lt2>",
      "</a:dk2>",
      "</a:accent1>",
      "</a:accent2>",
      "</a:accent3>",
      "</a:accent4>",
      "</a:accent5>",
      "</a:accent6>",
      "</a:hlink>",
      "</a:folHlink>"
    ];
    function parse_clrScheme(t, themes, opts) {
      themes.themeElements.clrScheme = [];
      var color = {};
      (t[0].match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        switch (y[0]) {
          case "<a:clrScheme":
          case "</a:clrScheme>":
            break;
          case "<a:srgbClr":
            color.rgb = y.val;
            break;
          case "<a:sysClr":
            color.rgb = y.lastClr;
            break;
          case "<a:dk1>":
          case "</a:dk1>":
          case "<a:lt1>":
          case "</a:lt1>":
          case "<a:dk2>":
          case "</a:dk2>":
          case "<a:lt2>":
          case "</a:lt2>":
          case "<a:accent1>":
          case "</a:accent1>":
          case "<a:accent2>":
          case "</a:accent2>":
          case "<a:accent3>":
          case "</a:accent3>":
          case "<a:accent4>":
          case "</a:accent4>":
          case "<a:accent5>":
          case "</a:accent5>":
          case "<a:accent6>":
          case "</a:accent6>":
          case "<a:hlink>":
          case "</a:hlink>":
          case "<a:folHlink>":
          case "</a:folHlink>":
            if (y[0].charAt(1) === "/") {
              themes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;
              color = {};
            } else {
              color.name = y[0].slice(3, y[0].length - 1);
            }
            break;
          default:
            if (opts && opts.WTF)
              throw new Error("Unrecognized " + y[0] + " in clrScheme");
        }
      });
    }
    function parse_fontScheme() {
    }
    function parse_fmtScheme() {
    }
    var clrsregex = /<a:clrScheme([^>]*)>[\s\S]*<\/a:clrScheme>/;
    var fntsregex = /<a:fontScheme([^>]*)>[\s\S]*<\/a:fontScheme>/;
    var fmtsregex = /<a:fmtScheme([^>]*)>[\s\S]*<\/a:fmtScheme>/;
    function parse_themeElements(data, themes, opts) {
      themes.themeElements = {};
      var t;
      [
        /* clrScheme CT_ColorScheme */
        ["clrScheme", clrsregex, parse_clrScheme],
        /* fontScheme CT_FontScheme */
        ["fontScheme", fntsregex, parse_fontScheme],
        /* fmtScheme CT_StyleMatrix */
        ["fmtScheme", fmtsregex, parse_fmtScheme]
      ].forEach(function(m) {
        if (!(t = data.match(m[1])))
          throw new Error(m[0] + " not found in themeElements");
        m[2](t, themes, opts);
      });
    }
    var themeltregex = /<a:themeElements([^>]*)>[\s\S]*<\/a:themeElements>/;
    function parse_theme_xml(data, opts) {
      if (!data || data.length === 0)
        return parse_theme_xml(write_theme());
      var t;
      var themes = {};
      if (!(t = data.match(themeltregex)))
        throw new Error("themeElements not found in theme");
      parse_themeElements(t[0], themes, opts);
      themes.raw = data;
      return themes;
    }
    function write_theme(Themes, opts) {
      if (opts && opts.themeXLSX)
        return opts.themeXLSX;
      if (Themes && typeof Themes.raw == "string")
        return Themes.raw;
      var o = [XML_HEADER];
      o[o.length] = '<a:theme xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" name="Office Theme">';
      o[o.length] = "<a:themeElements>";
      o[o.length] = '<a:clrScheme name="Office">';
      o[o.length] = '<a:dk1><a:sysClr val="windowText" lastClr="000000"/></a:dk1>';
      o[o.length] = '<a:lt1><a:sysClr val="window" lastClr="FFFFFF"/></a:lt1>';
      o[o.length] = '<a:dk2><a:srgbClr val="1F497D"/></a:dk2>';
      o[o.length] = '<a:lt2><a:srgbClr val="EEECE1"/></a:lt2>';
      o[o.length] = '<a:accent1><a:srgbClr val="4F81BD"/></a:accent1>';
      o[o.length] = '<a:accent2><a:srgbClr val="C0504D"/></a:accent2>';
      o[o.length] = '<a:accent3><a:srgbClr val="9BBB59"/></a:accent3>';
      o[o.length] = '<a:accent4><a:srgbClr val="8064A2"/></a:accent4>';
      o[o.length] = '<a:accent5><a:srgbClr val="4BACC6"/></a:accent5>';
      o[o.length] = '<a:accent6><a:srgbClr val="F79646"/></a:accent6>';
      o[o.length] = '<a:hlink><a:srgbClr val="0000FF"/></a:hlink>';
      o[o.length] = '<a:folHlink><a:srgbClr val="800080"/></a:folHlink>';
      o[o.length] = "</a:clrScheme>";
      o[o.length] = '<a:fontScheme name="Office">';
      o[o.length] = "<a:majorFont>";
      o[o.length] = '<a:latin typeface="Cambria"/>';
      o[o.length] = '<a:ea typeface=""/>';
      o[o.length] = '<a:cs typeface=""/>';
      o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
      o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
      o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
      o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
      o[o.length] = '<a:font script="Arab" typeface="Times New Roman"/>';
      o[o.length] = '<a:font script="Hebr" typeface="Times New Roman"/>';
      o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
      o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
      o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
      o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
      o[o.length] = '<a:font script="Khmr" typeface="MoolBoran"/>';
      o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
      o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
      o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
      o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
      o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
      o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
      o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
      o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
      o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
      o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
      o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
      o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
      o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
      o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
      o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
      o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
      o[o.length] = '<a:font script="Viet" typeface="Times New Roman"/>';
      o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
      o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
      o[o.length] = "</a:majorFont>";
      o[o.length] = "<a:minorFont>";
      o[o.length] = '<a:latin typeface="Calibri"/>';
      o[o.length] = '<a:ea typeface=""/>';
      o[o.length] = '<a:cs typeface=""/>';
      o[o.length] = '<a:font script="Jpan" typeface="MS Pゴシック"/>';
      o[o.length] = '<a:font script="Hang" typeface="맑은 고딕"/>';
      o[o.length] = '<a:font script="Hans" typeface="宋体"/>';
      o[o.length] = '<a:font script="Hant" typeface="新細明體"/>';
      o[o.length] = '<a:font script="Arab" typeface="Arial"/>';
      o[o.length] = '<a:font script="Hebr" typeface="Arial"/>';
      o[o.length] = '<a:font script="Thai" typeface="Tahoma"/>';
      o[o.length] = '<a:font script="Ethi" typeface="Nyala"/>';
      o[o.length] = '<a:font script="Beng" typeface="Vrinda"/>';
      o[o.length] = '<a:font script="Gujr" typeface="Shruti"/>';
      o[o.length] = '<a:font script="Khmr" typeface="DaunPenh"/>';
      o[o.length] = '<a:font script="Knda" typeface="Tunga"/>';
      o[o.length] = '<a:font script="Guru" typeface="Raavi"/>';
      o[o.length] = '<a:font script="Cans" typeface="Euphemia"/>';
      o[o.length] = '<a:font script="Cher" typeface="Plantagenet Cherokee"/>';
      o[o.length] = '<a:font script="Yiii" typeface="Microsoft Yi Baiti"/>';
      o[o.length] = '<a:font script="Tibt" typeface="Microsoft Himalaya"/>';
      o[o.length] = '<a:font script="Thaa" typeface="MV Boli"/>';
      o[o.length] = '<a:font script="Deva" typeface="Mangal"/>';
      o[o.length] = '<a:font script="Telu" typeface="Gautami"/>';
      o[o.length] = '<a:font script="Taml" typeface="Latha"/>';
      o[o.length] = '<a:font script="Syrc" typeface="Estrangelo Edessa"/>';
      o[o.length] = '<a:font script="Orya" typeface="Kalinga"/>';
      o[o.length] = '<a:font script="Mlym" typeface="Kartika"/>';
      o[o.length] = '<a:font script="Laoo" typeface="DokChampa"/>';
      o[o.length] = '<a:font script="Sinh" typeface="Iskoola Pota"/>';
      o[o.length] = '<a:font script="Mong" typeface="Mongolian Baiti"/>';
      o[o.length] = '<a:font script="Viet" typeface="Arial"/>';
      o[o.length] = '<a:font script="Uigh" typeface="Microsoft Uighur"/>';
      o[o.length] = '<a:font script="Geor" typeface="Sylfaen"/>';
      o[o.length] = "</a:minorFont>";
      o[o.length] = "</a:fontScheme>";
      o[o.length] = '<a:fmtScheme name="Office">';
      o[o.length] = "<a:fillStyleLst>";
      o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
      o[o.length] = '<a:gradFill rotWithShape="1">';
      o[o.length] = "<a:gsLst>";
      o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="50000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
      o[o.length] = '<a:gs pos="35000"><a:schemeClr val="phClr"><a:tint val="37000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
      o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="15000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
      o[o.length] = "</a:gsLst>";
      o[o.length] = '<a:lin ang="16200000" scaled="1"/>';
      o[o.length] = "</a:gradFill>";
      o[o.length] = '<a:gradFill rotWithShape="1">';
      o[o.length] = "<a:gsLst>";
      o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="100000"/><a:shade val="100000"/><a:satMod val="130000"/></a:schemeClr></a:gs>';
      o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:tint val="50000"/><a:shade val="100000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
      o[o.length] = "</a:gsLst>";
      o[o.length] = '<a:lin ang="16200000" scaled="0"/>';
      o[o.length] = "</a:gradFill>";
      o[o.length] = "</a:fillStyleLst>";
      o[o.length] = "<a:lnStyleLst>";
      o[o.length] = '<a:ln w="9525" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"><a:shade val="95000"/><a:satMod val="105000"/></a:schemeClr></a:solidFill><a:prstDash val="solid"/></a:ln>';
      o[o.length] = '<a:ln w="25400" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>';
      o[o.length] = '<a:ln w="38100" cap="flat" cmpd="sng" algn="ctr"><a:solidFill><a:schemeClr val="phClr"/></a:solidFill><a:prstDash val="solid"/></a:ln>';
      o[o.length] = "</a:lnStyleLst>";
      o[o.length] = "<a:effectStyleLst>";
      o[o.length] = "<a:effectStyle>";
      o[o.length] = "<a:effectLst>";
      o[o.length] = '<a:outerShdw blurRad="40000" dist="20000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="38000"/></a:srgbClr></a:outerShdw>';
      o[o.length] = "</a:effectLst>";
      o[o.length] = "</a:effectStyle>";
      o[o.length] = "<a:effectStyle>";
      o[o.length] = "<a:effectLst>";
      o[o.length] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>';
      o[o.length] = "</a:effectLst>";
      o[o.length] = "</a:effectStyle>";
      o[o.length] = "<a:effectStyle>";
      o[o.length] = "<a:effectLst>";
      o[o.length] = '<a:outerShdw blurRad="40000" dist="23000" dir="5400000" rotWithShape="0"><a:srgbClr val="000000"><a:alpha val="35000"/></a:srgbClr></a:outerShdw>';
      o[o.length] = "</a:effectLst>";
      o[o.length] = '<a:scene3d><a:camera prst="orthographicFront"><a:rot lat="0" lon="0" rev="0"/></a:camera><a:lightRig rig="threePt" dir="t"><a:rot lat="0" lon="0" rev="1200000"/></a:lightRig></a:scene3d>';
      o[o.length] = '<a:sp3d><a:bevelT w="63500" h="25400"/></a:sp3d>';
      o[o.length] = "</a:effectStyle>";
      o[o.length] = "</a:effectStyleLst>";
      o[o.length] = "<a:bgFillStyleLst>";
      o[o.length] = '<a:solidFill><a:schemeClr val="phClr"/></a:solidFill>';
      o[o.length] = '<a:gradFill rotWithShape="1">';
      o[o.length] = "<a:gsLst>";
      o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="40000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
      o[o.length] = '<a:gs pos="40000"><a:schemeClr val="phClr"><a:tint val="45000"/><a:shade val="99000"/><a:satMod val="350000"/></a:schemeClr></a:gs>';
      o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="20000"/><a:satMod val="255000"/></a:schemeClr></a:gs>';
      o[o.length] = "</a:gsLst>";
      o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="-80000" r="50000" b="180000"/></a:path>';
      o[o.length] = "</a:gradFill>";
      o[o.length] = '<a:gradFill rotWithShape="1">';
      o[o.length] = "<a:gsLst>";
      o[o.length] = '<a:gs pos="0"><a:schemeClr val="phClr"><a:tint val="80000"/><a:satMod val="300000"/></a:schemeClr></a:gs>';
      o[o.length] = '<a:gs pos="100000"><a:schemeClr val="phClr"><a:shade val="30000"/><a:satMod val="200000"/></a:schemeClr></a:gs>';
      o[o.length] = "</a:gsLst>";
      o[o.length] = '<a:path path="circle"><a:fillToRect l="50000" t="50000" r="50000" b="50000"/></a:path>';
      o[o.length] = "</a:gradFill>";
      o[o.length] = "</a:bgFillStyleLst>";
      o[o.length] = "</a:fmtScheme>";
      o[o.length] = "</a:themeElements>";
      o[o.length] = "<a:objectDefaults>";
      o[o.length] = "<a:spDef>";
      o[o.length] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="1"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="3"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="2"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></a:style>';
      o[o.length] = "</a:spDef>";
      o[o.length] = "<a:lnDef>";
      o[o.length] = '<a:spPr/><a:bodyPr/><a:lstStyle/><a:style><a:lnRef idx="2"><a:schemeClr val="accent1"/></a:lnRef><a:fillRef idx="0"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="1"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="tx1"/></a:fontRef></a:style>';
      o[o.length] = "</a:lnDef>";
      o[o.length] = "</a:objectDefaults>";
      o[o.length] = "<a:extraClrSchemeLst/>";
      o[o.length] = "</a:theme>";
      return o.join("");
    }
    function parse_Theme(blob, length, opts) {
      var end = blob.l + length;
      var dwThemeVersion = blob.read_shift(4);
      if (dwThemeVersion === 124226)
        return;
      if (!opts.cellStyles || !jszip2) {
        blob.l = end;
        return;
      }
      var data = blob.slice(blob.l);
      blob.l = end;
      var zip;
      try {
        zip = new jszip2(data);
      } catch (e) {
        return;
      }
      var themeXML = getzipstr(zip, "theme/theme/theme1.xml", true);
      if (!themeXML)
        return;
      return parse_theme_xml(themeXML, opts);
    }
    function parse_ColorTheme(blob) {
      return blob.read_shift(4);
    }
    function parse_FullColorExt(blob) {
      var o = {};
      o.xclrType = blob.read_shift(2);
      o.nTintShade = blob.read_shift(2);
      switch (o.xclrType) {
        case 0:
          blob.l += 4;
          break;
        case 1:
          o.xclrValue = parse_IcvXF(blob, 4);
          break;
        case 2:
          o.xclrValue = parse_LongRGBA(blob);
          break;
        case 3:
          o.xclrValue = parse_ColorTheme(blob);
          break;
        case 4:
          blob.l += 4;
          break;
      }
      blob.l += 8;
      return o;
    }
    function parse_IcvXF(blob, length) {
      return parsenoop(blob, length);
    }
    function parse_XFExtGradient(blob, length) {
      return parsenoop(blob, length);
    }
    function parse_ExtProp(blob) {
      var extType = blob.read_shift(2);
      var cb = blob.read_shift(2) - 4;
      var o = [extType];
      switch (extType) {
        case 4:
        case 5:
        case 7:
        case 8:
        case 9:
        case 10:
        case 11:
        case 13:
          o[1] = parse_FullColorExt(blob);
          break;
        case 6:
          o[1] = parse_XFExtGradient(blob, cb);
          break;
        case 14:
        case 15:
          o[1] = blob.read_shift(cb === 1 ? 1 : 2);
          break;
        default:
          throw new Error("Unrecognized ExtProp type: " + extType + " " + cb);
      }
      return o;
    }
    function parse_XFExt(blob, length) {
      var end = blob.l + length;
      blob.l += 2;
      var ixfe = blob.read_shift(2);
      blob.l += 2;
      var cexts = blob.read_shift(2);
      var ext = [];
      while (cexts-- > 0)
        ext.push(parse_ExtProp(blob, end - blob.l));
      return { ixfe, ext };
    }
    function update_xfext(xf, xfext) {
      xfext.forEach(function(xfe) {
        switch (xfe[0]) {
        }
      });
    }
    function parse_cc_xml(data) {
      var d = [];
      if (!data)
        return d;
      var i3 = 1;
      (data.match(tagregex) || []).forEach(function(x) {
        var y = parsexmltag(x);
        switch (y[0]) {
          case "<?xml":
            break;
          case "<calcChain":
          case "<calcChain>":
          case "</calcChain>":
            break;
          case "<c":
            delete y[0];
            if (y.i)
              i3 = y.i;
            else
              y.i = i3;
            d.push(y);
            break;
        }
      });
      return d;
    }
    function parse_BrtCalcChainItem$(data) {
      var out = {};
      out.i = data.read_shift(4);
      var cell = {};
      cell.r = data.read_shift(4);
      cell.c = data.read_shift(4);
      out.r = encode_cell(cell);
      var flags = data.read_shift(1);
      if (flags & 2)
        out.l = "1";
      if (flags & 8)
        out.a = "1";
      return out;
    }
    function parse_cc_bin(data, name, opts) {
      var out = [];
      recordhopper(data, function hopper_cc(val, R_n, RT) {
        switch (RT) {
          case 63:
            out.push(val);
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              ;
            else if ((R_n || "").indexOf("End") > 0)
              ;
            else
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      });
      return out;
    }
    function parse_xlink_xml() {
    }
    function parse_xlink_bin(data, rel, name, _opts) {
      if (!data)
        return data;
      var opts = _opts || {};
      var pass = false;
      recordhopper(data, function xlink_parse(val, R_n, RT) {
        switch (RT) {
          case 359:
          case 363:
          case 364:
          case 366:
          case 367:
          case 368:
          case 369:
          case 370:
          case 371:
          case 472:
          case 577:
          case 578:
          case 579:
          case 580:
          case 581:
          case 582:
          case 583:
          case 584:
          case 585:
          case 586:
          case 587:
            break;
          case 35:
            pass = true;
            break;
          case 36:
            pass = false;
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              ;
            else if ((R_n || "").indexOf("End") > 0)
              ;
            else if (!pass || opts.WTF)
              throw new Error("Unexpected record " + RT.toString(16) + " " + R_n);
        }
      }, opts);
    }
    RELS.IMG = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/image";
    RELS.DRAW = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing";
    function parse_drawing(data, rels) {
      if (!data)
        return "??";
      var id = (data.match(/<c:chart [^>]*r:id="([^"]*)"/) || ["", ""])[1];
      return rels["!id"][id].Target;
    }
    var _shapeid = 1024;
    function write_comments_vml(rId, comments) {
      var csize = [21600, 21600];
      var bbox = ["m0,0l0", csize[1], csize[0], csize[1], csize[0], "0xe"].join(",");
      var o = [
        writextag("xml", null, { "xmlns:v": XLMLNS.v, "xmlns:o": XLMLNS.o, "xmlns:x": XLMLNS.x, "xmlns:mv": XLMLNS.mv }).replace(/\/>/, ">"),
        writextag("o:shapelayout", writextag("o:idmap", null, { "v:ext": "edit", "data": rId }), { "v:ext": "edit" }),
        writextag("v:shapetype", [
          writextag("v:stroke", null, { joinstyle: "miter" }),
          writextag("v:path", null, { gradientshapeok: "t", "o:connecttype": "rect" })
        ].join(""), { id: "_x0000_t202", "o:spt": 202, coordsize: csize.join(","), path: bbox })
      ];
      while (_shapeid < rId * 1e3)
        _shapeid += 1e3;
      comments.forEach(function(x) {
        var c = decode_cell(x[0]);
        var fillopts = { "color2": "#BEFF82", "type": "gradient" };
        if (fillopts.type == "gradient")
          fillopts.angle = "-180";
        var fillparm = fillopts.type == "gradient" ? writextag("o:fill", null, { type: "gradientUnscaled", "v:ext": "view" }) : null;
        var fillxml = writextag("v:fill", fillparm, fillopts);
        var shadata = { on: "t", "obscured": "t" };
        ++_shapeid;
        o = o.concat([
          "<v:shape" + wxt_helper({
            id: "_x0000_s" + _shapeid,
            type: "#_x0000_t202",
            style: "position:absolute; margin-left:80pt;margin-top:5pt;width:104pt;height:64pt;z-index:10" + (x[1].hidden ? ";visibility:hidden" : ""),
            fillcolor: "#ECFAD4",
            strokecolor: "#edeaa1"
          }) + ">",
          fillxml,
          writextag("v:shadow", null, shadata),
          writextag("v:path", null, { "o:connecttype": "none" }),
          '<v:textbox><div style="text-align:left"></div></v:textbox>',
          '<x:ClientData ObjectType="Note">',
          "<x:MoveWithCells/>",
          "<x:SizeWithCells/>",
          /* Part 4 19.4.2.3 Anchor (Anchor) */
          writetag("x:Anchor", [c.c + 1, 0, c.r + 1, 0, c.c + 3, 20, c.r + 5, 20].join(",")),
          writetag("x:AutoFill", "False"),
          writetag("x:Row", String(c.r)),
          writetag("x:Column", String(c.c)),
          x[1].hidden ? "" : "<x:Visible/>",
          "</x:ClientData>",
          "</v:shape>"
        ]);
      });
      o.push("</xml>");
      return o.join("");
    }
    RELS.CMNT = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments";
    function sheet_insert_comments(sheet, comments) {
      var dense = Array.isArray(sheet);
      var cell;
      comments.forEach(function(comment) {
        var r = decode_cell(comment.ref);
        if (dense) {
          if (!sheet[r.r])
            sheet[r.r] = [];
          cell = sheet[r.r][r.c];
        } else
          cell = sheet[comment.ref];
        if (!cell) {
          cell = { t: "z" };
          if (dense)
            sheet[r.r][r.c] = cell;
          else
            sheet[comment.ref] = cell;
          var range = safe_decode_range(sheet["!ref"] || "BDWGO1000001:A1");
          if (range.s.r > r.r)
            range.s.r = r.r;
          if (range.e.r < r.r)
            range.e.r = r.r;
          if (range.s.c > r.c)
            range.s.c = r.c;
          if (range.e.c < r.c)
            range.e.c = r.c;
          var encoded = encode_range(range);
          if (encoded !== sheet["!ref"])
            sheet["!ref"] = encoded;
        }
        if (!cell.c)
          cell.c = [];
        var o = { a: comment.author, t: comment.t, r: comment.r };
        if (comment.h)
          o.h = comment.h;
        cell.c.push(o);
      });
    }
    function parse_comments_xml(data, opts) {
      if (data.match(/<(?:\w+:)?comments *\/>/))
        return [];
      var authors = [];
      var commentList = [];
      var authtag = data.match(/<(?:\w+:)?authors>([\s\S]*)<\/(?:\w+:)?authors>/);
      if (authtag && authtag[1])
        authtag[1].split(/<\/\w*:?author>/).forEach(function(x) {
          if (x === "" || x.trim() === "")
            return;
          var a = x.match(/<(?:\w+:)?author[^>]*>(.*)/);
          if (a)
            authors.push(a[1]);
        });
      var cmnttag = data.match(/<(?:\w+:)?commentList>([\s\S]*)<\/(?:\w+:)?commentList>/);
      if (cmnttag && cmnttag[1])
        cmnttag[1].split(/<\/\w*:?comment>/).forEach(function(x) {
          if (x === "" || x.trim() === "")
            return;
          var cm = x.match(/<(?:\w+:)?comment[^>]*>/);
          if (!cm)
            return;
          var y = parsexmltag(cm[0]);
          var comment = { author: y.authorId && authors[y.authorId] || "sheetjsghost", ref: y.ref, guid: y.guid };
          var cell = decode_cell(y.ref);
          if (opts.sheetRows && opts.sheetRows <= cell.r)
            return;
          var textMatch = x.match(/<(?:\w+:)?text>([\s\S]*)<\/(?:\w+:)?text>/);
          var rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || { r: "", t: "", h: "" };
          comment.r = rt.r;
          if (rt.r == "<t></t>")
            rt.t = rt.h = "";
          comment.t = rt.t.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
          if (opts.cellHTML)
            comment.h = rt.h;
          commentList.push(comment);
        });
      return commentList;
    }
    var CMNT_XML_ROOT = writextag("comments", null, { "xmlns": XMLNS.main[0] });
    function write_comments_xml(data) {
      var o = [XML_HEADER, CMNT_XML_ROOT];
      var iauthor = [];
      o.push("<authors>");
      data.forEach(function(x) {
        x[1].forEach(function(w) {
          var a = escapexml(w.a);
          if (iauthor.indexOf(a) > -1)
            return;
          iauthor.push(a);
          o.push("<author>" + a + "</author>");
        });
      });
      o.push("</authors>");
      o.push("<commentList>");
      data.forEach(function(d) {
        d[1].forEach(function(c) {
          o.push('<comment ref="' + d[0] + '" authorId="' + iauthor.indexOf(escapexml(c.a)) + '"><text>');
          o.push(writetag("t", c.t == null ? "" : escapexml(c.t)));
          o.push("</text></comment>");
        });
      });
      o.push("</commentList>");
      if (o.length > 2) {
        o[o.length] = "</comments>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    function parse_BrtBeginComment(data) {
      var out = {};
      out.iauthor = data.read_shift(4);
      var rfx = parse_UncheckedRfX(data);
      out.rfx = rfx.s;
      out.ref = encode_cell(rfx.s);
      data.l += 16;
      return out;
    }
    function write_BrtBeginComment(data, o) {
      if (o == null)
        o = new_buf(36);
      o.write_shift(4, data[1].iauthor);
      write_UncheckedRfX(data[0], o);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      return o;
    }
    var parse_BrtCommentAuthor = parse_XLWideString;
    function write_BrtCommentAuthor(data) {
      return write_XLWideString(data.slice(0, 54));
    }
    function parse_comments_bin(data, opts) {
      var out = [];
      var authors = [];
      var c = {};
      var pass = false;
      recordhopper(data, function hopper_cmnt(val, R_n, RT) {
        switch (RT) {
          case 632:
            authors.push(val);
            break;
          case 635:
            c = val;
            break;
          case 637:
            c.t = val.t;
            c.h = val.h;
            c.r = val.r;
            break;
          case 636:
            c.author = authors[c.iauthor];
            delete c.iauthor;
            if (opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r)
              break;
            if (!c.t)
              c.t = "";
            delete c.rfx;
            out.push(c);
            break;
          case 3072:
            break;
          case 35:
            pass = true;
            break;
          case 36:
            pass = false;
            break;
          case 37:
            break;
          case 38:
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              ;
            else if ((R_n || "").indexOf("End") > 0)
              ;
            else if (!pass || opts.WTF)
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      });
      return out;
    }
    function write_comments_bin(data) {
      var ba = buf_array();
      var iauthor = [];
      write_record(ba, "BrtBeginComments");
      write_record(ba, "BrtBeginCommentAuthors");
      data.forEach(function(comment) {
        comment[1].forEach(function(c) {
          if (iauthor.indexOf(c.a) > -1)
            return;
          iauthor.push(c.a.slice(0, 54));
          write_record(ba, "BrtCommentAuthor", write_BrtCommentAuthor(c.a));
        });
      });
      write_record(ba, "BrtEndCommentAuthors");
      write_record(ba, "BrtBeginCommentList");
      data.forEach(function(comment) {
        comment[1].forEach(function(c) {
          c.iauthor = iauthor.indexOf(c.a);
          var range = { s: decode_cell(comment[0]), e: decode_cell(comment[0]) };
          write_record(ba, "BrtBeginComment", write_BrtBeginComment([range, c]));
          if (c.t && c.t.length > 0)
            write_record(ba, "BrtCommentText", write_BrtCommentText(c));
          write_record(ba, "BrtEndComment");
          delete c.iauthor;
        });
      });
      write_record(ba, "BrtEndCommentList");
      write_record(ba, "BrtEndComments");
      return ba.end();
    }
    var CT_VBA = "application/vnd.ms-office.vbaProject";
    function make_vba_xls(cfb) {
      var newcfb = CFB.utils.cfb_new({ root: "R" });
      cfb.FullPaths.forEach(function(p, i3) {
        if (p.slice(-1) === "/" || !p.match(/_VBA_PROJECT_CUR/))
          return;
        var newpath = p.replace(/^[^\/]*/, "R").replace(/\/_VBA_PROJECT_CUR\u0000*/, "");
        CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i3].content);
      });
      return CFB.write(newcfb);
    }
    function fill_vba_xls(cfb, vba) {
      vba.FullPaths.forEach(function(p, i3) {
        if (i3 == 0)
          return;
        var newpath = p.replace(/[^\/]*[\/]/, "/_VBA_PROJECT_CUR/");
        if (newpath.slice(-1) !== "/")
          CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i3].content);
      });
    }
    var VBAFMTS = ["xlsb", "xlsm", "xlam", "biff8", "xla"];
    RELS.DS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet";
    RELS.MS = "http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet";
    function parse_ds_bin() {
      return { "!type": "dialog" };
    }
    function parse_ds_xml() {
      return { "!type": "dialog" };
    }
    function parse_ms_bin() {
      return { "!type": "macro" };
    }
    function parse_ms_xml() {
      return { "!type": "macro" };
    }
    var rc_to_a1 = function() {
      var rcregex = /(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g;
      var rcbase = { r: 0, c: 0 };
      function rcfunc($$, $1, $2, $3) {
        var cRel = false, rRel = false;
        if ($2.length == 0)
          rRel = true;
        else if ($2.charAt(0) == "[") {
          rRel = true;
          $2 = $2.slice(1, -1);
        }
        if ($3.length == 0)
          cRel = true;
        else if ($3.charAt(0) == "[") {
          cRel = true;
          $3 = $3.slice(1, -1);
        }
        var R = $2.length > 0 ? parseInt($2, 10) | 0 : 0, C = $3.length > 0 ? parseInt($3, 10) | 0 : 0;
        if (cRel)
          C += rcbase.c;
        else
          --C;
        if (rRel)
          R += rcbase.r;
        else
          --R;
        return $1 + (cRel ? "" : "$") + encode_col(C) + (rRel ? "" : "$") + encode_row(R);
      }
      return function rc_to_a12(fstr, base) {
        rcbase = base;
        return fstr.replace(rcregex, rcfunc);
      };
    }();
    var crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g;
    var a1_to_rc = function() {
      return function a1_to_rc2(fstr, base) {
        return fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
          var c = decode_col($3) - ($2 ? 0 : base.c);
          var r = decode_row($5) - ($4 ? 0 : base.r);
          var R = r == 0 ? "" : !$4 ? "[" + r + "]" : r + 1;
          var C = c == 0 ? "" : !$2 ? "[" + c + "]" : c + 1;
          return $1 + "R" + R + "C" + C;
        });
      };
    }();
    function shift_formula_str(f, delta) {
      return f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {
        return $1 + ($2 == "$" ? $2 + $3 : encode_col(decode_col($3) + delta.c)) + ($4 == "$" ? $4 + $5 : encode_row(decode_row($5) + delta.r));
      });
    }
    function shift_formula_xlsx(f, range, cell) {
      var r = decode_range(range), s = r.s, c = decode_cell(cell);
      var delta = { r: c.r - s.r, c: c.c - s.c };
      return shift_formula_str(f, delta);
    }
    function fuzzyfmla(f) {
      if (f.length == 1)
        return false;
      return true;
    }
    function _xlfn(f) {
      return f.replace(/_xlfn\./g, "");
    }
    function parseread1(blob) {
      blob.l += 1;
      return;
    }
    function parse_ColRelU(blob, length) {
      var c = blob.read_shift(length == 1 ? 1 : 2);
      return [c & 16383, c >> 14 & 1, c >> 15 & 1];
    }
    function parse_RgceArea(blob, length, opts) {
      var w = 2;
      if (opts) {
        if (opts.biff >= 2 && opts.biff <= 5)
          return parse_RgceArea_BIFF2(blob);
        else if (opts.biff == 12)
          w = 4;
      }
      var r = blob.read_shift(w), R = blob.read_shift(w);
      var c = parse_ColRelU(blob, 2);
      var C = parse_ColRelU(blob, 2);
      return { s: { r, c: c[0], cRel: c[1], rRel: c[2] }, e: { r: R, c: C[0], cRel: C[1], rRel: C[2] } };
    }
    function parse_RgceArea_BIFF2(blob) {
      var r = parse_ColRelU(blob, 2), R = parse_ColRelU(blob, 2);
      var c = blob.read_shift(1);
      var C = blob.read_shift(1);
      return { s: { r: r[0], c, cRel: r[1], rRel: r[2] }, e: { r: R[0], c: C, cRel: R[1], rRel: R[2] } };
    }
    function parse_RgceAreaRel(blob, length, opts) {
      if (opts.biff < 8)
        return parse_RgceArea_BIFF2(blob);
      var r = blob.read_shift(opts.biff == 12 ? 4 : 2), R = blob.read_shift(opts.biff == 12 ? 4 : 2);
      var c = parse_ColRelU(blob, 2);
      var C = parse_ColRelU(blob, 2);
      return { s: { r, c: c[0], cRel: c[1], rRel: c[2] }, e: { r: R, c: C[0], cRel: C[1], rRel: C[2] } };
    }
    function parse_RgceLoc(blob, length, opts) {
      if (opts && opts.biff >= 2 && opts.biff <= 5)
        return parse_RgceLoc_BIFF2(blob);
      var r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2);
      var c = parse_ColRelU(blob, 2);
      return { r, c: c[0], cRel: c[1], rRel: c[2] };
    }
    function parse_RgceLoc_BIFF2(blob) {
      var r = parse_ColRelU(blob, 2);
      var c = blob.read_shift(1);
      return { r: r[0], c, cRel: r[1], rRel: r[2] };
    }
    function parse_RgceElfLoc(blob) {
      var r = blob.read_shift(2);
      var c = blob.read_shift(2);
      return { r, c: c & 255, fQuoted: !!(c & 16384), cRel: c >> 15, rRel: c >> 15 };
    }
    function parse_RgceLocRel(blob, length, opts) {
      var biff = opts && opts.biff ? opts.biff : 8;
      if (biff >= 2 && biff <= 5)
        return parse_RgceLocRel_BIFF2(blob);
      var r = blob.read_shift(biff >= 12 ? 4 : 2);
      var cl = blob.read_shift(2);
      var cRel = (cl & 16384) >> 14, rRel = (cl & 32768) >> 15;
      cl &= 16383;
      if (rRel == 1)
        while (r > 524287)
          r -= 1048576;
      if (cRel == 1)
        while (cl > 8191)
          cl = cl - 16384;
      return { r, c: cl, cRel, rRel };
    }
    function parse_RgceLocRel_BIFF2(blob) {
      var rl = blob.read_shift(2);
      var c = blob.read_shift(1);
      var rRel = (rl & 32768) >> 15, cRel = (rl & 16384) >> 14;
      rl &= 16383;
      if (rRel == 1 && rl >= 8192)
        rl = rl - 16384;
      if (cRel == 1 && c >= 128)
        c = c - 256;
      return { r: rl, c, cRel, rRel };
    }
    function parse_PtgArea(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      var area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts);
      return [type, area];
    }
    function parse_PtgArea3d(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      var ixti = blob.read_shift(2, "i");
      var w = 8;
      if (opts)
        switch (opts.biff) {
          case 5:
            blob.l += 12;
            w = 6;
            break;
          case 12:
            w = 12;
            break;
        }
      var area = parse_RgceArea(blob, w, opts);
      return [type, ixti, area];
    }
    function parse_PtgAreaErr(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      blob.l += opts && opts.biff > 8 ? 12 : opts.biff < 8 ? 6 : 8;
      return [type];
    }
    function parse_PtgAreaErr3d(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      var ixti = blob.read_shift(2);
      var w = 8;
      if (opts)
        switch (opts.biff) {
          case 5:
            blob.l += 12;
            w = 6;
            break;
          case 12:
            w = 12;
            break;
        }
      blob.l += w;
      return [type, ixti];
    }
    function parse_PtgAreaN(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      var area = parse_RgceAreaRel(blob, length - 1, opts);
      return [type, area];
    }
    function parse_PtgArray(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      blob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7;
      return [type];
    }
    function parse_PtgAttrBaxcel(blob) {
      var bitSemi = blob[blob.l + 1] & 1;
      var bitBaxcel = 1;
      blob.l += 4;
      return [bitSemi, bitBaxcel];
    }
    function parse_PtgAttrChoose(blob, length, opts) {
      blob.l += 2;
      var offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
      var o = [];
      for (var i3 = 0; i3 <= offset; ++i3)
        o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2));
      return o;
    }
    function parse_PtgAttrGoto(blob, length, opts) {
      var bitGoto = blob[blob.l + 1] & 255 ? 1 : 0;
      blob.l += 2;
      return [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];
    }
    function parse_PtgAttrIf(blob, length, opts) {
      var bitIf = blob[blob.l + 1] & 255 ? 1 : 0;
      blob.l += 2;
      return [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];
    }
    function parse_PtgAttrIfError(blob) {
      var bitIf = blob[blob.l + 1] & 255 ? 1 : 0;
      blob.l += 2;
      return [bitIf, blob.read_shift(2)];
    }
    function parse_PtgAttrSemi(blob, length, opts) {
      var bitSemi = blob[blob.l + 1] & 255 ? 1 : 0;
      blob.l += opts && opts.biff == 2 ? 3 : 4;
      return [bitSemi];
    }
    function parse_PtgAttrSpaceType(blob) {
      var type = blob.read_shift(1), cch = blob.read_shift(1);
      return [type, cch];
    }
    function parse_PtgAttrSpace(blob) {
      blob.read_shift(2);
      return parse_PtgAttrSpaceType(blob);
    }
    function parse_PtgAttrSpaceSemi(blob) {
      blob.read_shift(2);
      return parse_PtgAttrSpaceType(blob);
    }
    function parse_PtgRef(blob, length, opts) {
      var type = (blob[blob.l] & 96) >> 5;
      blob.l += 1;
      var loc = parse_RgceLoc(blob, 0, opts);
      return [type, loc];
    }
    function parse_PtgRefN(blob, length, opts) {
      var type = (blob[blob.l] & 96) >> 5;
      blob.l += 1;
      var loc = parse_RgceLocRel(blob, 0, opts);
      return [type, loc];
    }
    function parse_PtgRef3d(blob, length, opts) {
      var type = (blob[blob.l] & 96) >> 5;
      blob.l += 1;
      var ixti = blob.read_shift(2);
      if (opts && opts.biff == 5)
        blob.l += 12;
      var loc = parse_RgceLoc(blob, 0, opts);
      return [type, ixti, loc];
    }
    function parse_PtgFunc(blob, length, opts) {
      var type = (blob[blob.l] & 96) >> 5;
      blob.l += 1;
      var iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);
      return [FtabArgc[iftab], Ftab[iftab], type];
    }
    function parse_PtgFuncVar(blob, length, opts) {
      var type = blob[blob.l++];
      var cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [type == 88 ? -1 : 0, blob.read_shift(1)] : parsetab(blob);
      return [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];
    }
    function parsetab(blob) {
      return [blob[blob.l + 1] >> 7, blob.read_shift(2) & 32767];
    }
    function parse_PtgAttrSum(blob, length, opts) {
      blob.l += opts && opts.biff == 2 ? 3 : 4;
      return;
    }
    function parse_PtgExp(blob, length, opts) {
      blob.l++;
      if (opts && opts.biff == 12)
        return [blob.read_shift(4, "i"), 0];
      var row = blob.read_shift(2);
      var col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
      return [row, col];
    }
    function parse_PtgErr(blob) {
      blob.l++;
      return BErr[blob.read_shift(1)];
    }
    function parse_PtgInt(blob) {
      blob.l++;
      return blob.read_shift(2);
    }
    function parse_PtgBool(blob) {
      blob.l++;
      return blob.read_shift(1) !== 0;
    }
    function parse_PtgNum(blob) {
      blob.l++;
      return parse_Xnum(blob);
    }
    function parse_PtgStr(blob, length, opts) {
      blob.l++;
      return parse_ShortXLUnicodeString(blob, length - 1, opts);
    }
    function parse_SerAr(blob, biff) {
      var val = [blob.read_shift(1)];
      if (biff == 12)
        switch (val[0]) {
          case 2:
            val[0] = 4;
            break;
          case 4:
            val[0] = 16;
            break;
          case 0:
            val[0] = 1;
            break;
          case 1:
            val[0] = 2;
            break;
        }
      switch (val[0]) {
        case 4:
          val[1] = parsebool(blob, 1) ? "TRUE" : "FALSE";
          if (biff != 12)
            blob.l += 7;
          break;
        case 37:
        case 16:
          val[1] = BErr[blob[blob.l]];
          blob.l += biff == 12 ? 4 : 8;
          break;
        case 0:
          blob.l += 8;
          break;
        case 1:
          val[1] = parse_Xnum(blob);
          break;
        case 2:
          val[1] = parse_XLUnicodeString2(blob, 0, { biff: biff > 0 && biff < 8 ? 2 : biff });
          break;
        default:
          throw new Error("Bad SerAr: " + val[0]);
      }
      return val;
    }
    function parse_PtgExtraMem(blob, cce, opts) {
      var count = blob.read_shift(opts.biff == 12 ? 4 : 2);
      var out = [];
      for (var i3 = 0; i3 != count; ++i3)
        out.push((opts.biff == 12 ? parse_UncheckedRfX : parse_Ref8U)(blob));
      return out;
    }
    function parse_PtgExtraArray(blob, length, opts) {
      var rows = 0, cols = 0;
      if (opts.biff == 12) {
        rows = blob.read_shift(4);
        cols = blob.read_shift(4);
      } else {
        cols = 1 + blob.read_shift(1);
        rows = 1 + blob.read_shift(2);
      }
      if (opts.biff >= 2 && opts.biff < 8) {
        --rows;
        if (--cols == 0)
          cols = 256;
      }
      for (var i3 = 0, o = []; i3 != rows && (o[i3] = []); ++i3)
        for (var j2 = 0; j2 != cols; ++j2)
          o[i3][j2] = parse_SerAr(blob, opts.biff);
      return o;
    }
    function parse_PtgName(blob, length, opts) {
      var type = blob.read_shift(1) >>> 5 & 3;
      var w = !opts || opts.biff >= 8 ? 4 : 2;
      var nameindex = blob.read_shift(w);
      switch (opts.biff) {
        case 2:
          blob.l += 5;
          break;
        case 3:
        case 4:
          blob.l += 8;
          break;
        case 5:
          blob.l += 12;
          break;
      }
      return [type, 0, nameindex];
    }
    function parse_PtgNameX(blob, length, opts) {
      if (opts.biff == 5)
        return parse_PtgNameX_BIFF5(blob);
      var type = blob.read_shift(1) >>> 5 & 3;
      var ixti = blob.read_shift(2);
      var nameindex = blob.read_shift(4);
      return [type, ixti, nameindex];
    }
    function parse_PtgNameX_BIFF5(blob) {
      var type = blob.read_shift(1) >>> 5 & 3;
      var ixti = blob.read_shift(2, "i");
      blob.l += 8;
      var nameindex = blob.read_shift(2);
      blob.l += 12;
      return [type, ixti, nameindex];
    }
    function parse_PtgMemArea(blob, length, opts) {
      var type = blob.read_shift(1) >>> 5 & 3;
      blob.l += opts && opts.biff == 2 ? 3 : 4;
      var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
      return [type, cce];
    }
    function parse_PtgMemFunc(blob, length, opts) {
      var type = blob.read_shift(1) >>> 5 & 3;
      var cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);
      return [type, cce];
    }
    function parse_PtgRefErr(blob, length, opts) {
      var type = blob.read_shift(1) >>> 5 & 3;
      blob.l += 4;
      if (opts.biff < 8)
        blob.l--;
      if (opts.biff == 12)
        blob.l += 2;
      return [type];
    }
    function parse_PtgRefErr3d(blob, length, opts) {
      var type = (blob[blob.l++] & 96) >> 5;
      var ixti = blob.read_shift(2);
      var w = 4;
      if (opts)
        switch (opts.biff) {
          case 5:
            w = 15;
            break;
          case 12:
            w = 6;
            break;
        }
      blob.l += w;
      return [type, ixti];
    }
    var parse_PtgMemErr = parsenoop;
    var parse_PtgMemNoMem = parsenoop;
    var parse_PtgTbl = parsenoop;
    function parse_PtgElfLoc(blob, length, opts) {
      blob.l += 2;
      return [parse_RgceElfLoc(blob)];
    }
    function parse_PtgElfNoop(blob) {
      blob.l += 6;
      return [];
    }
    var parse_PtgElfCol = parse_PtgElfLoc;
    var parse_PtgElfColS = parse_PtgElfNoop;
    var parse_PtgElfColSV = parse_PtgElfNoop;
    var parse_PtgElfColV = parse_PtgElfLoc;
    function parse_PtgElfLel(blob) {
      blob.l += 2;
      return [parseuint16(blob), blob.read_shift(2) & 1];
    }
    var parse_PtgElfRadical = parse_PtgElfLoc;
    var parse_PtgElfRadicalLel = parse_PtgElfLel;
    var parse_PtgElfRadicalS = parse_PtgElfNoop;
    var parse_PtgElfRw = parse_PtgElfLoc;
    var parse_PtgElfRwV = parse_PtgElfLoc;
    var PtgListRT = [
      "Data",
      "All",
      "Headers",
      "??",
      "?Data2",
      "??",
      "?DataHeaders",
      "??",
      "Totals",
      "??",
      "??",
      "??",
      "?DataTotals",
      "??",
      "??",
      "??",
      "?Current"
    ];
    function parse_PtgList(blob) {
      blob.l += 2;
      var ixti = blob.read_shift(2);
      var flags = blob.read_shift(2);
      var idx = blob.read_shift(4);
      var c = blob.read_shift(2);
      var C = blob.read_shift(2);
      var rt = PtgListRT[flags >> 2 & 31];
      return { ixti, coltype: flags & 3, rt, idx, c, C };
    }
    function parse_PtgSxName(blob) {
      blob.l += 2;
      return [blob.read_shift(4)];
    }
    function parse_PtgSheet(blob, length, opts) {
      blob.l += 5;
      blob.l += 2;
      blob.l += opts.biff == 2 ? 1 : 4;
      return ["PTGSHEET"];
    }
    function parse_PtgEndSheet(blob, length, opts) {
      blob.l += opts.biff == 2 ? 4 : 5;
      return ["PTGENDSHEET"];
    }
    function parse_PtgMemAreaN(blob) {
      var type = blob.read_shift(1) >>> 5 & 3;
      var cce = blob.read_shift(2);
      return [type, cce];
    }
    function parse_PtgMemNoMemN(blob) {
      var type = blob.read_shift(1) >>> 5 & 3;
      var cce = blob.read_shift(2);
      return [type, cce];
    }
    function parse_PtgAttrNoop(blob) {
      blob.l += 4;
      return [0, 0];
    }
    var PtgTypes = {
      1: { n: "PtgExp", f: parse_PtgExp },
      2: { n: "PtgTbl", f: parse_PtgTbl },
      3: { n: "PtgAdd", f: parseread1 },
      4: { n: "PtgSub", f: parseread1 },
      5: { n: "PtgMul", f: parseread1 },
      6: { n: "PtgDiv", f: parseread1 },
      7: { n: "PtgPower", f: parseread1 },
      8: { n: "PtgConcat", f: parseread1 },
      9: { n: "PtgLt", f: parseread1 },
      10: { n: "PtgLe", f: parseread1 },
      11: { n: "PtgEq", f: parseread1 },
      12: { n: "PtgGe", f: parseread1 },
      13: { n: "PtgGt", f: parseread1 },
      14: { n: "PtgNe", f: parseread1 },
      15: { n: "PtgIsect", f: parseread1 },
      16: { n: "PtgUnion", f: parseread1 },
      17: { n: "PtgRange", f: parseread1 },
      18: { n: "PtgUplus", f: parseread1 },
      19: { n: "PtgUminus", f: parseread1 },
      20: { n: "PtgPercent", f: parseread1 },
      21: { n: "PtgParen", f: parseread1 },
      22: { n: "PtgMissArg", f: parseread1 },
      23: { n: "PtgStr", f: parse_PtgStr },
      26: { n: "PtgSheet", f: parse_PtgSheet },
      27: { n: "PtgEndSheet", f: parse_PtgEndSheet },
      28: { n: "PtgErr", f: parse_PtgErr },
      29: { n: "PtgBool", f: parse_PtgBool },
      30: { n: "PtgInt", f: parse_PtgInt },
      31: { n: "PtgNum", f: parse_PtgNum },
      32: { n: "PtgArray", f: parse_PtgArray },
      33: { n: "PtgFunc", f: parse_PtgFunc },
      34: { n: "PtgFuncVar", f: parse_PtgFuncVar },
      35: { n: "PtgName", f: parse_PtgName },
      36: { n: "PtgRef", f: parse_PtgRef },
      37: { n: "PtgArea", f: parse_PtgArea },
      38: { n: "PtgMemArea", f: parse_PtgMemArea },
      39: { n: "PtgMemErr", f: parse_PtgMemErr },
      40: { n: "PtgMemNoMem", f: parse_PtgMemNoMem },
      41: { n: "PtgMemFunc", f: parse_PtgMemFunc },
      42: { n: "PtgRefErr", f: parse_PtgRefErr },
      43: { n: "PtgAreaErr", f: parse_PtgAreaErr },
      44: { n: "PtgRefN", f: parse_PtgRefN },
      45: { n: "PtgAreaN", f: parse_PtgAreaN },
      46: { n: "PtgMemAreaN", f: parse_PtgMemAreaN },
      47: { n: "PtgMemNoMemN", f: parse_PtgMemNoMemN },
      57: { n: "PtgNameX", f: parse_PtgNameX },
      58: { n: "PtgRef3d", f: parse_PtgRef3d },
      59: { n: "PtgArea3d", f: parse_PtgArea3d },
      60: { n: "PtgRefErr3d", f: parse_PtgRefErr3d },
      61: { n: "PtgAreaErr3d", f: parse_PtgAreaErr3d },
      255: {}
    };
    var PtgDupes = {
      64: 32,
      96: 32,
      65: 33,
      97: 33,
      66: 34,
      98: 34,
      67: 35,
      99: 35,
      68: 36,
      100: 36,
      69: 37,
      101: 37,
      70: 38,
      102: 38,
      71: 39,
      103: 39,
      72: 40,
      104: 40,
      73: 41,
      105: 41,
      74: 42,
      106: 42,
      75: 43,
      107: 43,
      76: 44,
      108: 44,
      77: 45,
      109: 45,
      78: 46,
      110: 46,
      79: 47,
      111: 47,
      88: 34,
      120: 34,
      89: 57,
      121: 57,
      90: 58,
      122: 58,
      91: 59,
      123: 59,
      92: 60,
      124: 60,
      93: 61,
      125: 61
    };
    (function() {
      for (var y in PtgDupes)
        PtgTypes[y] = PtgTypes[PtgDupes[y]];
    })();
    var Ptg18 = {
      1: { n: "PtgElfLel", f: parse_PtgElfLel },
      2: { n: "PtgElfRw", f: parse_PtgElfRw },
      3: { n: "PtgElfCol", f: parse_PtgElfCol },
      6: { n: "PtgElfRwV", f: parse_PtgElfRwV },
      7: { n: "PtgElfColV", f: parse_PtgElfColV },
      10: { n: "PtgElfRadical", f: parse_PtgElfRadical },
      11: { n: "PtgElfRadicalS", f: parse_PtgElfRadicalS },
      13: { n: "PtgElfColS", f: parse_PtgElfColS },
      15: { n: "PtgElfColSV", f: parse_PtgElfColSV },
      16: { n: "PtgElfRadicalLel", f: parse_PtgElfRadicalLel },
      25: { n: "PtgList", f: parse_PtgList },
      29: { n: "PtgSxName", f: parse_PtgSxName },
      255: {}
    };
    var Ptg19 = {
      0: { n: "PtgAttrNoop", f: parse_PtgAttrNoop },
      1: { n: "PtgAttrSemi", f: parse_PtgAttrSemi },
      2: { n: "PtgAttrIf", f: parse_PtgAttrIf },
      4: { n: "PtgAttrChoose", f: parse_PtgAttrChoose },
      8: { n: "PtgAttrGoto", f: parse_PtgAttrGoto },
      16: { n: "PtgAttrSum", f: parse_PtgAttrSum },
      32: { n: "PtgAttrBaxcel", f: parse_PtgAttrBaxcel },
      64: { n: "PtgAttrSpace", f: parse_PtgAttrSpace },
      65: { n: "PtgAttrSpaceSemi", f: parse_PtgAttrSpaceSemi },
      128: { n: "PtgAttrIfError", f: parse_PtgAttrIfError },
      255: {}
    };
    Ptg19[33] = Ptg19[32];
    function parse_RgbExtra(blob, length, rgce, opts) {
      if (opts.biff < 8)
        return parsenoop(blob, length);
      var target = blob.l + length;
      var o = [];
      for (var i3 = 0; i3 !== rgce.length; ++i3) {
        switch (rgce[i3][0]) {
          case "PtgArray":
            rgce[i3][1] = parse_PtgExtraArray(blob, 0, opts);
            o.push(rgce[i3][1]);
            break;
          case "PtgMemArea":
            rgce[i3][2] = parse_PtgExtraMem(blob, rgce[i3][1], opts);
            o.push(rgce[i3][2]);
            break;
          case "PtgExp":
            if (opts && opts.biff == 12) {
              rgce[i3][1][1] = blob.read_shift(4);
              o.push(rgce[i3][1]);
            }
            break;
          case "PtgList":
          case "PtgElfRadicalS":
          case "PtgElfColS":
          case "PtgElfColSV":
            throw "Unsupported " + rgce[i3][0];
        }
      }
      length = target - blob.l;
      if (length !== 0)
        o.push(parsenoop(blob, length));
      return o;
    }
    function parse_Rgce(blob, length, opts) {
      var target = blob.l + length;
      var R, id, ptgs = [];
      while (target != blob.l) {
        length = target - blob.l;
        id = blob[blob.l];
        R = PtgTypes[id];
        if (id === 24 || id === 25)
          R = (id === 24 ? Ptg18 : Ptg19)[blob[blob.l + 1]];
        if (!R || !R.f) {
          parsenoop(blob, length);
        } else {
          ptgs.push([R.n, R.f(blob, length, opts)]);
        }
      }
      return ptgs;
    }
    function stringify_array(f) {
      var o = [];
      for (var i3 = 0; i3 < f.length; ++i3) {
        var x = f[i3], r = [];
        for (var j2 = 0; j2 < x.length; ++j2) {
          var y = x[j2];
          if (y)
            switch (y[0]) {
              case 2:
                r.push('"' + y[1].replace(/"/g, '""') + '"');
                break;
              default:
                r.push(y[1]);
            }
          else
            r.push("");
        }
        o.push(r.join(","));
      }
      return o.join(";");
    }
    var PtgBinOp = {
      PtgAdd: "+",
      PtgConcat: "&",
      PtgDiv: "/",
      PtgEq: "=",
      PtgGe: ">=",
      PtgGt: ">",
      PtgLe: "<=",
      PtgLt: "<",
      PtgMul: "*",
      PtgNe: "<>",
      PtgPower: "^",
      PtgSub: "-"
    };
    function formula_quote_sheet_name(sname, opts) {
      if (!sname && !(opts && opts.biff <= 5 && opts.biff >= 2))
        throw new Error("empty sheet name");
      if (sname.indexOf(" ") > -1)
        return "'" + sname + "'";
      return sname;
    }
    function get_ixti_raw(supbooks, ixti, opts) {
      if (!supbooks)
        return "SH33TJSERR0";
      if (opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti]))
        return supbooks.SheetNames[ixti];
      if (!supbooks.XTI)
        return "SH33TJSERR6";
      var XTI = supbooks.XTI[ixti];
      if (opts.biff < 8) {
        if (ixti > 1e4)
          ixti -= 65536;
        if (ixti < 0)
          ixti = -ixti;
        return ixti == 0 ? "" : supbooks.XTI[ixti - 1];
      }
      if (!XTI)
        return "SH33TJSERR1";
      var o = "";
      if (opts.biff > 8)
        switch (supbooks[XTI[0]][0]) {
          case 357:
            o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]];
            return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
          case 358:
            if (opts.SID != null)
              return supbooks.SheetNames[opts.SID];
            return "SH33TJSSAME" + supbooks[XTI[0]][0];
          case 355:
          default:
            return "SH33TJSSRC" + supbooks[XTI[0]][0];
        }
      switch (supbooks[XTI[0]][0][0]) {
        case 1025:
          o = XTI[1] == -1 ? "#REF" : supbooks.SheetNames[XTI[1]] || "SH33TJSERR3";
          return XTI[1] == XTI[2] ? o : o + ":" + supbooks.SheetNames[XTI[2]];
        case 14849:
          return supbooks[XTI[0]].slice(1).map(function(name) {
            return name.Name;
          }).join(";;");
        default:
          if (!supbooks[XTI[0]][0][3])
            return "SH33TJSERR2";
          o = XTI[1] == -1 ? "#REF" : supbooks[XTI[0]][0][3][XTI[1]] || "SH33TJSERR4";
          return XTI[1] == XTI[2] ? o : o + ":" + supbooks[XTI[0]][0][3][XTI[2]];
      }
    }
    function get_ixti(supbooks, ixti, opts) {
      return formula_quote_sheet_name(get_ixti_raw(supbooks, ixti, opts), opts);
    }
    function stringify_formula(formula, range, cell, supbooks, opts) {
      var biff = opts && opts.biff || 8;
      var _range = (
        /*range != null ? range :*/
        { s: { c: 0, r: 0 }, e: { c: 0, r: 0 } }
      );
      var stack = [], e1, e2, c, ixti = 0, nameidx = 0, r, sname = "";
      if (!formula[0] || !formula[0][0])
        return "";
      var last_sp = -1, sp = "";
      for (var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {
        var f = formula[0][ff];
        switch (f[0]) {
          case "PtgUminus":
            stack.push("-" + stack.pop());
            break;
          case "PtgUplus":
            stack.push("+" + stack.pop());
            break;
          case "PtgPercent":
            stack.push(stack.pop() + "%");
            break;
          case "PtgAdd":
          case "PtgConcat":
          case "PtgDiv":
          case "PtgEq":
          case "PtgGe":
          case "PtgGt":
          case "PtgLe":
          case "PtgLt":
          case "PtgMul":
          case "PtgNe":
          case "PtgPower":
          case "PtgSub":
            e1 = stack.pop();
            e2 = stack.pop();
            if (last_sp >= 0) {
              switch (formula[0][last_sp][1][0]) {
                case 0:
                  sp = fill(" ", formula[0][last_sp][1][1]);
                  break;
                case 1:
                  sp = fill("\r", formula[0][last_sp][1][1]);
                  break;
                default:
                  sp = "";
                  if (opts.WTF)
                    throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]);
              }
              e2 = e2 + sp;
              last_sp = -1;
            }
            stack.push(e2 + PtgBinOp[f[0]] + e1);
            break;
          case "PtgIsect":
            e1 = stack.pop();
            e2 = stack.pop();
            stack.push(e2 + " " + e1);
            break;
          case "PtgUnion":
            e1 = stack.pop();
            e2 = stack.pop();
            stack.push(e2 + "," + e1);
            break;
          case "PtgRange":
            e1 = stack.pop();
            e2 = stack.pop();
            stack.push(e2 + ":" + e1);
            break;
          case "PtgAttrChoose":
            break;
          case "PtgAttrGoto":
            break;
          case "PtgAttrIf":
            break;
          case "PtgAttrIfError":
            break;
          case "PtgRef":
            c = shift_cell_xls(f[1][1], _range, opts);
            stack.push(encode_cell_xls(c, biff));
            break;
          case "PtgRefN":
            c = cell ? shift_cell_xls(f[1][1], cell, opts) : f[1][1];
            stack.push(encode_cell_xls(c, biff));
            break;
          case "PtgRef3d":
            ixti = f[1][1];
            c = shift_cell_xls(f[1][2], _range, opts);
            sname = get_ixti(supbooks, ixti, opts);
            stack.push(sname + "!" + encode_cell_xls(c, biff));
            break;
          case "PtgFunc":
          case "PtgFuncVar":
            var argc = f[1][0], func = f[1][1];
            if (!argc)
              argc = 0;
            argc &= 127;
            var args = argc == 0 ? [] : stack.slice(-argc);
            stack.length -= argc;
            if (func === "User")
              func = args.shift();
            stack.push(func + "(" + args.join(",") + ")");
            break;
          case "PtgBool":
            stack.push(f[1] ? "TRUE" : "FALSE");
            break;
          case "PtgInt":
            stack.push(f[1]);
            break;
          case "PtgNum":
            stack.push(String(f[1]));
            break;
          case "PtgStr":
            stack.push('"' + f[1].replace(/"/g, '""') + '"');
            break;
          case "PtgErr":
            stack.push(f[1]);
            break;
          case "PtgAreaN":
            r = shift_range_xls(f[1][1], cell ? { s: cell } : _range, opts);
            stack.push(encode_range_xls(r, opts));
            break;
          case "PtgArea":
            r = shift_range_xls(f[1][1], _range, opts);
            stack.push(encode_range_xls(r, opts));
            break;
          case "PtgArea3d":
            ixti = f[1][1];
            r = f[1][2];
            sname = get_ixti(supbooks, ixti, opts);
            stack.push(sname + "!" + encode_range_xls(r, opts));
            break;
          case "PtgAttrSum":
            stack.push("SUM(" + stack.pop() + ")");
            break;
          case "PtgAttrBaxcel":
          case "PtgAttrSemi":
            break;
          case "PtgName":
            nameidx = f[1][2];
            var lbl = (supbooks.names || [])[nameidx - 1] || (supbooks[0] || [])[nameidx];
            var name = lbl ? lbl.Name : "SH33TJSNAME" + String(nameidx);
            if (name in XLSXFutureFunctions)
              name = XLSXFutureFunctions[name];
            stack.push(name);
            break;
          case "PtgNameX":
            var bookidx = f[1][1];
            nameidx = f[1][2];
            var externbook;
            if (opts.biff <= 5) {
              if (bookidx < 0)
                bookidx = -bookidx;
              if (supbooks[bookidx])
                externbook = supbooks[bookidx][nameidx];
            } else {
              var o = "";
              if (((supbooks[bookidx] || [])[0] || [])[0] == 14849)
                ;
              else if (((supbooks[bookidx] || [])[0] || [])[0] == 1025) {
                if (supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) {
                  o = supbooks.SheetNames[supbooks[bookidx][nameidx].itab - 1] + "!";
                }
              } else
                o = supbooks.SheetNames[nameidx - 1] + "!";
              if (supbooks[bookidx] && supbooks[bookidx][nameidx])
                o += supbooks[bookidx][nameidx].Name;
              else if (supbooks[0] && supbooks[0][nameidx])
                o += supbooks[0][nameidx].Name;
              else {
                var ixtidata = get_ixti_raw(supbooks, bookidx, opts).split(";;");
                if (ixtidata[nameidx - 1])
                  o = ixtidata[nameidx - 1];
                else
                  o += "SH33TJSERRX";
              }
              stack.push(o);
              break;
            }
            if (!externbook)
              externbook = { Name: "SH33TJSERRY" };
            stack.push(externbook.Name);
            break;
          case "PtgParen":
            var lp = "(", rp = ")";
            if (last_sp >= 0) {
              sp = "";
              switch (formula[0][last_sp][1][0]) {
                case 2:
                  lp = fill(" ", formula[0][last_sp][1][1]) + lp;
                  break;
                case 3:
                  lp = fill("\r", formula[0][last_sp][1][1]) + lp;
                  break;
                case 4:
                  rp = fill(" ", formula[0][last_sp][1][1]) + rp;
                  break;
                case 5:
                  rp = fill("\r", formula[0][last_sp][1][1]) + rp;
                  break;
                default:
                  if (opts.WTF)
                    throw new Error("Unexpected PtgAttrSpaceType " + formula[0][last_sp][1][0]);
              }
              last_sp = -1;
            }
            stack.push(lp + stack.pop() + rp);
            break;
          case "PtgRefErr":
            stack.push("#REF!");
            break;
          case "PtgRefErr3d":
            stack.push("#REF!");
            break;
          case "PtgExp":
            c = { c: f[1][1], r: f[1][0] };
            var q = { c: cell.c, r: cell.r };
            if (supbooks.sharedf[encode_cell(c)]) {
              var parsedf = supbooks.sharedf[encode_cell(c)];
              stack.push(stringify_formula(parsedf, _range, q, supbooks, opts));
            } else {
              var fnd = false;
              for (e1 = 0; e1 != supbooks.arrayf.length; ++e1) {
                e2 = supbooks.arrayf[e1];
                if (c.c < e2[0].s.c || c.c > e2[0].e.c)
                  continue;
                if (c.r < e2[0].s.r || c.r > e2[0].e.r)
                  continue;
                stack.push(stringify_formula(e2[1], _range, q, supbooks, opts));
                fnd = true;
                break;
              }
              if (!fnd)
                stack.push(f[1]);
            }
            break;
          case "PtgArray":
            stack.push("{" + stringify_array(f[1]) + "}");
            break;
          case "PtgMemArea":
            break;
          case "PtgAttrSpace":
          case "PtgAttrSpaceSemi":
            last_sp = ff;
            break;
          case "PtgTbl":
            break;
          case "PtgMemErr":
            break;
          case "PtgMissArg":
            stack.push("");
            break;
          case "PtgAreaErr":
            stack.push("#REF!");
            break;
          case "PtgAreaErr3d":
            stack.push("#REF!");
            break;
          case "PtgList":
            stack.push("Table" + f[1].idx + "[#" + f[1].rt + "]");
            break;
          case "PtgMemAreaN":
          case "PtgMemNoMemN":
          case "PtgAttrNoop":
          case "PtgSheet":
          case "PtgEndSheet":
            break;
          case "PtgMemFunc":
            break;
          case "PtgMemNoMem":
            break;
          case "PtgElfCol":
          case "PtgElfColS":
          case "PtgElfColSV":
          case "PtgElfColV":
          case "PtgElfLel":
          case "PtgElfRadical":
          case "PtgElfRadicalLel":
          case "PtgElfRadicalS":
          case "PtgElfRw":
          case "PtgElfRwV":
            throw new Error("Unsupported ELFs");
          case "PtgSxName":
            throw new Error("Unrecognized Formula Token: " + String(f));
          default:
            throw new Error("Unrecognized Formula Token: " + String(f));
        }
        var PtgNonDisp = ["PtgAttrSpace", "PtgAttrSpaceSemi", "PtgAttrGoto"];
        if (opts.biff != 3) {
          if (last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {
            f = formula[0][last_sp];
            var _left = true;
            switch (f[1][0]) {
              case 4:
                _left = false;
              case 0:
                sp = fill(" ", f[1][1]);
                break;
              case 5:
                _left = false;
              case 1:
                sp = fill("\r", f[1][1]);
                break;
              default:
                sp = "";
                if (opts.WTF)
                  throw new Error("Unexpected PtgAttrSpaceType " + f[1][0]);
            }
            stack.push((_left ? sp : "") + stack.pop() + (_left ? "" : sp));
            last_sp = -1;
          }
        }
      }
      if (stack.length > 1 && opts.WTF)
        throw new Error("bad formula stack");
      return stack[0];
    }
    function parse_ArrayParsedFormula(blob, length, opts) {
      var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
      var rgcb, cce = blob.read_shift(len);
      if (cce == 65535)
        return [[], parsenoop(blob, length - 2)];
      var rgce = parse_Rgce(blob, cce, opts);
      if (length !== cce + len)
        rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
      blob.l = target;
      return [rgce, rgcb];
    }
    function parse_XLSCellParsedFormula(blob, length, opts) {
      var target = blob.l + length, len = opts.biff == 2 ? 1 : 2;
      var rgcb, cce = blob.read_shift(len);
      if (cce == 65535)
        return [[], parsenoop(blob, length - 2)];
      var rgce = parse_Rgce(blob, cce, opts);
      if (length !== cce + len)
        rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);
      blob.l = target;
      return [rgce, rgcb];
    }
    function parse_NameParsedFormula(blob, length, opts, cce) {
      var target = blob.l + length;
      var rgce = parse_Rgce(blob, cce, opts);
      var rgcb;
      if (target !== blob.l)
        rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);
      return [rgce, rgcb];
    }
    function parse_SharedParsedFormula(blob, length, opts) {
      var target = blob.l + length;
      var rgcb, cce = blob.read_shift(2);
      var rgce = parse_Rgce(blob, cce, opts);
      if (cce == 65535)
        return [[], parsenoop(blob, length - 2)];
      if (length !== cce + 2)
        rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);
      return [rgce, rgcb];
    }
    function parse_FormulaValue(blob) {
      var b;
      if (__readUInt16LE(blob, blob.l + 6) !== 65535)
        return [parse_Xnum(blob), "n"];
      switch (blob[blob.l]) {
        case 0:
          blob.l += 8;
          return ["String", "s"];
        case 1:
          b = blob[blob.l + 2] === 1;
          blob.l += 8;
          return [b, "b"];
        case 2:
          b = blob[blob.l + 2];
          blob.l += 8;
          return [b, "e"];
        case 3:
          blob.l += 8;
          return ["", "s"];
      }
      return [];
    }
    function write_FormulaValue(value) {
      if (value == null) {
        var o = new_buf(8);
        o.write_shift(1, 3);
        o.write_shift(1, 0);
        o.write_shift(2, 0);
        o.write_shift(2, 0);
        o.write_shift(2, 65535);
        return o;
      } else if (typeof value == "number")
        return write_Xnum(value);
      return write_Xnum(0);
    }
    function parse_Formula(blob, length, opts) {
      var end = blob.l + length;
      var cell = parse_XLSCell(blob);
      if (opts.biff == 2)
        ++blob.l;
      var val = parse_FormulaValue(blob);
      var flags = blob.read_shift(1);
      if (opts.biff != 2) {
        blob.read_shift(1);
        if (opts.biff >= 5) {
          blob.read_shift(4);
        }
      }
      var cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);
      return { cell, val: val[0], formula: cbf, shared: flags >> 3 & 1, tt: val[1] };
    }
    function write_Formula(cell, R, C, opts, os) {
      var o1 = write_XLSCell(R, C, os);
      var o2 = write_FormulaValue(cell.v);
      var o3 = new_buf(6);
      var flags = 1 | 32;
      o3.write_shift(2, flags);
      o3.write_shift(4, 0);
      var bf = new_buf(cell.bf.length);
      for (var i3 = 0; i3 < cell.bf.length; ++i3)
        bf[i3] = cell.bf[i3];
      var out = bconcat([o1, o2, o3, bf]);
      return out;
    }
    function parse_XLSBParsedFormula(data, length, opts) {
      var cce = data.read_shift(4);
      var rgce = parse_Rgce(data, cce, opts);
      var cb = data.read_shift(4);
      var rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null;
      return [rgce, rgcb];
    }
    var parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula;
    var parse_XLSBCellParsedFormula = parse_XLSBParsedFormula;
    var parse_XLSBNameParsedFormula = parse_XLSBParsedFormula;
    var parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula;
    var Cetab = {
      0: "BEEP",
      1: "OPEN",
      2: "OPEN.LINKS",
      3: "CLOSE.ALL",
      4: "SAVE",
      5: "SAVE.AS",
      6: "FILE.DELETE",
      7: "PAGE.SETUP",
      8: "PRINT",
      9: "PRINTER.SETUP",
      10: "QUIT",
      11: "NEW.WINDOW",
      12: "ARRANGE.ALL",
      13: "WINDOW.SIZE",
      14: "WINDOW.MOVE",
      15: "FULL",
      16: "CLOSE",
      17: "RUN",
      22: "SET.PRINT.AREA",
      23: "SET.PRINT.TITLES",
      24: "SET.PAGE.BREAK",
      25: "REMOVE.PAGE.BREAK",
      26: "FONT",
      27: "DISPLAY",
      28: "PROTECT.DOCUMENT",
      29: "PRECISION",
      30: "A1.R1C1",
      31: "CALCULATE.NOW",
      32: "CALCULATION",
      34: "DATA.FIND",
      35: "EXTRACT",
      36: "DATA.DELETE",
      37: "SET.DATABASE",
      38: "SET.CRITERIA",
      39: "SORT",
      40: "DATA.SERIES",
      41: "TABLE",
      42: "FORMAT.NUMBER",
      43: "ALIGNMENT",
      44: "STYLE",
      45: "BORDER",
      46: "CELL.PROTECTION",
      47: "COLUMN.WIDTH",
      48: "UNDO",
      49: "CUT",
      50: "COPY",
      51: "PASTE",
      52: "CLEAR",
      53: "PASTE.SPECIAL",
      54: "EDIT.DELETE",
      55: "INSERT",
      56: "FILL.RIGHT",
      57: "FILL.DOWN",
      61: "DEFINE.NAME",
      62: "CREATE.NAMES",
      63: "FORMULA.GOTO",
      64: "FORMULA.FIND",
      65: "SELECT.LAST.CELL",
      66: "SHOW.ACTIVE.CELL",
      67: "GALLERY.AREA",
      68: "GALLERY.BAR",
      69: "GALLERY.COLUMN",
      70: "GALLERY.LINE",
      71: "GALLERY.PIE",
      72: "GALLERY.SCATTER",
      73: "COMBINATION",
      74: "PREFERRED",
      75: "ADD.OVERLAY",
      76: "GRIDLINES",
      77: "SET.PREFERRED",
      78: "AXES",
      79: "LEGEND",
      80: "ATTACH.TEXT",
      81: "ADD.ARROW",
      82: "SELECT.CHART",
      83: "SELECT.PLOT.AREA",
      84: "PATTERNS",
      85: "MAIN.CHART",
      86: "OVERLAY",
      87: "SCALE",
      88: "FORMAT.LEGEND",
      89: "FORMAT.TEXT",
      90: "EDIT.REPEAT",
      91: "PARSE",
      92: "JUSTIFY",
      93: "HIDE",
      94: "UNHIDE",
      95: "WORKSPACE",
      96: "FORMULA",
      97: "FORMULA.FILL",
      98: "FORMULA.ARRAY",
      99: "DATA.FIND.NEXT",
      100: "DATA.FIND.PREV",
      101: "FORMULA.FIND.NEXT",
      102: "FORMULA.FIND.PREV",
      103: "ACTIVATE",
      104: "ACTIVATE.NEXT",
      105: "ACTIVATE.PREV",
      106: "UNLOCKED.NEXT",
      107: "UNLOCKED.PREV",
      108: "COPY.PICTURE",
      109: "SELECT",
      110: "DELETE.NAME",
      111: "DELETE.FORMAT",
      112: "VLINE",
      113: "HLINE",
      114: "VPAGE",
      115: "HPAGE",
      116: "VSCROLL",
      117: "HSCROLL",
      118: "ALERT",
      119: "NEW",
      120: "CANCEL.COPY",
      121: "SHOW.CLIPBOARD",
      122: "MESSAGE",
      124: "PASTE.LINK",
      125: "APP.ACTIVATE",
      126: "DELETE.ARROW",
      127: "ROW.HEIGHT",
      128: "FORMAT.MOVE",
      129: "FORMAT.SIZE",
      130: "FORMULA.REPLACE",
      131: "SEND.KEYS",
      132: "SELECT.SPECIAL",
      133: "APPLY.NAMES",
      134: "REPLACE.FONT",
      135: "FREEZE.PANES",
      136: "SHOW.INFO",
      137: "SPLIT",
      138: "ON.WINDOW",
      139: "ON.DATA",
      140: "DISABLE.INPUT",
      142: "OUTLINE",
      143: "LIST.NAMES",
      144: "FILE.CLOSE",
      145: "SAVE.WORKBOOK",
      146: "DATA.FORM",
      147: "COPY.CHART",
      148: "ON.TIME",
      149: "WAIT",
      150: "FORMAT.FONT",
      151: "FILL.UP",
      152: "FILL.LEFT",
      153: "DELETE.OVERLAY",
      155: "SHORT.MENUS",
      159: "SET.UPDATE.STATUS",
      161: "COLOR.PALETTE",
      162: "DELETE.STYLE",
      163: "WINDOW.RESTORE",
      164: "WINDOW.MAXIMIZE",
      166: "CHANGE.LINK",
      167: "CALCULATE.DOCUMENT",
      168: "ON.KEY",
      169: "APP.RESTORE",
      170: "APP.MOVE",
      171: "APP.SIZE",
      172: "APP.MINIMIZE",
      173: "APP.MAXIMIZE",
      174: "BRING.TO.FRONT",
      175: "SEND.TO.BACK",
      185: "MAIN.CHART.TYPE",
      186: "OVERLAY.CHART.TYPE",
      187: "SELECT.END",
      188: "OPEN.MAIL",
      189: "SEND.MAIL",
      190: "STANDARD.FONT",
      191: "CONSOLIDATE",
      192: "SORT.SPECIAL",
      193: "GALLERY.3D.AREA",
      194: "GALLERY.3D.COLUMN",
      195: "GALLERY.3D.LINE",
      196: "GALLERY.3D.PIE",
      197: "VIEW.3D",
      198: "GOAL.SEEK",
      199: "WORKGROUP",
      200: "FILL.GROUP",
      201: "UPDATE.LINK",
      202: "PROMOTE",
      203: "DEMOTE",
      204: "SHOW.DETAIL",
      206: "UNGROUP",
      207: "OBJECT.PROPERTIES",
      208: "SAVE.NEW.OBJECT",
      209: "SHARE",
      210: "SHARE.NAME",
      211: "DUPLICATE",
      212: "APPLY.STYLE",
      213: "ASSIGN.TO.OBJECT",
      214: "OBJECT.PROTECTION",
      215: "HIDE.OBJECT",
      216: "SET.EXTRACT",
      217: "CREATE.PUBLISHER",
      218: "SUBSCRIBE.TO",
      219: "ATTRIBUTES",
      220: "SHOW.TOOLBAR",
      222: "PRINT.PREVIEW",
      223: "EDIT.COLOR",
      224: "SHOW.LEVELS",
      225: "FORMAT.MAIN",
      226: "FORMAT.OVERLAY",
      227: "ON.RECALC",
      228: "EDIT.SERIES",
      229: "DEFINE.STYLE",
      240: "LINE.PRINT",
      243: "ENTER.DATA",
      249: "GALLERY.RADAR",
      250: "MERGE.STYLES",
      251: "EDITION.OPTIONS",
      252: "PASTE.PICTURE",
      253: "PASTE.PICTURE.LINK",
      254: "SPELLING",
      256: "ZOOM",
      259: "INSERT.OBJECT",
      260: "WINDOW.MINIMIZE",
      265: "SOUND.NOTE",
      266: "SOUND.PLAY",
      267: "FORMAT.SHAPE",
      268: "EXTEND.POLYGON",
      269: "FORMAT.AUTO",
      272: "GALLERY.3D.BAR",
      273: "GALLERY.3D.SURFACE",
      274: "FILL.AUTO",
      276: "CUSTOMIZE.TOOLBAR",
      277: "ADD.TOOL",
      278: "EDIT.OBJECT",
      279: "ON.DOUBLECLICK",
      280: "ON.ENTRY",
      281: "WORKBOOK.ADD",
      282: "WORKBOOK.MOVE",
      283: "WORKBOOK.COPY",
      284: "WORKBOOK.OPTIONS",
      285: "SAVE.WORKSPACE",
      288: "CHART.WIZARD",
      289: "DELETE.TOOL",
      290: "MOVE.TOOL",
      291: "WORKBOOK.SELECT",
      292: "WORKBOOK.ACTIVATE",
      293: "ASSIGN.TO.TOOL",
      295: "COPY.TOOL",
      296: "RESET.TOOL",
      297: "CONSTRAIN.NUMERIC",
      298: "PASTE.TOOL",
      302: "WORKBOOK.NEW",
      305: "SCENARIO.CELLS",
      306: "SCENARIO.DELETE",
      307: "SCENARIO.ADD",
      308: "SCENARIO.EDIT",
      309: "SCENARIO.SHOW",
      310: "SCENARIO.SHOW.NEXT",
      311: "SCENARIO.SUMMARY",
      312: "PIVOT.TABLE.WIZARD",
      313: "PIVOT.FIELD.PROPERTIES",
      314: "PIVOT.FIELD",
      315: "PIVOT.ITEM",
      316: "PIVOT.ADD.FIELDS",
      318: "OPTIONS.CALCULATION",
      319: "OPTIONS.EDIT",
      320: "OPTIONS.VIEW",
      321: "ADDIN.MANAGER",
      322: "MENU.EDITOR",
      323: "ATTACH.TOOLBARS",
      324: "VBAActivate",
      325: "OPTIONS.CHART",
      328: "VBA.INSERT.FILE",
      330: "VBA.PROCEDURE.DEFINITION",
      336: "ROUTING.SLIP",
      338: "ROUTE.DOCUMENT",
      339: "MAIL.LOGON",
      342: "INSERT.PICTURE",
      343: "EDIT.TOOL",
      344: "GALLERY.DOUGHNUT",
      350: "CHART.TREND",
      352: "PIVOT.ITEM.PROPERTIES",
      354: "WORKBOOK.INSERT",
      355: "OPTIONS.TRANSITION",
      356: "OPTIONS.GENERAL",
      370: "FILTER.ADVANCED",
      373: "MAIL.ADD.MAILER",
      374: "MAIL.DELETE.MAILER",
      375: "MAIL.REPLY",
      376: "MAIL.REPLY.ALL",
      377: "MAIL.FORWARD",
      378: "MAIL.NEXT.LETTER",
      379: "DATA.LABEL",
      380: "INSERT.TITLE",
      381: "FONT.PROPERTIES",
      382: "MACRO.OPTIONS",
      383: "WORKBOOK.HIDE",
      384: "WORKBOOK.UNHIDE",
      385: "WORKBOOK.DELETE",
      386: "WORKBOOK.NAME",
      388: "GALLERY.CUSTOM",
      390: "ADD.CHART.AUTOFORMAT",
      391: "DELETE.CHART.AUTOFORMAT",
      392: "CHART.ADD.DATA",
      393: "AUTO.OUTLINE",
      394: "TAB.ORDER",
      395: "SHOW.DIALOG",
      396: "SELECT.ALL",
      397: "UNGROUP.SHEETS",
      398: "SUBTOTAL.CREATE",
      399: "SUBTOTAL.REMOVE",
      400: "RENAME.OBJECT",
      412: "WORKBOOK.SCROLL",
      413: "WORKBOOK.NEXT",
      414: "WORKBOOK.PREV",
      415: "WORKBOOK.TAB.SPLIT",
      416: "FULL.SCREEN",
      417: "WORKBOOK.PROTECT",
      420: "SCROLLBAR.PROPERTIES",
      421: "PIVOT.SHOW.PAGES",
      422: "TEXT.TO.COLUMNS",
      423: "FORMAT.CHARTTYPE",
      424: "LINK.FORMAT",
      425: "TRACER.DISPLAY",
      430: "TRACER.NAVIGATE",
      431: "TRACER.CLEAR",
      432: "TRACER.ERROR",
      433: "PIVOT.FIELD.GROUP",
      434: "PIVOT.FIELD.UNGROUP",
      435: "CHECKBOX.PROPERTIES",
      436: "LABEL.PROPERTIES",
      437: "LISTBOX.PROPERTIES",
      438: "EDITBOX.PROPERTIES",
      439: "PIVOT.REFRESH",
      440: "LINK.COMBO",
      441: "OPEN.TEXT",
      442: "HIDE.DIALOG",
      443: "SET.DIALOG.FOCUS",
      444: "ENABLE.OBJECT",
      445: "PUSHBUTTON.PROPERTIES",
      446: "SET.DIALOG.DEFAULT",
      447: "FILTER",
      448: "FILTER.SHOW.ALL",
      449: "CLEAR.OUTLINE",
      450: "FUNCTION.WIZARD",
      451: "ADD.LIST.ITEM",
      452: "SET.LIST.ITEM",
      453: "REMOVE.LIST.ITEM",
      454: "SELECT.LIST.ITEM",
      455: "SET.CONTROL.VALUE",
      456: "SAVE.COPY.AS",
      458: "OPTIONS.LISTS.ADD",
      459: "OPTIONS.LISTS.DELETE",
      460: "SERIES.AXES",
      461: "SERIES.X",
      462: "SERIES.Y",
      463: "ERRORBAR.X",
      464: "ERRORBAR.Y",
      465: "FORMAT.CHART",
      466: "SERIES.ORDER",
      467: "MAIL.LOGOFF",
      468: "CLEAR.ROUTING.SLIP",
      469: "APP.ACTIVATE.MICROSOFT",
      470: "MAIL.EDIT.MAILER",
      471: "ON.SHEET",
      472: "STANDARD.WIDTH",
      473: "SCENARIO.MERGE",
      474: "SUMMARY.INFO",
      475: "FIND.FILE",
      476: "ACTIVE.CELL.FONT",
      477: "ENABLE.TIPWIZARD",
      478: "VBA.MAKE.ADDIN",
      480: "INSERTDATATABLE",
      481: "WORKGROUP.OPTIONS",
      482: "MAIL.SEND.MAILER",
      485: "AUTOCORRECT",
      489: "POST.DOCUMENT",
      491: "PICKLIST",
      493: "VIEW.SHOW",
      494: "VIEW.DEFINE",
      495: "VIEW.DELETE",
      509: "SHEET.BACKGROUND",
      510: "INSERT.MAP.OBJECT",
      511: "OPTIONS.MENONO",
      517: "MSOCHECKS",
      518: "NORMAL",
      519: "LAYOUT",
      520: "RM.PRINT.AREA",
      521: "CLEAR.PRINT.AREA",
      522: "ADD.PRINT.AREA",
      523: "MOVE.BRK",
      545: "HIDECURR.NOTE",
      546: "HIDEALL.NOTES",
      547: "DELETE.NOTE",
      548: "TRAVERSE.NOTES",
      549: "ACTIVATE.NOTES",
      620: "PROTECT.REVISIONS",
      621: "UNPROTECT.REVISIONS",
      647: "OPTIONS.ME",
      653: "WEB.PUBLISH",
      667: "NEWWEBQUERY",
      673: "PIVOT.TABLE.CHART",
      753: "OPTIONS.SAVE",
      755: "OPTIONS.SPELL",
      808: "HIDEALL.INKANNOTS"
    };
    var Ftab = {
      0: "COUNT",
      1: "IF",
      2: "ISNA",
      3: "ISERROR",
      4: "SUM",
      5: "AVERAGE",
      6: "MIN",
      7: "MAX",
      8: "ROW",
      9: "COLUMN",
      10: "NA",
      11: "NPV",
      12: "STDEV",
      13: "DOLLAR",
      14: "FIXED",
      15: "SIN",
      16: "COS",
      17: "TAN",
      18: "ATAN",
      19: "PI",
      20: "SQRT",
      21: "EXP",
      22: "LN",
      23: "LOG10",
      24: "ABS",
      25: "INT",
      26: "SIGN",
      27: "ROUND",
      28: "LOOKUP",
      29: "INDEX",
      30: "REPT",
      31: "MID",
      32: "LEN",
      33: "VALUE",
      34: "TRUE",
      35: "FALSE",
      36: "AND",
      37: "OR",
      38: "NOT",
      39: "MOD",
      40: "DCOUNT",
      41: "DSUM",
      42: "DAVERAGE",
      43: "DMIN",
      44: "DMAX",
      45: "DSTDEV",
      46: "VAR",
      47: "DVAR",
      48: "TEXT",
      49: "LINEST",
      50: "TREND",
      51: "LOGEST",
      52: "GROWTH",
      53: "GOTO",
      54: "HALT",
      55: "RETURN",
      56: "PV",
      57: "FV",
      58: "NPER",
      59: "PMT",
      60: "RATE",
      61: "MIRR",
      62: "IRR",
      63: "RAND",
      64: "MATCH",
      65: "DATE",
      66: "TIME",
      67: "DAY",
      68: "MONTH",
      69: "YEAR",
      70: "WEEKDAY",
      71: "HOUR",
      72: "MINUTE",
      73: "SECOND",
      74: "NOW",
      75: "AREAS",
      76: "ROWS",
      77: "COLUMNS",
      78: "OFFSET",
      79: "ABSREF",
      80: "RELREF",
      81: "ARGUMENT",
      82: "SEARCH",
      83: "TRANSPOSE",
      84: "ERROR",
      85: "STEP",
      86: "TYPE",
      87: "ECHO",
      88: "SET.NAME",
      89: "CALLER",
      90: "DEREF",
      91: "WINDOWS",
      92: "SERIES",
      93: "DOCUMENTS",
      94: "ACTIVE.CELL",
      95: "SELECTION",
      96: "RESULT",
      97: "ATAN2",
      98: "ASIN",
      99: "ACOS",
      100: "CHOOSE",
      101: "HLOOKUP",
      102: "VLOOKUP",
      103: "LINKS",
      104: "INPUT",
      105: "ISREF",
      106: "GET.FORMULA",
      107: "GET.NAME",
      108: "SET.VALUE",
      109: "LOG",
      110: "EXEC",
      111: "CHAR",
      112: "LOWER",
      113: "UPPER",
      114: "PROPER",
      115: "LEFT",
      116: "RIGHT",
      117: "EXACT",
      118: "TRIM",
      119: "REPLACE",
      120: "SUBSTITUTE",
      121: "CODE",
      122: "NAMES",
      123: "DIRECTORY",
      124: "FIND",
      125: "CELL",
      126: "ISERR",
      127: "ISTEXT",
      128: "ISNUMBER",
      129: "ISBLANK",
      130: "T",
      131: "N",
      132: "FOPEN",
      133: "FCLOSE",
      134: "FSIZE",
      135: "FREADLN",
      136: "FREAD",
      137: "FWRITELN",
      138: "FWRITE",
      139: "FPOS",
      140: "DATEVALUE",
      141: "TIMEVALUE",
      142: "SLN",
      143: "SYD",
      144: "DDB",
      145: "GET.DEF",
      146: "REFTEXT",
      147: "TEXTREF",
      148: "INDIRECT",
      149: "REGISTER",
      150: "CALL",
      151: "ADD.BAR",
      152: "ADD.MENU",
      153: "ADD.COMMAND",
      154: "ENABLE.COMMAND",
      155: "CHECK.COMMAND",
      156: "RENAME.COMMAND",
      157: "SHOW.BAR",
      158: "DELETE.MENU",
      159: "DELETE.COMMAND",
      160: "GET.CHART.ITEM",
      161: "DIALOG.BOX",
      162: "CLEAN",
      163: "MDETERM",
      164: "MINVERSE",
      165: "MMULT",
      166: "FILES",
      167: "IPMT",
      168: "PPMT",
      169: "COUNTA",
      170: "CANCEL.KEY",
      171: "FOR",
      172: "WHILE",
      173: "BREAK",
      174: "NEXT",
      175: "INITIATE",
      176: "REQUEST",
      177: "POKE",
      178: "EXECUTE",
      179: "TERMINATE",
      180: "RESTART",
      181: "HELP",
      182: "GET.BAR",
      183: "PRODUCT",
      184: "FACT",
      185: "GET.CELL",
      186: "GET.WORKSPACE",
      187: "GET.WINDOW",
      188: "GET.DOCUMENT",
      189: "DPRODUCT",
      190: "ISNONTEXT",
      191: "GET.NOTE",
      192: "NOTE",
      193: "STDEVP",
      194: "VARP",
      195: "DSTDEVP",
      196: "DVARP",
      197: "TRUNC",
      198: "ISLOGICAL",
      199: "DCOUNTA",
      200: "DELETE.BAR",
      201: "UNREGISTER",
      204: "USDOLLAR",
      205: "FINDB",
      206: "SEARCHB",
      207: "REPLACEB",
      208: "LEFTB",
      209: "RIGHTB",
      210: "MIDB",
      211: "LENB",
      212: "ROUNDUP",
      213: "ROUNDDOWN",
      214: "ASC",
      215: "DBCS",
      216: "RANK",
      219: "ADDRESS",
      220: "DAYS360",
      221: "TODAY",
      222: "VDB",
      223: "ELSE",
      224: "ELSE.IF",
      225: "END.IF",
      226: "FOR.CELL",
      227: "MEDIAN",
      228: "SUMPRODUCT",
      229: "SINH",
      230: "COSH",
      231: "TANH",
      232: "ASINH",
      233: "ACOSH",
      234: "ATANH",
      235: "DGET",
      236: "CREATE.OBJECT",
      237: "VOLATILE",
      238: "LAST.ERROR",
      239: "CUSTOM.UNDO",
      240: "CUSTOM.REPEAT",
      241: "FORMULA.CONVERT",
      242: "GET.LINK.INFO",
      243: "TEXT.BOX",
      244: "INFO",
      245: "GROUP",
      246: "GET.OBJECT",
      247: "DB",
      248: "PAUSE",
      251: "RESUME",
      252: "FREQUENCY",
      253: "ADD.TOOLBAR",
      254: "DELETE.TOOLBAR",
      255: "User",
      256: "RESET.TOOLBAR",
      257: "EVALUATE",
      258: "GET.TOOLBAR",
      259: "GET.TOOL",
      260: "SPELLING.CHECK",
      261: "ERROR.TYPE",
      262: "APP.TITLE",
      263: "WINDOW.TITLE",
      264: "SAVE.TOOLBAR",
      265: "ENABLE.TOOL",
      266: "PRESS.TOOL",
      267: "REGISTER.ID",
      268: "GET.WORKBOOK",
      269: "AVEDEV",
      270: "BETADIST",
      271: "GAMMALN",
      272: "BETAINV",
      273: "BINOMDIST",
      274: "CHIDIST",
      275: "CHIINV",
      276: "COMBIN",
      277: "CONFIDENCE",
      278: "CRITBINOM",
      279: "EVEN",
      280: "EXPONDIST",
      281: "FDIST",
      282: "FINV",
      283: "FISHER",
      284: "FISHERINV",
      285: "FLOOR",
      286: "GAMMADIST",
      287: "GAMMAINV",
      288: "CEILING",
      289: "HYPGEOMDIST",
      290: "LOGNORMDIST",
      291: "LOGINV",
      292: "NEGBINOMDIST",
      293: "NORMDIST",
      294: "NORMSDIST",
      295: "NORMINV",
      296: "NORMSINV",
      297: "STANDARDIZE",
      298: "ODD",
      299: "PERMUT",
      300: "POISSON",
      301: "TDIST",
      302: "WEIBULL",
      303: "SUMXMY2",
      304: "SUMX2MY2",
      305: "SUMX2PY2",
      306: "CHITEST",
      307: "CORREL",
      308: "COVAR",
      309: "FORECAST",
      310: "FTEST",
      311: "INTERCEPT",
      312: "PEARSON",
      313: "RSQ",
      314: "STEYX",
      315: "SLOPE",
      316: "TTEST",
      317: "PROB",
      318: "DEVSQ",
      319: "GEOMEAN",
      320: "HARMEAN",
      321: "SUMSQ",
      322: "KURT",
      323: "SKEW",
      324: "ZTEST",
      325: "LARGE",
      326: "SMALL",
      327: "QUARTILE",
      328: "PERCENTILE",
      329: "PERCENTRANK",
      330: "MODE",
      331: "TRIMMEAN",
      332: "TINV",
      334: "MOVIE.COMMAND",
      335: "GET.MOVIE",
      336: "CONCATENATE",
      337: "POWER",
      338: "PIVOT.ADD.DATA",
      339: "GET.PIVOT.TABLE",
      340: "GET.PIVOT.FIELD",
      341: "GET.PIVOT.ITEM",
      342: "RADIANS",
      343: "DEGREES",
      344: "SUBTOTAL",
      345: "SUMIF",
      346: "COUNTIF",
      347: "COUNTBLANK",
      348: "SCENARIO.GET",
      349: "OPTIONS.LISTS.GET",
      350: "ISPMT",
      351: "DATEDIF",
      352: "DATESTRING",
      353: "NUMBERSTRING",
      354: "ROMAN",
      355: "OPEN.DIALOG",
      356: "SAVE.DIALOG",
      357: "VIEW.GET",
      358: "GETPIVOTDATA",
      359: "HYPERLINK",
      360: "PHONETIC",
      361: "AVERAGEA",
      362: "MAXA",
      363: "MINA",
      364: "STDEVPA",
      365: "VARPA",
      366: "STDEVA",
      367: "VARA",
      368: "BAHTTEXT",
      369: "THAIDAYOFWEEK",
      370: "THAIDIGIT",
      371: "THAIMONTHOFYEAR",
      372: "THAINUMSOUND",
      373: "THAINUMSTRING",
      374: "THAISTRINGLENGTH",
      375: "ISTHAIDIGIT",
      376: "ROUNDBAHTDOWN",
      377: "ROUNDBAHTUP",
      378: "THAIYEAR",
      379: "RTD",
      380: "CUBEVALUE",
      381: "CUBEMEMBER",
      382: "CUBEMEMBERPROPERTY",
      383: "CUBERANKEDMEMBER",
      384: "HEX2BIN",
      385: "HEX2DEC",
      386: "HEX2OCT",
      387: "DEC2BIN",
      388: "DEC2HEX",
      389: "DEC2OCT",
      390: "OCT2BIN",
      391: "OCT2HEX",
      392: "OCT2DEC",
      393: "BIN2DEC",
      394: "BIN2OCT",
      395: "BIN2HEX",
      396: "IMSUB",
      397: "IMDIV",
      398: "IMPOWER",
      399: "IMABS",
      400: "IMSQRT",
      401: "IMLN",
      402: "IMLOG2",
      403: "IMLOG10",
      404: "IMSIN",
      405: "IMCOS",
      406: "IMEXP",
      407: "IMARGUMENT",
      408: "IMCONJUGATE",
      409: "IMAGINARY",
      410: "IMREAL",
      411: "COMPLEX",
      412: "IMSUM",
      413: "IMPRODUCT",
      414: "SERIESSUM",
      415: "FACTDOUBLE",
      416: "SQRTPI",
      417: "QUOTIENT",
      418: "DELTA",
      419: "GESTEP",
      420: "ISEVEN",
      421: "ISODD",
      422: "MROUND",
      423: "ERF",
      424: "ERFC",
      425: "BESSELJ",
      426: "BESSELK",
      427: "BESSELY",
      428: "BESSELI",
      429: "XIRR",
      430: "XNPV",
      431: "PRICEMAT",
      432: "YIELDMAT",
      433: "INTRATE",
      434: "RECEIVED",
      435: "DISC",
      436: "PRICEDISC",
      437: "YIELDDISC",
      438: "TBILLEQ",
      439: "TBILLPRICE",
      440: "TBILLYIELD",
      441: "PRICE",
      442: "YIELD",
      443: "DOLLARDE",
      444: "DOLLARFR",
      445: "NOMINAL",
      446: "EFFECT",
      447: "CUMPRINC",
      448: "CUMIPMT",
      449: "EDATE",
      450: "EOMONTH",
      451: "YEARFRAC",
      452: "COUPDAYBS",
      453: "COUPDAYS",
      454: "COUPDAYSNC",
      455: "COUPNCD",
      456: "COUPNUM",
      457: "COUPPCD",
      458: "DURATION",
      459: "MDURATION",
      460: "ODDLPRICE",
      461: "ODDLYIELD",
      462: "ODDFPRICE",
      463: "ODDFYIELD",
      464: "RANDBETWEEN",
      465: "WEEKNUM",
      466: "AMORDEGRC",
      467: "AMORLINC",
      468: "CONVERT",
      724: "SHEETJS",
      469: "ACCRINT",
      470: "ACCRINTM",
      471: "WORKDAY",
      472: "NETWORKDAYS",
      473: "GCD",
      474: "MULTINOMIAL",
      475: "LCM",
      476: "FVSCHEDULE",
      477: "CUBEKPIMEMBER",
      478: "CUBESET",
      479: "CUBESETCOUNT",
      480: "IFERROR",
      481: "COUNTIFS",
      482: "SUMIFS",
      483: "AVERAGEIF",
      484: "AVERAGEIFS"
    };
    var FtabArgc = {
      2: 1,
      /* ISNA */
      3: 1,
      /* ISERROR */
      10: 0,
      /* NA */
      15: 1,
      /* SIN */
      16: 1,
      /* COS */
      17: 1,
      /* TAN */
      18: 1,
      /* ATAN */
      19: 0,
      /* PI */
      20: 1,
      /* SQRT */
      21: 1,
      /* EXP */
      22: 1,
      /* LN */
      23: 1,
      /* LOG10 */
      24: 1,
      /* ABS */
      25: 1,
      /* INT */
      26: 1,
      /* SIGN */
      27: 2,
      /* ROUND */
      30: 2,
      /* REPT */
      31: 3,
      /* MID */
      32: 1,
      /* LEN */
      33: 1,
      /* VALUE */
      34: 0,
      /* TRUE */
      35: 0,
      /* FALSE */
      38: 1,
      /* NOT */
      39: 2,
      /* MOD */
      40: 3,
      /* DCOUNT */
      41: 3,
      /* DSUM */
      42: 3,
      /* DAVERAGE */
      43: 3,
      /* DMIN */
      44: 3,
      /* DMAX */
      45: 3,
      /* DSTDEV */
      47: 3,
      /* DVAR */
      48: 2,
      /* TEXT */
      53: 1,
      /* GOTO */
      61: 3,
      /* MIRR */
      63: 0,
      /* RAND */
      65: 3,
      /* DATE */
      66: 3,
      /* TIME */
      67: 1,
      /* DAY */
      68: 1,
      /* MONTH */
      69: 1,
      /* YEAR */
      70: 1,
      /* WEEKDAY */
      71: 1,
      /* HOUR */
      72: 1,
      /* MINUTE */
      73: 1,
      /* SECOND */
      74: 0,
      /* NOW */
      75: 1,
      /* AREAS */
      76: 1,
      /* ROWS */
      77: 1,
      /* COLUMNS */
      79: 2,
      /* ABSREF */
      80: 2,
      /* RELREF */
      83: 1,
      /* TRANSPOSE */
      85: 0,
      /* STEP */
      86: 1,
      /* TYPE */
      89: 0,
      /* CALLER */
      90: 1,
      /* DEREF */
      94: 0,
      /* ACTIVE.CELL */
      95: 0,
      /* SELECTION */
      97: 2,
      /* ATAN2 */
      98: 1,
      /* ASIN */
      99: 1,
      /* ACOS */
      101: 3,
      /* HLOOKUP */
      102: 3,
      /* VLOOKUP */
      105: 1,
      /* ISREF */
      106: 1,
      /* GET.FORMULA */
      108: 2,
      /* SET.VALUE */
      111: 1,
      /* CHAR */
      112: 1,
      /* LOWER */
      113: 1,
      /* UPPER */
      114: 1,
      /* PROPER */
      117: 2,
      /* EXACT */
      118: 1,
      /* TRIM */
      119: 4,
      /* REPLACE */
      121: 1,
      /* CODE */
      126: 1,
      /* ISERR */
      127: 1,
      /* ISTEXT */
      128: 1,
      /* ISNUMBER */
      129: 1,
      /* ISBLANK */
      130: 1,
      /* T */
      131: 1,
      /* N */
      133: 1,
      /* FCLOSE */
      134: 1,
      /* FSIZE */
      135: 1,
      /* FREADLN */
      136: 2,
      /* FREAD */
      137: 2,
      /* FWRITELN */
      138: 2,
      /* FWRITE */
      140: 1,
      /* DATEVALUE */
      141: 1,
      /* TIMEVALUE */
      142: 3,
      /* SLN */
      143: 4,
      /* SYD */
      144: 4,
      /* DDB */
      161: 1,
      /* DIALOG.BOX */
      162: 1,
      /* CLEAN */
      163: 1,
      /* MDETERM */
      164: 1,
      /* MINVERSE */
      165: 2,
      /* MMULT */
      172: 1,
      /* WHILE */
      175: 2,
      /* INITIATE */
      176: 2,
      /* REQUEST */
      177: 3,
      /* POKE */
      178: 2,
      /* EXECUTE */
      179: 1,
      /* TERMINATE */
      184: 1,
      /* FACT */
      186: 1,
      /* GET.WORKSPACE */
      189: 3,
      /* DPRODUCT */
      190: 1,
      /* ISNONTEXT */
      195: 3,
      /* DSTDEVP */
      196: 3,
      /* DVARP */
      197: 1,
      /* TRUNC */
      198: 1,
      /* ISLOGICAL */
      199: 3,
      /* DCOUNTA */
      201: 1,
      /* UNREGISTER */
      207: 4,
      /* REPLACEB */
      210: 3,
      /* MIDB */
      211: 1,
      /* LENB */
      212: 2,
      /* ROUNDUP */
      213: 2,
      /* ROUNDDOWN */
      214: 1,
      /* ASC */
      215: 1,
      /* DBCS */
      225: 0,
      /* END.IF */
      229: 1,
      /* SINH */
      230: 1,
      /* COSH */
      231: 1,
      /* TANH */
      232: 1,
      /* ASINH */
      233: 1,
      /* ACOSH */
      234: 1,
      /* ATANH */
      235: 3,
      /* DGET */
      244: 1,
      /* INFO */
      247: 4,
      /* DB */
      252: 2,
      /* FREQUENCY */
      257: 1,
      /* EVALUATE */
      261: 1,
      /* ERROR.TYPE */
      271: 1,
      /* GAMMALN */
      273: 4,
      /* BINOMDIST */
      274: 2,
      /* CHIDIST */
      275: 2,
      /* CHIINV */
      276: 2,
      /* COMBIN */
      277: 3,
      /* CONFIDENCE */
      278: 3,
      /* CRITBINOM */
      279: 1,
      /* EVEN */
      280: 3,
      /* EXPONDIST */
      281: 3,
      /* FDIST */
      282: 3,
      /* FINV */
      283: 1,
      /* FISHER */
      284: 1,
      /* FISHERINV */
      285: 2,
      /* FLOOR */
      286: 4,
      /* GAMMADIST */
      287: 3,
      /* GAMMAINV */
      288: 2,
      /* CEILING */
      289: 4,
      /* HYPGEOMDIST */
      290: 3,
      /* LOGNORMDIST */
      291: 3,
      /* LOGINV */
      292: 3,
      /* NEGBINOMDIST */
      293: 4,
      /* NORMDIST */
      294: 1,
      /* NORMSDIST */
      295: 3,
      /* NORMINV */
      296: 1,
      /* NORMSINV */
      297: 3,
      /* STANDARDIZE */
      298: 1,
      /* ODD */
      299: 2,
      /* PERMUT */
      300: 3,
      /* POISSON */
      301: 3,
      /* TDIST */
      302: 4,
      /* WEIBULL */
      303: 2,
      /* SUMXMY2 */
      304: 2,
      /* SUMX2MY2 */
      305: 2,
      /* SUMX2PY2 */
      306: 2,
      /* CHITEST */
      307: 2,
      /* CORREL */
      308: 2,
      /* COVAR */
      309: 3,
      /* FORECAST */
      310: 2,
      /* FTEST */
      311: 2,
      /* INTERCEPT */
      312: 2,
      /* PEARSON */
      313: 2,
      /* RSQ */
      314: 2,
      /* STEYX */
      315: 2,
      /* SLOPE */
      316: 4,
      /* TTEST */
      325: 2,
      /* LARGE */
      326: 2,
      /* SMALL */
      327: 2,
      /* QUARTILE */
      328: 2,
      /* PERCENTILE */
      331: 2,
      /* TRIMMEAN */
      332: 2,
      /* TINV */
      337: 2,
      /* POWER */
      342: 1,
      /* RADIANS */
      343: 1,
      /* DEGREES */
      346: 2,
      /* COUNTIF */
      347: 1,
      /* COUNTBLANK */
      350: 4,
      /* ISPMT */
      351: 3,
      /* DATEDIF */
      352: 1,
      /* DATESTRING */
      353: 2,
      /* NUMBERSTRING */
      360: 1,
      /* PHONETIC */
      368: 1,
      /* BAHTTEXT */
      369: 1,
      /* THAIDAYOFWEEK */
      370: 1,
      /* THAIDIGIT */
      371: 1,
      /* THAIMONTHOFYEAR */
      372: 1,
      /* THAINUMSOUND */
      373: 1,
      /* THAINUMSTRING */
      374: 1,
      /* THAISTRINGLENGTH */
      375: 1,
      /* ISTHAIDIGIT */
      376: 1,
      /* ROUNDBAHTDOWN */
      377: 1,
      /* ROUNDBAHTUP */
      378: 1,
      /* THAIYEAR */
      382: 3,
      /* CUBEMEMBERPROPERTY */
      385: 1,
      /* HEX2DEC */
      392: 1,
      /* OCT2DEC */
      393: 1,
      /* BIN2DEC */
      396: 2,
      /* IMSUB */
      397: 2,
      /* IMDIV */
      398: 2,
      /* IMPOWER */
      399: 1,
      /* IMABS */
      400: 1,
      /* IMSQRT */
      401: 1,
      /* IMLN */
      402: 1,
      /* IMLOG2 */
      403: 1,
      /* IMLOG10 */
      404: 1,
      /* IMSIN */
      405: 1,
      /* IMCOS */
      406: 1,
      /* IMEXP */
      407: 1,
      /* IMARGUMENT */
      408: 1,
      /* IMCONJUGATE */
      409: 1,
      /* IMAGINARY */
      410: 1,
      /* IMREAL */
      414: 4,
      /* SERIESSUM */
      415: 1,
      /* FACTDOUBLE */
      416: 1,
      /* SQRTPI */
      417: 2,
      /* QUOTIENT */
      420: 1,
      /* ISEVEN */
      421: 1,
      /* ISODD */
      422: 2,
      /* MROUND */
      424: 1,
      /* ERFC */
      425: 2,
      /* BESSELJ */
      426: 2,
      /* BESSELK */
      427: 2,
      /* BESSELY */
      428: 2,
      /* BESSELI */
      430: 3,
      /* XNPV */
      438: 3,
      /* TBILLEQ */
      439: 3,
      /* TBILLPRICE */
      440: 3,
      /* TBILLYIELD */
      443: 2,
      /* DOLLARDE */
      444: 2,
      /* DOLLARFR */
      445: 2,
      /* NOMINAL */
      446: 2,
      /* EFFECT */
      447: 6,
      /* CUMPRINC */
      448: 6,
      /* CUMIPMT */
      449: 2,
      /* EDATE */
      450: 2,
      /* EOMONTH */
      464: 2,
      /* RANDBETWEEN */
      468: 3,
      /* CONVERT */
      476: 2,
      /* FVSCHEDULE */
      479: 1,
      /* CUBESETCOUNT */
      480: 2,
      /* IFERROR */
      65535: 0
    };
    var XLSXFutureFunctions = {
      "_xlfn.ACOT": "ACOT",
      "_xlfn.ACOTH": "ACOTH",
      "_xlfn.AGGREGATE": "AGGREGATE",
      "_xlfn.ARABIC": "ARABIC",
      "_xlfn.AVERAGEIF": "AVERAGEIF",
      "_xlfn.AVERAGEIFS": "AVERAGEIFS",
      "_xlfn.BASE": "BASE",
      "_xlfn.BETA.DIST": "BETA.DIST",
      "_xlfn.BETA.INV": "BETA.INV",
      "_xlfn.BINOM.DIST": "BINOM.DIST",
      "_xlfn.BINOM.DIST.RANGE": "BINOM.DIST.RANGE",
      "_xlfn.BINOM.INV": "BINOM.INV",
      "_xlfn.BITAND": "BITAND",
      "_xlfn.BITLSHIFT": "BITLSHIFT",
      "_xlfn.BITOR": "BITOR",
      "_xlfn.BITRSHIFT": "BITRSHIFT",
      "_xlfn.BITXOR": "BITXOR",
      "_xlfn.CEILING.MATH": "CEILING.MATH",
      "_xlfn.CEILING.PRECISE": "CEILING.PRECISE",
      "_xlfn.CHISQ.DIST": "CHISQ.DIST",
      "_xlfn.CHISQ.DIST.RT": "CHISQ.DIST.RT",
      "_xlfn.CHISQ.INV": "CHISQ.INV",
      "_xlfn.CHISQ.INV.RT": "CHISQ.INV.RT",
      "_xlfn.CHISQ.TEST": "CHISQ.TEST",
      "_xlfn.COMBINA": "COMBINA",
      "_xlfn.CONCAT": "CONCAT",
      "_xlfn.CONFIDENCE.NORM": "CONFIDENCE.NORM",
      "_xlfn.CONFIDENCE.T": "CONFIDENCE.T",
      "_xlfn.COT": "COT",
      "_xlfn.COTH": "COTH",
      "_xlfn.COUNTIFS": "COUNTIFS",
      "_xlfn.COVARIANCE.P": "COVARIANCE.P",
      "_xlfn.COVARIANCE.S": "COVARIANCE.S",
      "_xlfn.CSC": "CSC",
      "_xlfn.CSCH": "CSCH",
      "_xlfn.DAYS": "DAYS",
      "_xlfn.DECIMAL": "DECIMAL",
      "_xlfn.ECMA.CEILING": "ECMA.CEILING",
      "_xlfn.ERF.PRECISE": "ERF.PRECISE",
      "_xlfn.ERFC.PRECISE": "ERFC.PRECISE",
      "_xlfn.EXPON.DIST": "EXPON.DIST",
      "_xlfn.F.DIST": "F.DIST",
      "_xlfn.F.DIST.RT": "F.DIST.RT",
      "_xlfn.F.INV": "F.INV",
      "_xlfn.F.INV.RT": "F.INV.RT",
      "_xlfn.F.TEST": "F.TEST",
      "_xlfn.FILTERXML": "FILTERXML",
      "_xlfn.FLOOR.MATH": "FLOOR.MATH",
      "_xlfn.FLOOR.PRECISE": "FLOOR.PRECISE",
      "_xlfn.FORECAST.ETS": "FORECAST.ETS",
      "_xlfn.FORECAST.ETS.CONFINT": "FORECAST.ETS.CONFINT",
      "_xlfn.FORECAST.ETS.SEASONALITY": "FORECAST.ETS.SEASONALITY",
      "_xlfn.FORECAST.ETS.STAT": "FORECAST.ETS.STAT",
      "_xlfn.FORECAST.LINEAR": "FORECAST.LINEAR",
      "_xlfn.FORMULATEXT": "FORMULATEXT",
      "_xlfn.GAMMA": "GAMMA",
      "_xlfn.GAMMA.DIST": "GAMMA.DIST",
      "_xlfn.GAMMA.INV": "GAMMA.INV",
      "_xlfn.GAMMALN.PRECISE": "GAMMALN.PRECISE",
      "_xlfn.GAUSS": "GAUSS",
      "_xlfn.HYPGEOM.DIST": "HYPGEOM.DIST",
      "_xlfn.IFERROR": "IFERROR",
      "_xlfn.IFNA": "IFNA",
      "_xlfn.IFS": "IFS",
      "_xlfn.IMCOSH": "IMCOSH",
      "_xlfn.IMCOT": "IMCOT",
      "_xlfn.IMCSC": "IMCSC",
      "_xlfn.IMCSCH": "IMCSCH",
      "_xlfn.IMSEC": "IMSEC",
      "_xlfn.IMSECH": "IMSECH",
      "_xlfn.IMSINH": "IMSINH",
      "_xlfn.IMTAN": "IMTAN",
      "_xlfn.ISFORMULA": "ISFORMULA",
      "_xlfn.ISO.CEILING": "ISO.CEILING",
      "_xlfn.ISOWEEKNUM": "ISOWEEKNUM",
      "_xlfn.LOGNORM.DIST": "LOGNORM.DIST",
      "_xlfn.LOGNORM.INV": "LOGNORM.INV",
      "_xlfn.MAXIFS": "MAXIFS",
      "_xlfn.MINIFS": "MINIFS",
      "_xlfn.MODE.MULT": "MODE.MULT",
      "_xlfn.MODE.SNGL": "MODE.SNGL",
      "_xlfn.MUNIT": "MUNIT",
      "_xlfn.NEGBINOM.DIST": "NEGBINOM.DIST",
      "_xlfn.NETWORKDAYS.INTL": "NETWORKDAYS.INTL",
      "_xlfn.NIGBINOM": "NIGBINOM",
      "_xlfn.NORM.DIST": "NORM.DIST",
      "_xlfn.NORM.INV": "NORM.INV",
      "_xlfn.NORM.S.DIST": "NORM.S.DIST",
      "_xlfn.NORM.S.INV": "NORM.S.INV",
      "_xlfn.NUMBERVALUE": "NUMBERVALUE",
      "_xlfn.PDURATION": "PDURATION",
      "_xlfn.PERCENTILE.EXC": "PERCENTILE.EXC",
      "_xlfn.PERCENTILE.INC": "PERCENTILE.INC",
      "_xlfn.PERCENTRANK.EXC": "PERCENTRANK.EXC",
      "_xlfn.PERCENTRANK.INC": "PERCENTRANK.INC",
      "_xlfn.PERMUTATIONA": "PERMUTATIONA",
      "_xlfn.PHI": "PHI",
      "_xlfn.POISSON.DIST": "POISSON.DIST",
      "_xlfn.QUARTILE.EXC": "QUARTILE.EXC",
      "_xlfn.QUARTILE.INC": "QUARTILE.INC",
      "_xlfn.QUERYSTRING": "QUERYSTRING",
      "_xlfn.RANK.AVG": "RANK.AVG",
      "_xlfn.RANK.EQ": "RANK.EQ",
      "_xlfn.RRI": "RRI",
      "_xlfn.SEC": "SEC",
      "_xlfn.SECH": "SECH",
      "_xlfn.SHEET": "SHEET",
      "_xlfn.SHEETS": "SHEETS",
      "_xlfn.SKEW.P": "SKEW.P",
      "_xlfn.STDEV.P": "STDEV.P",
      "_xlfn.STDEV.S": "STDEV.S",
      "_xlfn.SUMIFS": "SUMIFS",
      "_xlfn.SWITCH": "SWITCH",
      "_xlfn.T.DIST": "T.DIST",
      "_xlfn.T.DIST.2T": "T.DIST.2T",
      "_xlfn.T.DIST.RT": "T.DIST.RT",
      "_xlfn.T.INV": "T.INV",
      "_xlfn.T.INV.2T": "T.INV.2T",
      "_xlfn.T.TEST": "T.TEST",
      "_xlfn.TEXTJOIN": "TEXTJOIN",
      "_xlfn.UNICHAR": "UNICHAR",
      "_xlfn.UNICODE": "UNICODE",
      "_xlfn.VAR.P": "VAR.P",
      "_xlfn.VAR.S": "VAR.S",
      "_xlfn.WEBSERVICE": "WEBSERVICE",
      "_xlfn.WEIBULL.DIST": "WEIBULL.DIST",
      "_xlfn.WORKDAY.INTL": "WORKDAY.INTL",
      "_xlfn.XOR": "XOR",
      "_xlfn.Z.TEST": "Z.TEST"
    };
    function ods_to_csf_formula(f) {
      if (f.slice(0, 3) == "of:")
        f = f.slice(3);
      if (f.charCodeAt(0) == 61) {
        f = f.slice(1);
        if (f.charCodeAt(0) == 61)
          f = f.slice(1);
      }
      f = f.replace(/COM\.MICROSOFT\./g, "");
      f = f.replace(/\[((?:\.[A-Z]+[0-9]+)(?::\.[A-Z]+[0-9]+)?)\]/g, function($$, $1) {
        return $1.replace(/\./g, "");
      });
      f = f.replace(/\[.(#[A-Z]*[?!])\]/g, "$1");
      return f.replace(/[;~]/g, ",").replace(/\|/g, ";");
    }
    function csf_to_ods_formula(f) {
      var o = "of:=" + f.replace(crefregex, "$1[.$2$3$4$5]").replace(/\]:\[/g, ":");
      return o.replace(/;/g, "|").replace(/,/g, ";");
    }
    function ods_to_csf_3D(r) {
      var a = r.split(":");
      var s = a[0].split(".")[0];
      return [s, a[0].split(".")[1] + (a.length > 1 ? ":" + (a[1].split(".")[1] || a[1].split(".")[0]) : "")];
    }
    function csf_to_ods_3D(r) {
      return r.replace(/\./, "!");
    }
    var strs = {};
    var _ssfopts = {};
    RELS.WS = [
      "http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
      "http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet"
    ];
    var browser_has_Map = typeof Map !== "undefined";
    function get_sst_id(sst, str, rev) {
      var i3 = 0, len = sst.length;
      if (rev) {
        if (browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {
          var revarr = browser_has_Map ? rev.get(str) : rev[str];
          for (; i3 < revarr.length; ++i3) {
            if (sst[revarr[i3]].t === str) {
              sst.Count++;
              return revarr[i3];
            }
          }
        }
      } else
        for (; i3 < len; ++i3) {
          if (sst[i3].t === str) {
            sst.Count++;
            return i3;
          }
        }
      sst[len] = { t: str };
      sst.Count++;
      sst.Unique++;
      if (rev) {
        if (browser_has_Map) {
          if (!rev.has(str))
            rev.set(str, []);
          rev.get(str).push(len);
        } else {
          if (!Object.prototype.hasOwnProperty.call(rev, str))
            rev[str] = [];
          rev[str].push(len);
        }
      }
      return len;
    }
    function col_obj_w(C, col) {
      var p = { min: C + 1, max: C + 1 };
      var wch = -1;
      if (col.MDW)
        MDW = col.MDW;
      if (col.width != null)
        p.customWidth = 1;
      else if (col.wpx != null)
        wch = px2char(col.wpx);
      else if (col.wch != null)
        wch = col.wch;
      if (wch > -1) {
        p.width = char2width(wch);
        p.customWidth = 1;
      } else if (col.width != null)
        p.width = col.width;
      if (col.hidden)
        p.hidden = true;
      return p;
    }
    function default_margins(margins, mode) {
      if (!margins)
        return;
      var defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];
      if (mode == "xlml")
        defs = [1, 1, 1, 1, 0.5, 0.5];
      if (margins.left == null)
        margins.left = defs[0];
      if (margins.right == null)
        margins.right = defs[1];
      if (margins.top == null)
        margins.top = defs[2];
      if (margins.bottom == null)
        margins.bottom = defs[3];
      if (margins.header == null)
        margins.header = defs[4];
      if (margins.footer == null)
        margins.footer = defs[5];
    }
    function get_cell_style(styles, cell, opts) {
      var z = opts.revssf[cell.z != null ? cell.z : "General"];
      var i3 = 60, len = styles.length;
      if (z == null && opts.ssf) {
        for (; i3 < 392; ++i3)
          if (opts.ssf[i3] == null) {
            SSF.load(cell.z, i3);
            opts.ssf[i3] = cell.z;
            opts.revssf[cell.z] = z = i3;
            break;
          }
      }
      for (i3 = 0; i3 != len; ++i3)
        if (styles[i3].numFmtId === z)
          return i3;
      styles[len] = {
        numFmtId: z,
        fontId: 0,
        fillId: 0,
        borderId: 0,
        xfId: 0,
        applyNumberFormat: 1
      };
      return len;
    }
    function safe_format(p, fmtid, fillid, opts, themes, styles) {
      try {
        if (opts.cellNF)
          p.z = SSF._table[fmtid];
      } catch (e) {
        if (opts.WTF)
          throw e;
      }
      if (p.t === "z")
        return;
      if (p.t === "d" && typeof p.v === "string")
        p.v = parseDate(p.v);
      if (!opts || opts.cellText !== false)
        try {
          if (SSF._table[fmtid] == null)
            SSF.load(SSFImplicit[fmtid] || "General", fmtid);
          if (p.t === "e")
            p.w = p.w || BErr[p.v];
          else if (fmtid === 0) {
            if (p.t === "n") {
              if ((p.v | 0) === p.v)
                p.w = SSF._general_int(p.v);
              else
                p.w = SSF._general_num(p.v);
            } else if (p.t === "d") {
              var dd = datenum(p.v);
              if ((dd | 0) === dd)
                p.w = SSF._general_int(dd);
              else
                p.w = SSF._general_num(dd);
            } else if (p.v === void 0)
              return "";
            else
              p.w = SSF._general(p.v, _ssfopts);
          } else if (p.t === "d")
            p.w = SSF.format(fmtid, datenum(p.v), _ssfopts);
          else
            p.w = SSF.format(fmtid, p.v, _ssfopts);
        } catch (e) {
          if (opts.WTF)
            throw e;
        }
      if (!opts.cellStyles)
        return;
      if (fillid != null)
        try {
          p.s = styles.Fills[fillid];
          if (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {
            p.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);
            if (opts.WTF)
              p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;
          }
          if (p.s.bgColor && p.s.bgColor.theme) {
            p.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);
            if (opts.WTF)
              p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;
          }
        } catch (e) {
          if (opts.WTF && styles.Fills)
            throw e;
        }
    }
    function check_ws(ws, sname, i3) {
      if (ws && ws["!ref"]) {
        var range = safe_decode_range(ws["!ref"]);
        if (range.e.c < range.s.c || range.e.r < range.s.r)
          throw new Error("Bad range (" + i3 + "): " + ws["!ref"]);
      }
    }
    function parse_ws_xml_dim(ws, s) {
      var d = safe_decode_range(s);
      if (d.s.r <= d.e.r && d.s.c <= d.e.c && d.s.r >= 0 && d.s.c >= 0)
        ws["!ref"] = encode_range(d);
    }
    var mergecregex = /<(?:\w:)?mergeCell ref="[A-Z0-9:]+"\s*[\/]?>/g;
    var sheetdataregex = /<(?:\w+:)?sheetData[^>]*>([\s\S]*)<\/(?:\w+:)?sheetData>/;
    var hlinkregex = /<(?:\w:)?hyperlink [^>]*>/mg;
    var dimregex = /"(\w*:\w*)"/;
    var colregex = /<(?:\w:)?col\b[^>]*[\/]?>/g;
    var afregex = /<(?:\w:)?autoFilter[^>]*([\/]|>([\s\S]*)<\/(?:\w:)?autoFilter)>/g;
    var marginregex = /<(?:\w:)?pageMargins[^>]*\/>/g;
    var sheetprregex = /<(?:\w:)?sheetPr\b(?:[^>a-z][^>]*)?\/>/;
    var svsregex = /<(?:\w:)?sheetViews[^>]*(?:[\/]|>([\s\S]*)<\/(?:\w:)?sheetViews)>/;
    function parse_ws_xml(data, opts, idx, rels, wb, themes, styles) {
      if (!data)
        return data;
      if (!rels)
        rels = { "!id": {} };
      var s = opts.dense ? [] : {};
      var refguess = { s: { r: 2e6, c: 2e6 }, e: { r: 0, c: 0 } };
      var data1 = "", data2 = "";
      var mtch = data.match(sheetdataregex);
      if (mtch) {
        data1 = data.slice(0, mtch.index);
        data2 = data.slice(mtch.index + mtch[0].length);
      } else
        data1 = data2 = data;
      var sheetPr = data1.match(sheetprregex);
      if (sheetPr)
        parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
      var ridx = (data1.match(/<(?:\w*:)?dimension/) || { index: -1 }).index;
      if (ridx > 0) {
        var ref2 = data1.slice(ridx, ridx + 50).match(dimregex);
        if (ref2)
          parse_ws_xml_dim(s, ref2[1]);
      }
      var svs = data1.match(svsregex);
      if (svs && svs[1])
        parse_ws_xml_sheetviews(svs[1], wb);
      var columns = [];
      if (opts.cellStyles) {
        var cols = data1.match(colregex);
        if (cols)
          parse_ws_xml_cols(columns, cols);
      }
      if (mtch)
        parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);
      var afilter = data2.match(afregex);
      if (afilter)
        s["!autofilter"] = parse_ws_xml_autofilter(afilter[0]);
      var merges = [];
      var _merge = data2.match(mergecregex);
      if (_merge)
        for (ridx = 0; ridx != _merge.length; ++ridx)
          merges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf('"') + 1));
      var hlink = data2.match(hlinkregex);
      if (hlink)
        parse_ws_xml_hlinks(s, hlink, rels);
      var margins = data2.match(marginregex);
      if (margins)
        s["!margins"] = parse_ws_xml_margins(parsexmltag(margins[0]));
      if (!s["!ref"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r)
        s["!ref"] = encode_range(refguess);
      if (opts.sheetRows > 0 && s["!ref"]) {
        var tmpref = safe_decode_range(s["!ref"]);
        if (opts.sheetRows <= +tmpref.e.r) {
          tmpref.e.r = opts.sheetRows - 1;
          if (tmpref.e.r > refguess.e.r)
            tmpref.e.r = refguess.e.r;
          if (tmpref.e.r < tmpref.s.r)
            tmpref.s.r = tmpref.e.r;
          if (tmpref.e.c > refguess.e.c)
            tmpref.e.c = refguess.e.c;
          if (tmpref.e.c < tmpref.s.c)
            tmpref.s.c = tmpref.e.c;
          s["!fullref"] = s["!ref"];
          s["!ref"] = encode_range(tmpref);
        }
      }
      if (columns.length > 0)
        s["!cols"] = columns;
      if (merges.length > 0)
        s["!merges"] = merges;
      return s;
    }
    function write_ws_xml_merges(merges) {
      if (merges.length === 0)
        return "";
      var o = '<mergeCells count="' + merges.length + '">';
      for (var i3 = 0; i3 != merges.length; ++i3)
        o += '<mergeCell ref="' + encode_range(merges[i3]) + '"/>';
      return o + "</mergeCells>";
    }
    function parse_ws_xml_sheetpr(sheetPr, s, wb, idx) {
      var data = parsexmltag(sheetPr);
      if (!wb.Sheets[idx])
        wb.Sheets[idx] = {};
      if (data.codeName)
        wb.Sheets[idx].CodeName = data.codeName;
    }
    function write_ws_xml_sheetpr(ws, wb, idx, opts, o) {
      var needed = false;
      var props = {}, payload = null;
      if (opts.bookType !== "xlsx" && wb.vbaraw) {
        var cname = wb.SheetNames[idx];
        try {
          if (wb.Workbook)
            cname = wb.Workbook.Sheets[idx].CodeName || cname;
        } catch (e) {
        }
        needed = true;
        props.codeName = escapexml(cname);
      }
      if (!needed && !payload)
        return;
      o[o.length] = writextag("sheetPr", payload, props);
    }
    var sheetprot_deffalse = ["objects", "scenarios", "selectLockedCells", "selectUnlockedCells"];
    var sheetprot_deftrue = [
      "formatColumns",
      "formatRows",
      "formatCells",
      "insertColumns",
      "insertRows",
      "insertHyperlinks",
      "deleteColumns",
      "deleteRows",
      "sort",
      "autoFilter",
      "pivotTables"
    ];
    function write_ws_xml_protection(sp) {
      var o = { sheet: 1 };
      sheetprot_deffalse.forEach(function(n) {
        if (sp[n] != null && sp[n])
          o[n] = "1";
      });
      sheetprot_deftrue.forEach(function(n) {
        if (sp[n] != null && !sp[n])
          o[n] = "0";
      });
      if (sp.password)
        o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();
      return writextag("sheetProtection", null, o);
    }
    function parse_ws_xml_hlinks(s, data, rels) {
      var dense = Array.isArray(s);
      for (var i3 = 0; i3 != data.length; ++i3) {
        var val = parsexmltag(utf8read(data[i3]), true);
        if (!val.ref)
          return;
        var rel = ((rels || {})["!id"] || [])[val.id];
        if (rel) {
          val.Target = rel.Target;
          if (val.location)
            val.Target += "#" + val.location;
        } else {
          val.Target = "#" + val.location;
          rel = { Target: val.Target, TargetMode: "Internal" };
        }
        val.Rel = rel;
        if (val.tooltip) {
          val.Tooltip = val.tooltip;
          delete val.tooltip;
        }
        var rng = safe_decode_range(val.ref);
        for (var R = rng.s.r; R <= rng.e.r; ++R)
          for (var C = rng.s.c; C <= rng.e.c; ++C) {
            var addr = encode_cell({ c: C, r: R });
            if (dense) {
              if (!s[R])
                s[R] = [];
              if (!s[R][C])
                s[R][C] = { t: "z", v: void 0 };
              s[R][C].l = val;
            } else {
              if (!s[addr])
                s[addr] = { t: "z", v: void 0 };
              s[addr].l = val;
            }
          }
      }
    }
    function parse_ws_xml_margins(margin) {
      var o = {};
      ["left", "right", "top", "bottom", "header", "footer"].forEach(function(k) {
        if (margin[k])
          o[k] = parseFloat(margin[k]);
      });
      return o;
    }
    function write_ws_xml_margins(margin) {
      default_margins(margin);
      return writextag("pageMargins", null, margin);
    }
    function parse_ws_xml_cols(columns, cols) {
      var seencol = false;
      for (var coli = 0; coli != cols.length; ++coli) {
        var coll = parsexmltag(cols[coli], true);
        if (coll.hidden)
          coll.hidden = parsexmlbool(coll.hidden);
        var colm = parseInt(coll.min, 10) - 1, colM = parseInt(coll.max, 10) - 1;
        delete coll.min;
        delete coll.max;
        coll.width = +coll.width;
        if (!seencol && coll.width) {
          seencol = true;
          find_mdw_colw(coll.width);
        }
        process_col(coll);
        while (colm <= colM)
          columns[colm++] = dup(coll);
      }
    }
    function write_ws_xml_cols(ws, cols) {
      var o = ["<cols>"], col;
      for (var i3 = 0; i3 != cols.length; ++i3) {
        if (!(col = cols[i3]))
          continue;
        o[o.length] = writextag("col", null, col_obj_w(i3, col));
      }
      o[o.length] = "</cols>";
      return o.join("");
    }
    function parse_ws_xml_autofilter(data) {
      var o = { ref: (data.match(/ref="([^"]*)"/) || [])[1] };
      return o;
    }
    function write_ws_xml_autofilter(data, ws, wb, idx) {
      var ref2 = typeof data.ref == "string" ? data.ref : encode_range(data.ref);
      if (!wb.Workbook)
        wb.Workbook = { Sheets: [] };
      if (!wb.Workbook.Names)
        wb.Workbook.Names = [];
      var names = wb.Workbook.Names;
      var range = decode_range(ref2);
      if (range.s.r == range.e.r) {
        range.e.r = decode_range(ws["!ref"]).e.r;
        ref2 = encode_range(range);
      }
      for (var i3 = 0; i3 < names.length; ++i3) {
        var name = names[i3];
        if (name.Name != "_xlnm._FilterDatabase")
          continue;
        if (name.Sheet != idx)
          continue;
        name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref2;
        break;
      }
      if (i3 == names.length)
        names.push({ Name: "_xlnm._FilterDatabase", Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref2 });
      return writextag("autoFilter", null, { ref: ref2 });
    }
    var sviewregex = /<(?:\w:)?sheetView(?:[^>a-z][^>]*)?\/?>/;
    function parse_ws_xml_sheetviews(data, wb) {
      if (!wb.Views)
        wb.Views = [{}];
      (data.match(sviewregex) || []).forEach(function(r, i3) {
        var tag = parsexmltag(r);
        if (!wb.Views[i3])
          wb.Views[i3] = {};
        if (parsexmlbool(tag.rightToLeft))
          wb.Views[i3].RTL = true;
      });
    }
    function write_ws_xml_sheetviews(ws, opts, idx, wb) {
      var sview = { workbookViewId: "0" };
      if ((((wb || {}).Workbook || {}).Views || [])[0])
        sview.rightToLeft = wb.Workbook.Views[0].RTL ? "1" : "0";
      return writextag("sheetViews", writextag("sheetView", null, sview), {});
    }
    function write_ws_xml_cell(cell, ref2, ws, opts) {
      if (cell.v === void 0 && cell.f === void 0 || cell.t === "z")
        return "";
      var vv = "";
      var oldt = cell.t, oldv = cell.v;
      if (cell.t !== "z")
        switch (cell.t) {
          case "b":
            vv = cell.v ? "1" : "0";
            break;
          case "n":
            vv = "" + cell.v;
            break;
          case "e":
            vv = BErr[cell.v];
            break;
          case "d":
            if (opts && opts.cellDates)
              vv = parseDate(cell.v, -1).toISOString();
            else {
              cell = dup(cell);
              cell.t = "n";
              vv = "" + (cell.v = datenum(parseDate(cell.v)));
            }
            if (typeof cell.z === "undefined")
              cell.z = SSF._table[14];
            break;
          default:
            vv = cell.v;
            break;
        }
      var v = writetag("v", escapexml(vv)), o = { r: ref2 };
      var os = get_cell_style(opts.cellXfs, cell, opts);
      if (os !== 0)
        o.s = os;
      switch (cell.t) {
        case "n":
          break;
        case "d":
          o.t = "d";
          break;
        case "b":
          o.t = "b";
          break;
        case "e":
          o.t = "e";
          break;
        case "z":
          break;
        default:
          if (cell.v == null) {
            delete cell.t;
            break;
          }
          if (opts && opts.bookSST) {
            v = writetag("v", "" + get_sst_id(opts.Strings, cell.v, opts.revStrings));
            o.t = "s";
            break;
          }
          o.t = "str";
          break;
      }
      if (cell.t != oldt) {
        cell.t = oldt;
        cell.v = oldv;
      }
      if (cell.f) {
        var ff = cell.F && cell.F.slice(0, ref2.length) == ref2 ? { t: "array", ref: cell.F } : null;
        v = writextag("f", escapexml(cell.f), ff) + (cell.v != null ? v : "");
      }
      if (cell.l)
        ws["!links"].push([ref2, cell.l]);
      if (cell.c)
        ws["!comments"].push([ref2, cell.c]);
      return writextag("c", v, o);
    }
    var parse_ws_xml_data = function() {
      var cellregex = /<(?:\w+:)?c[ >]/, rowregex = /<\/(?:\w+:)?row>/;
      var rregex = /r=["']([^"']*)["']/, isregex = /<(?:\w+:)?is>([\S\s]*?)<\/(?:\w+:)?is>/;
      var refregex = /ref=["']([^"']*)["']/;
      var match_v = matchtag("v"), match_f = matchtag("f");
      return function parse_ws_xml_data2(sdata, s, opts, guess, themes, styles) {
        var ri = 0, x = "", cells = [], cref = [], idx = 0, i3 = 0, cc = 0, d = "", p;
        var tag, tagr = 0, tagc = 0;
        var sstr, ftag;
        var fmtid = 0, fillid = 0;
        var do_format = Array.isArray(styles.CellXf), cf;
        var arrayf = [];
        var sharedf = [];
        var dense = Array.isArray(s);
        var rows = [], rowobj = {}, rowrite = false;
        for (var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {
          x = marr[mt].trim();
          var xlen = x.length;
          if (xlen === 0)
            continue;
          for (ri = 0; ri < xlen; ++ri)
            if (x.charCodeAt(ri) === 62)
              break;
          ++ri;
          tag = parsexmltag(x.slice(0, ri), true);
          tagr = tag.r != null ? parseInt(tag.r, 10) : tagr + 1;
          tagc = -1;
          if (opts.sheetRows && opts.sheetRows < tagr)
            continue;
          if (guess.s.r > tagr - 1)
            guess.s.r = tagr - 1;
          if (guess.e.r < tagr - 1)
            guess.e.r = tagr - 1;
          if (opts && opts.cellStyles) {
            rowobj = {};
            rowrite = false;
            if (tag.ht) {
              rowrite = true;
              rowobj.hpt = parseFloat(tag.ht);
              rowobj.hpx = pt2px(rowobj.hpt);
            }
            if (tag.hidden == "1") {
              rowrite = true;
              rowobj.hidden = true;
            }
            if (tag.outlineLevel != null) {
              rowrite = true;
              rowobj.level = +tag.outlineLevel;
            }
            if (rowrite)
              rows[tagr - 1] = rowobj;
          }
          cells = x.slice(ri).split(cellregex);
          for (var rslice = 0; rslice != cells.length; ++rslice)
            if (cells[rslice].trim().charAt(0) != "<")
              break;
          cells = cells.slice(rslice);
          for (ri = 0; ri != cells.length; ++ri) {
            x = cells[ri].trim();
            if (x.length === 0)
              continue;
            cref = x.match(rregex);
            idx = ri;
            i3 = 0;
            cc = 0;
            x = "<c " + (x.slice(0, 1) == "<" ? ">" : "") + x;
            if (cref != null && cref.length === 2) {
              idx = 0;
              d = cref[1];
              for (i3 = 0; i3 != d.length; ++i3) {
                if ((cc = d.charCodeAt(i3) - 64) < 1 || cc > 26)
                  break;
                idx = 26 * idx + cc;
              }
              --idx;
              tagc = idx;
            } else
              ++tagc;
            for (i3 = 0; i3 != x.length; ++i3)
              if (x.charCodeAt(i3) === 62)
                break;
            ++i3;
            tag = parsexmltag(x.slice(0, i3), true);
            if (!tag.r)
              tag.r = encode_cell({ r: tagr - 1, c: tagc });
            d = x.slice(i3);
            p = { t: "" };
            if ((cref = d.match(match_v)) != null && cref[1] !== "")
              p.v = unescapexml(cref[1]);
            if (opts.cellFormula) {
              if ((cref = d.match(match_f)) != null && cref[1] !== "") {
                p.f = _xlfn(unescapexml(utf8read(cref[1])));
                if (cref[0].indexOf('t="array"') > -1) {
                  p.F = (d.match(refregex) || [])[1];
                  if (p.F.indexOf(":") > -1)
                    arrayf.push([safe_decode_range(p.F), p.F]);
                } else if (cref[0].indexOf('t="shared"') > -1) {
                  ftag = parsexmltag(cref[0]);
                  sharedf[parseInt(ftag.si, 10)] = [ftag, _xlfn(unescapexml(utf8read(cref[1]))), tag.r];
                }
              } else if (cref = d.match(/<f[^>]*\/>/)) {
                ftag = parsexmltag(cref[0]);
                if (sharedf[ftag.si])
                  p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2], tag.r);
              }
              var _tag = decode_cell(tag.r);
              for (i3 = 0; i3 < arrayf.length; ++i3)
                if (_tag.r >= arrayf[i3][0].s.r && _tag.r <= arrayf[i3][0].e.r) {
                  if (_tag.c >= arrayf[i3][0].s.c && _tag.c <= arrayf[i3][0].e.c)
                    p.F = arrayf[i3][1];
                }
            }
            if (tag.t == null && p.v === void 0) {
              if (p.f || p.F) {
                p.v = 0;
                p.t = "n";
              } else if (!opts.sheetStubs)
                continue;
              else
                p.t = "z";
            } else
              p.t = tag.t || "n";
            if (guess.s.c > tagc)
              guess.s.c = tagc;
            if (guess.e.c < tagc)
              guess.e.c = tagc;
            switch (p.t) {
              case "n":
                if (p.v == "" || p.v == null) {
                  if (!opts.sheetStubs)
                    continue;
                  p.t = "z";
                } else
                  p.v = parseFloat(p.v);
                break;
              case "s":
                if (typeof p.v == "undefined") {
                  if (!opts.sheetStubs)
                    continue;
                  p.t = "z";
                } else {
                  sstr = strs[parseInt(p.v, 10)];
                  p.v = sstr.t;
                  p.r = sstr.r;
                  if (opts.cellHTML)
                    p.h = sstr.h;
                }
                break;
              case "str":
                p.t = "s";
                p.v = p.v != null ? utf8read(p.v) : "";
                if (opts.cellHTML)
                  p.h = escapehtml(p.v);
                break;
              case "inlineStr":
                cref = d.match(isregex);
                p.t = "s";
                if (cref != null && (sstr = parse_si(cref[1]))) {
                  p.v = sstr.t;
                  if (opts.cellHTML)
                    p.h = sstr.h;
                } else
                  p.v = "";
                break;
              case "b":
                p.v = parsexmlbool(p.v);
                break;
              case "d":
                if (opts.cellDates)
                  p.v = parseDate(p.v, 1);
                else {
                  p.v = datenum(parseDate(p.v, 1));
                  p.t = "n";
                }
                break;
              case "e":
                if (!opts || opts.cellText !== false)
                  p.w = p.v;
                p.v = RBErr[p.v];
                break;
            }
            fmtid = fillid = 0;
            cf = null;
            if (do_format && tag.s !== void 0) {
              cf = styles.CellXf[tag.s];
              if (cf != null) {
                if (cf.numFmtId != null)
                  fmtid = cf.numFmtId;
                if (opts.cellStyles) {
                  if (cf.fillId != null)
                    fillid = cf.fillId;
                }
              }
            }
            safe_format(p, fmtid, fillid, opts, themes, styles);
            if (opts.cellDates && do_format && p.t == "n" && SSF.is_date(SSF._table[fmtid])) {
              p.t = "d";
              p.v = numdate(p.v);
            }
            if (dense) {
              var _r = decode_cell(tag.r);
              if (!s[_r.r])
                s[_r.r] = [];
              s[_r.r][_r.c] = p;
            } else
              s[tag.r] = p;
          }
        }
        if (rows.length > 0)
          s["!rows"] = rows;
      };
    }();
    function write_ws_xml_data(ws, opts, idx, wb) {
      var o = [], r = [], range = safe_decode_range(ws["!ref"]), cell = "", ref2, rr = "", cols = [], R = 0, C = 0, rows = ws["!rows"];
      var dense = Array.isArray(ws);
      var params = { r: rr }, row, height = -1;
      for (C = range.s.c; C <= range.e.c; ++C)
        cols[C] = encode_col(C);
      for (R = range.s.r; R <= range.e.r; ++R) {
        r = [];
        rr = encode_row(R);
        for (C = range.s.c; C <= range.e.c; ++C) {
          ref2 = cols[C] + rr;
          var _cell = dense ? (ws[R] || [])[C] : ws[ref2];
          if (_cell === void 0)
            continue;
          if ((cell = write_ws_xml_cell(_cell, ref2, ws, opts)) != null)
            r.push(cell);
        }
        if (r.length > 0 || rows && rows[R]) {
          params = { r: rr };
          if (rows && rows[R]) {
            row = rows[R];
            if (row.hidden)
              params.hidden = 1;
            height = -1;
            if (row.hpx)
              height = px2pt(row.hpx);
            else if (row.hpt)
              height = row.hpt;
            if (height > -1) {
              params.ht = height;
              params.customHeight = 1;
            }
            if (row.level) {
              params.outlineLevel = row.level;
            }
          }
          o[o.length] = writextag("row", r.join(""), params);
        }
      }
      if (rows)
        for (; R < rows.length; ++R) {
          if (rows && rows[R]) {
            params = { r: R + 1 };
            row = rows[R];
            if (row.hidden)
              params.hidden = 1;
            height = -1;
            if (row.hpx)
              height = px2pt(row.hpx);
            else if (row.hpt)
              height = row.hpt;
            if (height > -1) {
              params.ht = height;
              params.customHeight = 1;
            }
            if (row.level) {
              params.outlineLevel = row.level;
            }
            o[o.length] = writextag("row", "", params);
          }
        }
      return o.join("");
    }
    var WS_XML_ROOT = writextag("worksheet", null, {
      "xmlns": XMLNS.main[0],
      "xmlns:r": XMLNS.r
    });
    function write_ws_xml(idx, opts, wb, rels) {
      var o = [XML_HEADER, WS_XML_ROOT];
      var s = wb.SheetNames[idx], sidx = 0, rdata = "";
      var ws = wb.Sheets[s];
      if (ws == null)
        ws = {};
      var ref2 = ws["!ref"] || "A1";
      var range = safe_decode_range(ref2);
      if (range.e.c > 16383 || range.e.r > 1048575) {
        if (opts.WTF)
          throw new Error("Range " + ref2 + " exceeds format limit A1:XFD1048576");
        range.e.c = Math.min(range.e.c, 16383);
        range.e.r = Math.min(range.e.c, 1048575);
        ref2 = encode_range(range);
      }
      if (!rels)
        rels = {};
      ws["!comments"] = [];
      var _drawing = [];
      write_ws_xml_sheetpr(ws, wb, idx, opts, o);
      o[o.length] = writextag("dimension", null, { "ref": ref2 });
      o[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);
      if (opts.sheetFormat)
        o[o.length] = writextag("sheetFormatPr", null, {
          defaultRowHeight: opts.sheetFormat.defaultRowHeight || "16",
          baseColWidth: opts.sheetFormat.baseColWidth || "10",
          outlineLevelRow: opts.sheetFormat.outlineLevelRow || "7"
        });
      if (ws["!cols"] != null && ws["!cols"].length > 0)
        o[o.length] = write_ws_xml_cols(ws, ws["!cols"]);
      o[sidx = o.length] = "<sheetData/>";
      ws["!links"] = [];
      if (ws["!ref"] != null) {
        rdata = write_ws_xml_data(ws, opts);
        if (rdata.length > 0)
          o[o.length] = rdata;
      }
      if (o.length > sidx + 1) {
        o[o.length] = "</sheetData>";
        o[sidx] = o[sidx].replace("/>", ">");
      }
      if (ws["!protect"] != null)
        o[o.length] = write_ws_xml_protection(ws["!protect"]);
      if (ws["!autofilter"] != null)
        o[o.length] = write_ws_xml_autofilter(ws["!autofilter"], ws, wb, idx);
      if (ws["!merges"] != null && ws["!merges"].length > 0)
        o[o.length] = write_ws_xml_merges(ws["!merges"]);
      var relc = -1, rel, rId = -1;
      if (ws["!links"].length > 0) {
        o[o.length] = "<hyperlinks>";
        ws["!links"].forEach(function(l) {
          if (!l[1].Target)
            return;
          rel = { "ref": l[0] };
          if (l[1].Target.charAt(0) != "#") {
            rId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, ""), RELS.HLINK);
            rel["r:id"] = "rId" + rId;
          }
          if ((relc = l[1].Target.indexOf("#")) > -1)
            rel.location = escapexml(l[1].Target.slice(relc + 1));
          if (l[1].Tooltip)
            rel.tooltip = escapexml(l[1].Tooltip);
          o[o.length] = writextag("hyperlink", null, rel);
        });
        o[o.length] = "</hyperlinks>";
      }
      delete ws["!links"];
      if (ws["!margins"] != null)
        o[o.length] = write_ws_xml_margins(ws["!margins"]);
      if (!opts || opts.ignoreEC || opts.ignoreEC == void 0)
        o[o.length] = writetag("ignoredErrors", writextag("ignoredError", null, { numberStoredAsText: 1, sqref: ref2 }));
      if (_drawing.length > 0) {
        rId = add_rels(rels, -1, "../drawings/drawing" + (idx + 1) + ".xml", RELS.DRAW);
        o[o.length] = writextag("drawing", null, { "r:id": "rId" + rId });
        ws["!drawing"] = _drawing;
      }
      if (ws["!comments"].length > 0) {
        rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx + 1) + ".vml", RELS.VML);
        o[o.length] = writextag("legacyDrawing", null, { "r:id": "rId" + rId });
        ws["!legacy"] = rId;
      }
      if (o.length > 1) {
        o[o.length] = "</worksheet>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    function parse_BrtRowHdr(data, length) {
      var z = {};
      var tgt = data.l + length;
      z.r = data.read_shift(4);
      data.l += 4;
      var miyRw = data.read_shift(2);
      data.l += 1;
      var flags = data.read_shift(1);
      data.l = tgt;
      if (flags & 7)
        z.level = flags & 7;
      if (flags & 16)
        z.hidden = true;
      if (flags & 32)
        z.hpt = miyRw / 20;
      return z;
    }
    function write_BrtRowHdr(R, range, ws) {
      var o = new_buf(17 + 8 * 16);
      var row = (ws["!rows"] || [])[R] || {};
      o.write_shift(4, R);
      o.write_shift(4, 0);
      var miyRw = 320;
      if (row.hpx)
        miyRw = px2pt(row.hpx) * 20;
      else if (row.hpt)
        miyRw = row.hpt * 20;
      o.write_shift(2, miyRw);
      o.write_shift(1, 0);
      var flags = 0;
      if (row.level)
        flags |= row.level;
      if (row.hidden)
        flags |= 16;
      if (row.hpx || row.hpt)
        flags |= 32;
      o.write_shift(1, flags);
      o.write_shift(1, 0);
      var ncolspan = 0, lcs = o.l;
      o.l += 4;
      var caddr = { r: R, c: 0 };
      for (var i3 = 0; i3 < 16; ++i3) {
        if (range.s.c > i3 + 1 << 10 || range.e.c < i3 << 10)
          continue;
        var first = -1, last = -1;
        for (var j2 = i3 << 10; j2 < i3 + 1 << 10; ++j2) {
          caddr.c = j2;
          var cell = Array.isArray(ws) ? (ws[caddr.r] || [])[caddr.c] : ws[encode_cell(caddr)];
          if (cell) {
            if (first < 0)
              first = j2;
            last = j2;
          }
        }
        if (first < 0)
          continue;
        ++ncolspan;
        o.write_shift(4, first);
        o.write_shift(4, last);
      }
      var l = o.l;
      o.l = lcs;
      o.write_shift(4, ncolspan);
      o.l = l;
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function write_row_header(ba, ws, range, R) {
      var o = write_BrtRowHdr(R, range, ws);
      if (o.length > 17 || (ws["!rows"] || [])[R])
        write_record(ba, "BrtRowHdr", o);
    }
    var parse_BrtWsDim = parse_UncheckedRfX;
    var write_BrtWsDim = write_UncheckedRfX;
    function parse_BrtWsFmtInfo() {
    }
    function parse_BrtWsProp(data, length) {
      var z = {};
      data.l += 19;
      z.name = parse_XLSBCodeName(data);
      return z;
    }
    function write_BrtWsProp(str, o) {
      if (o == null)
        o = new_buf(84 + 4 * str.length);
      for (var i3 = 0; i3 < 3; ++i3)
        o.write_shift(1, 0);
      write_BrtColor({ auto: 1 }, o);
      o.write_shift(-4, -1);
      o.write_shift(-4, -1);
      write_XLSBCodeName(str, o);
      return o.slice(0, o.l);
    }
    function parse_BrtCellBlank(data) {
      var cell = parse_XLSBCell(data);
      return [cell];
    }
    function write_BrtCellBlank(cell, ncell, o) {
      if (o == null)
        o = new_buf(8);
      return write_XLSBCell(ncell, o);
    }
    function parse_BrtCellBool(data) {
      var cell = parse_XLSBCell(data);
      var fBool = data.read_shift(1);
      return [cell, fBool, "b"];
    }
    function write_BrtCellBool(cell, ncell, o) {
      if (o == null)
        o = new_buf(9);
      write_XLSBCell(ncell, o);
      o.write_shift(1, cell.v ? 1 : 0);
      return o;
    }
    function parse_BrtCellError(data) {
      var cell = parse_XLSBCell(data);
      var bError = data.read_shift(1);
      return [cell, bError, "e"];
    }
    function parse_BrtCellIsst(data) {
      var cell = parse_XLSBCell(data);
      var isst = data.read_shift(4);
      return [cell, isst, "s"];
    }
    function write_BrtCellIsst(cell, ncell, o) {
      if (o == null)
        o = new_buf(12);
      write_XLSBCell(ncell, o);
      o.write_shift(4, ncell.v);
      return o;
    }
    function parse_BrtCellReal(data) {
      var cell = parse_XLSBCell(data);
      var value = parse_Xnum(data);
      return [cell, value, "n"];
    }
    function write_BrtCellReal(cell, ncell, o) {
      if (o == null)
        o = new_buf(16);
      write_XLSBCell(ncell, o);
      write_Xnum(cell.v, o);
      return o;
    }
    function parse_BrtCellRk(data) {
      var cell = parse_XLSBCell(data);
      var value = parse_RkNumber(data);
      return [cell, value, "n"];
    }
    function write_BrtCellRk(cell, ncell, o) {
      if (o == null)
        o = new_buf(12);
      write_XLSBCell(ncell, o);
      write_RkNumber(cell.v, o);
      return o;
    }
    function parse_BrtCellSt(data) {
      var cell = parse_XLSBCell(data);
      var value = parse_XLWideString(data);
      return [cell, value, "str"];
    }
    function write_BrtCellSt(cell, ncell, o) {
      if (o == null)
        o = new_buf(12 + 4 * cell.v.length);
      write_XLSBCell(ncell, o);
      write_XLWideString(cell.v, o);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function parse_BrtFmlaBool(data, length, opts) {
      var end = data.l + length;
      var cell = parse_XLSBCell(data);
      cell.r = opts["!row"];
      var value = data.read_shift(1);
      var o = [cell, value, "b"];
      if (opts.cellFormula) {
        data.l += 2;
        var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
        o[3] = stringify_formula(formula, null, cell, opts.supbooks, opts);
      } else
        data.l = end;
      return o;
    }
    function parse_BrtFmlaError(data, length, opts) {
      var end = data.l + length;
      var cell = parse_XLSBCell(data);
      cell.r = opts["!row"];
      var value = data.read_shift(1);
      var o = [cell, value, "e"];
      if (opts.cellFormula) {
        data.l += 2;
        var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
        o[3] = stringify_formula(formula, null, cell, opts.supbooks, opts);
      } else
        data.l = end;
      return o;
    }
    function parse_BrtFmlaNum(data, length, opts) {
      var end = data.l + length;
      var cell = parse_XLSBCell(data);
      cell.r = opts["!row"];
      var value = parse_Xnum(data);
      var o = [cell, value, "n"];
      if (opts.cellFormula) {
        data.l += 2;
        var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
        o[3] = stringify_formula(formula, null, cell, opts.supbooks, opts);
      } else
        data.l = end;
      return o;
    }
    function parse_BrtFmlaString(data, length, opts) {
      var end = data.l + length;
      var cell = parse_XLSBCell(data);
      cell.r = opts["!row"];
      var value = parse_XLWideString(data);
      var o = [cell, value, "str"];
      if (opts.cellFormula) {
        data.l += 2;
        var formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);
        o[3] = stringify_formula(formula, null, cell, opts.supbooks, opts);
      } else
        data.l = end;
      return o;
    }
    var parse_BrtMergeCell = parse_UncheckedRfX;
    var write_BrtMergeCell = write_UncheckedRfX;
    function write_BrtBeginMergeCells(cnt, o) {
      if (o == null)
        o = new_buf(4);
      o.write_shift(4, cnt);
      return o;
    }
    function parse_BrtHLink(data, length) {
      var end = data.l + length;
      var rfx = parse_UncheckedRfX(data);
      var relId = parse_XLNullableWideString(data);
      var loc = parse_XLWideString(data);
      var tooltip = parse_XLWideString(data);
      var display = parse_XLWideString(data);
      data.l = end;
      var o = { rfx, relId, loc, display };
      if (tooltip)
        o.Tooltip = tooltip;
      return o;
    }
    function write_BrtHLink(l, rId) {
      var o = new_buf(50 + 4 * (l[1].Target.length + (l[1].Tooltip || "").length));
      write_UncheckedRfX({ s: decode_cell(l[0]), e: decode_cell(l[0]) }, o);
      write_RelID("rId" + rId, o);
      var locidx = l[1].Target.indexOf("#");
      var loc = locidx == -1 ? "" : l[1].Target.slice(locidx + 1);
      write_XLWideString(loc || "", o);
      write_XLWideString(l[1].Tooltip || "", o);
      write_XLWideString("", o);
      return o.slice(0, o.l);
    }
    function parse_BrtPane() {
    }
    function parse_BrtArrFmla(data, length, opts) {
      var end = data.l + length;
      var rfx = parse_RfX(data);
      var fAlwaysCalc = data.read_shift(1);
      var o = [rfx];
      o[2] = fAlwaysCalc;
      if (opts.cellFormula) {
        var formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts);
        o[1] = formula;
      } else
        data.l = end;
      return o;
    }
    function parse_BrtShrFmla(data, length, opts) {
      var end = data.l + length;
      var rfx = parse_UncheckedRfX(data);
      var o = [rfx];
      if (opts.cellFormula) {
        var formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts);
        o[1] = formula;
        data.l = end;
      } else
        data.l = end;
      return o;
    }
    function write_BrtColInfo(C, col, o) {
      if (o == null)
        o = new_buf(18);
      var p = col_obj_w(C, col);
      o.write_shift(-4, C);
      o.write_shift(-4, C);
      o.write_shift(4, (p.width || 10) * 256);
      o.write_shift(
        4,
        0
        /*ixfe*/
      );
      var flags = 0;
      if (col.hidden)
        flags |= 1;
      if (typeof p.width == "number")
        flags |= 2;
      if (col.level)
        flags |= col.level << 8;
      o.write_shift(2, flags);
      return o;
    }
    var BrtMarginKeys = ["left", "right", "top", "bottom", "header", "footer"];
    function parse_BrtMargins(data) {
      var margins = {};
      BrtMarginKeys.forEach(function(k) {
        margins[k] = parse_Xnum(data);
      });
      return margins;
    }
    function write_BrtMargins(margins, o) {
      if (o == null)
        o = new_buf(6 * 8);
      default_margins(margins);
      BrtMarginKeys.forEach(function(k) {
        write_Xnum(margins[k], o);
      });
      return o;
    }
    function parse_BrtBeginWsView(data) {
      var f = data.read_shift(2);
      data.l += 28;
      return { RTL: f & 32 };
    }
    function write_BrtBeginWsView(ws, Workbook, o) {
      if (o == null)
        o = new_buf(30);
      var f = 924;
      if ((((Workbook || {}).Views || [])[0] || {}).RTL)
        f |= 32;
      o.write_shift(2, f);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      o.write_shift(1, 0);
      o.write_shift(1, 0);
      o.write_shift(2, 0);
      o.write_shift(2, 100);
      o.write_shift(2, 0);
      o.write_shift(2, 0);
      o.write_shift(2, 0);
      o.write_shift(4, 0);
      return o;
    }
    function write_BrtCellIgnoreEC(ref2) {
      var o = new_buf(24);
      o.write_shift(4, 4);
      o.write_shift(4, 1);
      write_UncheckedRfX(ref2, o);
      return o;
    }
    function write_BrtSheetProtection(sp, o) {
      if (o == null)
        o = new_buf(16 * 4 + 2);
      o.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0);
      o.write_shift(4, 1);
      [
        ["objects", false],
        // fObjects
        ["scenarios", false],
        // fScenarios
        ["formatCells", true],
        // fFormatCells
        ["formatColumns", true],
        // fFormatColumns
        ["formatRows", true],
        // fFormatRows
        ["insertColumns", true],
        // fInsertColumns
        ["insertRows", true],
        // fInsertRows
        ["insertHyperlinks", true],
        // fInsertHyperlinks
        ["deleteColumns", true],
        // fDeleteColumns
        ["deleteRows", true],
        // fDeleteRows
        ["selectLockedCells", false],
        // fSelLockedCells
        ["sort", true],
        // fSort
        ["autoFilter", true],
        // fAutoFilter
        ["pivotTables", true],
        // fPivotTables
        ["selectUnlockedCells", false]
        // fSelUnlockedCells
      ].forEach(function(n) {
        if (n[1])
          o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0);
        else
          o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1);
      });
      return o;
    }
    function parse_BrtDVal() {
    }
    function parse_BrtDVal14() {
    }
    function parse_ws_bin(data, _opts, idx, rels, wb, themes, styles) {
      if (!data)
        return data;
      var opts = _opts || {};
      if (!rels)
        rels = { "!id": {} };
      var s = opts.dense ? [] : {};
      var ref2;
      var refguess = { s: { r: 2e6, c: 2e6 }, e: { r: 0, c: 0 } };
      var pass = false, end = false;
      var row, p, cf, R, C, addr, sstr, rr, cell;
      var merges = [];
      opts.biff = 12;
      opts["!row"] = 0;
      var ai = 0, af = false;
      var arrayf = [];
      var sharedf = {};
      var supbooks = opts.supbooks || wb.supbooks || [[]];
      supbooks.sharedf = sharedf;
      supbooks.arrayf = arrayf;
      supbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) {
        return x.name;
      });
      if (!opts.supbooks) {
        opts.supbooks = supbooks;
        if (wb.Names)
          for (var i3 = 0; i3 < wb.Names.length; ++i3)
            supbooks[0][i3 + 1] = wb.Names[i3];
      }
      var colinfo = [], rowinfo = [];
      var seencol = false;
      recordhopper(data, function ws_parse(val, R_n, RT) {
        if (end)
          return;
        switch (RT) {
          case 148:
            ref2 = val;
            break;
          case 0:
            row = val;
            if (opts.sheetRows && opts.sheetRows <= row.r)
              end = true;
            rr = encode_row(R = row.r);
            opts["!row"] = row.r;
            if (val.hidden || val.hpt || val.level != null) {
              if (val.hpt)
                val.hpx = pt2px(val.hpt);
              rowinfo[val.r] = val;
            }
            break;
          case 2:
          case 3:
          case 4:
          case 5:
          case 6:
          case 7:
          case 8:
          case 9:
          case 10:
          case 11:
            p = { t: val[2] };
            switch (val[2]) {
              case "n":
                p.v = val[1];
                break;
              case "s":
                sstr = strs[val[1]];
                p.v = sstr.t;
                p.r = sstr.r;
                break;
              case "b":
                p.v = val[1] ? true : false;
                break;
              case "e":
                p.v = val[1];
                if (opts.cellText !== false)
                  p.w = BErr[p.v];
                break;
              case "str":
                p.t = "s";
                p.v = val[1];
                break;
            }
            if (cf = styles.CellXf[val[0].iStyleRef])
              safe_format(p, cf.numFmtId, null, opts, themes, styles);
            C = val[0].c;
            if (opts.dense) {
              if (!s[R])
                s[R] = [];
              s[R][C] = p;
            } else
              s[encode_col(C) + rr] = p;
            if (opts.cellFormula) {
              af = false;
              for (ai = 0; ai < arrayf.length; ++ai) {
                var aii = arrayf[ai];
                if (row.r >= aii[0].s.r && row.r <= aii[0].e.r) {
                  if (C >= aii[0].s.c && C <= aii[0].e.c) {
                    p.F = encode_range(aii[0]);
                    af = true;
                  }
                }
              }
              if (!af && val.length > 3)
                p.f = val[3];
            }
            if (refguess.s.r > row.r)
              refguess.s.r = row.r;
            if (refguess.s.c > C)
              refguess.s.c = C;
            if (refguess.e.r < row.r)
              refguess.e.r = row.r;
            if (refguess.e.c < C)
              refguess.e.c = C;
            if (opts.cellDates && cf && p.t == "n" && SSF.is_date(SSF._table[cf.numFmtId])) {
              var _d = SSF.parse_date_code(p.v);
              if (_d) {
                p.t = "d";
                p.v = new Date(_d.y, _d.m - 1, _d.d, _d.H, _d.M, _d.S, _d.u);
              }
            }
            break;
          case 1:
            if (!opts.sheetStubs || pass)
              break;
            p = { t: "z", v: void 0 };
            C = val[0].c;
            if (opts.dense) {
              if (!s[R])
                s[R] = [];
              s[R][C] = p;
            } else
              s[encode_col(C) + rr] = p;
            if (refguess.s.r > row.r)
              refguess.s.r = row.r;
            if (refguess.s.c > C)
              refguess.s.c = C;
            if (refguess.e.r < row.r)
              refguess.e.r = row.r;
            if (refguess.e.c < C)
              refguess.e.c = C;
            break;
          case 176:
            merges.push(val);
            break;
          case 494:
            var rel = rels["!id"][val.relId];
            if (rel) {
              val.Target = rel.Target;
              if (val.loc)
                val.Target += "#" + val.loc;
              val.Rel = rel;
            } else if (val.relId == "") {
              val.Target = "#" + val.loc;
            }
            for (R = val.rfx.s.r; R <= val.rfx.e.r; ++R)
              for (C = val.rfx.s.c; C <= val.rfx.e.c; ++C) {
                if (opts.dense) {
                  if (!s[R])
                    s[R] = [];
                  if (!s[R][C])
                    s[R][C] = { t: "z", v: void 0 };
                  s[R][C].l = val;
                } else {
                  addr = encode_cell({ c: C, r: R });
                  if (!s[addr])
                    s[addr] = { t: "z", v: void 0 };
                  s[addr].l = val;
                }
              }
            break;
          case 426:
            if (!opts.cellFormula)
              break;
            arrayf.push(val);
            cell = opts.dense ? s[R][C] : s[encode_col(C) + rr];
            cell.f = stringify_formula(val[1], refguess, { r: row.r, c: C }, supbooks, opts);
            cell.F = encode_range(val[0]);
            break;
          case 427:
            if (!opts.cellFormula)
              break;
            sharedf[encode_cell(val[0].s)] = val[1];
            cell = opts.dense ? s[R][C] : s[encode_col(C) + rr];
            cell.f = stringify_formula(val[1], refguess, { r: row.r, c: C }, supbooks, opts);
            break;
          case 60:
            if (!opts.cellStyles)
              break;
            while (val.e >= val.s) {
              colinfo[val.e--] = { width: val.w / 256, hidden: !!(val.flags & 1), level: val.level };
              if (!seencol) {
                seencol = true;
                find_mdw_colw(val.w / 256);
              }
              process_col(colinfo[val.e + 1]);
            }
            break;
          case 161:
            s["!autofilter"] = { ref: encode_range(val) };
            break;
          case 476:
            s["!margins"] = val;
            break;
          case 147:
            if (!wb.Sheets[idx])
              wb.Sheets[idx] = {};
            if (val.name)
              wb.Sheets[idx].CodeName = val.name;
            break;
          case 137:
            if (!wb.Views)
              wb.Views = [{}];
            if (!wb.Views[0])
              wb.Views[0] = {};
            if (val.RTL)
              wb.Views[0].RTL = true;
            break;
          case 485:
            break;
          case 64:
          case 1053:
            break;
          case 151:
            break;
          case 175:
          case 644:
          case 625:
          case 562:
          case 396:
          case 1112:
          case 1146:
          case 471:
          case 1050:
          case 649:
          case 1105:
          case 49:
          case 589:
          case 607:
          case 564:
          case 1055:
          case 168:
          case 174:
          case 1180:
          case 499:
          case 550:
          case 171:
          case 167:
          case 1177:
          case 169:
          case 1181:
          case 551:
          case 552:
          case 661:
          case 639:
          case 478:
          case 537:
          case 477:
          case 536:
          case 1103:
          case 680:
          case 1104:
          case 1024:
          case 152:
          case 663:
          case 535:
          case 678:
          case 504:
          case 1043:
          case 428:
          case 170:
          case 3072:
          case 50:
          case 2070:
          case 1045:
            break;
          case 35:
            pass = true;
            break;
          case 36:
            pass = false;
            break;
          case 37:
            pass = true;
            break;
          case 38:
            pass = false;
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              ;
            else if ((R_n || "").indexOf("End") > 0)
              ;
            else if (!pass || opts.WTF)
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      }, opts);
      delete opts.supbooks;
      delete opts["!row"];
      if (!s["!ref"] && (refguess.s.r < 2e6 || ref2 && (ref2.e.r > 0 || ref2.e.c > 0 || ref2.s.r > 0 || ref2.s.c > 0)))
        s["!ref"] = encode_range(ref2 || refguess);
      if (opts.sheetRows && s["!ref"]) {
        var tmpref = safe_decode_range(s["!ref"]);
        if (opts.sheetRows <= +tmpref.e.r) {
          tmpref.e.r = opts.sheetRows - 1;
          if (tmpref.e.r > refguess.e.r)
            tmpref.e.r = refguess.e.r;
          if (tmpref.e.r < tmpref.s.r)
            tmpref.s.r = tmpref.e.r;
          if (tmpref.e.c > refguess.e.c)
            tmpref.e.c = refguess.e.c;
          if (tmpref.e.c < tmpref.s.c)
            tmpref.s.c = tmpref.e.c;
          s["!fullref"] = s["!ref"];
          s["!ref"] = encode_range(tmpref);
        }
      }
      if (merges.length > 0)
        s["!merges"] = merges;
      if (colinfo.length > 0)
        s["!cols"] = colinfo;
      if (rowinfo.length > 0)
        s["!rows"] = rowinfo;
      return s;
    }
    function write_ws_bin_cell(ba, cell, R, C, opts, ws) {
      if (cell.v === void 0)
        return;
      var vv = "";
      switch (cell.t) {
        case "b":
          vv = cell.v ? "1" : "0";
          break;
        case "d":
          cell = dup(cell);
          cell.z = cell.z || SSF._table[14];
          cell.v = datenum(parseDate(cell.v));
          cell.t = "n";
          break;
        case "n":
        case "e":
          vv = "" + cell.v;
          break;
        default:
          vv = cell.v;
          break;
      }
      var o = { r: R, c: C };
      o.s = get_cell_style(opts.cellXfs, cell, opts);
      if (cell.l)
        ws["!links"].push([encode_cell(o), cell.l]);
      if (cell.c)
        ws["!comments"].push([encode_cell(o), cell.c]);
      switch (cell.t) {
        case "s":
        case "str":
          if (opts.bookSST) {
            vv = get_sst_id(opts.Strings, cell.v, opts.revStrings);
            o.t = "s";
            o.v = vv;
            write_record(ba, "BrtCellIsst", write_BrtCellIsst(cell, o));
          } else {
            o.t = "str";
            write_record(ba, "BrtCellSt", write_BrtCellSt(cell, o));
          }
          return;
        case "n":
          if (cell.v == (cell.v | 0) && cell.v > -1e3 && cell.v < 1e3)
            write_record(ba, "BrtCellRk", write_BrtCellRk(cell, o));
          else
            write_record(ba, "BrtCellReal", write_BrtCellReal(cell, o));
          return;
        case "b":
          o.t = "b";
          write_record(ba, "BrtCellBool", write_BrtCellBool(cell, o));
          return;
        case "e":
          o.t = "e";
          break;
      }
      write_record(ba, "BrtCellBlank", write_BrtCellBlank(cell, o));
    }
    function write_CELLTABLE(ba, ws, idx, opts) {
      var range = safe_decode_range(ws["!ref"] || "A1"), ref2, rr = "", cols = [];
      write_record(ba, "BrtBeginSheetData");
      var dense = Array.isArray(ws);
      var cap = range.e.r;
      if (ws["!rows"])
        cap = Math.max(range.e.r, ws["!rows"].length - 1);
      for (var R = range.s.r; R <= cap; ++R) {
        rr = encode_row(R);
        write_row_header(ba, ws, range, R);
        if (R <= range.e.r)
          for (var C = range.s.c; C <= range.e.c; ++C) {
            if (R === range.s.r)
              cols[C] = encode_col(C);
            ref2 = cols[C] + rr;
            var cell = dense ? (ws[R] || [])[C] : ws[ref2];
            if (!cell)
              continue;
            write_ws_bin_cell(ba, cell, R, C, opts, ws);
          }
      }
      write_record(ba, "BrtEndSheetData");
    }
    function write_MERGECELLS(ba, ws) {
      if (!ws || !ws["!merges"])
        return;
      write_record(ba, "BrtBeginMergeCells", write_BrtBeginMergeCells(ws["!merges"].length));
      ws["!merges"].forEach(function(m) {
        write_record(ba, "BrtMergeCell", write_BrtMergeCell(m));
      });
      write_record(ba, "BrtEndMergeCells");
    }
    function write_COLINFOS(ba, ws) {
      if (!ws || !ws["!cols"])
        return;
      write_record(ba, "BrtBeginColInfos");
      ws["!cols"].forEach(function(m, i3) {
        if (m)
          write_record(ba, "BrtColInfo", write_BrtColInfo(i3, m));
      });
      write_record(ba, "BrtEndColInfos");
    }
    function write_IGNOREECS(ba, ws) {
      if (!ws || !ws["!ref"])
        return;
      write_record(ba, "BrtBeginCellIgnoreECs");
      write_record(ba, "BrtCellIgnoreEC", write_BrtCellIgnoreEC(safe_decode_range(ws["!ref"])));
      write_record(ba, "BrtEndCellIgnoreECs");
    }
    function write_HLINKS(ba, ws, rels) {
      ws["!links"].forEach(function(l) {
        if (!l[1].Target)
          return;
        var rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, ""), RELS.HLINK);
        write_record(ba, "BrtHLink", write_BrtHLink(l, rId));
      });
      delete ws["!links"];
    }
    function write_LEGACYDRAWING(ba, ws, idx, rels) {
      if (ws["!comments"].length > 0) {
        var rId = add_rels(rels, -1, "../drawings/vmlDrawing" + (idx + 1) + ".vml", RELS.VML);
        write_record(ba, "BrtLegacyDrawing", write_RelID("rId" + rId));
        ws["!legacy"] = rId;
      }
    }
    function write_AUTOFILTER(ba, ws, wb, idx) {
      if (!ws["!autofilter"])
        return;
      var data = ws["!autofilter"];
      var ref2 = typeof data.ref === "string" ? data.ref : encode_range(data.ref);
      if (!wb.Workbook)
        wb.Workbook = { Sheets: [] };
      if (!wb.Workbook.Names)
        wb.Workbook.Names = [];
      var names = wb.Workbook.Names;
      var range = decode_range(ref2);
      if (range.s.r == range.e.r) {
        range.e.r = decode_range(ws["!ref"]).e.r;
        ref2 = encode_range(range);
      }
      for (var i3 = 0; i3 < names.length; ++i3) {
        var name = names[i3];
        if (name.Name != "_xlnm._FilterDatabase")
          continue;
        if (name.Sheet != idx)
          continue;
        name.Ref = "'" + wb.SheetNames[idx] + "'!" + ref2;
        break;
      }
      if (i3 == names.length)
        names.push({ Name: "_xlnm._FilterDatabase", Sheet: idx, Ref: "'" + wb.SheetNames[idx] + "'!" + ref2 });
      write_record(ba, "BrtBeginAFilter", write_UncheckedRfX(safe_decode_range(ref2)));
      write_record(ba, "BrtEndAFilter");
    }
    function write_WSVIEWS2(ba, ws, Workbook) {
      write_record(ba, "BrtBeginWsViews");
      {
        write_record(ba, "BrtBeginWsView", write_BrtBeginWsView(ws, Workbook));
        write_record(ba, "BrtEndWsView");
      }
      write_record(ba, "BrtEndWsViews");
    }
    function write_SHEETPROTECT(ba, ws) {
      if (!ws["!protect"])
        return;
      write_record(ba, "BrtSheetProtection", write_BrtSheetProtection(ws["!protect"]));
    }
    function write_ws_bin(idx, opts, wb, rels) {
      var ba = buf_array();
      var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
      var c = s;
      try {
        if (wb && wb.Workbook)
          c = wb.Workbook.Sheets[idx].CodeName || c;
      } catch (e) {
      }
      var r = safe_decode_range(ws["!ref"] || "A1");
      if (r.e.c > 16383 || r.e.r > 1048575) {
        if (opts.WTF)
          throw new Error("Range " + (ws["!ref"] || "A1") + " exceeds format limit A1:XFD1048576");
        r.e.c = Math.min(r.e.c, 16383);
        r.e.r = Math.min(r.e.c, 1048575);
      }
      ws["!links"] = [];
      ws["!comments"] = [];
      write_record(ba, "BrtBeginSheet");
      if (wb.vbaraw)
        write_record(ba, "BrtWsProp", write_BrtWsProp(c));
      write_record(ba, "BrtWsDim", write_BrtWsDim(r));
      write_WSVIEWS2(ba, ws, wb.Workbook);
      write_COLINFOS(ba, ws);
      write_CELLTABLE(ba, ws, idx, opts);
      write_SHEETPROTECT(ba, ws);
      write_AUTOFILTER(ba, ws, wb, idx);
      write_MERGECELLS(ba, ws);
      write_HLINKS(ba, ws, rels);
      if (ws["!margins"])
        write_record(ba, "BrtMargins", write_BrtMargins(ws["!margins"]));
      if (!opts || opts.ignoreEC || opts.ignoreEC == void 0)
        write_IGNOREECS(ba, ws);
      write_LEGACYDRAWING(ba, ws, idx, rels);
      write_record(ba, "BrtEndSheet");
      return ba.end();
    }
    RELS.CHART = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart";
    RELS.CHARTEX = "http://schemas.microsoft.com/office/2014/relationships/chartEx";
    function parse_Cache(data) {
      var col = [];
      var num = data.match(/^<c:numCache>/);
      var f;
      (data.match(/<c:pt idx="(\d*)">(.*?)<\/c:pt>/mg) || []).forEach(function(pt) {
        var q = pt.match(/<c:pt idx="(\d*?)"><c:v>(.*)<\/c:v><\/c:pt>/);
        if (!q)
          return;
        col[+q[1]] = num ? +q[2] : q[2];
      });
      var nf = unescapexml((data.match(/<c:formatCode>([\s\S]*?)<\/c:formatCode>/) || ["", "General"])[1]);
      (data.match(/<c:f>(.*?)<\/c:f>/mg) || []).forEach(function(F) {
        f = F.replace(/<.*?>/g, "");
      });
      return [col, nf, f];
    }
    function parse_chart(data, name, opts, rels, wb, csheet) {
      var cs = csheet || { "!type": "chart" };
      if (!data)
        return csheet;
      var C = 0, R = 0, col = "A";
      var refguess = { s: { r: 2e6, c: 2e6 }, e: { r: 0, c: 0 } };
      (data.match(/<c:numCache>[\s\S]*?<\/c:numCache>/gm) || []).forEach(function(nc) {
        var cache = parse_Cache(nc);
        refguess.s.r = refguess.s.c = 0;
        refguess.e.c = C;
        col = encode_col(C);
        cache[0].forEach(function(n, i3) {
          cs[col + encode_row(i3)] = { t: "n", v: n, z: cache[1] };
          R = i3;
        });
        if (refguess.e.r < R)
          refguess.e.r = R;
        ++C;
      });
      if (C > 0)
        cs["!ref"] = encode_range(refguess);
      return cs;
    }
    RELS.CS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet";
    writextag("chartsheet", null, {
      "xmlns": XMLNS.main[0],
      "xmlns:r": XMLNS.r
    });
    function parse_cs_xml(data, opts, idx, rels, wb) {
      if (!data)
        return data;
      if (!rels)
        rels = { "!id": {} };
      var s = { "!type": "chart", "!drawel": null, "!rel": "" };
      var m;
      var sheetPr = data.match(sheetprregex);
      if (sheetPr)
        parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);
      if (m = data.match(/drawing r:id="(.*?)"/))
        s["!rel"] = m[1];
      if (rels["!id"][s["!rel"]])
        s["!drawel"] = rels["!id"][s["!rel"]];
      return s;
    }
    function parse_BrtCsProp(data, length) {
      data.l += 10;
      var name = parse_XLWideString(data);
      return { name };
    }
    function parse_cs_bin(data, opts, idx, rels, wb) {
      if (!data)
        return data;
      if (!rels)
        rels = { "!id": {} };
      var s = { "!type": "chart", "!drawel": null, "!rel": "" };
      var pass = false;
      recordhopper(data, function cs_parse(val, R_n, RT) {
        switch (RT) {
          case 550:
            s["!rel"] = val;
            break;
          case 651:
            if (!wb.Sheets[idx])
              wb.Sheets[idx] = {};
            if (val.name)
              wb.Sheets[idx].CodeName = val.name;
            break;
          case 562:
          case 652:
          case 669:
          case 679:
          case 551:
          case 552:
          case 476:
          case 3072:
            break;
          case 35:
            pass = true;
            break;
          case 36:
            pass = false;
            break;
          case 37:
            break;
          case 38:
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              ;
            else if ((R_n || "").indexOf("End") > 0)
              ;
            else if (!pass || opts.WTF)
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      }, opts);
      if (rels["!id"][s["!rel"]])
        s["!drawel"] = rels["!id"][s["!rel"]];
      return s;
    }
    var WBPropsDef = [
      ["allowRefreshQuery", false, "bool"],
      ["autoCompressPictures", true, "bool"],
      ["backupFile", false, "bool"],
      ["checkCompatibility", false, "bool"],
      ["CodeName", ""],
      ["date1904", false, "bool"],
      ["defaultThemeVersion", 0, "int"],
      ["filterPrivacy", false, "bool"],
      ["hidePivotFieldList", false, "bool"],
      ["promptedSolutions", false, "bool"],
      ["publishItems", false, "bool"],
      ["refreshAllConnections", false, "bool"],
      ["saveExternalLinkValues", true, "bool"],
      ["showBorderUnselectedTables", true, "bool"],
      ["showInkAnnotation", true, "bool"],
      ["showObjects", "all"],
      ["showPivotChartFilter", false, "bool"],
      ["updateLinks", "userSet"]
    ];
    var WBViewDef = [
      ["activeTab", 0, "int"],
      ["autoFilterDateGrouping", true, "bool"],
      ["firstSheet", 0, "int"],
      ["minimized", false, "bool"],
      ["showHorizontalScroll", true, "bool"],
      ["showSheetTabs", true, "bool"],
      ["showVerticalScroll", true, "bool"],
      ["tabRatio", 600, "int"],
      ["visibility", "visible"]
      //window{Height,Width}, {x,y}Window
    ];
    var SheetDef = [
      //['state', 'visible']
    ];
    var CalcPrDef = [
      ["calcCompleted", "true"],
      ["calcMode", "auto"],
      ["calcOnSave", "true"],
      ["concurrentCalc", "true"],
      ["fullCalcOnLoad", "false"],
      ["fullPrecision", "true"],
      ["iterate", "false"],
      ["iterateCount", "100"],
      ["iterateDelta", "0.001"],
      ["refMode", "A1"]
    ];
    function push_defaults_array(target, defaults) {
      for (var j2 = 0; j2 != target.length; ++j2) {
        var w = target[j2];
        for (var i3 = 0; i3 != defaults.length; ++i3) {
          var z = defaults[i3];
          if (w[z[0]] == null)
            w[z[0]] = z[1];
          else
            switch (z[2]) {
              case "bool":
                if (typeof w[z[0]] == "string")
                  w[z[0]] = parsexmlbool(w[z[0]]);
                break;
              case "int":
                if (typeof w[z[0]] == "string")
                  w[z[0]] = parseInt(w[z[0]], 10);
                break;
            }
        }
      }
    }
    function push_defaults(target, defaults) {
      for (var i3 = 0; i3 != defaults.length; ++i3) {
        var z = defaults[i3];
        if (target[z[0]] == null)
          target[z[0]] = z[1];
        else
          switch (z[2]) {
            case "bool":
              if (typeof target[z[0]] == "string")
                target[z[0]] = parsexmlbool(target[z[0]]);
              break;
            case "int":
              if (typeof target[z[0]] == "string")
                target[z[0]] = parseInt(target[z[0]], 10);
              break;
          }
      }
    }
    function parse_wb_defaults(wb) {
      push_defaults(wb.WBProps, WBPropsDef);
      push_defaults(wb.CalcPr, CalcPrDef);
      push_defaults_array(wb.WBView, WBViewDef);
      push_defaults_array(wb.Sheets, SheetDef);
      _ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);
    }
    function safe1904(wb) {
      if (!wb.Workbook)
        return "false";
      if (!wb.Workbook.WBProps)
        return "false";
      return parsexmlbool(wb.Workbook.WBProps.date1904) ? "true" : "false";
    }
    var badchars = "][*?/\\".split("");
    function check_ws_name(n, safe) {
      if (n.length > 31) {
        if (safe)
          return false;
        throw new Error("Sheet names cannot exceed 31 chars");
      }
      var _good = true;
      badchars.forEach(function(c) {
        if (n.indexOf(c) == -1)
          return;
        if (!safe)
          throw new Error("Sheet name cannot contain : \\ / ? * [ ]");
        _good = false;
      });
      return _good;
    }
    function check_wb_names(N, S, codes) {
      N.forEach(function(n, i3) {
        check_ws_name(n);
        for (var j2 = 0; j2 < i3; ++j2)
          if (n == N[j2])
            throw new Error("Duplicate Sheet Name: " + n);
        if (codes) {
          var cn = S && S[i3] && S[i3].CodeName || n;
          if (cn.charCodeAt(0) == 95 && cn.length > 22)
            throw new Error("Bad Code Name: Worksheet" + cn);
        }
      });
    }
    function check_wb(wb) {
      if (!wb || !wb.SheetNames || !wb.Sheets)
        throw new Error("Invalid Workbook");
      if (!wb.SheetNames.length)
        throw new Error("Workbook is empty");
      var Sheets = wb.Workbook && wb.Workbook.Sheets || [];
      check_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);
      for (var i3 = 0; i3 < wb.SheetNames.length; ++i3)
        check_ws(wb.Sheets[wb.SheetNames[i3]], wb.SheetNames[i3], i3);
    }
    var wbnsregex = /<\w+:workbook/;
    function parse_wb_xml(data, opts) {
      if (!data)
        throw new Error("Could not find file");
      var wb = { AppVersion: {}, WBProps: {}, WBView: [], Sheets: [], CalcPr: {}, Names: [], xmlns: "" };
      var pass = false, xmlns = "xmlns";
      var dname = {}, dnstart = 0;
      data.replace(tagregex, function xml_wb(x, idx) {
        var y = parsexmltag(x);
        switch (strip_ns(y[0])) {
          case "<?xml":
            break;
          case "<workbook":
            if (x.match(wbnsregex))
              xmlns = "xmlns" + x.match(/<(\w+):/)[1];
            wb.xmlns = y[xmlns];
            break;
          case "</workbook>":
            break;
          case "<fileVersion":
            delete y[0];
            wb.AppVersion = y;
            break;
          case "<fileVersion/>":
          case "</fileVersion>":
            break;
          case "<fileSharing":
            break;
          case "<fileSharing/>":
            break;
          case "<workbookPr":
          case "<workbookPr/>":
            WBPropsDef.forEach(function(w) {
              if (y[w[0]] == null)
                return;
              switch (w[2]) {
                case "bool":
                  wb.WBProps[w[0]] = parsexmlbool(y[w[0]]);
                  break;
                case "int":
                  wb.WBProps[w[0]] = parseInt(y[w[0]], 10);
                  break;
                default:
                  wb.WBProps[w[0]] = y[w[0]];
              }
            });
            if (y.codeName)
              wb.WBProps.CodeName = y.codeName;
            break;
          case "</workbookPr>":
            break;
          case "<workbookProtection":
            break;
          case "<workbookProtection/>":
            break;
          case "<bookViews":
          case "<bookViews>":
          case "</bookViews>":
            break;
          case "<workbookView":
          case "<workbookView/>":
            delete y[0];
            wb.WBView.push(y);
            break;
          case "</workbookView>":
            break;
          case "<sheets":
          case "<sheets>":
          case "</sheets>":
            break;
          case "<sheet":
            switch (y.state) {
              case "hidden":
                y.Hidden = 1;
                break;
              case "veryHidden":
                y.Hidden = 2;
                break;
              default:
                y.Hidden = 0;
            }
            delete y.state;
            y.name = unescapexml(utf8read(y.name));
            delete y[0];
            wb.Sheets.push(y);
            break;
          case "</sheet>":
            break;
          case "<functionGroups":
          case "<functionGroups/>":
            break;
          case "<functionGroup":
            break;
          case "<externalReferences":
          case "</externalReferences>":
          case "<externalReferences>":
            break;
          case "<externalReference":
            break;
          case "<definedNames/>":
            break;
          case "<definedNames>":
          case "<definedNames":
            pass = true;
            break;
          case "</definedNames>":
            pass = false;
            break;
          case "<definedName":
            {
              dname = {};
              dname.Name = utf8read(y.name);
              if (y.comment)
                dname.Comment = y.comment;
              if (y.localSheetId)
                dname.Sheet = +y.localSheetId;
              if (parsexmlbool(y.hidden || "0"))
                dname.Hidden = true;
              dnstart = idx + x.length;
            }
            break;
          case "</definedName>":
            {
              dname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));
              wb.Names.push(dname);
            }
            break;
          case "<definedName/>":
            break;
          case "<calcPr":
            delete y[0];
            wb.CalcPr = y;
            break;
          case "<calcPr/>":
            delete y[0];
            wb.CalcPr = y;
            break;
          case "</calcPr>":
            break;
          case "<oleSize":
            break;
          case "<customWorkbookViews>":
          case "</customWorkbookViews>":
          case "<customWorkbookViews":
            break;
          case "<customWorkbookView":
          case "</customWorkbookView>":
            break;
          case "<pivotCaches>":
          case "</pivotCaches>":
          case "<pivotCaches":
            break;
          case "<pivotCache":
            break;
          case "<smartTagPr":
          case "<smartTagPr/>":
            break;
          case "<smartTagTypes":
          case "<smartTagTypes>":
          case "</smartTagTypes>":
            break;
          case "<smartTagType":
            break;
          case "<webPublishing":
          case "<webPublishing/>":
            break;
          case "<fileRecoveryPr":
          case "<fileRecoveryPr/>":
            break;
          case "<webPublishObjects>":
          case "<webPublishObjects":
          case "</webPublishObjects>":
            break;
          case "<webPublishObject":
            break;
          case "<extLst":
          case "<extLst>":
          case "</extLst>":
          case "<extLst/>":
            break;
          case "<ext":
            pass = true;
            break;
          case "</ext>":
            pass = false;
            break;
          case "<ArchID":
            break;
          case "<AlternateContent":
          case "<AlternateContent>":
            pass = true;
            break;
          case "</AlternateContent>":
            pass = false;
            break;
          case "<revisionPtr":
            break;
          default:
            if (!pass && opts.WTF)
              throw new Error("unrecognized " + y[0] + " in workbook");
        }
        return x;
      });
      if (XMLNS.main.indexOf(wb.xmlns) === -1)
        throw new Error("Unknown Namespace: " + wb.xmlns);
      parse_wb_defaults(wb);
      return wb;
    }
    var WB_XML_ROOT = writextag("workbook", null, {
      "xmlns": XMLNS.main[0],
      //'xmlns:mx': XMLNS.mx,
      //'xmlns:s': XMLNS.main[0],
      "xmlns:r": XMLNS.r
    });
    function write_wb_xml(wb) {
      var o = [XML_HEADER];
      o[o.length] = WB_XML_ROOT;
      var write_names = wb.Workbook && (wb.Workbook.Names || []).length > 0;
      var workbookPr = { codeName: "ThisWorkbook" };
      if (wb.Workbook && wb.Workbook.WBProps) {
        WBPropsDef.forEach(function(x) {
          if (wb.Workbook.WBProps[x[0]] == null)
            return;
          if (wb.Workbook.WBProps[x[0]] == x[1])
            return;
          workbookPr[x[0]] = wb.Workbook.WBProps[x[0]];
        });
        if (wb.Workbook.WBProps.CodeName) {
          workbookPr.codeName = wb.Workbook.WBProps.CodeName;
          delete workbookPr.CodeName;
        }
      }
      o[o.length] = writextag("workbookPr", null, workbookPr);
      var sheets = wb.Workbook && wb.Workbook.Sheets || [];
      var i3 = 0;
      o[o.length] = "<sheets>";
      for (i3 = 0; i3 != wb.SheetNames.length; ++i3) {
        var sht = { name: escapexml(wb.SheetNames[i3].slice(0, 31)) };
        sht.sheetId = "" + (i3 + 1);
        sht["r:id"] = "rId" + (i3 + 1);
        if (sheets[i3])
          switch (sheets[i3].Hidden) {
            case 1:
              sht.state = "hidden";
              break;
            case 2:
              sht.state = "veryHidden";
              break;
          }
        o[o.length] = writextag("sheet", null, sht);
      }
      o[o.length] = "</sheets>";
      if (write_names) {
        o[o.length] = "<definedNames>";
        if (wb.Workbook && wb.Workbook.Names)
          wb.Workbook.Names.forEach(function(n) {
            var d = { name: n.Name };
            if (n.Comment)
              d.comment = n.Comment;
            if (n.Sheet != null)
              d.localSheetId = "" + n.Sheet;
            if (n.Hidden)
              d.hidden = "1";
            if (!n.Ref)
              return;
            o[o.length] = writextag("definedName", escapexml(n.Ref), d);
          });
        o[o.length] = "</definedNames>";
      }
      if (o.length > 2) {
        o[o.length] = "</workbook>";
        o[1] = o[1].replace("/>", ">");
      }
      return o.join("");
    }
    function parse_BrtBundleSh(data, length) {
      var z = {};
      z.Hidden = data.read_shift(4);
      z.iTabID = data.read_shift(4);
      z.strRelID = parse_RelID(data);
      z.name = parse_XLWideString(data);
      return z;
    }
    function write_BrtBundleSh(data, o) {
      if (!o)
        o = new_buf(127);
      o.write_shift(4, data.Hidden);
      o.write_shift(4, data.iTabID);
      write_RelID(data.strRelID, o);
      write_XLWideString(data.name.slice(0, 31), o);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function parse_BrtWbProp(data, length) {
      var o = {};
      var flags = data.read_shift(4);
      o.defaultThemeVersion = data.read_shift(4);
      var strName = length > 8 ? parse_XLWideString(data) : "";
      if (strName.length > 0)
        o.CodeName = strName;
      o.autoCompressPictures = !!(flags & 65536);
      o.backupFile = !!(flags & 64);
      o.checkCompatibility = !!(flags & 4096);
      o.date1904 = !!(flags & 1);
      o.filterPrivacy = !!(flags & 8);
      o.hidePivotFieldList = !!(flags & 1024);
      o.promptedSolutions = !!(flags & 16);
      o.publishItems = !!(flags & 2048);
      o.refreshAllConnections = !!(flags & 262144);
      o.saveExternalLinkValues = !!(flags & 128);
      o.showBorderUnselectedTables = !!(flags & 4);
      o.showInkAnnotation = !!(flags & 32);
      o.showObjects = ["all", "placeholders", "none"][flags >> 13 & 3];
      o.showPivotChartFilter = !!(flags & 32768);
      o.updateLinks = ["userSet", "never", "always"][flags >> 8 & 3];
      return o;
    }
    function write_BrtWbProp(data, o) {
      if (!o)
        o = new_buf(72);
      var flags = 0;
      if (data) {
        if (data.filterPrivacy)
          flags |= 8;
      }
      o.write_shift(4, flags);
      o.write_shift(4, 0);
      write_XLSBCodeName(data && data.CodeName || "ThisWorkbook", o);
      return o.slice(0, o.l);
    }
    function parse_BrtFRTArchID$(data, length) {
      var o = {};
      data.read_shift(4);
      o.ArchID = data.read_shift(4);
      data.l += length - 8;
      return o;
    }
    function parse_BrtName(data, length, opts) {
      var end = data.l + length;
      data.l += 4;
      data.l += 1;
      var itab = data.read_shift(4);
      var name = parse_XLNameWideString(data);
      var formula = parse_XLSBNameParsedFormula(data, 0, opts);
      var comment = parse_XLNullableWideString(data);
      data.l = end;
      var out = { Name: name, Ptg: formula };
      if (itab < 268435455)
        out.Sheet = itab;
      if (comment)
        out.Comment = comment;
      return out;
    }
    function parse_wb_bin(data, opts) {
      var wb = { AppVersion: {}, WBProps: {}, WBView: [], Sheets: [], CalcPr: {}, xmlns: "" };
      var state = [];
      var pass = false;
      if (!opts)
        opts = {};
      opts.biff = 12;
      var Names = [];
      var supbooks = [[]];
      supbooks.SheetNames = [];
      supbooks.XTI = [];
      recordhopper(data, function hopper_wb(val, R_n, RT) {
        switch (RT) {
          case 156:
            supbooks.SheetNames.push(val.name);
            wb.Sheets.push(val);
            break;
          case 153:
            wb.WBProps = val;
            break;
          case 39:
            if (val.Sheet != null)
              opts.SID = val.Sheet;
            val.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);
            delete opts.SID;
            delete val.Ptg;
            Names.push(val);
            break;
          case 1036:
            break;
          case 357:
          case 358:
          case 355:
          case 667:
            if (!supbooks[0].length)
              supbooks[0] = [RT, val];
            else
              supbooks.push([RT, val]);
            supbooks[supbooks.length - 1].XTI = [];
            break;
          case 362:
            if (supbooks.length === 0) {
              supbooks[0] = [];
              supbooks[0].XTI = [];
            }
            supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
            supbooks.XTI = supbooks.XTI.concat(val);
            break;
          case 361:
            break;
          case 3072:
          case 3073:
          case 2071:
          case 534:
          case 677:
          case 158:
          case 157:
          case 610:
          case 2050:
          case 155:
          case 548:
          case 676:
          case 128:
          case 665:
          case 2128:
          case 2125:
          case 549:
          case 2053:
          case 596:
          case 2076:
          case 2075:
          case 2082:
          case 397:
          case 154:
          case 1117:
          case 553:
          case 2091:
            break;
          case 35:
            state.push(R_n);
            pass = true;
            break;
          case 36:
            state.pop();
            pass = false;
            break;
          case 37:
            state.push(R_n);
            pass = true;
            break;
          case 38:
            state.pop();
            pass = false;
            break;
          case 16:
            break;
          default:
            if ((R_n || "").indexOf("Begin") > 0)
              ;
            else if ((R_n || "").indexOf("End") > 0)
              ;
            else if (!pass || opts.WTF && state[state.length - 1] != "BrtACBegin" && state[state.length - 1] != "BrtFRTBegin")
              throw new Error("Unexpected record " + RT + " " + R_n);
        }
      }, opts);
      parse_wb_defaults(wb);
      wb.Names = Names;
      wb.supbooks = supbooks;
      return wb;
    }
    function write_BUNDLESHS(ba, wb) {
      write_record(ba, "BrtBeginBundleShs");
      for (var idx = 0; idx != wb.SheetNames.length; ++idx) {
        var viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;
        var d = { Hidden: viz, iTabID: idx + 1, strRelID: "rId" + (idx + 1), name: wb.SheetNames[idx] };
        write_record(ba, "BrtBundleSh", write_BrtBundleSh(d));
      }
      write_record(ba, "BrtEndBundleShs");
    }
    function write_BrtFileVersion(data, o) {
      if (!o)
        o = new_buf(127);
      for (var i3 = 0; i3 != 4; ++i3)
        o.write_shift(4, 0);
      write_XLWideString("SheetJS", o);
      write_XLWideString(XLSX.version, o);
      write_XLWideString(XLSX.version, o);
      write_XLWideString("7262", o);
      o.length = o.l;
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function write_BrtBookView(idx, o) {
      if (!o)
        o = new_buf(29);
      o.write_shift(-4, 0);
      o.write_shift(-4, 460);
      o.write_shift(4, 28800);
      o.write_shift(4, 17600);
      o.write_shift(4, 500);
      o.write_shift(4, idx);
      o.write_shift(4, idx);
      var flags = 120;
      o.write_shift(1, flags);
      return o.length > o.l ? o.slice(0, o.l) : o;
    }
    function write_BOOKVIEWS(ba, wb) {
      if (!wb.Workbook || !wb.Workbook.Sheets)
        return;
      var sheets = wb.Workbook.Sheets;
      var i3 = 0, vistab = -1, hidden = -1;
      for (; i3 < sheets.length; ++i3) {
        if (!sheets[i3] || !sheets[i3].Hidden && vistab == -1)
          vistab = i3;
        else if (sheets[i3].Hidden == 1 && hidden == -1)
          hidden = i3;
      }
      if (hidden > vistab)
        return;
      write_record(ba, "BrtBeginBookViews");
      write_record(ba, "BrtBookView", write_BrtBookView(vistab));
      write_record(ba, "BrtEndBookViews");
    }
    function write_wb_bin(wb, opts) {
      var ba = buf_array();
      write_record(ba, "BrtBeginBook");
      write_record(ba, "BrtFileVersion", write_BrtFileVersion());
      write_record(ba, "BrtWbProp", write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));
      write_BOOKVIEWS(ba, wb);
      write_BUNDLESHS(ba, wb);
      write_record(ba, "BrtEndBook");
      return ba.end();
    }
    function parse_wb(data, name, opts) {
      if (name.slice(-4) === ".bin")
        return parse_wb_bin(data, opts);
      return parse_wb_xml(data, opts);
    }
    function parse_ws(data, name, idx, opts, rels, wb, themes, styles) {
      if (name.slice(-4) === ".bin")
        return parse_ws_bin(data, opts, idx, rels, wb, themes, styles);
      return parse_ws_xml(data, opts, idx, rels, wb, themes, styles);
    }
    function parse_cs(data, name, idx, opts, rels, wb, themes, styles) {
      if (name.slice(-4) === ".bin")
        return parse_cs_bin(data, opts, idx, rels, wb);
      return parse_cs_xml(data, opts, idx, rels, wb);
    }
    function parse_ms(data, name, idx, opts, rels, wb, themes, styles) {
      if (name.slice(-4) === ".bin")
        return parse_ms_bin();
      return parse_ms_xml();
    }
    function parse_ds(data, name, idx, opts, rels, wb, themes, styles) {
      if (name.slice(-4) === ".bin")
        return parse_ds_bin();
      return parse_ds_xml();
    }
    function parse_sty(data, name, themes, opts) {
      if (name.slice(-4) === ".bin")
        return parse_sty_bin(data, themes, opts);
      return parse_sty_xml(data, themes, opts);
    }
    function parse_theme(data, name, opts) {
      return parse_theme_xml(data, opts);
    }
    function parse_sst(data, name, opts) {
      if (name.slice(-4) === ".bin")
        return parse_sst_bin(data, opts);
      return parse_sst_xml(data, opts);
    }
    function parse_cmnt(data, name, opts) {
      if (name.slice(-4) === ".bin")
        return parse_comments_bin(data, opts);
      return parse_comments_xml(data, opts);
    }
    function parse_cc(data, name, opts) {
      if (name.slice(-4) === ".bin")
        return parse_cc_bin(data);
      return parse_cc_xml(data);
    }
    function parse_xlink(data, rel, name, opts) {
      if (name.slice(-4) === ".bin")
        return parse_xlink_bin(data, rel, name, opts);
      return parse_xlink_xml();
    }
    function write_wb(wb, name, opts) {
      return (name.slice(-4) === ".bin" ? write_wb_bin : write_wb_xml)(wb);
    }
    function write_ws(data, name, opts, wb, rels) {
      return (name.slice(-4) === ".bin" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);
    }
    function write_sty(data, name, opts) {
      return (name.slice(-4) === ".bin" ? write_sty_bin : write_sty_xml)(data, opts);
    }
    function write_sst(data, name, opts) {
      return (name.slice(-4) === ".bin" ? write_sst_bin : write_sst_xml)(data, opts);
    }
    function write_cmnt(data, name, opts) {
      return (name.slice(-4) === ".bin" ? write_comments_bin : write_comments_xml)(data);
    }
    var attregexg2 = /([\w:]+)=((?:")([^"]*)(?:")|(?:')([^']*)(?:'))/g;
    var attregex2 = /([\w:]+)=((?:")(?:[^"]*)(?:")|(?:')(?:[^']*)(?:'))/;
    function xlml_parsexmltag(tag, skip_root) {
      var words = tag.split(/\s+/);
      var z = [];
      if (!skip_root)
        z[0] = words[0];
      if (words.length === 1)
        return z;
      var m = tag.match(attregexg2), y, j2, w, i3;
      if (m)
        for (i3 = 0; i3 != m.length; ++i3) {
          y = m[i3].match(attregex2);
          if ((j2 = y[1].indexOf(":")) === -1)
            z[y[1]] = y[2].slice(1, y[2].length - 1);
          else {
            if (y[1].slice(0, 6) === "xmlns:")
              w = "xmlns" + y[1].slice(6);
            else
              w = y[1].slice(j2 + 1);
            z[w] = y[2].slice(1, y[2].length - 1);
          }
        }
      return z;
    }
    function xlml_parsexmltagobj(tag) {
      var words = tag.split(/\s+/);
      var z = {};
      if (words.length === 1)
        return z;
      var m = tag.match(attregexg2), y, j2, w, i3;
      if (m)
        for (i3 = 0; i3 != m.length; ++i3) {
          y = m[i3].match(attregex2);
          if ((j2 = y[1].indexOf(":")) === -1)
            z[y[1]] = y[2].slice(1, y[2].length - 1);
          else {
            if (y[1].slice(0, 6) === "xmlns:")
              w = "xmlns" + y[1].slice(6);
            else
              w = y[1].slice(j2 + 1);
            z[w] = y[2].slice(1, y[2].length - 1);
          }
        }
      return z;
    }
    function xlml_format(format, value) {
      var fmt = XLMLFormatMap[format] || unescapexml(format);
      if (fmt === "General")
        return SSF._general(value);
      return SSF.format(fmt, value);
    }
    function xlml_set_custprop(Custprops, key, cp, val) {
      var oval = val;
      switch ((cp[0].match(/dt:dt="([\w.]+)"/) || ["", ""])[1]) {
        case "boolean":
          oval = parsexmlbool(val);
          break;
        case "i2":
        case "int":
          oval = parseInt(val, 10);
          break;
        case "r4":
        case "float":
          oval = parseFloat(val);
          break;
        case "date":
        case "dateTime.tz":
          oval = parseDate(val);
          break;
        case "i8":
        case "string":
        case "fixed":
        case "uuid":
        case "bin.base64":
          break;
        default:
          throw new Error("bad custprop:" + cp[0]);
      }
      Custprops[unescapexml(key)] = oval;
    }
    function safe_format_xlml(cell, nf, o) {
      if (cell.t === "z")
        return;
      if (!o || o.cellText !== false)
        try {
          if (cell.t === "e") {
            cell.w = cell.w || BErr[cell.v];
          } else if (nf === "General") {
            if (cell.t === "n") {
              if ((cell.v | 0) === cell.v)
                cell.w = SSF._general_int(cell.v);
              else
                cell.w = SSF._general_num(cell.v);
            } else
              cell.w = SSF._general(cell.v);
          } else
            cell.w = xlml_format(nf || "General", cell.v);
        } catch (e) {
          if (o.WTF)
            throw e;
        }
      try {
        var z = XLMLFormatMap[nf] || nf || "General";
        if (o.cellNF)
          cell.z = z;
        if (o.cellDates && cell.t == "n" && SSF.is_date(z)) {
          var _d = SSF.parse_date_code(cell.v);
          if (_d) {
            cell.t = "d";
            cell.v = new Date(_d.y, _d.m - 1, _d.d, _d.H, _d.M, _d.S, _d.u);
          }
        }
      } catch (e) {
        if (o.WTF)
          throw e;
      }
    }
    function process_style_xlml(styles, stag, opts) {
      if (opts.cellStyles) {
        if (stag.Interior) {
          var I = stag.Interior;
          if (I.Pattern)
            I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;
        }
      }
      styles[stag.ID] = stag;
    }
    function parse_xlml_data(xml, ss, data, cell, base, styles, csty, row, arrayf, o) {
      var nf = "General", sid = cell.StyleID, S = {};
      o = o || {};
      var interiors = [];
      var i3 = 0;
      if (sid === void 0 && row)
        sid = row.StyleID;
      if (sid === void 0 && csty)
        sid = csty.StyleID;
      while (styles[sid] !== void 0) {
        if (styles[sid].nf)
          nf = styles[sid].nf;
        if (styles[sid].Interior)
          interiors.push(styles[sid].Interior);
        if (!styles[sid].Parent)
          break;
        sid = styles[sid].Parent;
      }
      switch (data.Type) {
        case "Boolean":
          cell.t = "b";
          cell.v = parsexmlbool(xml);
          break;
        case "String":
          cell.t = "s";
          cell.r = xlml_fixstr(unescapexml(xml));
          cell.v = xml.indexOf("<") > -1 ? unescapexml(ss || xml) : cell.r;
          break;
        case "DateTime":
          if (xml.slice(-1) != "Z")
            xml += "Z";
          cell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1e3);
          if (cell.v !== cell.v)
            cell.v = unescapexml(xml);
          else if (cell.v < 60)
            cell.v = cell.v - 1;
          if (!nf || nf == "General")
            nf = "yyyy-mm-dd";
        case "Number":
          if (cell.v === void 0)
            cell.v = +xml;
          if (!cell.t)
            cell.t = "n";
          break;
        case "Error":
          cell.t = "e";
          cell.v = RBErr[xml];
          if (o.cellText !== false)
            cell.w = xml;
          break;
        default:
          if (xml == "" && ss == "") {
            cell.t = "z";
          } else {
            cell.t = "s";
            cell.v = xlml_fixstr(ss || xml);
          }
          break;
      }
      safe_format_xlml(cell, nf, o);
      if (o.cellFormula !== false) {
        if (cell.Formula) {
          var fstr = unescapexml(cell.Formula);
          if (fstr.charCodeAt(0) == 61)
            fstr = fstr.slice(1);
          cell.f = rc_to_a1(fstr, base);
          delete cell.Formula;
          if (cell.ArrayRange == "RC")
            cell.F = rc_to_a1("RC:RC", base);
          else if (cell.ArrayRange) {
            cell.F = rc_to_a1(cell.ArrayRange, base);
            arrayf.push([safe_decode_range(cell.F), cell.F]);
          }
        } else {
          for (i3 = 0; i3 < arrayf.length; ++i3)
            if (base.r >= arrayf[i3][0].s.r && base.r <= arrayf[i3][0].e.r) {
              if (base.c >= arrayf[i3][0].s.c && base.c <= arrayf[i3][0].e.c)
                cell.F = arrayf[i3][1];
            }
        }
      }
      if (o.cellStyles) {
        interiors.forEach(function(x) {
          if (!S.patternType && x.patternType)
            S.patternType = x.patternType;
        });
        cell.s = S;
      }
      if (cell.StyleID !== void 0)
        cell.ixfe = cell.StyleID;
    }
    function xlml_clean_comment(comment) {
      comment.t = comment.v || "";
      comment.t = comment.t.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
      comment.v = comment.w = comment.ixfe = void 0;
    }
    function xlml_normalize(d) {
      if (has_buf && Buffer.isBuffer(d))
        return d.toString("utf8");
      if (typeof d === "string")
        return d;
      if (typeof Uint8Array !== "undefined" && d instanceof Uint8Array)
        return utf8read(a2s(ab2a(d)));
      throw new Error("Bad input format: expected Buffer or string");
    }
    var xlmlregex = /<(\/?)([^\s?>!\/:]*:|)([^\s?>:\/]+)[^>]*>/mg;
    function parse_xlml_xml(d, _opts) {
      var opts = _opts || {};
      make_ssf(SSF);
      var str = debom(xlml_normalize(d));
      if (opts.type == "binary" || opts.type == "array" || opts.type == "base64") {
        if (typeof cptable !== "undefined")
          str = cptable.utils.decode(65001, char_codes(str));
        else
          str = utf8read(str);
      }
      var opening = str.slice(0, 1024).toLowerCase(), ishtml = false;
      if (opening.indexOf("<?xml") == -1)
        ["html", "table", "head", "meta", "script", "style", "div"].forEach(function(tag) {
          if (opening.indexOf("<" + tag) >= 0)
            ishtml = true;
        });
      if (ishtml)
        return HTML_.to_workbook(str, opts);
      var Rn;
      var state = [], tmp;
      var sheets = {}, sheetnames = [], cursheet = opts.dense ? [] : {}, sheetname = "";
      var cell = {}, row = {};
      var dtag = xlml_parsexmltag('<Data ss:Type="String">'), didx = 0;
      var c = 0, r = 0;
      var refguess = { s: { r: 2e6, c: 2e6 }, e: { r: 0, c: 0 } };
      var styles = {}, stag = {};
      var ss = "", fidx = 0;
      var merges = [];
      var Props = {}, Custprops = {}, pidx = 0, cp = [];
      var comments = [], comment = {};
      var cstys = [], csty, seencol = false;
      var arrayf = [];
      var rowinfo = [], rowobj = {}, cc = 0, rr = 0;
      var Workbook = { Sheets: [], WBProps: { date1904: false } }, wsprops = {};
      xlmlregex.lastIndex = 0;
      str = str.replace(/<!--([\s\S]*?)-->/mg, "");
      while (Rn = xlmlregex.exec(str))
        switch (Rn[3]) {
          case "Data":
            if (state[state.length - 1][1])
              break;
            if (Rn[1] === "/")
              parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length - 1][0] == "Comment" ? comment : cell, { c, r }, styles, cstys[c], row, arrayf, opts);
            else {
              ss = "";
              dtag = xlml_parsexmltag(Rn[0]);
              didx = Rn.index + Rn[0].length;
            }
            break;
          case "Cell":
            if (Rn[1] === "/") {
              if (comments.length > 0)
                cell.c = comments;
              if ((!opts.sheetRows || opts.sheetRows > r) && cell.v !== void 0) {
                if (opts.dense) {
                  if (!cursheet[r])
                    cursheet[r] = [];
                  cursheet[r][c] = cell;
                } else
                  cursheet[encode_col(c) + encode_row(r)] = cell;
              }
              if (cell.HRef) {
                cell.l = { Target: cell.HRef };
                if (cell.HRefScreenTip)
                  cell.l.Tooltip = cell.HRefScreenTip;
                delete cell.HRef;
                delete cell.HRefScreenTip;
              }
              if (cell.MergeAcross || cell.MergeDown) {
                cc = c + (parseInt(cell.MergeAcross, 10) | 0);
                rr = r + (parseInt(cell.MergeDown, 10) | 0);
                merges.push({ s: { c, r }, e: { c: cc, r: rr } });
              }
              if (!opts.sheetStubs) {
                if (cell.MergeAcross)
                  c = cc + 1;
                else
                  ++c;
              } else if (cell.MergeAcross || cell.MergeDown) {
                for (var cma = c; cma <= cc; ++cma) {
                  for (var cmd = r; cmd <= rr; ++cmd) {
                    if (cma > c || cmd > r) {
                      if (opts.dense) {
                        if (!cursheet[cmd])
                          cursheet[cmd] = [];
                        cursheet[cmd][cma] = { t: "z" };
                      } else
                        cursheet[encode_col(cma) + encode_row(cmd)] = { t: "z" };
                    }
                  }
                }
                c = cc + 1;
              } else
                ++c;
            } else {
              cell = xlml_parsexmltagobj(Rn[0]);
              if (cell.Index)
                c = +cell.Index - 1;
              if (c < refguess.s.c)
                refguess.s.c = c;
              if (c > refguess.e.c)
                refguess.e.c = c;
              if (Rn[0].slice(-2) === "/>")
                ++c;
              comments = [];
            }
            break;
          case "Row":
            if (Rn[1] === "/" || Rn[0].slice(-2) === "/>") {
              if (r < refguess.s.r)
                refguess.s.r = r;
              if (r > refguess.e.r)
                refguess.e.r = r;
              if (Rn[0].slice(-2) === "/>") {
                row = xlml_parsexmltag(Rn[0]);
                if (row.Index)
                  r = +row.Index - 1;
              }
              c = 0;
              ++r;
            } else {
              row = xlml_parsexmltag(Rn[0]);
              if (row.Index)
                r = +row.Index - 1;
              rowobj = {};
              if (row.AutoFitHeight == "0" || row.Height) {
                rowobj.hpx = parseInt(row.Height, 10);
                rowobj.hpt = px2pt(rowobj.hpx);
                rowinfo[r] = rowobj;
              }
              if (row.Hidden == "1") {
                rowobj.hidden = true;
                rowinfo[r] = rowobj;
              }
            }
            break;
          case "Worksheet":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
              sheetnames.push(sheetname);
              if (refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {
                cursheet["!ref"] = encode_range(refguess);
                if (opts.sheetRows && opts.sheetRows <= refguess.e.r) {
                  cursheet["!fullref"] = cursheet["!ref"];
                  refguess.e.r = opts.sheetRows - 1;
                  cursheet["!ref"] = encode_range(refguess);
                }
              }
              if (merges.length)
                cursheet["!merges"] = merges;
              if (cstys.length > 0)
                cursheet["!cols"] = cstys;
              if (rowinfo.length > 0)
                cursheet["!rows"] = rowinfo;
              sheets[sheetname] = cursheet;
            } else {
              refguess = { s: { r: 2e6, c: 2e6 }, e: { r: 0, c: 0 } };
              r = c = 0;
              state.push([Rn[3], false]);
              tmp = xlml_parsexmltag(Rn[0]);
              sheetname = unescapexml(tmp.Name);
              cursheet = opts.dense ? [] : {};
              merges = [];
              arrayf = [];
              rowinfo = [];
              wsprops = { name: sheetname, Hidden: 0 };
              Workbook.Sheets.push(wsprops);
            }
            break;
          case "Table":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
            } else if (Rn[0].slice(-2) == "/>")
              break;
            else {
              xlml_parsexmltag(Rn[0]);
              state.push([Rn[3], false]);
              cstys = [];
              seencol = false;
            }
            break;
          case "Style":
            if (Rn[1] === "/")
              process_style_xlml(styles, stag, opts);
            else
              stag = xlml_parsexmltag(Rn[0]);
            break;
          case "NumberFormat":
            stag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || "General");
            if (XLMLFormatMap[stag.nf])
              stag.nf = XLMLFormatMap[stag.nf];
            for (var ssfidx = 0; ssfidx != 392; ++ssfidx)
              if (SSF._table[ssfidx] == stag.nf)
                break;
            if (ssfidx == 392) {
              for (ssfidx = 57; ssfidx != 392; ++ssfidx)
                if (SSF._table[ssfidx] == null) {
                  SSF.load(stag.nf, ssfidx);
                  break;
                }
            }
            break;
          case "Column":
            if (state[state.length - 1][0] !== "Table")
              break;
            csty = xlml_parsexmltag(Rn[0]);
            if (csty.Hidden) {
              csty.hidden = true;
              delete csty.Hidden;
            }
            if (csty.Width)
              csty.wpx = parseInt(csty.Width, 10);
            if (!seencol && csty.wpx > 10) {
              seencol = true;
              MDW = DEF_MDW;
              for (var _col = 0; _col < cstys.length; ++_col)
                if (cstys[_col])
                  process_col(cstys[_col]);
            }
            if (seencol)
              process_col(csty);
            cstys[csty.Index - 1 || cstys.length] = csty;
            for (var i3 = 0; i3 < +csty.Span; ++i3)
              cstys[cstys.length] = dup(csty);
            break;
          case "NamedRange":
            if (!Workbook.Names)
              Workbook.Names = [];
            var _NamedRange = parsexmltag(Rn[0]);
            var _DefinedName = {
              Name: _NamedRange.Name,
              Ref: rc_to_a1(_NamedRange.RefersTo.slice(1), { r: 0, c: 0 })
            };
            if (Workbook.Sheets.length > 0)
              _DefinedName.Sheet = Workbook.Sheets.length - 1;
            Workbook.Names.push(_DefinedName);
            break;
          case "NamedCell":
            break;
          case "B":
            break;
          case "I":
            break;
          case "U":
            break;
          case "S":
            break;
          case "Sub":
            break;
          case "Sup":
            break;
          case "Span":
            break;
          case "Alignment":
            break;
          case "Borders":
            break;
          case "Border":
            break;
          case "Font":
            if (Rn[0].slice(-2) === "/>")
              break;
            else if (Rn[1] === "/")
              ss += str.slice(fidx, Rn.index);
            else
              fidx = Rn.index + Rn[0].length;
            break;
          case "Interior":
            if (!opts.cellStyles)
              break;
            stag.Interior = xlml_parsexmltag(Rn[0]);
            break;
          case "Protection":
            break;
          case "Author":
          case "Title":
          case "Description":
          case "Created":
          case "Keywords":
          case "Subject":
          case "Category":
          case "Company":
          case "LastAuthor":
          case "LastSaved":
          case "LastPrinted":
          case "Version":
          case "Revision":
          case "TotalTime":
          case "HyperlinkBase":
          case "Manager":
          case "ContentStatus":
          case "Identifier":
          case "Language":
          case "AppName":
            if (Rn[0].slice(-2) === "/>")
              break;
            else if (Rn[1] === "/")
              xlml_set_prop(Props, Rn[3], str.slice(pidx, Rn.index));
            else
              pidx = Rn.index + Rn[0].length;
            break;
          case "Paragraphs":
            break;
          case "Styles":
          case "Workbook":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
            } else
              state.push([Rn[3], false]);
            break;
          case "Comment":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
              xlml_clean_comment(comment);
              comments.push(comment);
            } else {
              state.push([Rn[3], false]);
              tmp = xlml_parsexmltag(Rn[0]);
              comment = { a: tmp.Author };
            }
            break;
          case "AutoFilter":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
            } else if (Rn[0].charAt(Rn[0].length - 2) !== "/") {
              var AutoFilter = xlml_parsexmltag(Rn[0]);
              cursheet["!autofilter"] = { ref: rc_to_a1(AutoFilter.Range).replace(/\$/g, "") };
              state.push([Rn[3], true]);
            }
            break;
          case "Name":
            break;
          case "DataValidation":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
            } else {
              if (Rn[0].charAt(Rn[0].length - 2) !== "/")
                state.push([Rn[3], true]);
            }
            break;
          case "ComponentOptions":
          case "DocumentProperties":
          case "CustomDocumentProperties":
          case "OfficeDocumentSettings":
          case "PivotTable":
          case "PivotCache":
          case "Names":
          case "MapInfo":
          case "PageBreaks":
          case "QueryTable":
          case "Sorting":
          case "Schema":
          case "data":
          case "ConditionalFormatting":
          case "SmartTagType":
          case "SmartTags":
          case "ExcelWorkbook":
          case "WorkbookOptions":
          case "WorksheetOptions":
            if (Rn[1] === "/") {
              if ((tmp = state.pop())[0] !== Rn[3])
                throw new Error("Bad state: " + tmp.join("|"));
            } else if (Rn[0].charAt(Rn[0].length - 2) !== "/")
              state.push([Rn[3], true]);
            break;
          default:
            if (state.length == 0 && Rn[3] == "document")
              return parse_fods(str, opts);
            if (state.length == 0 && Rn[3] == "UOF")
              return parse_fods(str, opts);
            var seen = true;
            switch (state[state.length - 1][0]) {
              case "OfficeDocumentSettings":
                switch (Rn[3]) {
                  case "AllowPNG":
                    break;
                  case "RemovePersonalInformation":
                    break;
                  case "DownloadComponents":
                    break;
                  case "LocationOfComponents":
                    break;
                  case "Colors":
                    break;
                  case "Color":
                    break;
                  case "Index":
                    break;
                  case "RGB":
                    break;
                  case "PixelsPerInch":
                    break;
                  case "TargetScreenSize":
                    break;
                  case "ReadOnlyRecommended":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "ComponentOptions":
                switch (Rn[3]) {
                  case "Toolbar":
                    break;
                  case "HideOfficeLogo":
                    break;
                  case "SpreadsheetAutoFit":
                    break;
                  case "Label":
                    break;
                  case "Caption":
                    break;
                  case "MaxHeight":
                    break;
                  case "MaxWidth":
                    break;
                  case "NextSheetNumber":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "ExcelWorkbook":
                switch (Rn[3]) {
                  case "Date1904":
                    Workbook.WBProps.date1904 = true;
                    break;
                  case "WindowHeight":
                    break;
                  case "WindowWidth":
                    break;
                  case "WindowTopX":
                    break;
                  case "WindowTopY":
                    break;
                  case "TabRatio":
                    break;
                  case "ProtectStructure":
                    break;
                  case "ProtectWindow":
                    break;
                  case "ProtectWindows":
                    break;
                  case "ActiveSheet":
                    break;
                  case "DisplayInkNotes":
                    break;
                  case "FirstVisibleSheet":
                    break;
                  case "SupBook":
                    break;
                  case "SheetName":
                    break;
                  case "SheetIndex":
                    break;
                  case "SheetIndexFirst":
                    break;
                  case "SheetIndexLast":
                    break;
                  case "Dll":
                    break;
                  case "AcceptLabelsInFormulas":
                    break;
                  case "DoNotSaveLinkValues":
                    break;
                  case "Iteration":
                    break;
                  case "MaxIterations":
                    break;
                  case "MaxChange":
                    break;
                  case "Path":
                    break;
                  case "Xct":
                    break;
                  case "Count":
                    break;
                  case "SelectedSheets":
                    break;
                  case "Calculation":
                    break;
                  case "Uncalced":
                    break;
                  case "StartupPrompt":
                    break;
                  case "Crn":
                    break;
                  case "ExternName":
                    break;
                  case "Formula":
                    break;
                  case "ColFirst":
                    break;
                  case "ColLast":
                    break;
                  case "WantAdvise":
                    break;
                  case "Boolean":
                    break;
                  case "Error":
                    break;
                  case "Text":
                    break;
                  case "OLE":
                    break;
                  case "NoAutoRecover":
                    break;
                  case "PublishObjects":
                    break;
                  case "DoNotCalculateBeforeSave":
                    break;
                  case "Number":
                    break;
                  case "RefModeR1C1":
                    break;
                  case "EmbedSaveSmartTags":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "WorkbookOptions":
                switch (Rn[3]) {
                  case "OWCVersion":
                    break;
                  case "Height":
                    break;
                  case "Width":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "WorksheetOptions":
                switch (Rn[3]) {
                  case "Visible":
                    if (Rn[0].slice(-2) === "/>")
                      ;
                    else if (Rn[1] === "/")
                      switch (str.slice(pidx, Rn.index)) {
                        case "SheetHidden":
                          wsprops.Hidden = 1;
                          break;
                        case "SheetVeryHidden":
                          wsprops.Hidden = 2;
                          break;
                      }
                    else
                      pidx = Rn.index + Rn[0].length;
                    break;
                  case "Header":
                    if (!cursheet["!margins"])
                      default_margins(cursheet["!margins"] = {}, "xlml");
                    cursheet["!margins"].header = parsexmltag(Rn[0]).Margin;
                    break;
                  case "Footer":
                    if (!cursheet["!margins"])
                      default_margins(cursheet["!margins"] = {}, "xlml");
                    cursheet["!margins"].footer = parsexmltag(Rn[0]).Margin;
                    break;
                  case "PageMargins":
                    var pagemargins = parsexmltag(Rn[0]);
                    if (!cursheet["!margins"])
                      default_margins(cursheet["!margins"] = {}, "xlml");
                    if (pagemargins.Top)
                      cursheet["!margins"].top = pagemargins.Top;
                    if (pagemargins.Left)
                      cursheet["!margins"].left = pagemargins.Left;
                    if (pagemargins.Right)
                      cursheet["!margins"].right = pagemargins.Right;
                    if (pagemargins.Bottom)
                      cursheet["!margins"].bottom = pagemargins.Bottom;
                    break;
                  case "DisplayRightToLeft":
                    if (!Workbook.Views)
                      Workbook.Views = [];
                    if (!Workbook.Views[0])
                      Workbook.Views[0] = {};
                    Workbook.Views[0].RTL = true;
                    break;
                  case "FreezePanes":
                    break;
                  case "FrozenNoSplit":
                    break;
                  case "SplitHorizontal":
                  case "SplitVertical":
                    break;
                  case "DoNotDisplayGridlines":
                    break;
                  case "TopRowBottomPane":
                    break;
                  case "LeftColumnRightPane":
                    break;
                  case "Unsynced":
                    break;
                  case "Print":
                    break;
                  case "Panes":
                    break;
                  case "Scale":
                    break;
                  case "Pane":
                    break;
                  case "Number":
                    break;
                  case "Layout":
                    break;
                  case "PageSetup":
                    break;
                  case "Selected":
                    break;
                  case "ProtectObjects":
                    break;
                  case "EnableSelection":
                    break;
                  case "ProtectScenarios":
                    break;
                  case "ValidPrinterInfo":
                    break;
                  case "HorizontalResolution":
                    break;
                  case "VerticalResolution":
                    break;
                  case "NumberofCopies":
                    break;
                  case "ActiveRow":
                    break;
                  case "ActiveCol":
                    break;
                  case "ActivePane":
                    break;
                  case "TopRowVisible":
                    break;
                  case "LeftColumnVisible":
                    break;
                  case "FitToPage":
                    break;
                  case "RangeSelection":
                    break;
                  case "PaperSizeIndex":
                    break;
                  case "PageLayoutZoom":
                    break;
                  case "PageBreakZoom":
                    break;
                  case "FilterOn":
                    break;
                  case "FitWidth":
                    break;
                  case "FitHeight":
                    break;
                  case "CommentsLayout":
                    break;
                  case "Zoom":
                    break;
                  case "LeftToRight":
                    break;
                  case "Gridlines":
                    break;
                  case "AllowSort":
                    break;
                  case "AllowFilter":
                    break;
                  case "AllowInsertRows":
                    break;
                  case "AllowDeleteRows":
                    break;
                  case "AllowInsertCols":
                    break;
                  case "AllowDeleteCols":
                    break;
                  case "AllowInsertHyperlinks":
                    break;
                  case "AllowFormatCells":
                    break;
                  case "AllowSizeCols":
                    break;
                  case "AllowSizeRows":
                    break;
                  case "NoSummaryRowsBelowDetail":
                    break;
                  case "TabColorIndex":
                    break;
                  case "DoNotDisplayHeadings":
                    break;
                  case "ShowPageLayoutZoom":
                    break;
                  case "NoSummaryColumnsRightDetail":
                    break;
                  case "BlackAndWhite":
                    break;
                  case "DoNotDisplayZeros":
                    break;
                  case "DisplayPageBreak":
                    break;
                  case "RowColHeadings":
                    break;
                  case "DoNotDisplayOutline":
                    break;
                  case "NoOrientation":
                    break;
                  case "AllowUsePivotTables":
                    break;
                  case "ZeroHeight":
                    break;
                  case "ViewableRange":
                    break;
                  case "Selection":
                    break;
                  case "ProtectContents":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "PivotTable":
              case "PivotCache":
                switch (Rn[3]) {
                  case "ImmediateItemsOnDrop":
                    break;
                  case "ShowPageMultipleItemLabel":
                    break;
                  case "CompactRowIndent":
                    break;
                  case "Location":
                    break;
                  case "PivotField":
                    break;
                  case "Orientation":
                    break;
                  case "LayoutForm":
                    break;
                  case "LayoutSubtotalLocation":
                    break;
                  case "LayoutCompactRow":
                    break;
                  case "Position":
                    break;
                  case "PivotItem":
                    break;
                  case "DataType":
                    break;
                  case "DataField":
                    break;
                  case "SourceName":
                    break;
                  case "ParentField":
                    break;
                  case "PTLineItems":
                    break;
                  case "PTLineItem":
                    break;
                  case "CountOfSameItems":
                    break;
                  case "Item":
                    break;
                  case "ItemType":
                    break;
                  case "PTSource":
                    break;
                  case "CacheIndex":
                    break;
                  case "ConsolidationReference":
                    break;
                  case "FileName":
                    break;
                  case "Reference":
                    break;
                  case "NoColumnGrand":
                    break;
                  case "NoRowGrand":
                    break;
                  case "BlankLineAfterItems":
                    break;
                  case "Hidden":
                    break;
                  case "Subtotal":
                    break;
                  case "BaseField":
                    break;
                  case "MapChildItems":
                    break;
                  case "Function":
                    break;
                  case "RefreshOnFileOpen":
                    break;
                  case "PrintSetTitles":
                    break;
                  case "MergeLabels":
                    break;
                  case "DefaultVersion":
                    break;
                  case "RefreshName":
                    break;
                  case "RefreshDate":
                    break;
                  case "RefreshDateCopy":
                    break;
                  case "VersionLastRefresh":
                    break;
                  case "VersionLastUpdate":
                    break;
                  case "VersionUpdateableMin":
                    break;
                  case "VersionRefreshableMin":
                    break;
                  case "Calculation":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "PageBreaks":
                switch (Rn[3]) {
                  case "ColBreaks":
                    break;
                  case "ColBreak":
                    break;
                  case "RowBreaks":
                    break;
                  case "RowBreak":
                    break;
                  case "ColStart":
                    break;
                  case "ColEnd":
                    break;
                  case "RowEnd":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "AutoFilter":
                switch (Rn[3]) {
                  case "AutoFilterColumn":
                    break;
                  case "AutoFilterCondition":
                    break;
                  case "AutoFilterAnd":
                    break;
                  case "AutoFilterOr":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "QueryTable":
                switch (Rn[3]) {
                  case "Id":
                    break;
                  case "AutoFormatFont":
                    break;
                  case "AutoFormatPattern":
                    break;
                  case "QuerySource":
                    break;
                  case "QueryType":
                    break;
                  case "EnableRedirections":
                    break;
                  case "RefreshedInXl9":
                    break;
                  case "URLString":
                    break;
                  case "HTMLTables":
                    break;
                  case "Connection":
                    break;
                  case "CommandText":
                    break;
                  case "RefreshInfo":
                    break;
                  case "NoTitles":
                    break;
                  case "NextId":
                    break;
                  case "ColumnInfo":
                    break;
                  case "OverwriteCells":
                    break;
                  case "DoNotPromptForFile":
                    break;
                  case "TextWizardSettings":
                    break;
                  case "Source":
                    break;
                  case "Number":
                    break;
                  case "Decimal":
                    break;
                  case "ThousandSeparator":
                    break;
                  case "TrailingMinusNumbers":
                    break;
                  case "FormatSettings":
                    break;
                  case "FieldType":
                    break;
                  case "Delimiters":
                    break;
                  case "Tab":
                    break;
                  case "Comma":
                    break;
                  case "AutoFormatName":
                    break;
                  case "VersionLastEdit":
                    break;
                  case "VersionLastRefresh":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "DataValidation":
                switch (Rn[3]) {
                  case "Range":
                    break;
                  case "Type":
                    break;
                  case "Min":
                    break;
                  case "Max":
                    break;
                  case "Sort":
                    break;
                  case "Descending":
                    break;
                  case "Order":
                    break;
                  case "CaseSensitive":
                    break;
                  case "Value":
                    break;
                  case "ErrorStyle":
                    break;
                  case "ErrorMessage":
                    break;
                  case "ErrorTitle":
                    break;
                  case "InputMessage":
                    break;
                  case "InputTitle":
                    break;
                  case "ComboHide":
                    break;
                  case "InputHide":
                    break;
                  case "Condition":
                    break;
                  case "Qualifier":
                    break;
                  case "UseBlank":
                    break;
                  case "Value1":
                    break;
                  case "Value2":
                    break;
                  case "Format":
                    break;
                  case "CellRangeList":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "Sorting":
              case "ConditionalFormatting":
                switch (Rn[3]) {
                  case "Range":
                    break;
                  case "Type":
                    break;
                  case "Min":
                    break;
                  case "Max":
                    break;
                  case "Sort":
                    break;
                  case "Descending":
                    break;
                  case "Order":
                    break;
                  case "CaseSensitive":
                    break;
                  case "Value":
                    break;
                  case "ErrorStyle":
                    break;
                  case "ErrorMessage":
                    break;
                  case "ErrorTitle":
                    break;
                  case "CellRangeList":
                    break;
                  case "InputMessage":
                    break;
                  case "InputTitle":
                    break;
                  case "ComboHide":
                    break;
                  case "InputHide":
                    break;
                  case "Condition":
                    break;
                  case "Qualifier":
                    break;
                  case "UseBlank":
                    break;
                  case "Value1":
                    break;
                  case "Value2":
                    break;
                  case "Format":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "MapInfo":
              case "Schema":
              case "data":
                switch (Rn[3]) {
                  case "Map":
                    break;
                  case "Entry":
                    break;
                  case "Range":
                    break;
                  case "XPath":
                    break;
                  case "Field":
                    break;
                  case "XSDType":
                    break;
                  case "FilterOn":
                    break;
                  case "Aggregate":
                    break;
                  case "ElementType":
                    break;
                  case "AttributeType":
                    break;
                  case "schema":
                  case "element":
                  case "complexType":
                  case "datatype":
                  case "all":
                  case "attribute":
                  case "extends":
                    break;
                  case "row":
                    break;
                  default:
                    seen = false;
                }
                break;
              case "SmartTags":
                break;
              default:
                seen = false;
                break;
            }
            if (seen)
              break;
            if (Rn[3].match(/!\[CDATA/))
              break;
            if (!state[state.length - 1][1])
              throw "Unrecognized tag: " + Rn[3] + "|" + state.join("|");
            if (state[state.length - 1][0] === "CustomDocumentProperties") {
              if (Rn[0].slice(-2) === "/>")
                break;
              else if (Rn[1] === "/")
                xlml_set_custprop(Custprops, Rn[3], cp, str.slice(pidx, Rn.index));
              else {
                cp = Rn;
                pidx = Rn.index + Rn[0].length;
              }
              break;
            }
            if (opts.WTF)
              throw "Unrecognized tag: " + Rn[3] + "|" + state.join("|");
        }
      var out = {};
      if (!opts.bookSheets && !opts.bookProps)
        out.Sheets = sheets;
      out.SheetNames = sheetnames;
      out.Workbook = Workbook;
      out.SSF = SSF.get_table();
      out.Props = Props;
      out.Custprops = Custprops;
      return out;
    }
    function parse_xlml(data, opts) {
      fix_read_opts(opts = opts || {});
      switch (opts.type || "base64") {
        case "base64":
          return parse_xlml_xml(Base64.decode(data), opts);
        case "binary":
        case "buffer":
        case "file":
          return parse_xlml_xml(data, opts);
        case "array":
          return parse_xlml_xml(a2s(data), opts);
      }
    }
    function write_props_xlml(wb, opts) {
      var o = [];
      if (wb.Props)
        o.push(xlml_write_docprops(wb.Props, opts));
      if (wb.Custprops)
        o.push(xlml_write_custprops(wb.Props, wb.Custprops));
      return o.join("");
    }
    function write_wb_xlml() {
      return "";
    }
    function write_sty_xlml(wb, opts) {
      var styles = ['<Style ss:ID="Default" ss:Name="Normal"><NumberFormat/></Style>'];
      opts.cellXfs.forEach(function(xf, id) {
        var payload = [];
        payload.push(writextag("NumberFormat", null, { "ss:Format": escapexml(SSF._table[xf.numFmtId]) }));
        var o = { "ss:ID": "s" + (21 + id) };
        styles.push(writextag("Style", payload.join(""), o));
      });
      return writextag("Styles", styles.join(""));
    }
    function write_name_xlml(n) {
      return writextag("NamedRange", null, { "ss:Name": n.Name, "ss:RefersTo": "=" + a1_to_rc(n.Ref, { r: 0, c: 0 }) });
    }
    function write_names_xlml(wb) {
      if (!((wb || {}).Workbook || {}).Names)
        return "";
      var names = wb.Workbook.Names;
      var out = [];
      for (var i3 = 0; i3 < names.length; ++i3) {
        var n = names[i3];
        if (n.Sheet != null)
          continue;
        if (n.Name.match(/^_xlfn\./))
          continue;
        out.push(write_name_xlml(n));
      }
      return writextag("Names", out.join(""));
    }
    function write_ws_xlml_names(ws, opts, idx, wb) {
      if (!ws)
        return "";
      if (!((wb || {}).Workbook || {}).Names)
        return "";
      var names = wb.Workbook.Names;
      var out = [];
      for (var i3 = 0; i3 < names.length; ++i3) {
        var n = names[i3];
        if (n.Sheet != idx)
          continue;
        if (n.Name.match(/^_xlfn\./))
          continue;
        out.push(write_name_xlml(n));
      }
      return out.join("");
    }
    function write_ws_xlml_wsopts(ws, opts, idx, wb) {
      if (!ws)
        return "";
      var o = [];
      if (ws["!margins"]) {
        o.push("<PageSetup>");
        if (ws["!margins"].header)
          o.push(writextag("Header", null, { "x:Margin": ws["!margins"].header }));
        if (ws["!margins"].footer)
          o.push(writextag("Footer", null, { "x:Margin": ws["!margins"].footer }));
        o.push(writextag("PageMargins", null, {
          "x:Bottom": ws["!margins"].bottom || "0.75",
          "x:Left": ws["!margins"].left || "0.7",
          "x:Right": ws["!margins"].right || "0.7",
          "x:Top": ws["!margins"].top || "0.75"
        }));
        o.push("</PageSetup>");
      }
      if (wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) {
        if (wb.Workbook.Sheets[idx].Hidden)
          o.push(writextag("Visible", wb.Workbook.Sheets[idx].Hidden == 1 ? "SheetHidden" : "SheetVeryHidden", {}));
        else {
          for (var i3 = 0; i3 < idx; ++i3)
            if (wb.Workbook.Sheets[i3] && !wb.Workbook.Sheets[i3].Hidden)
              break;
          if (i3 == idx)
            o.push("<Selected/>");
        }
      }
      if (((((wb || {}).Workbook || {}).Views || [])[0] || {}).RTL)
        o.push("<DisplayRightToLeft/>");
      if (ws["!protect"]) {
        o.push(writetag("ProtectContents", "True"));
        if (ws["!protect"].objects)
          o.push(writetag("ProtectObjects", "True"));
        if (ws["!protect"].scenarios)
          o.push(writetag("ProtectScenarios", "True"));
        if (ws["!protect"].selectLockedCells != null && !ws["!protect"].selectLockedCells)
          o.push(writetag("EnableSelection", "NoSelection"));
        else if (ws["!protect"].selectUnlockedCells != null && !ws["!protect"].selectUnlockedCells)
          o.push(writetag("EnableSelection", "UnlockedCells"));
        [
          ["formatCells", "AllowFormatCells"],
          ["formatColumns", "AllowSizeCols"],
          ["formatRows", "AllowSizeRows"],
          ["insertColumns", "AllowInsertCols"],
          ["insertRows", "AllowInsertRows"],
          ["insertHyperlinks", "AllowInsertHyperlinks"],
          ["deleteColumns", "AllowDeleteCols"],
          ["deleteRows", "AllowDeleteRows"],
          ["sort", "AllowSort"],
          ["autoFilter", "AllowFilter"],
          ["pivotTables", "AllowUsePivotTables"]
        ].forEach(function(x) {
          if (ws["!protect"][x[0]])
            o.push("<" + x[1] + "/>");
        });
      }
      if (o.length == 0)
        return "";
      return writextag("WorksheetOptions", o.join(""), { xmlns: XLMLNS.x });
    }
    function write_ws_xlml_comment(comments) {
      return comments.map(function(c) {
        var t = xlml_unfixstr(c.t || "");
        var d = writextag("ss:Data", t, { "xmlns": "http://www.w3.org/TR/REC-html40" });
        return writextag("Comment", d, { "ss:Author": c.a });
      }).join("");
    }
    function write_ws_xlml_cell(cell, ref2, ws, opts, idx, wb, addr) {
      if (!cell || cell.v == void 0 && cell.f == void 0)
        return "";
      var attr = {};
      if (cell.f)
        attr["ss:Formula"] = "=" + escapexml(a1_to_rc(cell.f, addr));
      if (cell.F && cell.F.slice(0, ref2.length) == ref2) {
        var end = decode_cell(cell.F.slice(ref2.length + 1));
        attr["ss:ArrayRange"] = "RC:R" + (end.r == addr.r ? "" : "[" + (end.r - addr.r) + "]") + "C" + (end.c == addr.c ? "" : "[" + (end.c - addr.c) + "]");
      }
      if (cell.l && cell.l.Target) {
        attr["ss:HRef"] = escapexml(cell.l.Target);
        if (cell.l.Tooltip)
          attr["x:HRefScreenTip"] = escapexml(cell.l.Tooltip);
      }
      if (ws["!merges"]) {
        var marr = ws["!merges"];
        for (var mi = 0; mi != marr.length; ++mi) {
          if (marr[mi].s.c != addr.c || marr[mi].s.r != addr.r)
            continue;
          if (marr[mi].e.c > marr[mi].s.c)
            attr["ss:MergeAcross"] = marr[mi].e.c - marr[mi].s.c;
          if (marr[mi].e.r > marr[mi].s.r)
            attr["ss:MergeDown"] = marr[mi].e.r - marr[mi].s.r;
        }
      }
      var t = "", p = "";
      switch (cell.t) {
        case "z":
          if (!opts.sheetStubs)
            return "";
          break;
        case "n":
          t = "Number";
          p = String(cell.v);
          break;
        case "b":
          t = "Boolean";
          p = cell.v ? "1" : "0";
          break;
        case "e":
          t = "Error";
          p = BErr[cell.v];
          break;
        case "d":
          t = "DateTime";
          p = new Date(cell.v).toISOString();
          if (cell.z == null)
            cell.z = cell.z || SSF._table[14];
          break;
        case "s":
          t = "String";
          p = escapexlml(cell.v || "");
          break;
      }
      var os = get_cell_style(opts.cellXfs, cell, opts);
      attr["ss:StyleID"] = "s" + (21 + os);
      attr["ss:Index"] = addr.c + 1;
      var _v = cell.v != null ? p : "";
      var m = cell.t == "z" ? "" : '<Data ss:Type="' + t + '">' + _v + "</Data>";
      if ((cell.c || []).length > 0)
        m += write_ws_xlml_comment(cell.c);
      return writextag("Cell", m, attr);
    }
    function write_ws_xlml_row(R, row) {
      var o = '<Row ss:Index="' + (R + 1) + '"';
      if (row) {
        if (row.hpt && !row.hpx)
          row.hpx = pt2px(row.hpt);
        if (row.hpx)
          o += ' ss:AutoFitHeight="0" ss:Height="' + row.hpx + '"';
        if (row.hidden)
          o += ' ss:Hidden="1"';
      }
      return o + ">";
    }
    function write_ws_xlml_table(ws, opts, idx, wb) {
      if (!ws["!ref"])
        return "";
      var range = safe_decode_range(ws["!ref"]);
      var marr = ws["!merges"] || [], mi = 0;
      var o = [];
      if (ws["!cols"])
        ws["!cols"].forEach(function(n, i3) {
          process_col(n);
          var w = !!n.width;
          var p = col_obj_w(i3, n);
          var k = { "ss:Index": i3 + 1 };
          if (w)
            k["ss:Width"] = width2px(p.width);
          if (n.hidden)
            k["ss:Hidden"] = "1";
          o.push(writextag("Column", null, k));
        });
      var dense = Array.isArray(ws);
      for (var R = range.s.r; R <= range.e.r; ++R) {
        var row = [write_ws_xlml_row(R, (ws["!rows"] || [])[R])];
        for (var C = range.s.c; C <= range.e.c; ++C) {
          var skip = false;
          for (mi = 0; mi != marr.length; ++mi) {
            if (marr[mi].s.c > C)
              continue;
            if (marr[mi].s.r > R)
              continue;
            if (marr[mi].e.c < C)
              continue;
            if (marr[mi].e.r < R)
              continue;
            if (marr[mi].s.c != C || marr[mi].s.r != R)
              skip = true;
            break;
          }
          if (skip)
            continue;
          var addr = { r: R, c: C };
          var ref2 = encode_cell(addr), cell = dense ? (ws[R] || [])[C] : ws[ref2];
          row.push(write_ws_xlml_cell(cell, ref2, ws, opts, idx, wb, addr));
        }
        row.push("</Row>");
        if (row.length > 2)
          o.push(row.join(""));
      }
      return o.join("");
    }
    function write_ws_xlml(idx, opts, wb) {
      var o = [];
      var s = wb.SheetNames[idx];
      var ws = wb.Sheets[s];
      var t = ws ? write_ws_xlml_names(ws, opts, idx, wb) : "";
      if (t.length > 0)
        o.push("<Names>" + t + "</Names>");
      t = ws ? write_ws_xlml_table(ws, opts, idx, wb) : "";
      if (t.length > 0)
        o.push("<Table>" + t + "</Table>");
      o.push(write_ws_xlml_wsopts(ws, opts, idx, wb));
      return o.join("");
    }
    function write_xlml(wb, opts) {
      if (!opts)
        opts = {};
      if (!wb.SSF)
        wb.SSF = SSF.get_table();
      if (wb.SSF) {
        make_ssf(SSF);
        SSF.load_table(wb.SSF);
        opts.revssf = evert_num(wb.SSF);
        opts.revssf[wb.SSF[65535]] = 0;
        opts.ssf = wb.SSF;
        opts.cellXfs = [];
        get_cell_style(opts.cellXfs, {}, { revssf: { "General": 0 } });
      }
      var d = [];
      d.push(write_props_xlml(wb, opts));
      d.push(write_wb_xlml());
      d.push("");
      d.push("");
      for (var i3 = 0; i3 < wb.SheetNames.length; ++i3)
        d.push(writextag("Worksheet", write_ws_xlml(i3, opts, wb), { "ss:Name": escapexml(wb.SheetNames[i3]) }));
      d[2] = write_sty_xlml(wb, opts);
      d[3] = write_names_xlml(wb);
      return XML_HEADER + writextag("Workbook", d.join(""), {
        "xmlns": XLMLNS.ss,
        "xmlns:o": XLMLNS.o,
        "xmlns:x": XLMLNS.x,
        "xmlns:ss": XLMLNS.ss,
        "xmlns:dt": XLMLNS.dt,
        "xmlns:html": XLMLNS.html
      });
    }
    function parse_compobj(obj) {
      var v = {};
      var o = obj.content;
      o.l = 28;
      v.AnsiUserType = o.read_shift(0, "lpstr-ansi");
      v.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o);
      if (o.length - o.l <= 4)
        return v;
      var m = o.read_shift(4);
      if (m == 0 || m > 40)
        return v;
      o.l -= 4;
      v.Reserved1 = o.read_shift(0, "lpstr-ansi");
      if (o.length - o.l <= 4)
        return v;
      m = o.read_shift(4);
      if (m !== 1907505652)
        return v;
      v.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o);
      m = o.read_shift(4);
      if (m == 0 || m > 40)
        return v;
      o.l -= 4;
      v.Reserved2 = o.read_shift(0, "lpwstr");
    }
    function slurp(R, blob, length, opts) {
      var l = length;
      var bufs = [];
      var d = blob.slice(blob.l, blob.l + l);
      if (opts && opts.enc && opts.enc.insitu)
        switch (R.n) {
          case "BOF":
          case "FilePass":
          case "FileLock":
          case "InterfaceHdr":
          case "RRDInfo":
          case "RRDHead":
          case "UsrExcl":
            break;
          default:
            if (d.length === 0)
              break;
            opts.enc.insitu(d);
        }
      bufs.push(d);
      blob.l += l;
      var next = XLSRecordEnum[__readUInt16LE(blob, blob.l)];
      var start = 0;
      while (next != null && next.n.slice(0, 8) === "Continue") {
        l = __readUInt16LE(blob, blob.l + 2);
        start = blob.l + 4;
        if (next.n == "ContinueFrt")
          start += 4;
        else if (next.n.slice(0, 11) == "ContinueFrt")
          start += 12;
        bufs.push(blob.slice(start, blob.l + 4 + l));
        blob.l += 4 + l;
        next = XLSRecordEnum[__readUInt16LE(blob, blob.l)];
      }
      var b = bconcat(bufs);
      prep_blob(b, 0);
      var ll = 0;
      b.lens = [];
      for (var j2 = 0; j2 < bufs.length; ++j2) {
        b.lens.push(ll);
        ll += bufs[j2].length;
      }
      return R.f(b, b.length, opts);
    }
    function safe_format_xf(p, opts, date1904) {
      if (p.t === "z")
        return;
      if (!p.XF)
        return;
      var fmtid = 0;
      try {
        fmtid = p.z || p.XF.numFmtId || 0;
        if (opts.cellNF)
          p.z = SSF._table[fmtid];
      } catch (e) {
        if (opts.WTF)
          throw e;
      }
      if (!opts || opts.cellText !== false)
        try {
          if (p.t === "e") {
            p.w = p.w || BErr[p.v];
          } else if (fmtid === 0 || fmtid == "General") {
            if (p.t === "n") {
              if ((p.v | 0) === p.v)
                p.w = SSF._general_int(p.v);
              else
                p.w = SSF._general_num(p.v);
            } else
              p.w = SSF._general(p.v);
          } else
            p.w = SSF.format(fmtid, p.v, { date1904: !!date1904 });
        } catch (e) {
          if (opts.WTF)
            throw e;
        }
      if (opts.cellDates && fmtid && p.t == "n" && SSF.is_date(SSF._table[fmtid] || String(fmtid))) {
        var _d = SSF.parse_date_code(p.v);
        if (_d) {
          p.t = "d";
          p.v = new Date(_d.y, _d.m - 1, _d.d, _d.H, _d.M, _d.S, _d.u);
        }
      }
    }
    function make_cell(val, ixfe, t) {
      return { v: val, ixfe, t };
    }
    function parse_workbook(blob, options) {
      var wb = { opts: {} };
      var Sheets = {};
      var out = options.dense ? [] : {};
      var Directory = {};
      var range = {};
      var last_formula = null;
      var sst = [];
      var cur_sheet = "";
      var Preamble = {};
      var lastcell, last_cell = "", cc, cmnt, rngC, rngR;
      var sharedf = {};
      var arrayf = [];
      var temp_val;
      var country;
      var cell_valid = true;
      var XFs = [];
      var palette = [];
      var Workbook = { Sheets: [], WBProps: { date1904: false }, Views: [{}] }, wsprops = {};
      var get_rgb = function getrgb(icv) {
        if (icv < 8)
          return XLSIcv[icv];
        if (icv < 64)
          return palette[icv - 8] || XLSIcv[icv];
        return XLSIcv[icv];
      };
      var process_cell_style = function pcs(cell, line, options2) {
        var xfd = line.XF.data;
        if (!xfd || !xfd.patternType || !options2 || !options2.cellStyles)
          return;
        line.s = {};
        line.s.patternType = xfd.patternType;
        var t;
        if (t = rgb2Hex(get_rgb(xfd.icvFore))) {
          line.s.fgColor = { rgb: t };
        }
        if (t = rgb2Hex(get_rgb(xfd.icvBack))) {
          line.s.bgColor = { rgb: t };
        }
      };
      var addcell = function addcell2(cell, line, options2) {
        if (file_depth > 1)
          return;
        if (options2.sheetRows && cell.r >= options2.sheetRows)
          cell_valid = false;
        if (!cell_valid)
          return;
        if (options2.cellStyles && line.XF && line.XF.data)
          process_cell_style(cell, line, options2);
        delete line.ixfe;
        delete line.XF;
        lastcell = cell;
        last_cell = encode_cell(cell);
        if (!range || !range.s || !range.e)
          range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
        if (cell.r < range.s.r)
          range.s.r = cell.r;
        if (cell.c < range.s.c)
          range.s.c = cell.c;
        if (cell.r + 1 > range.e.r)
          range.e.r = cell.r + 1;
        if (cell.c + 1 > range.e.c)
          range.e.c = cell.c + 1;
        if (options2.cellFormula && line.f) {
          for (var afi = 0; afi < arrayf.length; ++afi) {
            if (arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r)
              continue;
            if (arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r)
              continue;
            line.F = encode_range(arrayf[afi][0]);
            if (arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r)
              delete line.f;
            if (line.f)
              line.f = "" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts);
            break;
          }
        }
        {
          if (options2.dense) {
            if (!out[cell.r])
              out[cell.r] = [];
            out[cell.r][cell.c] = line;
          } else
            out[last_cell] = line;
        }
      };
      var opts = {
        enc: false,
        // encrypted
        sbcch: 0,
        // cch in the preceding SupBook
        snames: [],
        // sheetnames
        sharedf,
        // shared formulae by address
        arrayf,
        // array formulae array
        rrtabid: [],
        // RRTabId
        lastuser: "",
        // Last User from WriteAccess
        biff: 8,
        // BIFF version
        codepage: 0,
        // CP from CodePage record
        winlocked: 0,
        // fLockWn from WinProtect
        cellStyles: !!options && !!options.cellStyles,
        WTF: !!options && !!options.wtf
      };
      if (options.password)
        opts.password = options.password;
      var themes;
      var merges = [];
      var objects = [];
      var colinfo = [], rowinfo = [];
      var seencol = false;
      var supbooks = [];
      supbooks.SheetNames = opts.snames;
      supbooks.sharedf = opts.sharedf;
      supbooks.arrayf = opts.arrayf;
      supbooks.names = [];
      supbooks.XTI = [];
      var last_Rn = "";
      var file_depth = 0;
      var BIFF2Fmt = 0, BIFF2FmtTable = [];
      var FilterDatabases = [];
      var last_lbl;
      opts.codepage = 1200;
      set_cp(1200);
      var seen_codepage = false;
      while (blob.l < blob.length - 1) {
        var s = blob.l;
        var RecordType = blob.read_shift(2);
        if (RecordType === 0 && last_Rn === "EOF")
          break;
        var length = blob.l === blob.length ? 0 : blob.read_shift(2);
        var R = XLSRecordEnum[RecordType];
        if (R && R.f) {
          if (options.bookSheets) {
            if (last_Rn === "BoundSheet8" && R.n !== "BoundSheet8")
              break;
          }
          last_Rn = R.n;
          if (R.r === 2 || R.r == 12) {
            var rt = blob.read_shift(2);
            length -= 2;
            if (!opts.enc && rt !== RecordType && ((rt & 255) << 8 | rt >> 8) !== RecordType)
              throw new Error("rt mismatch: " + rt + "!=" + RecordType);
            if (R.r == 12) {
              blob.l += 10;
              length -= 10;
            }
          }
          var val = {};
          if (R.n === "EOF")
            val = R.f(blob, length, opts);
          else
            val = slurp(R, blob, length, opts);
          var Rn = R.n;
          if (file_depth == 0 && Rn != "BOF")
            continue;
          switch (Rn) {
            case "Date1904":
              wb.opts.Date1904 = Workbook.WBProps.date1904 = val;
              break;
            case "WriteProtect":
              wb.opts.WriteProtect = true;
              break;
            case "FilePass":
              if (!opts.enc)
                blob.l = 0;
              opts.enc = val;
              if (!options.password)
                throw new Error("File is password-protected");
              if (val.valid == null)
                throw new Error("Encryption scheme unsupported");
              if (!val.valid)
                throw new Error("Password is incorrect");
              break;
            case "WriteAccess":
              opts.lastuser = val;
              break;
            case "FileSharing":
              break;
            case "CodePage":
              var cpval = Number(val);
              switch (cpval) {
                case 21010:
                  cpval = 1200;
                  break;
                case 32768:
                  cpval = 1e4;
                  break;
                case 32769:
                  cpval = 1252;
                  break;
              }
              set_cp(opts.codepage = cpval);
              seen_codepage = true;
              break;
            case "RRTabId":
              opts.rrtabid = val;
              break;
            case "WinProtect":
              opts.winlocked = val;
              break;
            case "Template":
              break;
            case "BookBool":
              break;
            case "UsesELFs":
              break;
            case "MTRSettings":
              break;
            case "RefreshAll":
            case "CalcCount":
            case "CalcDelta":
            case "CalcIter":
            case "CalcMode":
            case "CalcPrecision":
            case "CalcSaveRecalc":
              wb.opts[Rn] = val;
              break;
            case "CalcRefMode":
              opts.CalcRefMode = val;
              break;
            case "Uncalced":
              break;
            case "ForceFullCalculation":
              wb.opts.FullCalc = val;
              break;
            case "WsBool":
              if (val.fDialog)
                out["!type"] = "dialog";
              break;
            case "XF":
              XFs.push(val);
              break;
            case "ExtSST":
              break;
            case "BookExt":
              break;
            case "RichTextStream":
              break;
            case "BkHim":
              break;
            case "SupBook":
              supbooks.push([val]);
              supbooks[supbooks.length - 1].XTI = [];
              break;
            case "ExternName":
              supbooks[supbooks.length - 1].push(val);
              break;
            case "Index":
              break;
            case "Lbl":
              last_lbl = {
                Name: val.Name,
                Ref: stringify_formula(val.rgce, range, null, supbooks, opts)
              };
              if (val.itab > 0)
                last_lbl.Sheet = val.itab - 1;
              supbooks.names.push(last_lbl);
              if (!supbooks[0]) {
                supbooks[0] = [];
                supbooks[0].XTI = [];
              }
              supbooks[supbooks.length - 1].push(val);
              if (val.Name == "_xlnm._FilterDatabase" && val.itab > 0) {
                if (val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == "PtgArea3d")
                  FilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) };
              }
              break;
            case "ExternCount":
              opts.ExternCount = val;
              break;
            case "ExternSheet":
              if (supbooks.length == 0) {
                supbooks[0] = [];
                supbooks[0].XTI = [];
              }
              supbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);
              supbooks.XTI = supbooks.XTI.concat(val);
              break;
            case "NameCmt":
              if (opts.biff < 8)
                break;
              if (last_lbl != null)
                last_lbl.Comment = val[1];
              break;
            case "Protect":
              out["!protect"] = val;
              break;
            case "Password":
              if (val !== 0 && opts.WTF)
                console.error("Password verifier: " + val);
              break;
            case "Prot4Rev":
            case "Prot4RevPass":
              break;
            case "BoundSheet8":
              {
                Directory[val.pos] = val;
                opts.snames.push(val.name);
              }
              break;
            case "EOF":
              {
                if (--file_depth)
                  break;
                if (range.e) {
                  if (range.e.r > 0 && range.e.c > 0) {
                    range.e.r--;
                    range.e.c--;
                    out["!ref"] = encode_range(range);
                    if (options.sheetRows && options.sheetRows <= range.e.r) {
                      var tmpri = range.e.r;
                      range.e.r = options.sheetRows - 1;
                      out["!fullref"] = out["!ref"];
                      out["!ref"] = encode_range(range);
                      range.e.r = tmpri;
                    }
                    range.e.r++;
                    range.e.c++;
                  }
                  if (merges.length > 0)
                    out["!merges"] = merges;
                  if (objects.length > 0)
                    out["!objects"] = objects;
                  if (colinfo.length > 0)
                    out["!cols"] = colinfo;
                  if (rowinfo.length > 0)
                    out["!rows"] = rowinfo;
                  Workbook.Sheets.push(wsprops);
                }
                if (cur_sheet === "")
                  Preamble = out;
                else
                  Sheets[cur_sheet] = out;
                out = options.dense ? [] : {};
              }
              break;
            case "BOF":
              {
                if (opts.biff === 8)
                  opts.biff = {
                    9: 2,
                    521: 3,
                    1033: 4
                  }[RecordType] || {
                    512: 2,
                    768: 3,
                    1024: 4,
                    1280: 5,
                    1536: 8,
                    2: 2,
                    7: 2
                  }[val.BIFFVer] || 8;
                if (opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16)
                  opts.biff = 2;
                if (file_depth++)
                  break;
                cell_valid = true;
                out = options.dense ? [] : {};
                if (opts.biff < 8 && !seen_codepage) {
                  seen_codepage = true;
                  set_cp(opts.codepage = options.codepage || 1252);
                }
                if (opts.biff < 5) {
                  if (cur_sheet === "")
                    cur_sheet = "Sheet1";
                  range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
                  var fakebs8 = { pos: blob.l - length, name: cur_sheet };
                  Directory[fakebs8.pos] = fakebs8;
                  opts.snames.push(cur_sheet);
                } else
                  cur_sheet = (Directory[s] || { name: "" }).name;
                if (val.dt == 32)
                  out["!type"] = "chart";
                if (val.dt == 64)
                  out["!type"] = "macro";
                merges = [];
                objects = [];
                opts.arrayf = arrayf = [];
                colinfo = [];
                rowinfo = [];
                seencol = false;
                wsprops = { Hidden: (Directory[s] || { hs: 0 }).hs, name: cur_sheet };
              }
              break;
            case "Number":
            case "BIFF2NUM":
            case "BIFF2INT":
              {
                if (out["!type"] == "chart") {
                  if (options.dense ? (out[val.r] || [])[val.c] : out[encode_cell({ c: val.c, r: val.r })])
                    ++val.c;
                }
                temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe] || {}, v: val.val, t: "n" };
                if (BIFF2Fmt > 0)
                  temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                safe_format_xf(temp_val, options, wb.opts.Date1904);
                addcell({ c: val.c, r: val.r }, temp_val, options);
              }
              break;
            case "BoolErr":
              {
                temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.val, t: val.t };
                if (BIFF2Fmt > 0)
                  temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                safe_format_xf(temp_val, options, wb.opts.Date1904);
                addcell({ c: val.c, r: val.r }, temp_val, options);
              }
              break;
            case "RK":
              {
                temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], v: val.rknum, t: "n" };
                if (BIFF2Fmt > 0)
                  temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                safe_format_xf(temp_val, options, wb.opts.Date1904);
                addcell({ c: val.c, r: val.r }, temp_val, options);
              }
              break;
            case "MulRk":
              {
                for (var j2 = val.c; j2 <= val.C; ++j2) {
                  var ixfe = val.rkrec[j2 - val.c][0];
                  temp_val = { ixfe, XF: XFs[ixfe], v: val.rkrec[j2 - val.c][1], t: "n" };
                  if (BIFF2Fmt > 0)
                    temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                  safe_format_xf(temp_val, options, wb.opts.Date1904);
                  addcell({ c: j2, r: val.r }, temp_val, options);
                }
              }
              break;
            case "Formula":
              {
                if (val.val == "String") {
                  last_formula = val;
                  break;
                }
                temp_val = make_cell(val.val, val.cell.ixfe, val.tt);
                temp_val.XF = XFs[temp_val.ixfe];
                if (options.cellFormula) {
                  var _f = val.formula;
                  if (_f && _f[0] && _f[0][0] && _f[0][0][0] == "PtgExp") {
                    var _fr = _f[0][0][1][0], _fc = _f[0][0][1][1];
                    var _fe = encode_cell({ r: _fr, c: _fc });
                    if (sharedf[_fe])
                      temp_val.f = "" + stringify_formula(val.formula, range, val.cell, supbooks, opts);
                    else
                      temp_val.F = ((options.dense ? (out[_fr] || [])[_fc] : out[_fe]) || {}).F;
                  } else
                    temp_val.f = "" + stringify_formula(val.formula, range, val.cell, supbooks, opts);
                }
                if (BIFF2Fmt > 0)
                  temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                safe_format_xf(temp_val, options, wb.opts.Date1904);
                addcell(val.cell, temp_val, options);
                last_formula = val;
              }
              break;
            case "String":
              {
                if (last_formula) {
                  last_formula.val = val;
                  temp_val = make_cell(val, last_formula.cell.ixfe, "s");
                  temp_val.XF = XFs[temp_val.ixfe];
                  if (options.cellFormula) {
                    temp_val.f = "" + stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);
                  }
                  if (BIFF2Fmt > 0)
                    temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                  safe_format_xf(temp_val, options, wb.opts.Date1904);
                  addcell(last_formula.cell, temp_val, options);
                  last_formula = null;
                } else
                  throw new Error("String record expects Formula");
              }
              break;
            case "Array":
              {
                arrayf.push(val);
                var _arraystart = encode_cell(val[0].s);
                cc = options.dense ? (out[val[0].s.r] || [])[val[0].s.c] : out[_arraystart];
                if (options.cellFormula && cc) {
                  if (!last_formula)
                    break;
                  if (!_arraystart || !cc)
                    break;
                  cc.f = "" + stringify_formula(val[1], range, val[0], supbooks, opts);
                  cc.F = encode_range(val[0]);
                }
              }
              break;
            case "ShrFmla":
              {
                if (!cell_valid)
                  break;
                if (!options.cellFormula)
                  break;
                if (last_cell) {
                  if (!last_formula)
                    break;
                  sharedf[encode_cell(last_formula.cell)] = val[0];
                  cc = options.dense ? (out[last_formula.cell.r] || [])[last_formula.cell.c] : out[encode_cell(last_formula.cell)];
                  (cc || {}).f = "" + stringify_formula(val[0], range, lastcell, supbooks, opts);
                }
              }
              break;
            case "LabelSst":
              temp_val = make_cell(sst[val.isst].t, val.ixfe, "s");
              if (sst[val.isst].h)
                temp_val.h = sst[val.isst].h;
              temp_val.XF = XFs[temp_val.ixfe];
              if (BIFF2Fmt > 0)
                temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
              safe_format_xf(temp_val, options, wb.opts.Date1904);
              addcell({ c: val.c, r: val.r }, temp_val, options);
              break;
            case "Blank":
              if (options.sheetStubs) {
                temp_val = { ixfe: val.ixfe, XF: XFs[val.ixfe], t: "z" };
                if (BIFF2Fmt > 0)
                  temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                safe_format_xf(temp_val, options, wb.opts.Date1904);
                addcell({ c: val.c, r: val.r }, temp_val, options);
              }
              break;
            case "MulBlank":
              if (options.sheetStubs) {
                for (var _j = val.c; _j <= val.C; ++_j) {
                  var _ixfe = val.ixfe[_j - val.c];
                  temp_val = { ixfe: _ixfe, XF: XFs[_ixfe], t: "z" };
                  if (BIFF2Fmt > 0)
                    temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
                  safe_format_xf(temp_val, options, wb.opts.Date1904);
                  addcell({ c: _j, r: val.r }, temp_val, options);
                }
              }
              break;
            case "RString":
            case "Label":
            case "BIFF2STR":
              temp_val = make_cell(val.val, val.ixfe, "s");
              temp_val.XF = XFs[temp_val.ixfe];
              if (BIFF2Fmt > 0)
                temp_val.z = BIFF2FmtTable[temp_val.ixfe >> 8 & 31];
              safe_format_xf(temp_val, options, wb.opts.Date1904);
              addcell({ c: val.c, r: val.r }, temp_val, options);
              break;
            case "Dimensions":
              {
                if (file_depth === 1)
                  range = val;
              }
              break;
            case "SST":
              {
                sst = val;
              }
              break;
            case "Format":
              {
                if (opts.biff == 4) {
                  BIFF2FmtTable[BIFF2Fmt++] = val[1];
                  for (var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx)
                    if (SSF._table[b4idx] == val[1])
                      break;
                  if (b4idx >= 163)
                    SSF.load(val[1], BIFF2Fmt + 163);
                } else
                  SSF.load(val[1], val[0]);
              }
              break;
            case "BIFF2FORMAT":
              {
                BIFF2FmtTable[BIFF2Fmt++] = val;
                for (var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx)
                  if (SSF._table[b2idx] == val)
                    break;
                if (b2idx >= 163)
                  SSF.load(val, BIFF2Fmt + 163);
              }
              break;
            case "MergeCells":
              merges = merges.concat(val);
              break;
            case "Obj":
              objects[val.cmo[0]] = opts.lastobj = val;
              break;
            case "TxO":
              opts.lastobj.TxO = val;
              break;
            case "ImData":
              opts.lastobj.ImData = val;
              break;
            case "HLink":
              {
                for (rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)
                  for (rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {
                    cc = options.dense ? (out[rngR] || [])[rngC] : out[encode_cell({ c: rngC, r: rngR })];
                    if (cc)
                      cc.l = val[1];
                  }
              }
              break;
            case "HLinkTooltip":
              {
                for (rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)
                  for (rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {
                    cc = options.dense ? (out[rngR] || [])[rngC] : out[encode_cell({ c: rngC, r: rngR })];
                    if (cc && cc.l)
                      cc.l.Tooltip = val[1];
                  }
              }
              break;
            case "Note":
              {
                if (opts.biff <= 5 && opts.biff >= 2)
                  break;
                cc = options.dense ? (out[val[0].r] || [])[val[0].c] : out[encode_cell(val[0])];
                var noteobj = objects[val[2]];
                if (!cc) {
                  if (options.dense) {
                    if (!out[val[0].r])
                      out[val[0].r] = [];
                    cc = out[val[0].r][val[0].c] = { t: "z" };
                  } else {
                    cc = out[encode_cell(val[0])] = { t: "z" };
                  }
                  range.e.r = Math.max(range.e.r, val[0].r);
                  range.s.r = Math.min(range.s.r, val[0].r);
                  range.e.c = Math.max(range.e.c, val[0].c);
                  range.s.c = Math.min(range.s.c, val[0].c);
                }
                if (!cc.c)
                  cc.c = [];
                cmnt = { a: val[1], t: noteobj.TxO.t };
                cc.c.push(cmnt);
              }
              break;
            default:
              switch (R.n) {
                case "ClrtClient":
                  break;
                case "XFExt":
                  update_xfext(XFs[val.ixfe], val.ext);
                  break;
                case "DefColWidth":
                  break;
                case "DefaultRowHeight":
                  val[1];
                  break;
                case "ColInfo":
                  {
                    if (!opts.cellStyles)
                      break;
                    while (val.e >= val.s) {
                      colinfo[val.e--] = { width: val.w / 256 };
                      if (!seencol) {
                        seencol = true;
                        find_mdw_colw(val.w / 256);
                      }
                      process_col(colinfo[val.e + 1]);
                    }
                  }
                  break;
                case "Row":
                  {
                    var rowobj = {};
                    if (val.level != null) {
                      rowinfo[val.r] = rowobj;
                      rowobj.level = val.level;
                    }
                    if (val.hidden) {
                      rowinfo[val.r] = rowobj;
                      rowobj.hidden = true;
                    }
                    if (val.hpt) {
                      rowinfo[val.r] = rowobj;
                      rowobj.hpt = val.hpt;
                      rowobj.hpx = pt2px(val.hpt);
                    }
                  }
                  break;
                case "LeftMargin":
                case "RightMargin":
                case "TopMargin":
                case "BottomMargin":
                  if (!out["!margins"])
                    default_margins(out["!margins"] = {});
                  out["!margins"][Rn.slice(0, -6).toLowerCase()] = val;
                  break;
                case "Setup":
                  if (!out["!margins"])
                    default_margins(out["!margins"] = {});
                  out["!margins"].header = val.header;
                  out["!margins"].footer = val.footer;
                  break;
                case "Window2":
                  if (val.RTL)
                    Workbook.Views[0].RTL = true;
                  break;
                case "Header":
                  break;
                case "Footer":
                  break;
                case "HCenter":
                  break;
                case "VCenter":
                  break;
                case "Pls":
                  break;
                case "GCW":
                  break;
                case "LHRecord":
                  break;
                case "DBCell":
                  break;
                case "EntExU2":
                  break;
                case "SxView":
                  break;
                case "Sxvd":
                  break;
                case "SXVI":
                  break;
                case "SXVDEx":
                  break;
                case "SxIvd":
                  break;
                case "SXString":
                  break;
                case "Sync":
                  break;
                case "Addin":
                  break;
                case "SXDI":
                  break;
                case "SXLI":
                  break;
                case "SXEx":
                  break;
                case "QsiSXTag":
                  break;
                case "Selection":
                  break;
                case "Feat":
                  break;
                case "FeatHdr":
                case "FeatHdr11":
                  break;
                case "Feature11":
                case "Feature12":
                case "List12":
                  break;
                case "Country":
                  country = val;
                  break;
                case "RecalcId":
                  break;
                case "DxGCol":
                  break;
                case "Fbi":
                case "Fbi2":
                case "GelFrame":
                  break;
                case "Font":
                  break;
                case "XFCRC":
                  break;
                case "Style":
                  break;
                case "StyleExt":
                  break;
                case "Palette":
                  palette = val;
                  break;
                case "Theme":
                  themes = val;
                  break;
                case "ScenarioProtect":
                  break;
                case "ObjProtect":
                  break;
                case "CondFmt12":
                  break;
                case "Table":
                  break;
                case "TableStyles":
                  break;
                case "TableStyle":
                  break;
                case "TableStyleElement":
                  break;
                case "SXStreamID":
                  break;
                case "SXVS":
                  break;
                case "DConRef":
                  break;
                case "SXAddl":
                  break;
                case "DConBin":
                  break;
                case "DConName":
                  break;
                case "SXPI":
                  break;
                case "SxFormat":
                  break;
                case "SxSelect":
                  break;
                case "SxRule":
                  break;
                case "SxFilt":
                  break;
                case "SxItm":
                  break;
                case "SxDXF":
                  break;
                case "ScenMan":
                  break;
                case "DCon":
                  break;
                case "CellWatch":
                  break;
                case "PrintRowCol":
                  break;
                case "PrintGrid":
                  break;
                case "PrintSize":
                  break;
                case "XCT":
                  break;
                case "CRN":
                  break;
                case "Scl":
                  break;
                case "SheetExt":
                  break;
                case "SheetExtOptional":
                  break;
                case "ObNoMacros":
                  break;
                case "ObProj":
                  break;
                case "CodeName":
                  {
                    if (!cur_sheet)
                      Workbook.WBProps.CodeName = val || "ThisWorkbook";
                    else
                      wsprops.CodeName = val || wsprops.name;
                  }
                  break;
                case "GUIDTypeLib":
                  break;
                case "WOpt":
                  break;
                case "PhoneticInfo":
                  break;
                case "OleObjectSize":
                  break;
                case "DXF":
                case "DXFN":
                case "DXFN12":
                case "DXFN12List":
                case "DXFN12NoCB":
                  break;
                case "Dv":
                case "DVal":
                  break;
                case "BRAI":
                case "Series":
                case "SeriesText":
                  break;
                case "DConn":
                  break;
                case "DbOrParamQry":
                  break;
                case "DBQueryExt":
                  break;
                case "OleDbConn":
                  break;
                case "ExtString":
                  break;
                case "IFmtRecord":
                  break;
                case "CondFmt":
                case "CF":
                case "CF12":
                case "CFEx":
                  break;
                case "Excel9File":
                  break;
                case "Units":
                  break;
                case "InterfaceHdr":
                case "Mms":
                case "InterfaceEnd":
                case "DSF":
                  break;
                case "BuiltInFnGroupCount":
                  break;
                case "Window1":
                case "HideObj":
                case "GridSet":
                case "Guts":
                case "UserBView":
                case "UserSViewBegin":
                case "UserSViewEnd":
                  break;
                case "Pane":
                  break;
                default:
                  switch (R.n) {
                    case "Dat":
                    case "Begin":
                    case "End":
                    case "StartBlock":
                    case "EndBlock":
                    case "Frame":
                    case "Area":
                    case "Axis":
                    case "AxisLine":
                    case "Tick":
                      break;
                    case "AxesUsed":
                    case "CrtLayout12":
                    case "CrtLayout12A":
                    case "CrtLink":
                    case "CrtLine":
                    case "CrtMlFrt":
                    case "CrtMlFrtContinue":
                      break;
                    case "LineFormat":
                    case "AreaFormat":
                    case "Chart":
                    case "Chart3d":
                    case "Chart3DBarShape":
                    case "ChartFormat":
                    case "ChartFrtInfo":
                      break;
                    case "PlotArea":
                    case "PlotGrowth":
                      break;
                    case "SeriesList":
                    case "SerParent":
                    case "SerAuxTrend":
                      break;
                    case "DataFormat":
                    case "SerToCrt":
                    case "FontX":
                      break;
                    case "CatSerRange":
                    case "AxcExt":
                    case "SerFmt":
                      break;
                    case "ShtProps":
                      break;
                    case "DefaultText":
                    case "Text":
                    case "CatLab":
                      break;
                    case "DataLabExtContents":
                      break;
                    case "Legend":
                    case "LegendException":
                      break;
                    case "Pie":
                    case "Scatter":
                      break;
                    case "PieFormat":
                    case "MarkerFormat":
                      break;
                    case "StartObject":
                    case "EndObject":
                      break;
                    case "AlRuns":
                    case "ObjectLink":
                      break;
                    case "SIIndex":
                      break;
                    case "AttachedLabel":
                    case "YMult":
                      break;
                    case "Line":
                    case "Bar":
                      break;
                    case "Surf":
                      break;
                    case "AxisParent":
                      break;
                    case "Pos":
                      break;
                    case "ValueRange":
                      break;
                    case "SXViewEx9":
                      break;
                    case "SXViewLink":
                      break;
                    case "PivotChartBits":
                      break;
                    case "SBaseRef":
                      break;
                    case "TextPropsStream":
                      break;
                    case "LnExt":
                      break;
                    case "MkrExt":
                      break;
                    case "CrtCoopt":
                      break;
                    case "Qsi":
                    case "Qsif":
                    case "Qsir":
                    case "QsiSXTag":
                      break;
                    case "TxtQry":
                      break;
                    case "FilterMode":
                      break;
                    case "AutoFilter":
                    case "AutoFilterInfo":
                      break;
                    case "AutoFilter12":
                      break;
                    case "DropDownObjIds":
                      break;
                    case "Sort":
                      break;
                    case "SortData":
                      break;
                    case "ShapePropsStream":
                      break;
                    case "MsoDrawing":
                    case "MsoDrawingGroup":
                    case "MsoDrawingSelection":
                      break;
                    case "WebPub":
                    case "AutoWebPub":
                      break;
                    case "HeaderFooter":
                    case "HFPicture":
                    case "PLV":
                    case "HorizontalPageBreaks":
                    case "VerticalPageBreaks":
                      break;
                    case "Backup":
                    case "CompressPictures":
                    case "Compat12":
                      break;
                    case "Continue":
                    case "ContinueFrt12":
                      break;
                    case "FrtFontList":
                    case "FrtWrapper":
                      break;
                    default:
                      switch (R.n) {
                        case "TabIdConf":
                        case "Radar":
                        case "RadarArea":
                        case "DropBar":
                        case "Intl":
                        case "CoordList":
                        case "SerAuxErrBar":
                          break;
                        case "BIFF2FONTCLR":
                        case "BIFF2FMTCNT":
                        case "BIFF2FONTXTRA":
                          break;
                        case "BIFF2XF":
                        case "BIFF3XF":
                        case "BIFF4XF":
                          break;
                        case "BIFF4FMTCNT":
                        case "BIFF2ROW":
                        case "BIFF2WINDOW2":
                          break;
                        case "SCENARIO":
                        case "DConBin":
                        case "PicF":
                        case "DataLabExt":
                        case "Lel":
                        case "BopPop":
                        case "BopPopCustom":
                        case "RealTimeData":
                        case "Name":
                          break;
                        case "LHNGraph":
                        case "FnGroupName":
                        case "AddMenu":
                        case "LPr":
                          break;
                        case "ListObj":
                        case "ListField":
                          break;
                        case "RRSort":
                          break;
                        case "BigName":
                          break;
                        case "ToolbarHdr":
                        case "ToolbarEnd":
                          break;
                        case "DDEObjName":
                          break;
                        case "FRTArchId$":
                          break;
                        default:
                          if (options.WTF)
                            throw "Unrecognized Record " + R.n;
                      }
                  }
              }
          }
        } else
          blob.l += length;
      }
      wb.SheetNames = keys(Directory).sort(function(a, b) {
        return Number(a) - Number(b);
      }).map(function(x) {
        return Directory[x].name;
      });
      if (!options.bookSheets)
        wb.Sheets = Sheets;
      if (wb.Sheets)
        FilterDatabases.forEach(function(r, i3) {
          wb.Sheets[wb.SheetNames[i3]]["!autofilter"] = r;
        });
      wb.Preamble = Preamble;
      wb.Strings = sst;
      wb.SSF = SSF.get_table();
      if (opts.enc)
        wb.Encryption = opts.enc;
      if (themes)
        wb.Themes = themes;
      wb.Metadata = {};
      if (country !== void 0)
        wb.Metadata.Country = country;
      if (supbooks.names.length > 0)
        Workbook.Names = supbooks.names;
      wb.Workbook = Workbook;
      return wb;
    }
    var PSCLSID = {
      SI: "e0859ff2f94f6810ab9108002b27b3d9",
      DSI: "02d5cdd59c2e1b10939708002b2cf9ae",
      UDI: "05d5cdd59c2e1b10939708002b2cf9ae"
    };
    function parse_xls_props(cfb, props, o) {
      var DSI = CFB.find(cfb, "!DocumentSummaryInformation");
      if (DSI && DSI.size > 0)
        try {
          var DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI);
          for (var d in DocSummary)
            props[d] = DocSummary[d];
        } catch (e) {
          if (o.WTF)
            throw e;
        }
      var SI = CFB.find(cfb, "!SummaryInformation");
      if (SI && SI.size > 0)
        try {
          var Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI);
          for (var s in Summary)
            if (props[s] == null)
              props[s] = Summary[s];
        } catch (e) {
          if (o.WTF)
            throw e;
        }
      if (props.HeadingPairs && props.TitlesOfParts) {
        load_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o);
        delete props.HeadingPairs;
        delete props.TitlesOfParts;
      }
    }
    function write_xls_props(wb, cfb) {
      var DSEntries = [], SEntries = [], CEntries = [];
      var i3 = 0, Keys;
      if (wb.Props) {
        Keys = keys(wb.Props);
        for (i3 = 0; i3 < Keys.length; ++i3)
          (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i3]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i3]) ? SEntries : CEntries).push([Keys[i3], wb.Props[Keys[i3]]]);
      }
      if (wb.Custprops) {
        Keys = keys(wb.Custprops);
        for (i3 = 0; i3 < Keys.length; ++i3)
          if (!Object.prototype.hasOwnProperty.call(wb.Props || {}, Keys[i3]))
            (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i3]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i3]) ? SEntries : CEntries).push([Keys[i3], wb.Custprops[Keys[i3]]]);
      }
      var CEntries2 = [];
      for (i3 = 0; i3 < CEntries.length; ++i3) {
        if (XLSPSSkip.indexOf(CEntries[i3][0]) > -1)
          continue;
        if (CEntries[i3][1] == null)
          continue;
        CEntries2.push(CEntries[i3]);
      }
      if (SEntries.length)
        CFB.utils.cfb_add(cfb, "/SummaryInformation", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI));
      if (DSEntries.length || CEntries2.length)
        CFB.utils.cfb_add(cfb, "/DocumentSummaryInformation", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI));
    }
    function parse_xlscfb(cfb, options) {
      if (!options)
        options = {};
      fix_read_opts(options);
      reset_cp();
      if (options.codepage)
        set_ansi(options.codepage);
      var CompObj, WB;
      if (cfb.FullPaths) {
        if (CFB.find(cfb, "/encryption"))
          throw new Error("File is password-protected");
        CompObj = CFB.find(cfb, "!CompObj");
        WB = CFB.find(cfb, "/Workbook") || CFB.find(cfb, "/Book");
      } else {
        switch (options.type) {
          case "base64":
            cfb = s2a(Base64.decode(cfb));
            break;
          case "binary":
            cfb = s2a(cfb);
            break;
          case "buffer":
            break;
          case "array":
            if (!Array.isArray(cfb))
              cfb = Array.prototype.slice.call(cfb);
            break;
        }
        prep_blob(cfb, 0);
        WB = { content: cfb };
      }
      var WorkbookP;
      var _data;
      if (CompObj)
        parse_compobj(CompObj);
      if (options.bookProps && !options.bookSheets)
        WorkbookP = {};
      else {
        var T = has_buf ? "buffer" : "array";
        if (WB && WB.content)
          WorkbookP = parse_workbook(WB.content, options);
        else if ((_data = CFB.find(cfb, "PerfectOffice_MAIN")) && _data.content)
          WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
        else if ((_data = CFB.find(cfb, "NativeContent_MAIN")) && _data.content)
          WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));
        else
          throw new Error("Cannot find Workbook stream");
        if (options.bookVBA && cfb.FullPaths && CFB.find(cfb, "/_VBA_PROJECT_CUR/VBA/dir"))
          WorkbookP.vbaraw = make_vba_xls(cfb);
      }
      var props = {};
      if (cfb.FullPaths)
        parse_xls_props(cfb, props, options);
      WorkbookP.Props = WorkbookP.Custprops = props;
      if (options.bookFiles)
        WorkbookP.cfb = cfb;
      return WorkbookP;
    }
    function write_xlscfb(wb, opts) {
      var o = opts || {};
      var cfb = CFB.utils.cfb_new({ root: "R" });
      var wbpath = "/Workbook";
      switch (o.bookType || "xls") {
        case "xls":
          o.bookType = "biff8";
        case "xla":
          if (!o.bookType)
            o.bookType = "xla";
        case "biff8":
          wbpath = "/Workbook";
          o.biff = 8;
          break;
        case "biff5":
          wbpath = "/Book";
          o.biff = 5;
          break;
        default:
          throw new Error("invalid type " + o.bookType + " for XLS CFB");
      }
      CFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o));
      if (o.biff == 8 && (wb.Props || wb.Custprops))
        write_xls_props(wb, cfb);
      if (o.biff == 8 && wb.vbaraw)
        fill_vba_xls(cfb, CFB.read(wb.vbaraw, { type: typeof wb.vbaraw == "string" ? "binary" : "buffer" }));
      return cfb;
    }
    var XLSBRecordEnum = {
      0: { n: "BrtRowHdr", f: parse_BrtRowHdr },
      1: { n: "BrtCellBlank", f: parse_BrtCellBlank },
      2: { n: "BrtCellRk", f: parse_BrtCellRk },
      3: { n: "BrtCellError", f: parse_BrtCellError },
      4: { n: "BrtCellBool", f: parse_BrtCellBool },
      5: { n: "BrtCellReal", f: parse_BrtCellReal },
      6: { n: "BrtCellSt", f: parse_BrtCellSt },
      7: { n: "BrtCellIsst", f: parse_BrtCellIsst },
      8: { n: "BrtFmlaString", f: parse_BrtFmlaString },
      9: { n: "BrtFmlaNum", f: parse_BrtFmlaNum },
      10: { n: "BrtFmlaBool", f: parse_BrtFmlaBool },
      11: { n: "BrtFmlaError", f: parse_BrtFmlaError },
      16: { n: "BrtFRTArchID$", f: parse_BrtFRTArchID$ },
      19: { n: "BrtSSTItem", f: parse_RichStr },
      20: { n: "BrtPCDIMissing" },
      21: { n: "BrtPCDINumber" },
      22: { n: "BrtPCDIBoolean" },
      23: { n: "BrtPCDIError" },
      24: { n: "BrtPCDIString" },
      25: { n: "BrtPCDIDatetime" },
      26: { n: "BrtPCDIIndex" },
      27: { n: "BrtPCDIAMissing" },
      28: { n: "BrtPCDIANumber" },
      29: { n: "BrtPCDIABoolean" },
      30: { n: "BrtPCDIAError" },
      31: { n: "BrtPCDIAString" },
      32: { n: "BrtPCDIADatetime" },
      33: { n: "BrtPCRRecord" },
      34: { n: "BrtPCRRecordDt" },
      35: { n: "BrtFRTBegin" },
      36: { n: "BrtFRTEnd" },
      37: { n: "BrtACBegin" },
      38: { n: "BrtACEnd" },
      39: { n: "BrtName", f: parse_BrtName },
      40: { n: "BrtIndexRowBlock" },
      42: { n: "BrtIndexBlock" },
      43: { n: "BrtFont", f: parse_BrtFont },
      44: { n: "BrtFmt", f: parse_BrtFmt },
      45: { n: "BrtFill", f: parse_BrtFill },
      46: { n: "BrtBorder", f: parse_BrtBorder },
      47: { n: "BrtXF", f: parse_BrtXF },
      48: { n: "BrtStyle" },
      49: { n: "BrtCellMeta" },
      50: { n: "BrtValueMeta" },
      51: { n: "BrtMdb" },
      52: { n: "BrtBeginFmd" },
      53: { n: "BrtEndFmd" },
      54: { n: "BrtBeginMdx" },
      55: { n: "BrtEndMdx" },
      56: { n: "BrtBeginMdxTuple" },
      57: { n: "BrtEndMdxTuple" },
      58: { n: "BrtMdxMbrIstr" },
      59: { n: "BrtStr" },
      60: { n: "BrtColInfo", f: parse_ColInfo },
      62: { n: "BrtCellRString" },
      63: { n: "BrtCalcChainItem$", f: parse_BrtCalcChainItem$ },
      64: { n: "BrtDVal", f: parse_BrtDVal },
      65: { n: "BrtSxvcellNum" },
      66: { n: "BrtSxvcellStr" },
      67: { n: "BrtSxvcellBool" },
      68: { n: "BrtSxvcellErr" },
      69: { n: "BrtSxvcellDate" },
      70: { n: "BrtSxvcellNil" },
      128: { n: "BrtFileVersion" },
      129: { n: "BrtBeginSheet" },
      130: { n: "BrtEndSheet" },
      131: { n: "BrtBeginBook", f: parsenoop, p: 0 },
      132: { n: "BrtEndBook" },
      133: { n: "BrtBeginWsViews" },
      134: { n: "BrtEndWsViews" },
      135: { n: "BrtBeginBookViews" },
      136: { n: "BrtEndBookViews" },
      137: { n: "BrtBeginWsView", f: parse_BrtBeginWsView },
      138: { n: "BrtEndWsView" },
      139: { n: "BrtBeginCsViews" },
      140: { n: "BrtEndCsViews" },
      141: { n: "BrtBeginCsView" },
      142: { n: "BrtEndCsView" },
      143: { n: "BrtBeginBundleShs" },
      144: { n: "BrtEndBundleShs" },
      145: { n: "BrtBeginSheetData" },
      146: { n: "BrtEndSheetData" },
      147: { n: "BrtWsProp", f: parse_BrtWsProp },
      148: { n: "BrtWsDim", f: parse_BrtWsDim, p: 16 },
      151: { n: "BrtPane", f: parse_BrtPane },
      152: { n: "BrtSel" },
      153: { n: "BrtWbProp", f: parse_BrtWbProp },
      154: { n: "BrtWbFactoid" },
      155: { n: "BrtFileRecover" },
      156: { n: "BrtBundleSh", f: parse_BrtBundleSh },
      157: { n: "BrtCalcProp" },
      158: { n: "BrtBookView" },
      159: { n: "BrtBeginSst", f: parse_BrtBeginSst },
      160: { n: "BrtEndSst" },
      161: { n: "BrtBeginAFilter", f: parse_UncheckedRfX },
      162: { n: "BrtEndAFilter" },
      163: { n: "BrtBeginFilterColumn" },
      164: { n: "BrtEndFilterColumn" },
      165: { n: "BrtBeginFilters" },
      166: { n: "BrtEndFilters" },
      167: { n: "BrtFilter" },
      168: { n: "BrtColorFilter" },
      169: { n: "BrtIconFilter" },
      170: { n: "BrtTop10Filter" },
      171: { n: "BrtDynamicFilter" },
      172: { n: "BrtBeginCustomFilters" },
      173: { n: "BrtEndCustomFilters" },
      174: { n: "BrtCustomFilter" },
      175: { n: "BrtAFilterDateGroupItem" },
      176: { n: "BrtMergeCell", f: parse_BrtMergeCell },
      177: { n: "BrtBeginMergeCells" },
      178: { n: "BrtEndMergeCells" },
      179: { n: "BrtBeginPivotCacheDef" },
      180: { n: "BrtEndPivotCacheDef" },
      181: { n: "BrtBeginPCDFields" },
      182: { n: "BrtEndPCDFields" },
      183: { n: "BrtBeginPCDField" },
      184: { n: "BrtEndPCDField" },
      185: { n: "BrtBeginPCDSource" },
      186: { n: "BrtEndPCDSource" },
      187: { n: "BrtBeginPCDSRange" },
      188: { n: "BrtEndPCDSRange" },
      189: { n: "BrtBeginPCDFAtbl" },
      190: { n: "BrtEndPCDFAtbl" },
      191: { n: "BrtBeginPCDIRun" },
      192: { n: "BrtEndPCDIRun" },
      193: { n: "BrtBeginPivotCacheRecords" },
      194: { n: "BrtEndPivotCacheRecords" },
      195: { n: "BrtBeginPCDHierarchies" },
      196: { n: "BrtEndPCDHierarchies" },
      197: { n: "BrtBeginPCDHierarchy" },
      198: { n: "BrtEndPCDHierarchy" },
      199: { n: "BrtBeginPCDHFieldsUsage" },
      200: { n: "BrtEndPCDHFieldsUsage" },
      201: { n: "BrtBeginExtConnection" },
      202: { n: "BrtEndExtConnection" },
      203: { n: "BrtBeginECDbProps" },
      204: { n: "BrtEndECDbProps" },
      205: { n: "BrtBeginECOlapProps" },
      206: { n: "BrtEndECOlapProps" },
      207: { n: "BrtBeginPCDSConsol" },
      208: { n: "BrtEndPCDSConsol" },
      209: { n: "BrtBeginPCDSCPages" },
      210: { n: "BrtEndPCDSCPages" },
      211: { n: "BrtBeginPCDSCPage" },
      212: { n: "BrtEndPCDSCPage" },
      213: { n: "BrtBeginPCDSCPItem" },
      214: { n: "BrtEndPCDSCPItem" },
      215: { n: "BrtBeginPCDSCSets" },
      216: { n: "BrtEndPCDSCSets" },
      217: { n: "BrtBeginPCDSCSet" },
      218: { n: "BrtEndPCDSCSet" },
      219: { n: "BrtBeginPCDFGroup" },
      220: { n: "BrtEndPCDFGroup" },
      221: { n: "BrtBeginPCDFGItems" },
      222: { n: "BrtEndPCDFGItems" },
      223: { n: "BrtBeginPCDFGRange" },
      224: { n: "BrtEndPCDFGRange" },
      225: { n: "BrtBeginPCDFGDiscrete" },
      226: { n: "BrtEndPCDFGDiscrete" },
      227: { n: "BrtBeginPCDSDTupleCache" },
      228: { n: "BrtEndPCDSDTupleCache" },
      229: { n: "BrtBeginPCDSDTCEntries" },
      230: { n: "BrtEndPCDSDTCEntries" },
      231: { n: "BrtBeginPCDSDTCEMembers" },
      232: { n: "BrtEndPCDSDTCEMembers" },
      233: { n: "BrtBeginPCDSDTCEMember" },
      234: { n: "BrtEndPCDSDTCEMember" },
      235: { n: "BrtBeginPCDSDTCQueries" },
      236: { n: "BrtEndPCDSDTCQueries" },
      237: { n: "BrtBeginPCDSDTCQuery" },
      238: { n: "BrtEndPCDSDTCQuery" },
      239: { n: "BrtBeginPCDSDTCSets" },
      240: { n: "BrtEndPCDSDTCSets" },
      241: { n: "BrtBeginPCDSDTCSet" },
      242: { n: "BrtEndPCDSDTCSet" },
      243: { n: "BrtBeginPCDCalcItems" },
      244: { n: "BrtEndPCDCalcItems" },
      245: { n: "BrtBeginPCDCalcItem" },
      246: { n: "BrtEndPCDCalcItem" },
      247: { n: "BrtBeginPRule" },
      248: { n: "BrtEndPRule" },
      249: { n: "BrtBeginPRFilters" },
      250: { n: "BrtEndPRFilters" },
      251: { n: "BrtBeginPRFilter" },
      252: { n: "BrtEndPRFilter" },
      253: { n: "BrtBeginPNames" },
      254: { n: "BrtEndPNames" },
      255: { n: "BrtBeginPName" },
      256: { n: "BrtEndPName" },
      257: { n: "BrtBeginPNPairs" },
      258: { n: "BrtEndPNPairs" },
      259: { n: "BrtBeginPNPair" },
      260: { n: "BrtEndPNPair" },
      261: { n: "BrtBeginECWebProps" },
      262: { n: "BrtEndECWebProps" },
      263: { n: "BrtBeginEcWpTables" },
      264: { n: "BrtEndECWPTables" },
      265: { n: "BrtBeginECParams" },
      266: { n: "BrtEndECParams" },
      267: { n: "BrtBeginECParam" },
      268: { n: "BrtEndECParam" },
      269: { n: "BrtBeginPCDKPIs" },
      270: { n: "BrtEndPCDKPIs" },
      271: { n: "BrtBeginPCDKPI" },
      272: { n: "BrtEndPCDKPI" },
      273: { n: "BrtBeginDims" },
      274: { n: "BrtEndDims" },
      275: { n: "BrtBeginDim" },
      276: { n: "BrtEndDim" },
      277: { n: "BrtIndexPartEnd" },
      278: { n: "BrtBeginStyleSheet" },
      279: { n: "BrtEndStyleSheet" },
      280: { n: "BrtBeginSXView" },
      281: { n: "BrtEndSXVI" },
      282: { n: "BrtBeginSXVI" },
      283: { n: "BrtBeginSXVIs" },
      284: { n: "BrtEndSXVIs" },
      285: { n: "BrtBeginSXVD" },
      286: { n: "BrtEndSXVD" },
      287: { n: "BrtBeginSXVDs" },
      288: { n: "BrtEndSXVDs" },
      289: { n: "BrtBeginSXPI" },
      290: { n: "BrtEndSXPI" },
      291: { n: "BrtBeginSXPIs" },
      292: { n: "BrtEndSXPIs" },
      293: { n: "BrtBeginSXDI" },
      294: { n: "BrtEndSXDI" },
      295: { n: "BrtBeginSXDIs" },
      296: { n: "BrtEndSXDIs" },
      297: { n: "BrtBeginSXLI" },
      298: { n: "BrtEndSXLI" },
      299: { n: "BrtBeginSXLIRws" },
      300: { n: "BrtEndSXLIRws" },
      301: { n: "BrtBeginSXLICols" },
      302: { n: "BrtEndSXLICols" },
      303: { n: "BrtBeginSXFormat" },
      304: { n: "BrtEndSXFormat" },
      305: { n: "BrtBeginSXFormats" },
      306: { n: "BrtEndSxFormats" },
      307: { n: "BrtBeginSxSelect" },
      308: { n: "BrtEndSxSelect" },
      309: { n: "BrtBeginISXVDRws" },
      310: { n: "BrtEndISXVDRws" },
      311: { n: "BrtBeginISXVDCols" },
      312: { n: "BrtEndISXVDCols" },
      313: { n: "BrtEndSXLocation" },
      314: { n: "BrtBeginSXLocation" },
      315: { n: "BrtEndSXView" },
      316: { n: "BrtBeginSXTHs" },
      317: { n: "BrtEndSXTHs" },
      318: { n: "BrtBeginSXTH" },
      319: { n: "BrtEndSXTH" },
      320: { n: "BrtBeginISXTHRws" },
      321: { n: "BrtEndISXTHRws" },
      322: { n: "BrtBeginISXTHCols" },
      323: { n: "BrtEndISXTHCols" },
      324: { n: "BrtBeginSXTDMPS" },
      325: { n: "BrtEndSXTDMPs" },
      326: { n: "BrtBeginSXTDMP" },
      327: { n: "BrtEndSXTDMP" },
      328: { n: "BrtBeginSXTHItems" },
      329: { n: "BrtEndSXTHItems" },
      330: { n: "BrtBeginSXTHItem" },
      331: { n: "BrtEndSXTHItem" },
      332: { n: "BrtBeginMetadata" },
      333: { n: "BrtEndMetadata" },
      334: { n: "BrtBeginEsmdtinfo" },
      335: { n: "BrtMdtinfo" },
      336: { n: "BrtEndEsmdtinfo" },
      337: { n: "BrtBeginEsmdb" },
      338: { n: "BrtEndEsmdb" },
      339: { n: "BrtBeginEsfmd" },
      340: { n: "BrtEndEsfmd" },
      341: { n: "BrtBeginSingleCells" },
      342: { n: "BrtEndSingleCells" },
      343: { n: "BrtBeginList" },
      344: { n: "BrtEndList" },
      345: { n: "BrtBeginListCols" },
      346: { n: "BrtEndListCols" },
      347: { n: "BrtBeginListCol" },
      348: { n: "BrtEndListCol" },
      349: { n: "BrtBeginListXmlCPr" },
      350: { n: "BrtEndListXmlCPr" },
      351: { n: "BrtListCCFmla" },
      352: { n: "BrtListTrFmla" },
      353: { n: "BrtBeginExternals" },
      354: { n: "BrtEndExternals" },
      355: { n: "BrtSupBookSrc", f: parse_RelID },
      357: { n: "BrtSupSelf" },
      358: { n: "BrtSupSame" },
      359: { n: "BrtSupTabs" },
      360: { n: "BrtBeginSupBook" },
      361: { n: "BrtPlaceholderName" },
      362: { n: "BrtExternSheet", f: parse_ExternSheet },
      363: { n: "BrtExternTableStart" },
      364: { n: "BrtExternTableEnd" },
      366: { n: "BrtExternRowHdr" },
      367: { n: "BrtExternCellBlank" },
      368: { n: "BrtExternCellReal" },
      369: { n: "BrtExternCellBool" },
      370: { n: "BrtExternCellError" },
      371: { n: "BrtExternCellString" },
      372: { n: "BrtBeginEsmdx" },
      373: { n: "BrtEndEsmdx" },
      374: { n: "BrtBeginMdxSet" },
      375: { n: "BrtEndMdxSet" },
      376: { n: "BrtBeginMdxMbrProp" },
      377: { n: "BrtEndMdxMbrProp" },
      378: { n: "BrtBeginMdxKPI" },
      379: { n: "BrtEndMdxKPI" },
      380: { n: "BrtBeginEsstr" },
      381: { n: "BrtEndEsstr" },
      382: { n: "BrtBeginPRFItem" },
      383: { n: "BrtEndPRFItem" },
      384: { n: "BrtBeginPivotCacheIDs" },
      385: { n: "BrtEndPivotCacheIDs" },
      386: { n: "BrtBeginPivotCacheID" },
      387: { n: "BrtEndPivotCacheID" },
      388: { n: "BrtBeginISXVIs" },
      389: { n: "BrtEndISXVIs" },
      390: { n: "BrtBeginColInfos" },
      391: { n: "BrtEndColInfos" },
      392: { n: "BrtBeginRwBrk" },
      393: { n: "BrtEndRwBrk" },
      394: { n: "BrtBeginColBrk" },
      395: { n: "BrtEndColBrk" },
      396: { n: "BrtBrk" },
      397: { n: "BrtUserBookView" },
      398: { n: "BrtInfo" },
      399: { n: "BrtCUsr" },
      400: { n: "BrtUsr" },
      401: { n: "BrtBeginUsers" },
      403: { n: "BrtEOF" },
      404: { n: "BrtUCR" },
      405: { n: "BrtRRInsDel" },
      406: { n: "BrtRREndInsDel" },
      407: { n: "BrtRRMove" },
      408: { n: "BrtRREndMove" },
      409: { n: "BrtRRChgCell" },
      410: { n: "BrtRREndChgCell" },
      411: { n: "BrtRRHeader" },
      412: { n: "BrtRRUserView" },
      413: { n: "BrtRRRenSheet" },
      414: { n: "BrtRRInsertSh" },
      415: { n: "BrtRRDefName" },
      416: { n: "BrtRRNote" },
      417: { n: "BrtRRConflict" },
      418: { n: "BrtRRTQSIF" },
      419: { n: "BrtRRFormat" },
      420: { n: "BrtRREndFormat" },
      421: { n: "BrtRRAutoFmt" },
      422: { n: "BrtBeginUserShViews" },
      423: { n: "BrtBeginUserShView" },
      424: { n: "BrtEndUserShView" },
      425: { n: "BrtEndUserShViews" },
      426: { n: "BrtArrFmla", f: parse_BrtArrFmla },
      427: { n: "BrtShrFmla", f: parse_BrtShrFmla },
      428: { n: "BrtTable" },
      429: { n: "BrtBeginExtConnections" },
      430: { n: "BrtEndExtConnections" },
      431: { n: "BrtBeginPCDCalcMems" },
      432: { n: "BrtEndPCDCalcMems" },
      433: { n: "BrtBeginPCDCalcMem" },
      434: { n: "BrtEndPCDCalcMem" },
      435: { n: "BrtBeginPCDHGLevels" },
      436: { n: "BrtEndPCDHGLevels" },
      437: { n: "BrtBeginPCDHGLevel" },
      438: { n: "BrtEndPCDHGLevel" },
      439: { n: "BrtBeginPCDHGLGroups" },
      440: { n: "BrtEndPCDHGLGroups" },
      441: { n: "BrtBeginPCDHGLGroup" },
      442: { n: "BrtEndPCDHGLGroup" },
      443: { n: "BrtBeginPCDHGLGMembers" },
      444: { n: "BrtEndPCDHGLGMembers" },
      445: { n: "BrtBeginPCDHGLGMember" },
      446: { n: "BrtEndPCDHGLGMember" },
      447: { n: "BrtBeginQSI" },
      448: { n: "BrtEndQSI" },
      449: { n: "BrtBeginQSIR" },
      450: { n: "BrtEndQSIR" },
      451: { n: "BrtBeginDeletedNames" },
      452: { n: "BrtEndDeletedNames" },
      453: { n: "BrtBeginDeletedName" },
      454: { n: "BrtEndDeletedName" },
      455: { n: "BrtBeginQSIFs" },
      456: { n: "BrtEndQSIFs" },
      457: { n: "BrtBeginQSIF" },
      458: { n: "BrtEndQSIF" },
      459: { n: "BrtBeginAutoSortScope" },
      460: { n: "BrtEndAutoSortScope" },
      461: { n: "BrtBeginConditionalFormatting" },
      462: { n: "BrtEndConditionalFormatting" },
      463: { n: "BrtBeginCFRule" },
      464: { n: "BrtEndCFRule" },
      465: { n: "BrtBeginIconSet" },
      466: { n: "BrtEndIconSet" },
      467: { n: "BrtBeginDatabar" },
      468: { n: "BrtEndDatabar" },
      469: { n: "BrtBeginColorScale" },
      470: { n: "BrtEndColorScale" },
      471: { n: "BrtCFVO" },
      472: { n: "BrtExternValueMeta" },
      473: { n: "BrtBeginColorPalette" },
      474: { n: "BrtEndColorPalette" },
      475: { n: "BrtIndexedColor" },
      476: { n: "BrtMargins", f: parse_BrtMargins },
      477: { n: "BrtPrintOptions" },
      478: { n: "BrtPageSetup" },
      479: { n: "BrtBeginHeaderFooter" },
      480: { n: "BrtEndHeaderFooter" },
      481: { n: "BrtBeginSXCrtFormat" },
      482: { n: "BrtEndSXCrtFormat" },
      483: { n: "BrtBeginSXCrtFormats" },
      484: { n: "BrtEndSXCrtFormats" },
      485: { n: "BrtWsFmtInfo", f: parse_BrtWsFmtInfo },
      486: { n: "BrtBeginMgs" },
      487: { n: "BrtEndMGs" },
      488: { n: "BrtBeginMGMaps" },
      489: { n: "BrtEndMGMaps" },
      490: { n: "BrtBeginMG" },
      491: { n: "BrtEndMG" },
      492: { n: "BrtBeginMap" },
      493: { n: "BrtEndMap" },
      494: { n: "BrtHLink", f: parse_BrtHLink },
      495: { n: "BrtBeginDCon" },
      496: { n: "BrtEndDCon" },
      497: { n: "BrtBeginDRefs" },
      498: { n: "BrtEndDRefs" },
      499: { n: "BrtDRef" },
      500: { n: "BrtBeginScenMan" },
      501: { n: "BrtEndScenMan" },
      502: { n: "BrtBeginSct" },
      503: { n: "BrtEndSct" },
      504: { n: "BrtSlc" },
      505: { n: "BrtBeginDXFs" },
      506: { n: "BrtEndDXFs" },
      507: { n: "BrtDXF" },
      508: { n: "BrtBeginTableStyles" },
      509: { n: "BrtEndTableStyles" },
      510: { n: "BrtBeginTableStyle" },
      511: { n: "BrtEndTableStyle" },
      512: { n: "BrtTableStyleElement" },
      513: { n: "BrtTableStyleClient" },
      514: { n: "BrtBeginVolDeps" },
      515: { n: "BrtEndVolDeps" },
      516: { n: "BrtBeginVolType" },
      517: { n: "BrtEndVolType" },
      518: { n: "BrtBeginVolMain" },
      519: { n: "BrtEndVolMain" },
      520: { n: "BrtBeginVolTopic" },
      521: { n: "BrtEndVolTopic" },
      522: { n: "BrtVolSubtopic" },
      523: { n: "BrtVolRef" },
      524: { n: "BrtVolNum" },
      525: { n: "BrtVolErr" },
      526: { n: "BrtVolStr" },
      527: { n: "BrtVolBool" },
      528: { n: "BrtBeginCalcChain$" },
      529: { n: "BrtEndCalcChain$" },
      530: { n: "BrtBeginSortState" },
      531: { n: "BrtEndSortState" },
      532: { n: "BrtBeginSortCond" },
      533: { n: "BrtEndSortCond" },
      534: { n: "BrtBookProtection" },
      535: { n: "BrtSheetProtection" },
      536: { n: "BrtRangeProtection" },
      537: { n: "BrtPhoneticInfo" },
      538: { n: "BrtBeginECTxtWiz" },
      539: { n: "BrtEndECTxtWiz" },
      540: { n: "BrtBeginECTWFldInfoLst" },
      541: { n: "BrtEndECTWFldInfoLst" },
      542: { n: "BrtBeginECTwFldInfo" },
      548: { n: "BrtFileSharing" },
      549: { n: "BrtOleSize" },
      550: { n: "BrtDrawing", f: parse_RelID },
      551: { n: "BrtLegacyDrawing" },
      552: { n: "BrtLegacyDrawingHF" },
      553: { n: "BrtWebOpt" },
      554: { n: "BrtBeginWebPubItems" },
      555: { n: "BrtEndWebPubItems" },
      556: { n: "BrtBeginWebPubItem" },
      557: { n: "BrtEndWebPubItem" },
      558: { n: "BrtBeginSXCondFmt" },
      559: { n: "BrtEndSXCondFmt" },
      560: { n: "BrtBeginSXCondFmts" },
      561: { n: "BrtEndSXCondFmts" },
      562: { n: "BrtBkHim" },
      564: { n: "BrtColor" },
      565: { n: "BrtBeginIndexedColors" },
      566: { n: "BrtEndIndexedColors" },
      569: { n: "BrtBeginMRUColors" },
      570: { n: "BrtEndMRUColors" },
      572: { n: "BrtMRUColor" },
      573: { n: "BrtBeginDVals" },
      574: { n: "BrtEndDVals" },
      577: { n: "BrtSupNameStart" },
      578: { n: "BrtSupNameValueStart" },
      579: { n: "BrtSupNameValueEnd" },
      580: { n: "BrtSupNameNum" },
      581: { n: "BrtSupNameErr" },
      582: { n: "BrtSupNameSt" },
      583: { n: "BrtSupNameNil" },
      584: { n: "BrtSupNameBool" },
      585: { n: "BrtSupNameFmla" },
      586: { n: "BrtSupNameBits" },
      587: { n: "BrtSupNameEnd" },
      588: { n: "BrtEndSupBook" },
      589: { n: "BrtCellSmartTagProperty" },
      590: { n: "BrtBeginCellSmartTag" },
      591: { n: "BrtEndCellSmartTag" },
      592: { n: "BrtBeginCellSmartTags" },
      593: { n: "BrtEndCellSmartTags" },
      594: { n: "BrtBeginSmartTags" },
      595: { n: "BrtEndSmartTags" },
      596: { n: "BrtSmartTagType" },
      597: { n: "BrtBeginSmartTagTypes" },
      598: { n: "BrtEndSmartTagTypes" },
      599: { n: "BrtBeginSXFilters" },
      600: { n: "BrtEndSXFilters" },
      601: { n: "BrtBeginSXFILTER" },
      602: { n: "BrtEndSXFilter" },
      603: { n: "BrtBeginFills" },
      604: { n: "BrtEndFills" },
      605: { n: "BrtBeginCellWatches" },
      606: { n: "BrtEndCellWatches" },
      607: { n: "BrtCellWatch" },
      608: { n: "BrtBeginCRErrs" },
      609: { n: "BrtEndCRErrs" },
      610: { n: "BrtCrashRecErr" },
      611: { n: "BrtBeginFonts" },
      612: { n: "BrtEndFonts" },
      613: { n: "BrtBeginBorders" },
      614: { n: "BrtEndBorders" },
      615: { n: "BrtBeginFmts" },
      616: { n: "BrtEndFmts" },
      617: { n: "BrtBeginCellXFs" },
      618: { n: "BrtEndCellXFs" },
      619: { n: "BrtBeginStyles" },
      620: { n: "BrtEndStyles" },
      625: { n: "BrtBigName" },
      626: { n: "BrtBeginCellStyleXFs" },
      627: { n: "BrtEndCellStyleXFs" },
      628: { n: "BrtBeginComments" },
      629: { n: "BrtEndComments" },
      630: { n: "BrtBeginCommentAuthors" },
      631: { n: "BrtEndCommentAuthors" },
      632: { n: "BrtCommentAuthor", f: parse_BrtCommentAuthor },
      633: { n: "BrtBeginCommentList" },
      634: { n: "BrtEndCommentList" },
      635: { n: "BrtBeginComment", f: parse_BrtBeginComment },
      636: { n: "BrtEndComment" },
      637: { n: "BrtCommentText", f: parse_BrtCommentText },
      638: { n: "BrtBeginOleObjects" },
      639: { n: "BrtOleObject" },
      640: { n: "BrtEndOleObjects" },
      641: { n: "BrtBeginSxrules" },
      642: { n: "BrtEndSxRules" },
      643: { n: "BrtBeginActiveXControls" },
      644: { n: "BrtActiveX" },
      645: { n: "BrtEndActiveXControls" },
      646: { n: "BrtBeginPCDSDTCEMembersSortBy" },
      648: { n: "BrtBeginCellIgnoreECs" },
      649: { n: "BrtCellIgnoreEC" },
      650: { n: "BrtEndCellIgnoreECs" },
      651: { n: "BrtCsProp", f: parse_BrtCsProp },
      652: { n: "BrtCsPageSetup" },
      653: { n: "BrtBeginUserCsViews" },
      654: { n: "BrtEndUserCsViews" },
      655: { n: "BrtBeginUserCsView" },
      656: { n: "BrtEndUserCsView" },
      657: { n: "BrtBeginPcdSFCIEntries" },
      658: { n: "BrtEndPCDSFCIEntries" },
      659: { n: "BrtPCDSFCIEntry" },
      660: { n: "BrtBeginListParts" },
      661: { n: "BrtListPart" },
      662: { n: "BrtEndListParts" },
      663: { n: "BrtSheetCalcProp" },
      664: { n: "BrtBeginFnGroup" },
      665: { n: "BrtFnGroup" },
      666: { n: "BrtEndFnGroup" },
      667: { n: "BrtSupAddin" },
      668: { n: "BrtSXTDMPOrder" },
      669: { n: "BrtCsProtection" },
      671: { n: "BrtBeginWsSortMap" },
      672: { n: "BrtEndWsSortMap" },
      673: { n: "BrtBeginRRSort" },
      674: { n: "BrtEndRRSort" },
      675: { n: "BrtRRSortItem" },
      676: { n: "BrtFileSharingIso" },
      677: { n: "BrtBookProtectionIso" },
      678: { n: "BrtSheetProtectionIso" },
      679: { n: "BrtCsProtectionIso" },
      680: { n: "BrtRangeProtectionIso" },
      681: { n: "BrtDValList" },
      1024: { n: "BrtRwDescent" },
      1025: { n: "BrtKnownFonts" },
      1026: { n: "BrtBeginSXTupleSet" },
      1027: { n: "BrtEndSXTupleSet" },
      1028: { n: "BrtBeginSXTupleSetHeader" },
      1029: { n: "BrtEndSXTupleSetHeader" },
      1030: { n: "BrtSXTupleSetHeaderItem" },
      1031: { n: "BrtBeginSXTupleSetData" },
      1032: { n: "BrtEndSXTupleSetData" },
      1033: { n: "BrtBeginSXTupleSetRow" },
      1034: { n: "BrtEndSXTupleSetRow" },
      1035: { n: "BrtSXTupleSetRowItem" },
      1036: { n: "BrtNameExt" },
      1037: { n: "BrtPCDH14" },
      1038: { n: "BrtBeginPCDCalcMem14" },
      1039: { n: "BrtEndPCDCalcMem14" },
      1040: { n: "BrtSXTH14" },
      1041: { n: "BrtBeginSparklineGroup" },
      1042: { n: "BrtEndSparklineGroup" },
      1043: { n: "BrtSparkline" },
      1044: { n: "BrtSXDI14" },
      1045: { n: "BrtWsFmtInfoEx14" },
      1046: { n: "BrtBeginConditionalFormatting14" },
      1047: { n: "BrtEndConditionalFormatting14" },
      1048: { n: "BrtBeginCFRule14" },
      1049: { n: "BrtEndCFRule14" },
      1050: { n: "BrtCFVO14" },
      1051: { n: "BrtBeginDatabar14" },
      1052: { n: "BrtBeginIconSet14" },
      1053: { n: "BrtDVal14", f: parse_BrtDVal14 },
      1054: { n: "BrtBeginDVals14" },
      1055: { n: "BrtColor14" },
      1056: { n: "BrtBeginSparklines" },
      1057: { n: "BrtEndSparklines" },
      1058: { n: "BrtBeginSparklineGroups" },
      1059: { n: "BrtEndSparklineGroups" },
      1061: { n: "BrtSXVD14" },
      1062: { n: "BrtBeginSXView14" },
      1063: { n: "BrtEndSXView14" },
      1064: { n: "BrtBeginSXView16" },
      1065: { n: "BrtEndSXView16" },
      1066: { n: "BrtBeginPCD14" },
      1067: { n: "BrtEndPCD14" },
      1068: { n: "BrtBeginExtConn14" },
      1069: { n: "BrtEndExtConn14" },
      1070: { n: "BrtBeginSlicerCacheIDs" },
      1071: { n: "BrtEndSlicerCacheIDs" },
      1072: { n: "BrtBeginSlicerCacheID" },
      1073: { n: "BrtEndSlicerCacheID" },
      1075: { n: "BrtBeginSlicerCache" },
      1076: { n: "BrtEndSlicerCache" },
      1077: { n: "BrtBeginSlicerCacheDef" },
      1078: { n: "BrtEndSlicerCacheDef" },
      1079: { n: "BrtBeginSlicersEx" },
      1080: { n: "BrtEndSlicersEx" },
      1081: { n: "BrtBeginSlicerEx" },
      1082: { n: "BrtEndSlicerEx" },
      1083: { n: "BrtBeginSlicer" },
      1084: { n: "BrtEndSlicer" },
      1085: { n: "BrtSlicerCachePivotTables" },
      1086: { n: "BrtBeginSlicerCacheOlapImpl" },
      1087: { n: "BrtEndSlicerCacheOlapImpl" },
      1088: { n: "BrtBeginSlicerCacheLevelsData" },
      1089: { n: "BrtEndSlicerCacheLevelsData" },
      1090: { n: "BrtBeginSlicerCacheLevelData" },
      1091: { n: "BrtEndSlicerCacheLevelData" },
      1092: { n: "BrtBeginSlicerCacheSiRanges" },
      1093: { n: "BrtEndSlicerCacheSiRanges" },
      1094: { n: "BrtBeginSlicerCacheSiRange" },
      1095: { n: "BrtEndSlicerCacheSiRange" },
      1096: { n: "BrtSlicerCacheOlapItem" },
      1097: { n: "BrtBeginSlicerCacheSelections" },
      1098: { n: "BrtSlicerCacheSelection" },
      1099: { n: "BrtEndSlicerCacheSelections" },
      1100: { n: "BrtBeginSlicerCacheNative" },
      1101: { n: "BrtEndSlicerCacheNative" },
      1102: { n: "BrtSlicerCacheNativeItem" },
      1103: { n: "BrtRangeProtection14" },
      1104: { n: "BrtRangeProtectionIso14" },
      1105: { n: "BrtCellIgnoreEC14" },
      1111: { n: "BrtList14" },
      1112: { n: "BrtCFIcon" },
      1113: { n: "BrtBeginSlicerCachesPivotCacheIDs" },
      1114: { n: "BrtEndSlicerCachesPivotCacheIDs" },
      1115: { n: "BrtBeginSlicers" },
      1116: { n: "BrtEndSlicers" },
      1117: { n: "BrtWbProp14" },
      1118: { n: "BrtBeginSXEdit" },
      1119: { n: "BrtEndSXEdit" },
      1120: { n: "BrtBeginSXEdits" },
      1121: { n: "BrtEndSXEdits" },
      1122: { n: "BrtBeginSXChange" },
      1123: { n: "BrtEndSXChange" },
      1124: { n: "BrtBeginSXChanges" },
      1125: { n: "BrtEndSXChanges" },
      1126: { n: "BrtSXTupleItems" },
      1128: { n: "BrtBeginSlicerStyle" },
      1129: { n: "BrtEndSlicerStyle" },
      1130: { n: "BrtSlicerStyleElement" },
      1131: { n: "BrtBeginStyleSheetExt14" },
      1132: { n: "BrtEndStyleSheetExt14" },
      1133: { n: "BrtBeginSlicerCachesPivotCacheID" },
      1134: { n: "BrtEndSlicerCachesPivotCacheID" },
      1135: { n: "BrtBeginConditionalFormattings" },
      1136: { n: "BrtEndConditionalFormattings" },
      1137: { n: "BrtBeginPCDCalcMemExt" },
      1138: { n: "BrtEndPCDCalcMemExt" },
      1139: { n: "BrtBeginPCDCalcMemsExt" },
      1140: { n: "BrtEndPCDCalcMemsExt" },
      1141: { n: "BrtPCDField14" },
      1142: { n: "BrtBeginSlicerStyles" },
      1143: { n: "BrtEndSlicerStyles" },
      1144: { n: "BrtBeginSlicerStyleElements" },
      1145: { n: "BrtEndSlicerStyleElements" },
      1146: { n: "BrtCFRuleExt" },
      1147: { n: "BrtBeginSXCondFmt14" },
      1148: { n: "BrtEndSXCondFmt14" },
      1149: { n: "BrtBeginSXCondFmts14" },
      1150: { n: "BrtEndSXCondFmts14" },
      1152: { n: "BrtBeginSortCond14" },
      1153: { n: "BrtEndSortCond14" },
      1154: { n: "BrtEndDVals14" },
      1155: { n: "BrtEndIconSet14" },
      1156: { n: "BrtEndDatabar14" },
      1157: { n: "BrtBeginColorScale14" },
      1158: { n: "BrtEndColorScale14" },
      1159: { n: "BrtBeginSxrules14" },
      1160: { n: "BrtEndSxrules14" },
      1161: { n: "BrtBeginPRule14" },
      1162: { n: "BrtEndPRule14" },
      1163: { n: "BrtBeginPRFilters14" },
      1164: { n: "BrtEndPRFilters14" },
      1165: { n: "BrtBeginPRFilter14" },
      1166: { n: "BrtEndPRFilter14" },
      1167: { n: "BrtBeginPRFItem14" },
      1168: { n: "BrtEndPRFItem14" },
      1169: { n: "BrtBeginCellIgnoreECs14" },
      1170: { n: "BrtEndCellIgnoreECs14" },
      1171: { n: "BrtDxf14" },
      1172: { n: "BrtBeginDxF14s" },
      1173: { n: "BrtEndDxf14s" },
      1177: { n: "BrtFilter14" },
      1178: { n: "BrtBeginCustomFilters14" },
      1180: { n: "BrtCustomFilter14" },
      1181: { n: "BrtIconFilter14" },
      1182: { n: "BrtPivotCacheConnectionName" },
      2048: { n: "BrtBeginDecoupledPivotCacheIDs" },
      2049: { n: "BrtEndDecoupledPivotCacheIDs" },
      2050: { n: "BrtDecoupledPivotCacheID" },
      2051: { n: "BrtBeginPivotTableRefs" },
      2052: { n: "BrtEndPivotTableRefs" },
      2053: { n: "BrtPivotTableRef" },
      2054: { n: "BrtSlicerCacheBookPivotTables" },
      2055: { n: "BrtBeginSxvcells" },
      2056: { n: "BrtEndSxvcells" },
      2057: { n: "BrtBeginSxRow" },
      2058: { n: "BrtEndSxRow" },
      2060: { n: "BrtPcdCalcMem15" },
      2067: { n: "BrtQsi15" },
      2068: { n: "BrtBeginWebExtensions" },
      2069: { n: "BrtEndWebExtensions" },
      2070: { n: "BrtWebExtension" },
      2071: { n: "BrtAbsPath15" },
      2072: { n: "BrtBeginPivotTableUISettings" },
      2073: { n: "BrtEndPivotTableUISettings" },
      2075: { n: "BrtTableSlicerCacheIDs" },
      2076: { n: "BrtTableSlicerCacheID" },
      2077: { n: "BrtBeginTableSlicerCache" },
      2078: { n: "BrtEndTableSlicerCache" },
      2079: { n: "BrtSxFilter15" },
      2080: { n: "BrtBeginTimelineCachePivotCacheIDs" },
      2081: { n: "BrtEndTimelineCachePivotCacheIDs" },
      2082: { n: "BrtTimelineCachePivotCacheID" },
      2083: { n: "BrtBeginTimelineCacheIDs" },
      2084: { n: "BrtEndTimelineCacheIDs" },
      2085: { n: "BrtBeginTimelineCacheID" },
      2086: { n: "BrtEndTimelineCacheID" },
      2087: { n: "BrtBeginTimelinesEx" },
      2088: { n: "BrtEndTimelinesEx" },
      2089: { n: "BrtBeginTimelineEx" },
      2090: { n: "BrtEndTimelineEx" },
      2091: { n: "BrtWorkBookPr15" },
      2092: { n: "BrtPCDH15" },
      2093: { n: "BrtBeginTimelineStyle" },
      2094: { n: "BrtEndTimelineStyle" },
      2095: { n: "BrtTimelineStyleElement" },
      2096: { n: "BrtBeginTimelineStylesheetExt15" },
      2097: { n: "BrtEndTimelineStylesheetExt15" },
      2098: { n: "BrtBeginTimelineStyles" },
      2099: { n: "BrtEndTimelineStyles" },
      2100: { n: "BrtBeginTimelineStyleElements" },
      2101: { n: "BrtEndTimelineStyleElements" },
      2102: { n: "BrtDxf15" },
      2103: { n: "BrtBeginDxfs15" },
      2104: { n: "brtEndDxfs15" },
      2105: { n: "BrtSlicerCacheHideItemsWithNoData" },
      2106: { n: "BrtBeginItemUniqueNames" },
      2107: { n: "BrtEndItemUniqueNames" },
      2108: { n: "BrtItemUniqueName" },
      2109: { n: "BrtBeginExtConn15" },
      2110: { n: "BrtEndExtConn15" },
      2111: { n: "BrtBeginOledbPr15" },
      2112: { n: "BrtEndOledbPr15" },
      2113: { n: "BrtBeginDataFeedPr15" },
      2114: { n: "BrtEndDataFeedPr15" },
      2115: { n: "BrtTextPr15" },
      2116: { n: "BrtRangePr15" },
      2117: { n: "BrtDbCommand15" },
      2118: { n: "BrtBeginDbTables15" },
      2119: { n: "BrtEndDbTables15" },
      2120: { n: "BrtDbTable15" },
      2121: { n: "BrtBeginDataModel" },
      2122: { n: "BrtEndDataModel" },
      2123: { n: "BrtBeginModelTables" },
      2124: { n: "BrtEndModelTables" },
      2125: { n: "BrtModelTable" },
      2126: { n: "BrtBeginModelRelationships" },
      2127: { n: "BrtEndModelRelationships" },
      2128: { n: "BrtModelRelationship" },
      2129: { n: "BrtBeginECTxtWiz15" },
      2130: { n: "BrtEndECTxtWiz15" },
      2131: { n: "BrtBeginECTWFldInfoLst15" },
      2132: { n: "BrtEndECTWFldInfoLst15" },
      2133: { n: "BrtBeginECTWFldInfo15" },
      2134: { n: "BrtFieldListActiveItem" },
      2135: { n: "BrtPivotCacheIdVersion" },
      2136: { n: "BrtSXDI15" },
      2137: { n: "BrtBeginModelTimeGroupings" },
      2138: { n: "BrtEndModelTimeGroupings" },
      2139: { n: "BrtBeginModelTimeGrouping" },
      2140: { n: "BrtEndModelTimeGrouping" },
      2141: { n: "BrtModelTimeGroupingCalcCol" },
      3072: { n: "BrtUid" },
      3073: { n: "BrtRevisionPtr" },
      5095: { n: "BrtBeginCalcFeatures" },
      5096: { n: "BrtEndCalcFeatures" },
      5097: { n: "BrtCalcFeature" },
      65535: { n: "" }
    };
    var XLSBRE = evert_key(XLSBRecordEnum, "n");
    var XLSRecordEnum = {
      3: { n: "BIFF2NUM", f: parse_BIFF2NUM },
      4: { n: "BIFF2STR", f: parse_BIFF2STR },
      6: { n: "Formula", f: parse_Formula },
      9: { n: "BOF", f: parse_BOF },
      10: { n: "EOF", f: parsenoop2 },
      12: { n: "CalcCount", f: parseuint16 },
      13: { n: "CalcMode", f: parseuint16 },
      14: { n: "CalcPrecision", f: parsebool },
      15: { n: "CalcRefMode", f: parsebool },
      16: { n: "CalcDelta", f: parse_Xnum },
      17: { n: "CalcIter", f: parsebool },
      18: { n: "Protect", f: parsebool },
      19: { n: "Password", f: parseuint16 },
      20: { n: "Header", f: parse_XLHeaderFooter },
      21: { n: "Footer", f: parse_XLHeaderFooter },
      23: { n: "ExternSheet", f: parse_ExternSheet },
      24: { n: "Lbl", f: parse_Lbl },
      25: { n: "WinProtect", f: parsebool },
      26: { n: "VerticalPageBreaks" },
      27: { n: "HorizontalPageBreaks" },
      28: { n: "Note", f: parse_Note },
      29: { n: "Selection" },
      34: { n: "Date1904", f: parsebool },
      35: { n: "ExternName", f: parse_ExternName },
      36: { n: "COLWIDTH" },
      38: { n: "LeftMargin", f: parse_Xnum },
      39: { n: "RightMargin", f: parse_Xnum },
      40: { n: "TopMargin", f: parse_Xnum },
      41: { n: "BottomMargin", f: parse_Xnum },
      42: { n: "PrintRowCol", f: parsebool },
      43: { n: "PrintGrid", f: parsebool },
      47: { n: "FilePass", f: parse_FilePass },
      49: { n: "Font", f: parse_Font },
      51: { n: "PrintSize", f: parseuint16 },
      60: { n: "Continue" },
      61: { n: "Window1", f: parse_Window1 },
      64: { n: "Backup", f: parsebool },
      65: { n: "Pane", f: parse_Pane },
      66: { n: "CodePage", f: parseuint16 },
      77: { n: "Pls" },
      80: { n: "DCon" },
      81: { n: "DConRef" },
      82: { n: "DConName" },
      85: { n: "DefColWidth", f: parseuint16 },
      89: { n: "XCT" },
      90: { n: "CRN" },
      91: { n: "FileSharing" },
      92: { n: "WriteAccess", f: parse_WriteAccess },
      93: { n: "Obj", f: parse_Obj },
      94: { n: "Uncalced" },
      95: { n: "CalcSaveRecalc", f: parsebool },
      96: { n: "Template" },
      97: { n: "Intl" },
      99: { n: "ObjProtect", f: parsebool },
      125: { n: "ColInfo", f: parse_ColInfo },
      128: { n: "Guts", f: parse_Guts },
      129: { n: "WsBool", f: parse_WsBool },
      130: { n: "GridSet", f: parseuint16 },
      131: { n: "HCenter", f: parsebool },
      132: { n: "VCenter", f: parsebool },
      133: { n: "BoundSheet8", f: parse_BoundSheet8 },
      134: { n: "WriteProtect" },
      140: { n: "Country", f: parse_Country },
      141: { n: "HideObj", f: parseuint16 },
      144: { n: "Sort" },
      146: { n: "Palette", f: parse_Palette },
      151: { n: "Sync" },
      152: { n: "LPr" },
      153: { n: "DxGCol" },
      154: { n: "FnGroupName" },
      155: { n: "FilterMode" },
      156: { n: "BuiltInFnGroupCount", f: parseuint16 },
      157: { n: "AutoFilterInfo" },
      158: { n: "AutoFilter" },
      160: { n: "Scl", f: parse_Scl },
      161: { n: "Setup", f: parse_Setup },
      174: { n: "ScenMan" },
      175: { n: "SCENARIO" },
      176: { n: "SxView" },
      177: { n: "Sxvd" },
      178: { n: "SXVI" },
      180: { n: "SxIvd" },
      181: { n: "SXLI" },
      182: { n: "SXPI" },
      184: { n: "DocRoute" },
      185: { n: "RecipName" },
      189: { n: "MulRk", f: parse_MulRk },
      190: { n: "MulBlank", f: parse_MulBlank },
      193: { n: "Mms", f: parsenoop2 },
      197: { n: "SXDI" },
      198: { n: "SXDB" },
      199: { n: "SXFDB" },
      200: { n: "SXDBB" },
      201: { n: "SXNum" },
      202: { n: "SxBool", f: parsebool },
      203: { n: "SxErr" },
      204: { n: "SXInt" },
      205: { n: "SXString" },
      206: { n: "SXDtr" },
      207: { n: "SxNil" },
      208: { n: "SXTbl" },
      209: { n: "SXTBRGIITM" },
      210: { n: "SxTbpg" },
      211: { n: "ObProj" },
      213: { n: "SXStreamID" },
      215: { n: "DBCell" },
      216: { n: "SXRng" },
      217: { n: "SxIsxoper" },
      218: { n: "BookBool", f: parseuint16 },
      220: { n: "DbOrParamQry" },
      221: { n: "ScenarioProtect", f: parsebool },
      222: { n: "OleObjectSize" },
      224: { n: "XF", f: parse_XF },
      225: { n: "InterfaceHdr", f: parse_InterfaceHdr },
      226: { n: "InterfaceEnd", f: parsenoop2 },
      227: { n: "SXVS" },
      229: { n: "MergeCells", f: parse_MergeCells },
      233: { n: "BkHim" },
      235: { n: "MsoDrawingGroup" },
      236: { n: "MsoDrawing" },
      237: { n: "MsoDrawingSelection" },
      239: { n: "PhoneticInfo" },
      240: { n: "SxRule" },
      241: { n: "SXEx" },
      242: { n: "SxFilt" },
      244: { n: "SxDXF" },
      245: { n: "SxItm" },
      246: { n: "SxName" },
      247: { n: "SxSelect" },
      248: { n: "SXPair" },
      249: { n: "SxFmla" },
      251: { n: "SxFormat" },
      252: { n: "SST", f: parse_SST },
      253: { n: "LabelSst", f: parse_LabelSst },
      255: { n: "ExtSST", f: parse_ExtSST },
      256: { n: "SXVDEx" },
      259: { n: "SXFormula" },
      290: { n: "SXDBEx" },
      311: { n: "RRDInsDel" },
      312: { n: "RRDHead" },
      315: { n: "RRDChgCell" },
      317: { n: "RRTabId", f: parseuint16a },
      318: { n: "RRDRenSheet" },
      319: { n: "RRSort" },
      320: { n: "RRDMove" },
      330: { n: "RRFormat" },
      331: { n: "RRAutoFmt" },
      333: { n: "RRInsertSh" },
      334: { n: "RRDMoveBegin" },
      335: { n: "RRDMoveEnd" },
      336: { n: "RRDInsDelBegin" },
      337: { n: "RRDInsDelEnd" },
      338: { n: "RRDConflict" },
      339: { n: "RRDDefName" },
      340: { n: "RRDRstEtxp" },
      351: { n: "LRng" },
      352: { n: "UsesELFs", f: parsebool },
      353: { n: "DSF", f: parsenoop2 },
      401: { n: "CUsr" },
      402: { n: "CbUsr" },
      403: { n: "UsrInfo" },
      404: { n: "UsrExcl" },
      405: { n: "FileLock" },
      406: { n: "RRDInfo" },
      407: { n: "BCUsrs" },
      408: { n: "UsrChk" },
      425: { n: "UserBView" },
      426: { n: "UserSViewBegin" },
      427: { n: "UserSViewEnd" },
      428: { n: "RRDUserView" },
      429: { n: "Qsi" },
      430: { n: "SupBook", f: parse_SupBook },
      431: { n: "Prot4Rev", f: parsebool },
      432: { n: "CondFmt" },
      433: { n: "CF" },
      434: { n: "DVal" },
      437: { n: "DConBin" },
      438: { n: "TxO", f: parse_TxO },
      439: { n: "RefreshAll", f: parsebool },
      440: { n: "HLink", f: parse_HLink },
      441: { n: "Lel" },
      442: { n: "CodeName", f: parse_XLUnicodeString },
      443: { n: "SXFDBType" },
      444: { n: "Prot4RevPass", f: parseuint16 },
      445: { n: "ObNoMacros" },
      446: { n: "Dv" },
      448: { n: "Excel9File", f: parsenoop2 },
      449: { n: "RecalcId", f: parse_RecalcId, r: 2 },
      450: { n: "EntExU2", f: parsenoop2 },
      512: { n: "Dimensions", f: parse_Dimensions },
      513: { n: "Blank", f: parse_Blank },
      515: { n: "Number", f: parse_Number },
      516: { n: "Label", f: parse_Label },
      517: { n: "BoolErr", f: parse_BoolErr },
      518: { n: "Formula", f: parse_Formula },
      519: { n: "String", f: parse_String },
      520: { n: "Row", f: parse_Row },
      523: { n: "Index" },
      545: { n: "Array", f: parse_Array },
      549: { n: "DefaultRowHeight", f: parse_DefaultRowHeight },
      566: { n: "Table" },
      574: { n: "Window2", f: parse_Window2 },
      638: { n: "RK", f: parse_RK },
      659: { n: "Style" },
      1030: { n: "Formula", f: parse_Formula },
      1048: { n: "BigName" },
      1054: { n: "Format", f: parse_Format },
      1084: { n: "ContinueBigName" },
      1212: { n: "ShrFmla", f: parse_ShrFmla },
      2048: { n: "HLinkTooltip", f: parse_HLinkTooltip },
      2049: { n: "WebPub" },
      2050: { n: "QsiSXTag" },
      2051: { n: "DBQueryExt" },
      2052: { n: "ExtString" },
      2053: { n: "TxtQry" },
      2054: { n: "Qsir" },
      2055: { n: "Qsif" },
      2056: { n: "RRDTQSIF" },
      2057: { n: "BOF", f: parse_BOF },
      2058: { n: "OleDbConn" },
      2059: { n: "WOpt" },
      2060: { n: "SXViewEx" },
      2061: { n: "SXTH" },
      2062: { n: "SXPIEx" },
      2063: { n: "SXVDTEx" },
      2064: { n: "SXViewEx9" },
      2066: { n: "ContinueFrt" },
      2067: { n: "RealTimeData" },
      2128: { n: "ChartFrtInfo" },
      2129: { n: "FrtWrapper" },
      2130: { n: "StartBlock" },
      2131: { n: "EndBlock" },
      2132: { n: "StartObject" },
      2133: { n: "EndObject" },
      2134: { n: "CatLab" },
      2135: { n: "YMult" },
      2136: { n: "SXViewLink" },
      2137: { n: "PivotChartBits" },
      2138: { n: "FrtFontList" },
      2146: { n: "SheetExt" },
      2147: { n: "BookExt", r: 12 },
      2148: { n: "SXAddl" },
      2149: { n: "CrErr" },
      2150: { n: "HFPicture" },
      2151: { n: "FeatHdr", f: parsenoop2 },
      2152: { n: "Feat" },
      2154: { n: "DataLabExt" },
      2155: { n: "DataLabExtContents" },
      2156: { n: "CellWatch" },
      2161: { n: "FeatHdr11" },
      2162: { n: "Feature11" },
      2164: { n: "DropDownObjIds" },
      2165: { n: "ContinueFrt11" },
      2166: { n: "DConn" },
      2167: { n: "List12" },
      2168: { n: "Feature12" },
      2169: { n: "CondFmt12" },
      2170: { n: "CF12" },
      2171: { n: "CFEx" },
      2172: { n: "XFCRC", f: parse_XFCRC, r: 12 },
      2173: { n: "XFExt", f: parse_XFExt, r: 12 },
      2174: { n: "AutoFilter12" },
      2175: { n: "ContinueFrt12" },
      2180: { n: "MDTInfo" },
      2181: { n: "MDXStr" },
      2182: { n: "MDXTuple" },
      2183: { n: "MDXSet" },
      2184: { n: "MDXProp" },
      2185: { n: "MDXKPI" },
      2186: { n: "MDB" },
      2187: { n: "PLV" },
      2188: { n: "Compat12", f: parsebool, r: 12 },
      2189: { n: "DXF" },
      2190: { n: "TableStyles", r: 12 },
      2191: { n: "TableStyle" },
      2192: { n: "TableStyleElement" },
      2194: { n: "StyleExt" },
      2195: { n: "NamePublish" },
      2196: { n: "NameCmt", f: parse_NameCmt, r: 12 },
      2197: { n: "SortData" },
      2198: { n: "Theme", f: parse_Theme, r: 12 },
      2199: { n: "GUIDTypeLib" },
      2200: { n: "FnGrp12" },
      2201: { n: "NameFnGrp12" },
      2202: { n: "MTRSettings", f: parse_MTRSettings, r: 12 },
      2203: { n: "CompressPictures", f: parsenoop2 },
      2204: { n: "HeaderFooter" },
      2205: { n: "CrtLayout12" },
      2206: { n: "CrtMlFrt" },
      2207: { n: "CrtMlFrtContinue" },
      2211: { n: "ForceFullCalculation", f: parse_ForceFullCalculation },
      2212: { n: "ShapePropsStream" },
      2213: { n: "TextPropsStream" },
      2214: { n: "RichTextStream" },
      2215: { n: "CrtLayout12A" },
      4097: { n: "Units" },
      4098: { n: "Chart" },
      4099: { n: "Series" },
      4102: { n: "DataFormat" },
      4103: { n: "LineFormat" },
      4105: { n: "MarkerFormat" },
      4106: { n: "AreaFormat" },
      4107: { n: "PieFormat" },
      4108: { n: "AttachedLabel" },
      4109: { n: "SeriesText" },
      4116: { n: "ChartFormat" },
      4117: { n: "Legend" },
      4118: { n: "SeriesList" },
      4119: { n: "Bar" },
      4120: { n: "Line" },
      4121: { n: "Pie" },
      4122: { n: "Area" },
      4123: { n: "Scatter" },
      4124: { n: "CrtLine" },
      4125: { n: "Axis" },
      4126: { n: "Tick" },
      4127: { n: "ValueRange" },
      4128: { n: "CatSerRange" },
      4129: { n: "AxisLine" },
      4130: { n: "CrtLink" },
      4132: { n: "DefaultText" },
      4133: { n: "Text" },
      4134: { n: "FontX", f: parseuint16 },
      4135: { n: "ObjectLink" },
      4146: { n: "Frame" },
      4147: { n: "Begin" },
      4148: { n: "End" },
      4149: { n: "PlotArea" },
      4154: { n: "Chart3d" },
      4156: { n: "PicF" },
      4157: { n: "DropBar" },
      4158: { n: "Radar" },
      4159: { n: "Surf" },
      4160: { n: "RadarArea" },
      4161: { n: "AxisParent" },
      4163: { n: "LegendException" },
      4164: { n: "ShtProps", f: parse_ShtProps },
      4165: { n: "SerToCrt" },
      4166: { n: "AxesUsed" },
      4168: { n: "SBaseRef" },
      4170: { n: "SerParent" },
      4171: { n: "SerAuxTrend" },
      4174: { n: "IFmtRecord" },
      4175: { n: "Pos" },
      4176: { n: "AlRuns" },
      4177: { n: "BRAI" },
      4187: { n: "SerAuxErrBar" },
      4188: { n: "ClrtClient", f: parse_ClrtClient },
      4189: { n: "SerFmt" },
      4191: { n: "Chart3DBarShape" },
      4192: { n: "Fbi" },
      4193: { n: "BopPop" },
      4194: { n: "AxcExt" },
      4195: { n: "Dat" },
      4196: { n: "PlotGrowth" },
      4197: { n: "SIIndex" },
      4198: { n: "GelFrame" },
      4199: { n: "BopPopCustom" },
      4200: { n: "Fbi2" },
      0: { n: "Dimensions", f: parse_Dimensions },
      2: { n: "BIFF2INT", f: parse_BIFF2INT },
      5: { n: "BoolErr", f: parse_BoolErr },
      7: { n: "String", f: parse_BIFF2STRING },
      8: { n: "BIFF2ROW" },
      11: { n: "Index" },
      22: { n: "ExternCount", f: parseuint16 },
      30: { n: "BIFF2FORMAT", f: parse_BIFF2Format },
      31: { n: "BIFF2FMTCNT" },
      /* 16-bit cnt of BIFF2FORMAT records */
      32: { n: "BIFF2COLINFO" },
      33: { n: "Array", f: parse_Array },
      37: { n: "DefaultRowHeight", f: parse_DefaultRowHeight },
      50: { n: "BIFF2FONTXTRA", f: parse_BIFF2FONTXTRA },
      52: { n: "DDEObjName" },
      62: { n: "BIFF2WINDOW2" },
      67: { n: "BIFF2XF" },
      69: { n: "BIFF2FONTCLR" },
      86: { n: "BIFF4FMTCNT" },
      /* 16-bit cnt, similar to BIFF2 */
      126: { n: "RK" },
      /* Not necessarily same as 0x027e */
      127: { n: "ImData", f: parse_ImData },
      135: { n: "Addin" },
      136: { n: "Edg" },
      137: { n: "Pub" },
      145: { n: "Sub" },
      148: { n: "LHRecord" },
      149: { n: "LHNGraph" },
      150: { n: "Sound" },
      169: { n: "CoordList" },
      171: { n: "GCW" },
      188: { n: "ShrFmla" },
      /* Not necessarily same as 0x04bc */
      191: { n: "ToolbarHdr" },
      192: { n: "ToolbarEnd" },
      194: { n: "AddMenu" },
      195: { n: "DelMenu" },
      214: { n: "RString", f: parse_RString },
      223: { n: "UDDesc" },
      234: { n: "TabIdConf" },
      354: { n: "XL5Modify" },
      421: { n: "FileSharing2" },
      521: { n: "BOF", f: parse_BOF },
      536: { n: "Lbl", f: parse_Lbl },
      547: { n: "ExternName", f: parse_ExternName },
      561: { n: "Font" },
      579: { n: "BIFF3XF" },
      1033: { n: "BOF", f: parse_BOF },
      1091: { n: "BIFF4XF" },
      2157: { n: "FeatInfo" },
      2163: { n: "FeatInfo11" },
      2177: { n: "SXAddl12" },
      2240: { n: "AutoWebPub" },
      2241: { n: "ListObj" },
      2242: { n: "ListField" },
      2243: { n: "ListDV" },
      2244: { n: "ListCondFmt" },
      2245: { n: "ListCF" },
      2246: { n: "FMQry" },
      2247: { n: "FMSQry" },
      2248: { n: "PLV" },
      2249: { n: "LnExt" },
      2250: { n: "MkrExt" },
      2251: { n: "CrtCoopt" },
      2262: { n: "FRTArchId$", r: 12 },
      29282: {}
    };
    var XLSRE = evert_key(XLSRecordEnum, "n");
    function write_biff_rec(ba, type, payload, length) {
      var t = +type || +XLSRE[type];
      if (isNaN(t))
        return;
      var len = length || (payload || []).length || 0;
      var o = ba.next(4);
      o.write_shift(2, t);
      o.write_shift(2, len);
      if (len > 0 && is_buf(payload))
        ba.push(payload);
    }
    function write_BIFF2Cell(out, r, c) {
      if (!out)
        out = new_buf(7);
      out.write_shift(2, r);
      out.write_shift(2, c);
      out.write_shift(2, 0);
      out.write_shift(1, 0);
      return out;
    }
    function write_BIFF2BERR(r, c, val, t) {
      var out = new_buf(9);
      write_BIFF2Cell(out, r, c);
      if (t == "e") {
        out.write_shift(1, val);
        out.write_shift(1, 1);
      } else {
        out.write_shift(1, val ? 1 : 0);
        out.write_shift(1, 0);
      }
      return out;
    }
    function write_BIFF2LABEL(r, c, val) {
      var out = new_buf(8 + 2 * val.length);
      write_BIFF2Cell(out, r, c);
      out.write_shift(1, val.length);
      out.write_shift(val.length, val, "sbcs");
      return out.l < out.length ? out.slice(0, out.l) : out;
    }
    function write_ws_biff2_cell(ba, cell, R, C) {
      if (cell.v != null)
        switch (cell.t) {
          case "d":
          case "n":
            var v = cell.t == "d" ? datenum(parseDate(cell.v)) : cell.v;
            if (v == (v | 0) && v >= 0 && v < 65536)
              write_biff_rec(ba, 2, write_BIFF2INT(R, C, v));
            else
              write_biff_rec(ba, 3, write_BIFF2NUM(R, C, v));
            return;
          case "b":
          case "e":
            write_biff_rec(ba, 5, write_BIFF2BERR(R, C, cell.v, cell.t));
            return;
          case "s":
          case "str":
            write_biff_rec(ba, 4, write_BIFF2LABEL(R, C, cell.v));
            return;
        }
      write_biff_rec(ba, 1, write_BIFF2Cell(null, R, C));
    }
    function write_ws_biff2(ba, ws, idx, opts) {
      var dense = Array.isArray(ws);
      var range = safe_decode_range(ws["!ref"] || "A1"), ref2, rr = "", cols = [];
      if (range.e.c > 255 || range.e.r > 16383) {
        if (opts.WTF)
          throw new Error("Range " + (ws["!ref"] || "A1") + " exceeds format limit A1:IV16384");
        range.e.c = Math.min(range.e.c, 255);
        range.e.r = Math.min(range.e.c, 16383);
        ref2 = encode_range(range);
      }
      for (var R = range.s.r; R <= range.e.r; ++R) {
        rr = encode_row(R);
        for (var C = range.s.c; C <= range.e.c; ++C) {
          if (R === range.s.r)
            cols[C] = encode_col(C);
          ref2 = cols[C] + rr;
          var cell = dense ? (ws[R] || [])[C] : ws[ref2];
          if (!cell)
            continue;
          write_ws_biff2_cell(ba, cell, R, C);
        }
      }
    }
    function write_biff2_buf(wb, opts) {
      var o = opts || {};
      var ba = buf_array();
      var idx = 0;
      for (var i3 = 0; i3 < wb.SheetNames.length; ++i3)
        if (wb.SheetNames[i3] == o.sheet)
          idx = i3;
      if (idx == 0 && !!o.sheet && wb.SheetNames[0] != o.sheet)
        throw new Error("Sheet not found: " + o.sheet);
      write_biff_rec(ba, 9, write_BOF(wb, 16, o));
      write_ws_biff2(ba, wb.Sheets[wb.SheetNames[idx]], idx, o);
      write_biff_rec(ba, 10);
      return ba.end();
    }
    function write_FONTS_biff8(ba, data, opts) {
      write_biff_rec(ba, "Font", write_Font({
        sz: 12,
        color: { theme: 1 },
        name: "Arial",
        family: 2,
        scheme: "minor"
      }, opts));
    }
    function write_FMTS_biff8(ba, NF, opts) {
      if (!NF)
        return;
      [[5, 8], [23, 26], [41, 44], [
        /*63*/
        50,
        /*66],[164,*/
        392
      ]].forEach(function(r) {
        for (var i3 = r[0]; i3 <= r[1]; ++i3)
          if (NF[i3] != null)
            write_biff_rec(ba, "Format", write_Format(i3, NF[i3], opts));
      });
    }
    function write_FEAT(ba, ws) {
      var o = new_buf(19);
      o.write_shift(4, 2151);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      o.write_shift(2, 3);
      o.write_shift(1, 1);
      o.write_shift(4, 0);
      write_biff_rec(ba, "FeatHdr", o);
      o = new_buf(39);
      o.write_shift(4, 2152);
      o.write_shift(4, 0);
      o.write_shift(4, 0);
      o.write_shift(2, 3);
      o.write_shift(1, 0);
      o.write_shift(4, 0);
      o.write_shift(2, 1);
      o.write_shift(4, 4);
      o.write_shift(2, 0);
      write_Ref8U(safe_decode_range(ws["!ref"] || "A1"), o);
      o.write_shift(4, 4);
      write_biff_rec(ba, "Feat", o);
    }
    function write_CELLXFS_biff8(ba, opts) {
      for (var i3 = 0; i3 < 16; ++i3)
        write_biff_rec(ba, "XF", write_XF({ numFmtId: 0, style: true }, 0, opts));
      opts.cellXfs.forEach(function(c) {
        write_biff_rec(ba, "XF", write_XF(c, 0, opts));
      });
    }
    function write_ws_biff8_hlinks(ba, ws) {
      for (var R = 0; R < ws["!links"].length; ++R) {
        var HL = ws["!links"][R];
        write_biff_rec(ba, "HLink", write_HLink(HL));
        if (HL[1].Tooltip)
          write_biff_rec(ba, "HLinkTooltip", write_HLinkTooltip(HL));
      }
      delete ws["!links"];
    }
    function write_ws_biff8_cell(ba, cell, R, C, opts) {
      var os = 16 + get_cell_style(opts.cellXfs, cell, opts);
      if (cell.v == null && !cell.bf) {
        write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
        return;
      }
      if (cell.bf)
        write_biff_rec(ba, "Formula", write_Formula(cell, R, C, opts, os));
      else
        switch (cell.t) {
          case "d":
          case "n":
            var v = cell.t == "d" ? datenum(parseDate(cell.v)) : cell.v;
            write_biff_rec(ba, "Number", write_Number(R, C, v, os));
            break;
          case "b":
          case "e":
            write_biff_rec(ba, 517, write_BoolErr(R, C, cell.v, os, opts, cell.t));
            break;
          case "s":
          case "str":
            write_biff_rec(ba, "Label", write_Label(R, C, cell.v, os, opts));
            break;
          default:
            write_biff_rec(ba, "Blank", write_XLSCell(R, C, os));
        }
    }
    function write_ws_biff8(idx, opts, wb) {
      var ba = buf_array();
      var s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};
      var _WB = (wb || {}).Workbook || {};
      var _sheet = (_WB.Sheets || [])[idx] || {};
      var dense = Array.isArray(ws);
      var b8 = opts.biff == 8;
      var ref2, rr = "", cols = [];
      var range = safe_decode_range(ws["!ref"] || "A1");
      var MAX_ROWS = b8 ? 65536 : 16384;
      if (range.e.c > 255 || range.e.r >= MAX_ROWS) {
        if (opts.WTF)
          throw new Error("Range " + (ws["!ref"] || "A1") + " exceeds format limit A1:IV16384");
        range.e.c = Math.min(range.e.c, 255);
        range.e.r = Math.min(range.e.c, MAX_ROWS - 1);
      }
      write_biff_rec(ba, 2057, write_BOF(wb, 16, opts));
      write_biff_rec(ba, "CalcMode", writeuint16(1));
      write_biff_rec(ba, "CalcCount", writeuint16(100));
      write_biff_rec(ba, "CalcRefMode", writebool(true));
      write_biff_rec(ba, "CalcIter", writebool(false));
      write_biff_rec(ba, "CalcDelta", write_Xnum(1e-3));
      write_biff_rec(ba, "CalcSaveRecalc", writebool(true));
      write_biff_rec(ba, "PrintRowCol", writebool(false));
      write_biff_rec(ba, "PrintGrid", writebool(false));
      write_biff_rec(ba, "GridSet", writeuint16(1));
      write_biff_rec(ba, "Guts", write_Guts([0, 0]));
      write_biff_rec(ba, "HCenter", writebool(false));
      write_biff_rec(ba, "VCenter", writebool(false));
      write_biff_rec(ba, 512, write_Dimensions(range, opts));
      if (b8)
        ws["!links"] = [];
      for (var R = range.s.r; R <= range.e.r; ++R) {
        rr = encode_row(R);
        for (var C = range.s.c; C <= range.e.c; ++C) {
          if (R === range.s.r)
            cols[C] = encode_col(C);
          ref2 = cols[C] + rr;
          var cell = dense ? (ws[R] || [])[C] : ws[ref2];
          if (!cell)
            continue;
          write_ws_biff8_cell(ba, cell, R, C, opts);
          if (b8 && cell.l)
            ws["!links"].push([ref2, cell.l]);
        }
      }
      var cname = _sheet.CodeName || _sheet.name || s;
      if (b8 && _WB.Views)
        write_biff_rec(ba, "Window2", write_Window2(_WB.Views[0]));
      if (b8 && (ws["!merges"] || []).length)
        write_biff_rec(ba, "MergeCells", write_MergeCells(ws["!merges"]));
      if (b8)
        write_ws_biff8_hlinks(ba, ws);
      write_biff_rec(ba, "CodeName", write_XLUnicodeString(cname));
      if (b8)
        write_FEAT(ba, ws);
      write_biff_rec(ba, "EOF");
      return ba.end();
    }
    function write_biff8_global(wb, bufs, opts) {
      var A = buf_array();
      var _WB = (wb || {}).Workbook || {};
      var _sheets = _WB.Sheets || [];
      var _wb = _WB.WBProps || {};
      var b8 = opts.biff == 8, b5 = opts.biff == 5;
      write_biff_rec(A, 2057, write_BOF(wb, 5, opts));
      if (opts.bookType == "xla")
        write_biff_rec(A, "Addin");
      write_biff_rec(A, "InterfaceHdr", b8 ? writeuint16(1200) : null);
      write_biff_rec(A, "Mms", writezeroes(2));
      if (b5)
        write_biff_rec(A, "ToolbarHdr");
      if (b5)
        write_biff_rec(A, "ToolbarEnd");
      write_biff_rec(A, "InterfaceEnd");
      write_biff_rec(A, "WriteAccess", write_WriteAccess("SheetJS", opts));
      write_biff_rec(A, "CodePage", writeuint16(b8 ? 1200 : 1252));
      if (b8)
        write_biff_rec(A, "DSF", writeuint16(0));
      if (b8)
        write_biff_rec(A, "Excel9File");
      write_biff_rec(A, "RRTabId", write_RRTabId(wb.SheetNames.length));
      if (b8 && wb.vbaraw)
        write_biff_rec(A, "ObProj");
      if (b8 && wb.vbaraw) {
        var cname = _wb.CodeName || "ThisWorkbook";
        write_biff_rec(A, "CodeName", write_XLUnicodeString(cname));
      }
      write_biff_rec(A, "BuiltInFnGroupCount", writeuint16(17));
      write_biff_rec(A, "WinProtect", writebool(false));
      write_biff_rec(A, "Protect", writebool(false));
      write_biff_rec(A, "Password", writeuint16(0));
      if (b8)
        write_biff_rec(A, "Prot4Rev", writebool(false));
      if (b8)
        write_biff_rec(A, "Prot4RevPass", writeuint16(0));
      write_biff_rec(A, "Window1", write_Window1());
      write_biff_rec(A, "Backup", writebool(false));
      write_biff_rec(A, "HideObj", writeuint16(0));
      write_biff_rec(A, "Date1904", writebool(safe1904(wb) == "true"));
      write_biff_rec(A, "CalcPrecision", writebool(true));
      if (b8)
        write_biff_rec(A, "RefreshAll", writebool(false));
      write_biff_rec(A, "BookBool", writeuint16(0));
      write_FONTS_biff8(A, wb, opts);
      write_FMTS_biff8(A, wb.SSF, opts);
      write_CELLXFS_biff8(A, opts);
      if (b8)
        write_biff_rec(A, "UsesELFs", writebool(false));
      var a = A.end();
      var C = buf_array();
      if (b8)
        write_biff_rec(C, "Country", write_Country());
      write_biff_rec(C, "EOF");
      var c = C.end();
      var B = buf_array();
      var blen = 0, j2 = 0;
      for (j2 = 0; j2 < wb.SheetNames.length; ++j2)
        blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j2].length;
      var start = a.length + blen + c.length;
      for (j2 = 0; j2 < wb.SheetNames.length; ++j2) {
        var _sheet = _sheets[j2] || {};
        write_biff_rec(B, "BoundSheet8", write_BoundSheet8({ pos: start, hs: _sheet.Hidden || 0, dt: 0, name: wb.SheetNames[j2] }, opts));
        start += bufs[j2].length;
      }
      var b = B.end();
      if (blen != b.length)
        throw new Error("BS8 " + blen + " != " + b.length);
      var out = [];
      if (a.length)
        out.push(a);
      if (b.length)
        out.push(b);
      if (c.length)
        out.push(c);
      return __toBuffer([out]);
    }
    function write_biff8_buf(wb, opts) {
      var o = opts || {};
      var bufs = [];
      if (wb && !wb.SSF) {
        wb.SSF = SSF.get_table();
      }
      if (wb && wb.SSF) {
        make_ssf(SSF);
        SSF.load_table(wb.SSF);
        o.revssf = evert_num(wb.SSF);
        o.revssf[wb.SSF[65535]] = 0;
        o.ssf = wb.SSF;
      }
      o.Strings = [];
      o.Strings.Count = 0;
      o.Strings.Unique = 0;
      fix_write_opts(o);
      o.cellXfs = [];
      get_cell_style(o.cellXfs, {}, { revssf: { "General": 0 } });
      if (!wb.Props)
        wb.Props = {};
      for (var i3 = 0; i3 < wb.SheetNames.length; ++i3)
        bufs[bufs.length] = write_ws_biff8(i3, o, wb);
      bufs.unshift(write_biff8_global(wb, bufs, o));
      return __toBuffer([bufs]);
    }
    function write_biff_buf(wb, opts) {
      var o = opts || {};
      switch (o.biff || 2) {
        case 8:
        case 5:
          return write_biff8_buf(wb, opts);
        case 4:
        case 3:
        case 2:
          return write_biff2_buf(wb, opts);
      }
      throw new Error("invalid type " + o.bookType + " for BIFF");
    }
    var HTML_ = function() {
      function html_to_sheet(str, _opts) {
        var opts = _opts || {};
        var ws = opts.dense ? [] : {};
        str = str.replace(/<!--.*?-->/g, "");
        var mtch = str.match(/<table/i);
        if (!mtch)
          throw new Error("Invalid HTML: could not find <table>");
        var mtch2 = str.match(/<\/table/i);
        var i3 = mtch.index, j2 = mtch2 && mtch2.index || str.length;
        var rows = split_regex(str.slice(i3, j2), /(:?<tr[^>]*>)/i, "<tr>");
        var R = -1, C = 0, RS = 0, CS = 0;
        var range = { s: { r: 1e7, c: 1e7 }, e: { r: 0, c: 0 } };
        var merges = [];
        for (i3 = 0; i3 < rows.length; ++i3) {
          var row = rows[i3].trim();
          var hd = row.slice(0, 3).toLowerCase();
          if (hd == "<tr") {
            ++R;
            if (opts.sheetRows && opts.sheetRows <= R) {
              --R;
              break;
            }
            C = 0;
            continue;
          }
          if (hd != "<td" && hd != "<th")
            continue;
          var cells = row.split(/<\/t[dh]>/i);
          for (j2 = 0; j2 < cells.length; ++j2) {
            var cell = cells[j2].trim();
            if (!cell.match(/<t[dh]/i))
              continue;
            var m = cell, cc = 0;
            while (m.charAt(0) == "<" && (cc = m.indexOf(">")) > -1)
              m = m.slice(cc + 1);
            for (var midx = 0; midx < merges.length; ++midx) {
              var _merge = merges[midx];
              if (_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) {
                C = _merge.e.c + 1;
                midx = -1;
              }
            }
            var tag = parsexmltag(cell.slice(0, cell.indexOf(">")));
            CS = tag.colspan ? +tag.colspan : 1;
            if ((RS = +tag.rowspan) > 1 || CS > 1)
              merges.push({ s: { r: R, c: C }, e: { r: R + (RS || 1) - 1, c: C + CS - 1 } });
            var _t = tag.t || "";
            if (!m.length) {
              C += CS;
              continue;
            }
            m = htmldecode(m);
            if (range.s.r > R)
              range.s.r = R;
            if (range.e.r < R)
              range.e.r = R;
            if (range.s.c > C)
              range.s.c = C;
            if (range.e.c < C)
              range.e.c = C;
            if (!m.length)
              continue;
            var o = { t: "s", v: m };
            if (opts.raw || !m.trim().length || _t == "s")
              ;
            else if (m === "TRUE")
              o = { t: "b", v: true };
            else if (m === "FALSE")
              o = { t: "b", v: false };
            else if (!isNaN(fuzzynum(m)))
              o = { t: "n", v: fuzzynum(m) };
            else if (!isNaN(fuzzydate(m).getDate())) {
              o = { t: "d", v: parseDate(m) };
              if (!opts.cellDates)
                o = { t: "n", v: datenum(o.v) };
              o.z = opts.dateNF || SSF._table[14];
            }
            if (opts.dense) {
              if (!ws[R])
                ws[R] = [];
              ws[R][C] = o;
            } else
              ws[encode_cell({ r: R, c: C })] = o;
            C += CS;
          }
        }
        ws["!ref"] = encode_range(range);
        if (merges.length)
          ws["!merges"] = merges;
        return ws;
      }
      function html_to_book(str, opts) {
        return sheet_to_workbook(html_to_sheet(str, opts), opts);
      }
      function make_html_row(ws, r, R, o) {
        var M = ws["!merges"] || [];
        var oo = [];
        for (var C = r.s.c; C <= r.e.c; ++C) {
          var RS = 0, CS = 0;
          for (var j2 = 0; j2 < M.length; ++j2) {
            if (M[j2].s.r > R || M[j2].s.c > C)
              continue;
            if (M[j2].e.r < R || M[j2].e.c < C)
              continue;
            if (M[j2].s.r < R || M[j2].s.c < C) {
              RS = -1;
              break;
            }
            RS = M[j2].e.r - M[j2].s.r + 1;
            CS = M[j2].e.c - M[j2].s.c + 1;
            break;
          }
          if (RS < 0)
            continue;
          var coord = encode_cell({ r: R, c: C });
          var cell = o.dense ? (ws[R] || [])[C] : ws[coord];
          var w = cell && cell.v != null && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || "")) || "";
          var sp = {};
          if (RS > 1)
            sp.rowspan = RS;
          if (CS > 1)
            sp.colspan = CS;
          sp.t = cell && cell.t || "z";
          if (o.editable)
            w = '<span contenteditable="true">' + w + "</span>";
          sp.id = (o.id || "sjs") + "-" + coord;
          oo.push(writextag("td", w, sp));
        }
        var preamble = "<tr>";
        return preamble + oo.join("") + "</tr>";
      }
      function make_html_preamble(ws, R, o) {
        var out = [];
        return out.join("") + "<table" + (o && o.id ? ' id="' + o.id + '"' : "") + ">";
      }
      var _BEGIN = '<html><head><meta charset="utf-8"/><title>SheetJS Table Export</title></head><body>';
      var _END = "</body></html>";
      function sheet_to_html(ws, opts) {
        var o = opts || {};
        var header = o.header != null ? o.header : _BEGIN;
        var footer = o.footer != null ? o.footer : _END;
        var out = [header];
        var r = decode_range(ws["!ref"]);
        o.dense = Array.isArray(ws);
        out.push(make_html_preamble(ws, r, o));
        for (var R = r.s.r; R <= r.e.r; ++R)
          out.push(make_html_row(ws, r, R, o));
        out.push("</table>" + footer);
        return out.join("");
      }
      return {
        to_workbook: html_to_book,
        to_sheet: html_to_sheet,
        _row: make_html_row,
        BEGIN: _BEGIN,
        END: _END,
        _preamble: make_html_preamble,
        from_sheet: sheet_to_html
      };
    }();
    function parse_dom_table(table, _opts) {
      var opts = _opts || {};
      var ws = opts.dense ? [] : {};
      var rows = table.getElementsByTagName("tr");
      var sheetRows = opts.sheetRows || 1e7;
      var range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
      var merges = [], midx = 0;
      var rowinfo = [];
      var _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0;
      for (; _R < rows.length && R < sheetRows; ++_R) {
        var row = rows[_R];
        if (is_dom_element_hidden(row)) {
          if (opts.display)
            continue;
          rowinfo[R] = { hidden: true };
        }
        var elts = row.children;
        for (_C = C = 0; _C < elts.length; ++_C) {
          var elt = elts[_C];
          if (opts.display && is_dom_element_hidden(elt))
            continue;
          var v = htmldecode(elt.innerHTML);
          for (midx = 0; midx < merges.length; ++midx) {
            var m = merges[midx];
            if (m.s.c == C && m.s.r <= R && R <= m.e.r) {
              C = m.e.c + 1;
              midx = -1;
            }
          }
          CS = +elt.getAttribute("colspan") || 1;
          if ((RS = +elt.getAttribute("rowspan")) > 0 || CS > 1)
            merges.push({ s: { r: R, c: C }, e: { r: R + (RS || 1) - 1, c: C + CS - 1 } });
          var o = { t: "s", v };
          var _t = elt.getAttribute("t") || "";
          if (v != null) {
            if (v.length == 0)
              o.t = _t || "z";
            else if (opts.raw || v.trim().length == 0 || _t == "s")
              ;
            else if (v === "TRUE")
              o = { t: "b", v: true };
            else if (v === "FALSE")
              o = { t: "b", v: false };
            else if (!isNaN(fuzzynum(v)))
              o = { t: "n", v: fuzzynum(v) };
            else if (!isNaN(fuzzydate(v).getDate())) {
              o = { t: "d", v: parseDate(v) };
              if (!opts.cellDates)
                o = { t: "n", v: datenum(o.v) };
              o.z = opts.dateNF || SSF._table[14];
            }
          }
          if (opts.dense) {
            if (!ws[R])
              ws[R] = [];
            ws[R][C] = o;
          } else
            ws[encode_cell({ c: C, r: R })] = o;
          if (range.e.c < C)
            range.e.c = C;
          C += CS;
        }
        ++R;
      }
      if (merges.length)
        ws["!merges"] = merges;
      if (rowinfo.length)
        ws["!rows"] = rowinfo;
      range.e.r = R - 1;
      ws["!ref"] = encode_range(range);
      if (R >= sheetRows)
        ws["!fullref"] = encode_range((range.e.r = rows.length - _R + R - 1, range));
      return ws;
    }
    function table_to_book(table, opts) {
      return sheet_to_workbook(parse_dom_table(table, opts), opts);
    }
    function is_dom_element_hidden(element) {
      var display = "";
      var get_computed_style = get_get_computed_style_function(element);
      if (get_computed_style)
        display = get_computed_style(element).getPropertyValue("display");
      if (!display)
        display = element.style.display;
      return display === "none";
    }
    function get_get_computed_style_function(element) {
      if (element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === "function")
        return element.ownerDocument.defaultView.getComputedStyle;
      if (typeof getComputedStyle === "function")
        return getComputedStyle;
      return null;
    }
    var parse_content_xml = function() {
      var parse_text_p = function(text) {
        var fixed = text.replace(/[\t\r\n]/g, " ").trim().replace(/ +/g, " ").replace(/<text:s\/>/g, " ").replace(/<text:s text:c="(\d+)"\/>/g, function($$, $1) {
          return Array(parseInt($1, 10) + 1).join(" ");
        }).replace(/<text:tab[^>]*\/>/g, "	").replace(/<text:line-break\/>/g, "\n");
        var v = unescapexml(fixed.replace(/<[^>]*>/g, ""));
        return [v];
      };
      var number_formats = {
        /* ods name: [short ssf fmt, long ssf fmt] */
        day: ["d", "dd"],
        month: ["m", "mm"],
        year: ["y", "yy"],
        hours: ["h", "hh"],
        minutes: ["m", "mm"],
        seconds: ["s", "ss"],
        "am-pm": ["A/P", "AM/PM"],
        "day-of-week": ["ddd", "dddd"],
        era: ["e", "ee"],
        /* there is no native representation of LO "Q" format */
        quarter: ["\\Qm", 'm\\"th quarter"']
      };
      return function pcx(d, _opts) {
        var opts = _opts || {};
        var str = xlml_normalize(d);
        var state = [], tmp;
        var tag;
        var NFtag = { name: "" }, NF = "", pidx = 0;
        var sheetag;
        var rowtag;
        var Sheets = {}, SheetNames = [];
        var ws = opts.dense ? [] : {};
        var Rn, q;
        var ctag = { value: "" };
        var textp = "", textpidx = 0;
        var textR = [];
        var R = -1, C = -1, range = { s: { r: 1e6, c: 1e7 }, e: { r: 0, c: 0 } };
        var row_ol = 0;
        var number_format_map = {};
        var merges = [], mrange = {}, mR = 0, mC = 0;
        var rowinfo = [], rowpeat = 1, colpeat = 1;
        var arrayf = [];
        var WB = { Names: [] };
        var atag = {};
        var _Ref = ["", ""];
        var comments = [], comment = {};
        var creator = "", creatoridx = 0;
        var isstub = false, intable = false;
        var i3 = 0;
        xlmlregex.lastIndex = 0;
        str = str.replace(/<!--([\s\S]*?)-->/mg, "").replace(/<!DOCTYPE[^\[]*\[[^\]]*\]>/gm, "");
        while (Rn = xlmlregex.exec(str))
          switch (Rn[3] = Rn[3].replace(/_.*$/, "")) {
            case "table":
            case "工作表":
              if (Rn[1] === "/") {
                if (range.e.c >= range.s.c && range.e.r >= range.s.r)
                  ws["!ref"] = encode_range(range);
                if (opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {
                  ws["!fullref"] = ws["!ref"];
                  range.e.r = opts.sheetRows - 1;
                  ws["!ref"] = encode_range(range);
                }
                if (merges.length)
                  ws["!merges"] = merges;
                if (rowinfo.length)
                  ws["!rows"] = rowinfo;
                sheetag.name = sheetag["名称"] || sheetag.name;
                if (typeof JSON !== "undefined")
                  JSON.stringify(sheetag);
                SheetNames.push(sheetag.name);
                Sheets[sheetag.name] = ws;
                intable = false;
              } else if (Rn[0].charAt(Rn[0].length - 2) !== "/") {
                sheetag = parsexmltag(Rn[0], false);
                R = C = -1;
                range.s.r = range.s.c = 1e7;
                range.e.r = range.e.c = 0;
                ws = opts.dense ? [] : {};
                merges = [];
                rowinfo = [];
                intable = true;
              }
              break;
            case "table-row-group":
              if (Rn[1] === "/")
                --row_ol;
              else
                ++row_ol;
              break;
            case "table-row":
            case "行":
              if (Rn[1] === "/") {
                R += rowpeat;
                rowpeat = 1;
                break;
              }
              rowtag = parsexmltag(Rn[0], false);
              if (rowtag["行号"])
                R = rowtag["行号"] - 1;
              else if (R == -1)
                R = 0;
              rowpeat = +rowtag["number-rows-repeated"] || 1;
              if (rowpeat < 10) {
                for (i3 = 0; i3 < rowpeat; ++i3)
                  if (row_ol > 0)
                    rowinfo[R + i3] = { level: row_ol };
              }
              C = -1;
              break;
            case "covered-table-cell":
              if (Rn[1] !== "/")
                ++C;
              if (opts.sheetStubs) {
                if (opts.dense) {
                  if (!ws[R])
                    ws[R] = [];
                  ws[R][C] = { t: "z" };
                } else
                  ws[encode_cell({ r: R, c: C })] = { t: "z" };
              }
              textp = "";
              textR = [];
              break;
            case "table-cell":
            case "数据":
              if (Rn[0].charAt(Rn[0].length - 2) === "/") {
                ++C;
                ctag = parsexmltag(Rn[0], false);
                colpeat = parseInt(ctag["number-columns-repeated"] || "1", 10);
                q = { t: "z", v: null };
                if (ctag.formula && opts.cellFormula != false)
                  q.f = ods_to_csf_formula(unescapexml(ctag.formula));
                if ((ctag["数据类型"] || ctag["value-type"]) == "string") {
                  q.t = "s";
                  q.v = unescapexml(ctag["string-value"] || "");
                  if (opts.dense) {
                    if (!ws[R])
                      ws[R] = [];
                    ws[R][C] = q;
                  } else {
                    ws[encode_cell({ r: R, c: C })] = q;
                  }
                }
                C += colpeat - 1;
              } else if (Rn[1] !== "/") {
                ++C;
                colpeat = 1;
                var rptR = rowpeat ? R + rowpeat - 1 : R;
                if (C > range.e.c)
                  range.e.c = C;
                if (C < range.s.c)
                  range.s.c = C;
                if (R < range.s.r)
                  range.s.r = R;
                if (rptR > range.e.r)
                  range.e.r = rptR;
                ctag = parsexmltag(Rn[0], false);
                comments = [];
                comment = {};
                q = { t: ctag["数据类型"] || ctag["value-type"], v: null };
                if (opts.cellFormula) {
                  if (ctag.formula)
                    ctag.formula = unescapexml(ctag.formula);
                  if (ctag["number-matrix-columns-spanned"] && ctag["number-matrix-rows-spanned"]) {
                    mR = parseInt(ctag["number-matrix-rows-spanned"], 10) || 0;
                    mC = parseInt(ctag["number-matrix-columns-spanned"], 10) || 0;
                    mrange = { s: { r: R, c: C }, e: { r: R + mR - 1, c: C + mC - 1 } };
                    q.F = encode_range(mrange);
                    arrayf.push([mrange, q.F]);
                  }
                  if (ctag.formula)
                    q.f = ods_to_csf_formula(ctag.formula);
                  else
                    for (i3 = 0; i3 < arrayf.length; ++i3)
                      if (R >= arrayf[i3][0].s.r && R <= arrayf[i3][0].e.r) {
                        if (C >= arrayf[i3][0].s.c && C <= arrayf[i3][0].e.c)
                          q.F = arrayf[i3][1];
                      }
                }
                if (ctag["number-columns-spanned"] || ctag["number-rows-spanned"]) {
                  mR = parseInt(ctag["number-rows-spanned"], 10) || 0;
                  mC = parseInt(ctag["number-columns-spanned"], 10) || 0;
                  mrange = { s: { r: R, c: C }, e: { r: R + mR - 1, c: C + mC - 1 } };
                  merges.push(mrange);
                }
                if (ctag["number-columns-repeated"])
                  colpeat = parseInt(ctag["number-columns-repeated"], 10);
                switch (q.t) {
                  case "boolean":
                    q.t = "b";
                    q.v = parsexmlbool(ctag["boolean-value"]);
                    break;
                  case "float":
                    q.t = "n";
                    q.v = parseFloat(ctag.value);
                    break;
                  case "percentage":
                    q.t = "n";
                    q.v = parseFloat(ctag.value);
                    break;
                  case "currency":
                    q.t = "n";
                    q.v = parseFloat(ctag.value);
                    break;
                  case "date":
                    q.t = "d";
                    q.v = parseDate(ctag["date-value"]);
                    if (!opts.cellDates) {
                      q.t = "n";
                      q.v = datenum(q.v);
                    }
                    q.z = "m/d/yy";
                    break;
                  case "time":
                    q.t = "n";
                    q.v = parse_isodur(ctag["time-value"]) / 86400;
                    break;
                  case "number":
                    q.t = "n";
                    q.v = parseFloat(ctag["数据数值"]);
                    break;
                  default:
                    if (q.t === "string" || q.t === "text" || !q.t) {
                      q.t = "s";
                      if (ctag["string-value"] != null) {
                        textp = unescapexml(ctag["string-value"]);
                        textR = [];
                      }
                    } else
                      throw new Error("Unsupported value type " + q.t);
                }
              } else {
                isstub = false;
                if (q.t === "s") {
                  q.v = textp || "";
                  if (textR.length)
                    q.R = textR;
                  isstub = textpidx == 0;
                }
                if (atag.Target)
                  q.l = atag;
                if (comments.length > 0) {
                  q.c = comments;
                  comments = [];
                }
                if (textp && opts.cellText !== false)
                  q.w = textp;
                if (isstub) {
                  q.t = "z";
                  delete q.v;
                }
                if (!isstub || opts.sheetStubs) {
                  if (!(opts.sheetRows && opts.sheetRows <= R)) {
                    for (var rpt = 0; rpt < rowpeat; ++rpt) {
                      colpeat = parseInt(ctag["number-columns-repeated"] || "1", 10);
                      if (opts.dense) {
                        if (!ws[R + rpt])
                          ws[R + rpt] = [];
                        ws[R + rpt][C] = rpt == 0 ? q : dup(q);
                        while (--colpeat > 0)
                          ws[R + rpt][C + colpeat] = dup(q);
                      } else {
                        ws[encode_cell({ r: R + rpt, c: C })] = q;
                        while (--colpeat > 0)
                          ws[encode_cell({ r: R + rpt, c: C + colpeat })] = dup(q);
                      }
                      if (range.e.c <= C)
                        range.e.c = C;
                    }
                  }
                }
                colpeat = parseInt(ctag["number-columns-repeated"] || "1", 10);
                C += colpeat - 1;
                colpeat = 0;
                q = {};
                textp = "";
                textR = [];
              }
              atag = {};
              break;
            case "document":
            case "document-content":
            case "电子表格文档":
            case "spreadsheet":
            case "主体":
            case "scripts":
            case "styles":
            case "font-face-decls":
              if (Rn[1] === "/") {
                if ((tmp = state.pop())[0] !== Rn[3])
                  throw "Bad state: " + tmp;
              } else if (Rn[0].charAt(Rn[0].length - 2) !== "/")
                state.push([Rn[3], true]);
              break;
            case "annotation":
              if (Rn[1] === "/") {
                if ((tmp = state.pop())[0] !== Rn[3])
                  throw "Bad state: " + tmp;
                comment.t = textp;
                if (textR.length)
                  comment.R = textR;
                comment.a = creator;
                comments.push(comment);
              } else if (Rn[0].charAt(Rn[0].length - 2) !== "/") {
                state.push([Rn[3], false]);
              }
              creator = "";
              creatoridx = 0;
              textp = "";
              textpidx = 0;
              textR = [];
              break;
            case "creator":
              if (Rn[1] === "/") {
                creator = str.slice(creatoridx, Rn.index);
              } else
                creatoridx = Rn.index + Rn[0].length;
              break;
            case "meta":
            case "元数据":
            case "settings":
            case "config-item-set":
            case "config-item-map-indexed":
            case "config-item-map-entry":
            case "config-item-map-named":
            case "shapes":
            case "frame":
            case "text-box":
            case "image":
            case "data-pilot-tables":
            case "list-style":
            case "form":
            case "dde-links":
            case "event-listeners":
            case "chart":
              if (Rn[1] === "/") {
                if ((tmp = state.pop())[0] !== Rn[3])
                  throw "Bad state: " + tmp;
              } else if (Rn[0].charAt(Rn[0].length - 2) !== "/")
                state.push([Rn[3], false]);
              textp = "";
              textpidx = 0;
              textR = [];
              break;
            case "scientific-number":
              break;
            case "currency-symbol":
              break;
            case "currency-style":
              break;
            case "number-style":
            case "percentage-style":
            case "date-style":
            case "time-style":
              if (Rn[1] === "/") {
                number_format_map[NFtag.name] = NF;
                if ((tmp = state.pop())[0] !== Rn[3])
                  throw "Bad state: " + tmp;
              } else if (Rn[0].charAt(Rn[0].length - 2) !== "/") {
                NF = "";
                NFtag = parsexmltag(Rn[0], false);
                state.push([Rn[3], true]);
              }
              break;
            case "script":
              break;
            case "libraries":
              break;
            case "automatic-styles":
              break;
            case "master-styles":
              break;
            case "default-style":
            case "page-layout":
              break;
            case "style":
              break;
            case "map":
              break;
            case "font-face":
              break;
            case "paragraph-properties":
              break;
            case "table-properties":
              break;
            case "table-column-properties":
              break;
            case "table-row-properties":
              break;
            case "table-cell-properties":
              break;
            case "number":
              switch (state[state.length - 1][0]) {
                case "time-style":
                case "date-style":
                  tag = parsexmltag(Rn[0], false);
                  NF += number_formats[Rn[3]][tag.style === "long" ? 1 : 0];
                  break;
              }
              break;
            case "fraction":
              break;
            case "day":
            case "month":
            case "year":
            case "era":
            case "day-of-week":
            case "week-of-year":
            case "quarter":
            case "hours":
            case "minutes":
            case "seconds":
            case "am-pm":
              switch (state[state.length - 1][0]) {
                case "time-style":
                case "date-style":
                  tag = parsexmltag(Rn[0], false);
                  NF += number_formats[Rn[3]][tag.style === "long" ? 1 : 0];
                  break;
              }
              break;
            case "boolean-style":
              break;
            case "boolean":
              break;
            case "text-style":
              break;
            case "text":
              if (Rn[0].slice(-2) === "/>")
                break;
              else if (Rn[1] === "/")
                switch (state[state.length - 1][0]) {
                  case "number-style":
                  case "date-style":
                  case "time-style":
                    NF += str.slice(pidx, Rn.index);
                    break;
                }
              else
                pidx = Rn.index + Rn[0].length;
              break;
            case "named-range":
              tag = parsexmltag(Rn[0], false);
              _Ref = ods_to_csf_3D(tag["cell-range-address"]);
              var nrange = { Name: tag.name, Ref: _Ref[0] + "!" + _Ref[1] };
              if (intable)
                nrange.Sheet = SheetNames.length;
              WB.Names.push(nrange);
              break;
            case "text-content":
              break;
            case "text-properties":
              break;
            case "embedded-text":
              break;
            case "body":
            case "电子表格":
              break;
            case "forms":
              break;
            case "table-column":
              break;
            case "table-header-rows":
              break;
            case "table-rows":
              break;
            case "table-column-group":
              break;
            case "table-header-columns":
              break;
            case "table-columns":
              break;
            case "null-date":
              break;
            case "graphic-properties":
              break;
            case "calculation-settings":
              break;
            case "named-expressions":
              break;
            case "label-range":
              break;
            case "label-ranges":
              break;
            case "named-expression":
              break;
            case "sort":
              break;
            case "sort-by":
              break;
            case "sort-groups":
              break;
            case "tab":
              break;
            case "line-break":
              break;
            case "span":
              break;
            case "p":
            case "文本串":
              if (Rn[1] === "/" && (!ctag || !ctag["string-value"])) {
                var ptp = parse_text_p(str.slice(textpidx, Rn.index));
                textp = (textp.length > 0 ? textp + "\n" : "") + ptp[0];
              } else {
                parsexmltag(Rn[0], false);
                textpidx = Rn.index + Rn[0].length;
              }
              break;
            case "s":
              break;
            case "database-range":
              if (Rn[1] === "/")
                break;
              try {
                _Ref = ods_to_csf_3D(parsexmltag(Rn[0])["target-range-address"]);
                Sheets[_Ref[0]]["!autofilter"] = { ref: _Ref[1] };
              } catch (e) {
              }
              break;
            case "date":
              break;
            case "object":
              break;
            case "title":
            case "标题":
              break;
            case "desc":
              break;
            case "binary-data":
              break;
            case "table-source":
              break;
            case "scenario":
              break;
            case "iteration":
              break;
            case "content-validations":
              break;
            case "content-validation":
              break;
            case "help-message":
              break;
            case "error-message":
              break;
            case "database-ranges":
              break;
            case "filter":
              break;
            case "filter-and":
              break;
            case "filter-or":
              break;
            case "filter-condition":
              break;
            case "list-level-style-bullet":
              break;
            case "list-level-style-number":
              break;
            case "list-level-properties":
              break;
            case "sender-firstname":
            case "sender-lastname":
            case "sender-initials":
            case "sender-title":
            case "sender-position":
            case "sender-email":
            case "sender-phone-private":
            case "sender-fax":
            case "sender-company":
            case "sender-phone-work":
            case "sender-street":
            case "sender-city":
            case "sender-postal-code":
            case "sender-country":
            case "sender-state-or-province":
            case "author-name":
            case "author-initials":
            case "chapter":
            case "file-name":
            case "template-name":
            case "sheet-name":
              break;
            case "event-listener":
              break;
            case "initial-creator":
            case "creation-date":
            case "print-date":
            case "generator":
            case "document-statistic":
            case "user-defined":
            case "editing-duration":
            case "editing-cycles":
              break;
            case "config-item":
              break;
            case "page-number":
              break;
            case "page-count":
              break;
            case "time":
              break;
            case "cell-range-source":
              break;
            case "detective":
              break;
            case "operation":
              break;
            case "highlighted-range":
              break;
            case "data-pilot-table":
            case "source-cell-range":
            case "source-service":
            case "data-pilot-field":
            case "data-pilot-level":
            case "data-pilot-subtotals":
            case "data-pilot-subtotal":
            case "data-pilot-members":
            case "data-pilot-member":
            case "data-pilot-display-info":
            case "data-pilot-sort-info":
            case "data-pilot-layout-info":
            case "data-pilot-field-reference":
            case "data-pilot-groups":
            case "data-pilot-group":
            case "data-pilot-group-member":
              break;
            case "rect":
              break;
            case "dde-connection-decls":
            case "dde-connection-decl":
            case "dde-link":
            case "dde-source":
              break;
            case "properties":
              break;
            case "property":
              break;
            case "a":
              if (Rn[1] !== "/") {
                atag = parsexmltag(Rn[0], false);
                if (!atag.href)
                  break;
                atag.Target = atag.href;
                delete atag.href;
                if (atag.Target.charAt(0) == "#" && atag.Target.indexOf(".") > -1) {
                  _Ref = ods_to_csf_3D(atag.Target.slice(1));
                  atag.Target = "#" + _Ref[0] + "!" + _Ref[1];
                }
              }
              break;
            case "table-protection":
              break;
            case "data-pilot-grand-total":
              break;
            case "office-document-common-attrs":
              break;
            default:
              switch (Rn[2]) {
                case "dc:":
                case "calcext:":
                case "loext:":
                case "ooo:":
                case "chartooo:":
                case "draw:":
                case "style:":
                case "chart:":
                case "form:":
                case "uof:":
                case "表:":
                case "字:":
                  break;
                default:
                  if (opts.WTF)
                    throw new Error(Rn);
              }
          }
        var out = {
          Sheets,
          SheetNames,
          Workbook: WB
        };
        if (opts.bookSheets)
          delete out.Sheets;
        return out;
      };
    }();
    function parse_ods(zip, opts) {
      opts = opts || {};
      var ods = !!safegetzipfile(zip, "objectdata");
      if (ods)
        parse_manifest(getzipdata(zip, "META-INF/manifest.xml"), opts);
      var content = getzipstr(zip, "content.xml");
      if (!content)
        throw new Error("Missing content.xml in " + (ods ? "ODS" : "UOF") + " file");
      var wb = parse_content_xml(ods ? content : utf8read(content), opts);
      if (safegetzipfile(zip, "meta.xml"))
        wb.Props = parse_core_props(getzipdata(zip, "meta.xml"));
      return wb;
    }
    function parse_fods(data, opts) {
      return parse_content_xml(data, opts);
    }
    var write_styles_ods = function() {
      var payload = "<office:document-styles " + wxt_helper({
        "xmlns:office": "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
        "xmlns:table": "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
        "xmlns:style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
        "xmlns:text": "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
        "xmlns:draw": "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
        "xmlns:fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
        "xmlns:xlink": "http://www.w3.org/1999/xlink",
        "xmlns:dc": "http://purl.org/dc/elements/1.1/",
        "xmlns:number": "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
        "xmlns:svg": "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
        "xmlns:of": "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
        "office:version": "1.2"
      }) + "></office:document-styles>";
      return function wso() {
        return XML_HEADER + payload;
      };
    }();
    var write_content_ods = function() {
      var write_text_p = function(text) {
        return escapexml(text).replace(/  +/g, function($$) {
          return '<text:s text:c="' + $$.length + '"/>';
        }).replace(/\t/g, "<text:tab/>").replace(/\n/g, "<text:line-break/>").replace(/^ /, "<text:s/>").replace(/ $/, "<text:s/>");
      };
      var null_cell_xml = "          <table:table-cell />\n";
      var covered_cell_xml = "          <table:covered-table-cell/>\n";
      var write_ws2 = function(ws, wb, i3) {
        var o = [];
        o.push('      <table:table table:name="' + escapexml(wb.SheetNames[i3]) + '">\n');
        var R = 0, C = 0, range = decode_range(ws["!ref"]);
        var marr = ws["!merges"] || [], mi = 0;
        var dense = Array.isArray(ws);
        for (R = 0; R < range.s.r; ++R)
          o.push("        <table:table-row></table:table-row>\n");
        for (; R <= range.e.r; ++R) {
          o.push("        <table:table-row>\n");
          for (C = 0; C < range.s.c; ++C)
            o.push(null_cell_xml);
          for (; C <= range.e.c; ++C) {
            var skip = false, ct = {}, textp = "";
            for (mi = 0; mi != marr.length; ++mi) {
              if (marr[mi].s.c > C)
                continue;
              if (marr[mi].s.r > R)
                continue;
              if (marr[mi].e.c < C)
                continue;
              if (marr[mi].e.r < R)
                continue;
              if (marr[mi].s.c != C || marr[mi].s.r != R)
                skip = true;
              ct["table:number-columns-spanned"] = marr[mi].e.c - marr[mi].s.c + 1;
              ct["table:number-rows-spanned"] = marr[mi].e.r - marr[mi].s.r + 1;
              break;
            }
            if (skip) {
              o.push(covered_cell_xml);
              continue;
            }
            var ref2 = encode_cell({ r: R, c: C }), cell = dense ? (ws[R] || [])[C] : ws[ref2];
            if (cell && cell.f) {
              ct["table:formula"] = escapexml(csf_to_ods_formula(cell.f));
              if (cell.F) {
                if (cell.F.slice(0, ref2.length) == ref2) {
                  var _Fref = decode_range(cell.F);
                  ct["table:number-matrix-columns-spanned"] = _Fref.e.c - _Fref.s.c + 1;
                  ct["table:number-matrix-rows-spanned"] = _Fref.e.r - _Fref.s.r + 1;
                }
              }
            }
            if (!cell) {
              o.push(null_cell_xml);
              continue;
            }
            switch (cell.t) {
              case "b":
                textp = cell.v ? "TRUE" : "FALSE";
                ct["office:value-type"] = "boolean";
                ct["office:boolean-value"] = cell.v ? "true" : "false";
                break;
              case "n":
                textp = cell.w || String(cell.v || 0);
                ct["office:value-type"] = "float";
                ct["office:value"] = cell.v || 0;
                break;
              case "s":
              case "str":
                textp = cell.v;
                ct["office:value-type"] = "string";
                break;
              case "d":
                textp = cell.w || parseDate(cell.v).toISOString();
                ct["office:value-type"] = "date";
                ct["office:date-value"] = parseDate(cell.v).toISOString();
                ct["table:style-name"] = "ce1";
                break;
              default:
                o.push(null_cell_xml);
                continue;
            }
            var text_p = write_text_p(textp);
            if (cell.l && cell.l.Target) {
              var _tgt = cell.l.Target;
              _tgt = _tgt.charAt(0) == "#" ? "#" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;
              text_p = writextag("text:a", text_p, { "xlink:href": _tgt });
            }
            o.push("          " + writextag("table:table-cell", writextag("text:p", text_p, {}), ct) + "\n");
          }
          o.push("        </table:table-row>\n");
        }
        o.push("      </table:table>\n");
        return o.join("");
      };
      var write_automatic_styles_ods = function(o) {
        o.push(" <office:automatic-styles>\n");
        o.push('  <number:date-style style:name="N37" number:automatic-order="true">\n');
        o.push('   <number:month number:style="long"/>\n');
        o.push("   <number:text>/</number:text>\n");
        o.push('   <number:day number:style="long"/>\n');
        o.push("   <number:text>/</number:text>\n");
        o.push("   <number:year/>\n");
        o.push("  </number:date-style>\n");
        o.push('  <style:style style:name="ta1" style:family="table">\n');
        o.push('   <style:table-properties table:display="true" style:writing-mode="lr-tb"/>\n');
        o.push("  </style:style>\n");
        o.push('  <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default" style:data-style-name="N37"/>\n');
        o.push(" </office:automatic-styles>\n");
      };
      return function wcx(wb, opts) {
        var o = [XML_HEADER];
        var attr = wxt_helper({
          "xmlns:office": "urn:oasis:names:tc:opendocument:xmlns:office:1.0",
          "xmlns:table": "urn:oasis:names:tc:opendocument:xmlns:table:1.0",
          "xmlns:style": "urn:oasis:names:tc:opendocument:xmlns:style:1.0",
          "xmlns:text": "urn:oasis:names:tc:opendocument:xmlns:text:1.0",
          "xmlns:draw": "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0",
          "xmlns:fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0",
          "xmlns:xlink": "http://www.w3.org/1999/xlink",
          "xmlns:dc": "http://purl.org/dc/elements/1.1/",
          "xmlns:meta": "urn:oasis:names:tc:opendocument:xmlns:meta:1.0",
          "xmlns:number": "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0",
          "xmlns:presentation": "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0",
          "xmlns:svg": "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0",
          "xmlns:chart": "urn:oasis:names:tc:opendocument:xmlns:chart:1.0",
          "xmlns:dr3d": "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0",
          "xmlns:math": "http://www.w3.org/1998/Math/MathML",
          "xmlns:form": "urn:oasis:names:tc:opendocument:xmlns:form:1.0",
          "xmlns:script": "urn:oasis:names:tc:opendocument:xmlns:script:1.0",
          "xmlns:ooo": "http://openoffice.org/2004/office",
          "xmlns:ooow": "http://openoffice.org/2004/writer",
          "xmlns:oooc": "http://openoffice.org/2004/calc",
          "xmlns:dom": "http://www.w3.org/2001/xml-events",
          "xmlns:xforms": "http://www.w3.org/2002/xforms",
          "xmlns:xsd": "http://www.w3.org/2001/XMLSchema",
          "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance",
          "xmlns:sheet": "urn:oasis:names:tc:opendocument:sh33tjs:1.0",
          "xmlns:rpt": "http://openoffice.org/2005/report",
          "xmlns:of": "urn:oasis:names:tc:opendocument:xmlns:of:1.2",
          "xmlns:xhtml": "http://www.w3.org/1999/xhtml",
          "xmlns:grddl": "http://www.w3.org/2003/g/data-view#",
          "xmlns:tableooo": "http://openoffice.org/2009/table",
          "xmlns:drawooo": "http://openoffice.org/2010/draw",
          "xmlns:calcext": "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0",
          "xmlns:loext": "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0",
          "xmlns:field": "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0",
          "xmlns:formx": "urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0",
          "xmlns:css3t": "http://www.w3.org/TR/css3-text/",
          "office:version": "1.2"
        });
        var fods = wxt_helper({
          "xmlns:config": "urn:oasis:names:tc:opendocument:xmlns:config:1.0",
          "office:mimetype": "application/vnd.oasis.opendocument.spreadsheet"
        });
        if (opts.bookType == "fods")
          o.push("<office:document" + attr + fods + ">\n");
        else
          o.push("<office:document-content" + attr + ">\n");
        write_automatic_styles_ods(o);
        o.push("  <office:body>\n");
        o.push("    <office:spreadsheet>\n");
        for (var i3 = 0; i3 != wb.SheetNames.length; ++i3)
          o.push(write_ws2(wb.Sheets[wb.SheetNames[i3]], wb, i3));
        o.push("    </office:spreadsheet>\n");
        o.push("  </office:body>\n");
        if (opts.bookType == "fods")
          o.push("</office:document>");
        else
          o.push("</office:document-content>");
        return o.join("");
      };
    }();
    function write_ods(wb, opts) {
      if (opts.bookType == "fods")
        return write_content_ods(wb, opts);
      var zip = zip_new();
      var f = "";
      var manifest = [];
      var rdf = [];
      f = "mimetype";
      zip_add_file(zip, f, "application/vnd.oasis.opendocument.spreadsheet");
      f = "content.xml";
      zip_add_file(zip, f, write_content_ods(wb, opts));
      manifest.push([f, "text/xml"]);
      rdf.push([f, "ContentFile"]);
      f = "styles.xml";
      zip_add_file(zip, f, write_styles_ods(wb, opts));
      manifest.push([f, "text/xml"]);
      rdf.push([f, "StylesFile"]);
      f = "meta.xml";
      zip_add_file(zip, f, write_meta_ods());
      manifest.push([f, "text/xml"]);
      rdf.push([f, "MetadataFile"]);
      f = "manifest.rdf";
      zip_add_file(zip, f, write_rdf(
        rdf
        /*, opts*/
      ));
      manifest.push([f, "application/rdf+xml"]);
      f = "META-INF/manifest.xml";
      zip_add_file(zip, f, write_manifest(
        manifest
        /*, opts*/
      ));
      return zip;
    }
    function write_sheet_index(wb, sheet) {
      if (!sheet)
        return 0;
      var idx = wb.SheetNames.indexOf(sheet);
      if (idx == -1)
        throw new Error("Sheet not found: " + sheet);
      return idx;
    }
    function write_obj_str(factory) {
      return function write_str(wb, o) {
        var idx = write_sheet_index(wb, o.sheet);
        return factory.from_sheet(wb.Sheets[wb.SheetNames[idx]], o, wb);
      };
    }
    var write_htm_str = write_obj_str(HTML_);
    var write_csv_str = write_obj_str({ from_sheet: sheet_to_csv });
    var write_slk_str = write_obj_str(typeof SYLK !== "undefined" ? SYLK : {});
    var write_dif_str = write_obj_str(typeof DIF !== "undefined" ? DIF : {});
    var write_prn_str = write_obj_str(typeof PRN !== "undefined" ? PRN : {});
    var write_rtf_str = write_obj_str(typeof RTF !== "undefined" ? RTF : {});
    var write_txt_str = write_obj_str({ from_sheet: sheet_to_txt });
    var write_dbf_buf = write_obj_str(typeof DBF !== "undefined" ? DBF : {});
    var write_eth_str = write_obj_str(typeof ETH !== "undefined" ? ETH : {});
    function fix_opts_func(defaults) {
      return function fix_opts(opts) {
        for (var i3 = 0; i3 != defaults.length; ++i3) {
          var d = defaults[i3];
          if (opts[d[0]] === void 0)
            opts[d[0]] = d[1];
          if (d[2] === "n")
            opts[d[0]] = Number(opts[d[0]]);
        }
      };
    }
    var fix_read_opts = fix_opts_func([
      ["cellNF", false],
      /* emit cell number format string as .z */
      ["cellHTML", true],
      /* emit html string as .h */
      ["cellFormula", true],
      /* emit formulae as .f */
      ["cellStyles", false],
      /* emits style/theme as .s */
      ["cellText", true],
      /* emit formatted text as .w */
      ["cellDates", false],
      /* emit date cells with type `d` */
      ["sheetStubs", false],
      /* emit empty cells */
      ["sheetRows", 0, "n"],
      /* read n rows (0 = read all rows) */
      ["bookDeps", false],
      /* parse calculation chains */
      ["bookSheets", false],
      /* only try to get sheet names (no Sheets) */
      ["bookProps", false],
      /* only try to get properties (no Sheets) */
      ["bookFiles", false],
      /* include raw file structure (keys, files, cfb) */
      ["bookVBA", false],
      /* include vba raw data (vbaraw) */
      ["password", ""],
      /* password */
      ["WTF", false]
      /* WTF mode (throws errors) */
    ]);
    var fix_write_opts = fix_opts_func([
      ["cellDates", false],
      /* write date cells with type `d` */
      ["bookSST", false],
      /* Generate Shared String Table */
      ["bookType", "xlsx"],
      /* Type of workbook (xlsx/m/b) */
      ["compression", false],
      /* Use file compression */
      ["WTF", false]
      /* WTF mode (throws errors) */
    ]);
    function get_sheet_type(n) {
      if (RELS.WS.indexOf(n) > -1)
        return "sheet";
      if (RELS.CS && n == RELS.CS)
        return "chart";
      if (RELS.DS && n == RELS.DS)
        return "dialog";
      if (RELS.MS && n == RELS.MS)
        return "macro";
      return n && n.length ? n : "sheet";
    }
    function safe_parse_wbrels(wbrels, sheets) {
      if (!wbrels)
        return 0;
      try {
        wbrels = sheets.map(function pwbr(w) {
          if (!w.id)
            w.id = w.strRelID;
          return [w.name, wbrels["!id"][w.id].Target, get_sheet_type(wbrels["!id"][w.id].Type)];
        });
      } catch (e) {
        return null;
      }
      return !wbrels || wbrels.length === 0 ? null : wbrels;
    }
    function safe_parse_sheet(zip, path, relsPath, sheet, idx, sheetRels, sheets, stype, opts, wb, themes, styles) {
      try {
        sheetRels[sheet] = parse_rels(getzipstr(zip, relsPath, true), path);
        var data = getzipdata(zip, path);
        var _ws;
        switch (stype) {
          case "sheet":
            _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
            break;
          case "chart":
            _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
            if (!_ws || !_ws["!drawel"])
              break;
            var dfile = resolve_path(_ws["!drawel"].Target, path);
            var drelsp = get_rels_path(dfile);
            var draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));
            var chartp = resolve_path(draw, dfile);
            var crelsp = get_rels_path(chartp);
            _ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);
            break;
          case "macro":
            _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
            break;
          case "dialog":
            _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);
            break;
          default:
            throw new Error("Unrecognized sheet type " + stype);
        }
        sheets[sheet] = _ws;
        var comments = [];
        if (sheetRels && sheetRels[sheet])
          keys(sheetRels[sheet]).forEach(function(n) {
            if (sheetRels[sheet][n].Type == RELS.CMNT) {
              var dfile2 = resolve_path(sheetRels[sheet][n].Target, path);
              comments = parse_cmnt(getzipdata(zip, dfile2, true), dfile2, opts);
              if (!comments || !comments.length)
                return;
              sheet_insert_comments(_ws, comments);
            }
          });
      } catch (e) {
        if (opts.WTF)
          throw e;
      }
    }
    function strip_front_slash(x) {
      return x.charAt(0) == "/" ? x.slice(1) : x;
    }
    function parse_zip(zip, opts) {
      make_ssf(SSF);
      opts = opts || {};
      fix_read_opts(opts);
      if (safegetzipfile(zip, "META-INF/manifest.xml"))
        return parse_ods(zip, opts);
      if (safegetzipfile(zip, "objectdata.xml"))
        return parse_ods(zip, opts);
      if (safegetzipfile(zip, "Index/Document.iwa"))
        throw new Error("Unsupported NUMBERS file");
      var entries = zipentries(zip);
      var dir = parse_ct(getzipstr(zip, "[Content_Types].xml"));
      var xlsb = false;
      var sheets, binname;
      if (dir.workbooks.length === 0) {
        binname = "xl/workbook.xml";
        if (getzipdata(zip, binname, true))
          dir.workbooks.push(binname);
      }
      if (dir.workbooks.length === 0) {
        binname = "xl/workbook.bin";
        if (!getzipdata(zip, binname, true))
          throw new Error("Could not find workbook");
        dir.workbooks.push(binname);
        xlsb = true;
      }
      if (dir.workbooks[0].slice(-3) == "bin")
        xlsb = true;
      var themes = {};
      var styles = {};
      if (!opts.bookSheets && !opts.bookProps) {
        strs = [];
        if (dir.sst)
          try {
            strs = parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts);
          } catch (e) {
            if (opts.WTF)
              throw e;
          }
        if (opts.cellStyles && dir.themes.length)
          themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\//, ""), true) || "", dir.themes[0], opts);
        if (dir.style)
          styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);
      }
      dir.links.map(function(link) {
        try {
          var rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);
          return parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);
        } catch (e) {
        }
      });
      var wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);
      var props = {}, propdata = "";
      if (dir.coreprops.length) {
        propdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);
        if (propdata)
          props = parse_core_props(propdata);
        if (dir.extprops.length !== 0) {
          propdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);
          if (propdata)
            parse_ext_props(propdata, props, opts);
        }
      }
      var custprops = {};
      if (!opts.bookSheets || opts.bookProps) {
        if (dir.custprops.length !== 0) {
          propdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);
          if (propdata)
            custprops = parse_cust_props(propdata, opts);
        }
      }
      var out = {};
      if (opts.bookSheets || opts.bookProps) {
        if (wb.Sheets)
          sheets = wb.Sheets.map(function pluck(x) {
            return x.name;
          });
        else if (props.Worksheets && props.SheetNames.length > 0)
          sheets = props.SheetNames;
        if (opts.bookProps) {
          out.Props = props;
          out.Custprops = custprops;
        }
        if (opts.bookSheets && typeof sheets !== "undefined")
          out.SheetNames = sheets;
        if (opts.bookSheets ? out.SheetNames : opts.bookProps)
          return out;
      }
      sheets = {};
      var deps = {};
      if (opts.bookDeps && dir.calcchain)
        deps = parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)), dir.calcchain);
      var i3 = 0;
      var sheetRels = {};
      var path, relsPath;
      {
        var wbsheets = wb.Sheets;
        props.Worksheets = wbsheets.length;
        props.SheetNames = [];
        for (var j2 = 0; j2 != wbsheets.length; ++j2) {
          props.SheetNames[j2] = wbsheets[j2].name;
        }
      }
      var wbext = xlsb ? "bin" : "xml";
      var wbrelsi = dir.workbooks[0].lastIndexOf("/");
      var wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi + 1) + "_rels/" + dir.workbooks[0].slice(wbrelsi + 1) + ".rels").replace(/^\//, "");
      if (!safegetzipfile(zip, wbrelsfile))
        wbrelsfile = "xl/_rels/workbook." + wbext + ".rels";
      var wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile);
      if (wbrels)
        wbrels = safe_parse_wbrels(wbrels, wb.Sheets);
      var nmode = getzipdata(zip, "xl/worksheets/sheet.xml", true) ? 1 : 0;
      wsloop:
        for (i3 = 0; i3 != props.Worksheets; ++i3) {
          var stype = "sheet";
          if (wbrels && wbrels[i3]) {
            path = "xl/" + wbrels[i3][1].replace(/[\/]?xl\//, "");
            if (!safegetzipfile(zip, path))
              path = wbrels[i3][1];
            if (!safegetzipfile(zip, path))
              path = wbrelsfile.replace(/_rels\/.*$/, "") + wbrels[i3][1];
            stype = wbrels[i3][2];
          } else {
            path = "xl/worksheets/sheet" + (i3 + 1 - nmode) + "." + wbext;
            path = path.replace(/sheet0\./, "sheet.");
          }
          relsPath = path.replace(/^(.*)(\/)([^\/]*)$/, "$1/_rels/$3.rels");
          if (opts && opts.sheets != null)
            switch (typeof opts.sheets) {
              case "number":
                if (i3 != opts.sheets)
                  continue wsloop;
                break;
              case "string":
                if (props.SheetNames[i3].toLowerCase() != opts.sheets.toLowerCase())
                  continue wsloop;
                break;
              default:
                if (Array.isArray && Array.isArray(opts.sheets)) {
                  var snjseen = false;
                  for (var snj = 0; snj != opts.sheets.length; ++snj) {
                    if (typeof opts.sheets[snj] == "number" && opts.sheets[snj] == i3)
                      snjseen = 1;
                    if (typeof opts.sheets[snj] == "string" && opts.sheets[snj].toLowerCase() == props.SheetNames[i3].toLowerCase())
                      snjseen = 1;
                  }
                  if (!snjseen)
                    continue wsloop;
                }
            }
          safe_parse_sheet(zip, path, relsPath, props.SheetNames[i3], i3, sheetRels, sheets, stype, opts, wb, themes, styles);
        }
      out = {
        Directory: dir,
        Workbook: wb,
        Props: props,
        Custprops: custprops,
        Deps: deps,
        Sheets: sheets,
        SheetNames: props.SheetNames,
        Strings: strs,
        Styles: styles,
        Themes: themes,
        SSF: SSF.get_table()
      };
      if (opts && opts.bookFiles) {
        out.keys = entries;
        out.files = zip.files;
      }
      if (opts && opts.bookVBA) {
        if (dir.vba.length > 0)
          out.vbaraw = getzipdata(zip, strip_front_slash(dir.vba[0]), true);
        else if (dir.defaults && dir.defaults.bin === CT_VBA)
          out.vbaraw = getzipdata(zip, "xl/vbaProject.bin", true);
      }
      return out;
    }
    function parse_xlsxcfb(cfb, _opts) {
      var opts = _opts || {};
      var f = "Workbook", data = CFB.find(cfb, f);
      try {
        f = "/!DataSpaces/Version";
        data = CFB.find(cfb, f);
        if (!data || !data.content)
          throw new Error("ECMA-376 Encrypted file missing " + f);
        parse_DataSpaceVersionInfo(data.content);
        f = "/!DataSpaces/DataSpaceMap";
        data = CFB.find(cfb, f);
        if (!data || !data.content)
          throw new Error("ECMA-376 Encrypted file missing " + f);
        var dsm = parse_DataSpaceMap(data.content);
        if (dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== "StrongEncryptionDataSpace" || dsm[0].comps[0].v !== "EncryptedPackage")
          throw new Error("ECMA-376 Encrypted file bad " + f);
        f = "/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace";
        data = CFB.find(cfb, f);
        if (!data || !data.content)
          throw new Error("ECMA-376 Encrypted file missing " + f);
        var seds = parse_DataSpaceDefinition(data.content);
        if (seds.length != 1 || seds[0] != "StrongEncryptionTransform")
          throw new Error("ECMA-376 Encrypted file bad " + f);
        f = "/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary";
        data = CFB.find(cfb, f);
        if (!data || !data.content)
          throw new Error("ECMA-376 Encrypted file missing " + f);
        parse_Primary(data.content);
      } catch (e) {
      }
      f = "/EncryptionInfo";
      data = CFB.find(cfb, f);
      if (!data || !data.content)
        throw new Error("ECMA-376 Encrypted file missing " + f);
      var einfo = parse_EncryptionInfo(data.content);
      f = "/EncryptedPackage";
      data = CFB.find(cfb, f);
      if (!data || !data.content)
        throw new Error("ECMA-376 Encrypted file missing " + f);
      if (einfo[0] == 4 && typeof decrypt_agile !== "undefined")
        return decrypt_agile(einfo[1], data.content, opts.password || "", opts);
      if (einfo[0] == 2 && typeof decrypt_std76 !== "undefined")
        return decrypt_std76(einfo[1], data.content, opts.password || "", opts);
      throw new Error("File is password-protected");
    }
    function write_zip(wb, opts) {
      _shapeid = 1024;
      if (opts.bookType == "ods")
        return write_ods(wb, opts);
      if (wb && !wb.SSF) {
        wb.SSF = SSF.get_table();
      }
      if (wb && wb.SSF) {
        make_ssf(SSF);
        SSF.load_table(wb.SSF);
        opts.revssf = evert_num(wb.SSF);
        opts.revssf[wb.SSF[65535]] = 0;
        opts.ssf = wb.SSF;
      }
      opts.rels = {};
      opts.wbrels = {};
      opts.Strings = [];
      opts.Strings.Count = 0;
      opts.Strings.Unique = 0;
      if (browser_has_Map)
        opts.revStrings = /* @__PURE__ */ new Map();
      else {
        opts.revStrings = {};
        opts.revStrings.foo = [];
        delete opts.revStrings.foo;
      }
      var wbext = opts.bookType == "xlsb" ? "bin" : "xml";
      var vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;
      var ct = new_ct();
      fix_write_opts(opts = opts || {});
      var zip = zip_new();
      var f = "", rId = 0;
      opts.cellXfs = [];
      get_cell_style(opts.cellXfs, {}, { revssf: { "General": 0 } });
      if (!wb.Props)
        wb.Props = {};
      f = "docProps/core.xml";
      zip_add_file(zip, f, write_core_props(wb.Props, opts));
      ct.coreprops.push(f);
      add_rels(opts.rels, 2, f, RELS.CORE_PROPS);
      f = "docProps/app.xml";
      if (wb.Props && wb.Props.SheetNames)
        ;
      else if (!wb.Workbook || !wb.Workbook.Sheets)
        wb.Props.SheetNames = wb.SheetNames;
      else {
        var _sn = [];
        for (var _i = 0; _i < wb.SheetNames.length; ++_i)
          if ((wb.Workbook.Sheets[_i] || {}).Hidden != 2)
            _sn.push(wb.SheetNames[_i]);
        wb.Props.SheetNames = _sn;
      }
      wb.Props.Worksheets = wb.Props.SheetNames.length;
      zip_add_file(zip, f, write_ext_props(wb.Props));
      ct.extprops.push(f);
      add_rels(opts.rels, 3, f, RELS.EXT_PROPS);
      if (wb.Custprops !== wb.Props && keys(wb.Custprops || {}).length > 0) {
        f = "docProps/custom.xml";
        zip_add_file(zip, f, write_cust_props(wb.Custprops));
        ct.custprops.push(f);
        add_rels(opts.rels, 4, f, RELS.CUST_PROPS);
      }
      for (rId = 1; rId <= wb.SheetNames.length; ++rId) {
        var wsrels = { "!id": {} };
        var ws = wb.Sheets[wb.SheetNames[rId - 1]];
        var _type = (ws || {})["!type"] || "sheet";
        switch (_type) {
          case "chart":
          default:
            f = "xl/worksheets/sheet" + rId + "." + wbext;
            zip_add_file(zip, f, write_ws(rId - 1, f, opts, wb, wsrels));
            ct.sheets.push(f);
            add_rels(opts.wbrels, -1, "worksheets/sheet" + rId + "." + wbext, RELS.WS[0]);
        }
        if (ws) {
          var comments = ws["!comments"];
          var need_vml = false;
          if (comments && comments.length > 0) {
            var cf = "xl/comments" + rId + "." + wbext;
            zip_add_file(zip, cf, write_cmnt(comments, cf));
            ct.comments.push(cf);
            add_rels(wsrels, -1, "../comments" + rId + "." + wbext, RELS.CMNT);
            need_vml = true;
          }
          if (ws["!legacy"]) {
            if (need_vml)
              zip_add_file(zip, "xl/drawings/vmlDrawing" + rId + ".vml", write_comments_vml(rId, ws["!comments"]));
          }
          delete ws["!comments"];
          delete ws["!legacy"];
        }
        if (wsrels["!id"].rId1)
          zip_add_file(zip, get_rels_path(f), write_rels(wsrels));
      }
      if (opts.Strings != null && opts.Strings.length > 0) {
        f = "xl/sharedStrings." + wbext;
        zip_add_file(zip, f, write_sst(opts.Strings, f, opts));
        ct.strs.push(f);
        add_rels(opts.wbrels, -1, "sharedStrings." + wbext, RELS.SST);
      }
      f = "xl/workbook." + wbext;
      zip_add_file(zip, f, write_wb(wb, f));
      ct.workbooks.push(f);
      add_rels(opts.rels, 1, f, RELS.WB);
      f = "xl/theme/theme1.xml";
      zip_add_file(zip, f, write_theme(wb.Themes, opts));
      ct.themes.push(f);
      add_rels(opts.wbrels, -1, "theme/theme1.xml", RELS.THEME);
      f = "xl/styles." + wbext;
      zip_add_file(zip, f, write_sty(wb, f, opts));
      ct.styles.push(f);
      add_rels(opts.wbrels, -1, "styles." + wbext, RELS.STY);
      if (wb.vbaraw && vbafmt) {
        f = "xl/vbaProject.bin";
        zip_add_file(zip, f, wb.vbaraw);
        ct.vba.push(f);
        add_rels(opts.wbrels, -1, "vbaProject.bin", RELS.VBA);
      }
      zip_add_file(zip, "[Content_Types].xml", write_ct(ct, opts));
      zip_add_file(zip, "_rels/.rels", write_rels(opts.rels));
      zip_add_file(zip, "xl/_rels/workbook." + wbext + ".rels", write_rels(opts.wbrels));
      delete opts.revssf;
      delete opts.ssf;
      return zip;
    }
    function firstbyte(f, o) {
      var x = "";
      switch ((o || {}).type || "base64") {
        case "buffer":
          return [f[0], f[1], f[2], f[3]];
        case "base64":
          x = Base64.decode(f.slice(0, 24));
          break;
        case "binary":
          x = f;
          break;
        case "array":
          return [f[0], f[1], f[2], f[3]];
        default:
          throw new Error("Unrecognized type " + (o && o.type || "undefined"));
      }
      return [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3)];
    }
    function read_cfb(cfb, opts) {
      if (CFB.find(cfb, "EncryptedPackage"))
        return parse_xlsxcfb(cfb, opts);
      return parse_xlscfb(cfb, opts);
    }
    function read_zip(data, opts) {
      var zip, d = data;
      var o = opts || {};
      if (!o.type)
        o.type = has_buf && Buffer.isBuffer(data) ? "buffer" : "base64";
      zip = zip_read(d, o);
      return parse_zip(zip, o);
    }
    function read_plaintext(data, o) {
      var i3 = 0;
      main:
        while (i3 < data.length)
          switch (data.charCodeAt(i3)) {
            case 10:
            case 13:
            case 32:
              ++i3;
              break;
            case 60:
              return parse_xlml(data.slice(i3), o);
            default:
              break main;
          }
      return PRN.to_workbook(data, o);
    }
    function read_plaintext_raw(data, o) {
      var str = "", bytes = firstbyte(data, o);
      switch (o.type) {
        case "base64":
          str = Base64.decode(data);
          break;
        case "binary":
          str = data;
          break;
        case "buffer":
          str = data.toString("binary");
          break;
        case "array":
          str = cc2str(data);
          break;
        default:
          throw new Error("Unrecognized type " + o.type);
      }
      if (bytes[0] == 239 && bytes[1] == 187 && bytes[2] == 191)
        str = utf8read(str);
      return read_plaintext(str, o);
    }
    function read_utf16(data, o) {
      var d = data;
      if (o.type == "base64")
        d = Base64.decode(d);
      d = cptable.utils.decode(1200, d.slice(2), "str");
      o.type = "binary";
      return read_plaintext(d, o);
    }
    function bstrify(data) {
      return !data.match(/[^\x00-\x7F]/) ? data : utf8write(data);
    }
    function read_prn(data, d, o, str) {
      if (str) {
        o.type = "string";
        return PRN.to_workbook(data, o);
      }
      return PRN.to_workbook(d, o);
    }
    function readSync(data, opts) {
      reset_cp();
      if (typeof ArrayBuffer !== "undefined" && data instanceof ArrayBuffer)
        return readSync(new Uint8Array(data), opts);
      var d = data, n = [0, 0, 0, 0], str = false;
      var o = opts || {};
      if (o.cellStyles) {
        o.cellNF = true;
        o.sheetStubs = true;
      }
      _ssfopts = {};
      if (o.dateNF)
        _ssfopts.dateNF = o.dateNF;
      if (!o.type)
        o.type = has_buf && Buffer.isBuffer(data) ? "buffer" : "base64";
      if (o.type == "file") {
        o.type = has_buf ? "buffer" : "binary";
        d = read_binary(data);
      }
      if (o.type == "string") {
        str = true;
        o.type = "binary";
        o.codepage = 65001;
        d = bstrify(data);
      }
      if (o.type == "array" && typeof Uint8Array !== "undefined" && data instanceof Uint8Array && typeof ArrayBuffer !== "undefined") {
        var ab = new ArrayBuffer(3), vu = new Uint8Array(ab);
        vu.foo = "bar";
        if (!vu.foo) {
          o = dup(o);
          o.type = "array";
          return readSync(ab2a(d), o);
        }
      }
      switch ((n = firstbyte(d, o))[0]) {
        case 208:
          return read_cfb(CFB.read(d, o), o);
        case 9:
          if (n[1] <= 4)
            return parse_xlscfb(d, o);
          break;
        case 60:
          return parse_xlml(d, o);
        case 73:
          if (n[1] === 68)
            return read_wb_ID(d, o);
          break;
        case 84:
          if (n[1] === 65 && n[2] === 66 && n[3] === 76)
            return DIF.to_workbook(d, o);
          break;
        case 80:
          return n[1] === 75 && n[2] < 9 && n[3] < 9 ? read_zip(d, o) : read_prn(data, d, o, str);
        case 239:
          return n[3] === 60 ? parse_xlml(d, o) : read_prn(data, d, o, str);
        case 255:
          if (n[1] === 254) {
            return read_utf16(d, o);
          }
          break;
        case 0:
          if (n[1] === 0 && n[2] >= 2 && n[3] === 0)
            return WK_.to_workbook(d, o);
          break;
        case 3:
        case 131:
        case 139:
        case 140:
          return DBF.to_workbook(d, o);
        case 123:
          if (n[1] === 92 && n[2] === 114 && n[3] === 116)
            return RTF.to_workbook(d, o);
          break;
        case 10:
        case 13:
        case 32:
          return read_plaintext_raw(d, o);
      }
      if (n[2] <= 12 && n[3] <= 31)
        return DBF.to_workbook(d, o);
      return read_prn(data, d, o, str);
    }
    function readFileSync(filename, opts) {
      var o = opts || {};
      o.type = "file";
      return readSync(filename, o);
    }
    function write_cfb_ctr(cfb, o) {
      switch (o.type) {
        case "base64":
        case "binary":
          break;
        case "buffer":
        case "array":
          o.type = "";
          break;
        case "file":
          return write_dl(o.file, CFB.write(cfb, { type: has_buf ? "buffer" : "" }));
        case "string":
          throw new Error("'string' output type invalid for '" + o.bookType + "' files");
        default:
          throw new Error("Unrecognized type " + o.type);
      }
      return CFB.write(cfb, o);
    }
    function write_zip_type(wb, opts) {
      var o = opts || {};
      var z = write_zip(wb, o);
      var oopts = {};
      if (o.compression)
        oopts.compression = "DEFLATE";
      if (o.password)
        oopts.type = has_buf ? "nodebuffer" : "string";
      else
        switch (o.type) {
          case "base64":
            oopts.type = "base64";
            break;
          case "binary":
            oopts.type = "string";
            break;
          case "string":
            throw new Error("'string' output type invalid for '" + o.bookType + "' files");
          case "buffer":
          case "file":
            oopts.type = has_buf ? "nodebuffer" : "string";
            break;
          default:
            throw new Error("Unrecognized type " + o.type);
        }
      var out = z.FullPaths ? CFB.write(z, { fileType: "zip", type: { "nodebuffer": "buffer", "string": "binary" }[oopts.type] || oopts.type }) : z.generate(oopts);
      if (o.password && typeof encrypt_agile !== "undefined")
        return write_cfb_ctr(encrypt_agile(out, o.password), o);
      if (o.type === "file")
        return write_dl(o.file, out);
      return o.type == "string" ? utf8read(out) : out;
    }
    function write_cfb_type(wb, opts) {
      var o = opts || {};
      var cfb = write_xlscfb(wb, o);
      return write_cfb_ctr(cfb, o);
    }
    function write_string_type(out, opts, bom) {
      if (!bom)
        bom = "";
      var o = bom + out;
      switch (opts.type) {
        case "base64":
          return Base64.encode(utf8write(o));
        case "binary":
          return utf8write(o);
        case "string":
          return out;
        case "file":
          return write_dl(opts.file, o, "utf8");
        case "buffer": {
          if (has_buf)
            return Buffer_from(o, "utf8");
          else
            return write_string_type(o, { type: "binary" }).split("").map(function(c) {
              return c.charCodeAt(0);
            });
        }
      }
      throw new Error("Unrecognized type " + opts.type);
    }
    function write_stxt_type(out, opts) {
      switch (opts.type) {
        case "base64":
          return Base64.encode(out);
        case "binary":
          return out;
        case "string":
          return out;
        case "file":
          return write_dl(opts.file, out, "binary");
        case "buffer": {
          if (has_buf)
            return Buffer_from(out, "binary");
          else
            return out.split("").map(function(c) {
              return c.charCodeAt(0);
            });
        }
      }
      throw new Error("Unrecognized type " + opts.type);
    }
    function write_binary_type(out, opts) {
      switch (opts.type) {
        case "string":
        case "base64":
        case "binary":
          var bstr = "";
          for (var i3 = 0; i3 < out.length; ++i3)
            bstr += String.fromCharCode(out[i3]);
          return opts.type == "base64" ? Base64.encode(bstr) : opts.type == "string" ? utf8read(bstr) : bstr;
        case "file":
          return write_dl(opts.file, out);
        case "buffer":
          return out;
        default:
          throw new Error("Unrecognized type " + opts.type);
      }
    }
    function writeSync(wb, opts) {
      reset_cp();
      check_wb(wb);
      var o = opts || {};
      if (o.cellStyles) {
        o.cellNF = true;
        o.sheetStubs = true;
      }
      if (o.type == "array") {
        o.type = "binary";
        var out = writeSync(wb, o);
        o.type = "array";
        return s2ab(out);
      }
      switch (o.bookType || "xlsb") {
        case "xml":
        case "xlml":
          return write_string_type(write_xlml(wb, o), o);
        case "slk":
        case "sylk":
          return write_string_type(write_slk_str(wb, o), o);
        case "htm":
        case "html":
          return write_string_type(write_htm_str(wb, o), o);
        case "txt":
          return write_stxt_type(write_txt_str(wb, o), o);
        case "csv":
          return write_string_type(write_csv_str(wb, o), o, "\uFEFF");
        case "dif":
          return write_string_type(write_dif_str(wb, o), o);
        case "dbf":
          return write_binary_type(write_dbf_buf(wb, o), o);
        case "prn":
          return write_string_type(write_prn_str(wb, o), o);
        case "rtf":
          return write_string_type(write_rtf_str(wb, o), o);
        case "eth":
          return write_string_type(write_eth_str(wb, o), o);
        case "fods":
          return write_string_type(write_ods(wb, o), o);
        case "biff2":
          if (!o.biff)
            o.biff = 2;
        case "biff3":
          if (!o.biff)
            o.biff = 3;
        case "biff4":
          if (!o.biff)
            o.biff = 4;
          return write_binary_type(write_biff_buf(wb, o), o);
        case "biff5":
          if (!o.biff)
            o.biff = 5;
        case "biff8":
        case "xla":
        case "xls":
          if (!o.biff)
            o.biff = 8;
          return write_cfb_type(wb, o);
        case "xlsx":
        case "xlsm":
        case "xlam":
        case "xlsb":
        case "ods":
          return write_zip_type(wb, o);
        default:
          throw new Error("Unrecognized bookType |" + o.bookType + "|");
      }
    }
    function resolve_book_type(o) {
      if (o.bookType)
        return;
      var _BT = {
        "xls": "biff8",
        "htm": "html",
        "slk": "sylk",
        "socialcalc": "eth",
        "Sh33tJS": "WTF"
      };
      var ext = o.file.slice(o.file.lastIndexOf(".")).toLowerCase();
      if (ext.match(/^\.[a-z]+$/))
        o.bookType = ext.slice(1);
      o.bookType = _BT[o.bookType] || o.bookType;
    }
    function writeFileSync(wb, filename, opts) {
      var o = opts || {};
      o.type = "file";
      o.file = filename;
      resolve_book_type(o);
      return writeSync(wb, o);
    }
    function writeFileAsync(filename, wb, opts, cb) {
      var o = opts || {};
      o.type = "file";
      o.file = filename;
      resolve_book_type(o);
      o.type = "buffer";
      var _cb = cb;
      if (!(_cb instanceof Function))
        _cb = opts;
      return _fs.writeFile(filename, writeSync(wb, o), _cb);
    }
    function make_json_row(sheet, r, R, cols, header, hdr, dense, o) {
      var rr = encode_row(R);
      var defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, "raw");
      var isempty = true;
      var row = header === 1 ? [] : {};
      if (header !== 1) {
        if (Object.defineProperty)
          try {
            Object.defineProperty(row, "__rowNum__", { value: R, enumerable: false });
          } catch (e) {
            row.__rowNum__ = R;
          }
        else
          row.__rowNum__ = R;
      }
      if (!dense || sheet[R])
        for (var C = r.s.c; C <= r.e.c; ++C) {
          var val = dense ? sheet[R][C] : sheet[cols[C] + rr];
          if (val === void 0 || val.t === void 0) {
            if (defval === void 0)
              continue;
            if (hdr[C] != null) {
              row[hdr[C]] = defval;
            }
            continue;
          }
          var v = val.v;
          switch (val.t) {
            case "z":
              if (v == null)
                break;
              continue;
            case "e":
              v = void 0;
              break;
            case "s":
            case "d":
            case "b":
            case "n":
              break;
            default:
              throw new Error("unrecognized type " + val.t);
          }
          if (hdr[C] != null) {
            if (v == null) {
              if (defval !== void 0)
                row[hdr[C]] = defval;
              else if (raw && v === null)
                row[hdr[C]] = null;
              else
                continue;
            } else {
              row[hdr[C]] = raw ? v : format_cell(val, v, o);
            }
            if (v != null)
              isempty = false;
          }
        }
      return { row, isempty };
    }
    function sheet_to_json(sheet, opts) {
      if (sheet == null || sheet["!ref"] == null)
        return [];
      var val = { t: "n", v: 0 }, header = 0, offset = 1, hdr = [], v = 0, vv = "";
      var r = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
      var o = opts || {};
      var range = o.range != null ? o.range : sheet["!ref"];
      if (o.header === 1)
        header = 1;
      else if (o.header === "A")
        header = 2;
      else if (Array.isArray(o.header))
        header = 3;
      else if (o.header == null)
        header = 0;
      switch (typeof range) {
        case "string":
          r = safe_decode_range(range);
          break;
        case "number":
          r = safe_decode_range(sheet["!ref"]);
          r.s.r = range;
          break;
        default:
          r = range;
      }
      if (header > 0)
        offset = 0;
      var rr = encode_row(r.s.r);
      var cols = [];
      var out = [];
      var outi = 0, counter = 0;
      var dense = Array.isArray(sheet);
      var R = r.s.r, C = 0, CC = 0;
      if (dense && !sheet[R])
        sheet[R] = [];
      for (C = r.s.c; C <= r.e.c; ++C) {
        cols[C] = encode_col(C);
        val = dense ? sheet[R][C] : sheet[cols[C] + rr];
        switch (header) {
          case 1:
            hdr[C] = C - r.s.c;
            break;
          case 2:
            hdr[C] = cols[C];
            break;
          case 3:
            hdr[C] = o.header[C - r.s.c];
            break;
          default:
            if (val == null)
              val = { w: "__EMPTY", t: "s" };
            vv = v = format_cell(val, null, o);
            counter = 0;
            for (CC = 0; CC < hdr.length; ++CC)
              if (hdr[CC] == vv)
                vv = v + "_" + ++counter;
            hdr[C] = vv;
        }
      }
      for (R = r.s.r + offset; R <= r.e.r; ++R) {
        var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
        if (row.isempty === false || (header === 1 ? o.blankrows !== false : !!o.blankrows))
          out[outi++] = row.row;
      }
      out.length = outi;
      return out;
    }
    var qreg = /"/g;
    function make_csv_row(sheet, r, R, cols, fs, rs, FS, o) {
      var isempty = true;
      var row = [], txt = "", rr = encode_row(R);
      for (var C = r.s.c; C <= r.e.c; ++C) {
        if (!cols[C])
          continue;
        var val = o.dense ? (sheet[R] || [])[C] : sheet[cols[C] + rr];
        if (val == null)
          txt = "";
        else if (val.v != null) {
          isempty = false;
          txt = "" + format_cell(val, null, o);
          for (var i3 = 0, cc = 0; i3 !== txt.length; ++i3)
            if ((cc = txt.charCodeAt(i3)) === fs || cc === rs || cc === 34) {
              txt = '"' + txt.replace(qreg, '""') + '"';
              break;
            }
          if (txt == "ID")
            txt = '"ID"';
        } else if (val.f != null && !val.F) {
          isempty = false;
          txt = "=" + val.f;
          if (txt.indexOf(",") >= 0)
            txt = '"' + txt.replace(qreg, '""') + '"';
        } else
          txt = "";
        row.push(txt);
      }
      if (o.blankrows === false && isempty)
        return null;
      return row.join(FS);
    }
    function sheet_to_csv(sheet, opts) {
      var out = [];
      var o = opts == null ? {} : opts;
      if (sheet == null || sheet["!ref"] == null)
        return "";
      var r = safe_decode_range(sheet["!ref"]);
      var FS = o.FS !== void 0 ? o.FS : ",", fs = FS.charCodeAt(0);
      var RS = o.RS !== void 0 ? o.RS : "\n", rs = RS.charCodeAt(0);
      var endregex = new RegExp((FS == "|" ? "\\|" : FS) + "+$");
      var row = "", cols = [];
      o.dense = Array.isArray(sheet);
      var colinfo = o.skipHidden && sheet["!cols"] || [];
      var rowinfo = o.skipHidden && sheet["!rows"] || [];
      for (var C = r.s.c; C <= r.e.c; ++C)
        if (!(colinfo[C] || {}).hidden)
          cols[C] = encode_col(C);
      for (var R = r.s.r; R <= r.e.r; ++R) {
        if ((rowinfo[R] || {}).hidden)
          continue;
        row = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);
        if (row == null) {
          continue;
        }
        if (o.strip)
          row = row.replace(endregex, "");
        out.push(row + RS);
      }
      delete o.dense;
      return out.join("");
    }
    function sheet_to_txt(sheet, opts) {
      if (!opts)
        opts = {};
      opts.FS = "	";
      opts.RS = "\n";
      var s = sheet_to_csv(sheet, opts);
      if (typeof cptable == "undefined" || opts.type == "string")
        return s;
      var o = cptable.utils.encode(1200, s, "str");
      return String.fromCharCode(255) + String.fromCharCode(254) + o;
    }
    function sheet_to_formulae(sheet) {
      var y = "", x, val = "";
      if (sheet == null || sheet["!ref"] == null)
        return [];
      var r = safe_decode_range(sheet["!ref"]), rr = "", cols = [], C;
      var cmds = [];
      var dense = Array.isArray(sheet);
      for (C = r.s.c; C <= r.e.c; ++C)
        cols[C] = encode_col(C);
      for (var R = r.s.r; R <= r.e.r; ++R) {
        rr = encode_row(R);
        for (C = r.s.c; C <= r.e.c; ++C) {
          y = cols[C] + rr;
          x = dense ? (sheet[R] || [])[C] : sheet[y];
          val = "";
          if (x === void 0)
            continue;
          else if (x.F != null) {
            y = x.F;
            if (!x.f)
              continue;
            val = x.f;
            if (y.indexOf(":") == -1)
              y = y + ":" + y;
          }
          if (x.f != null)
            val = x.f;
          else if (x.t == "z")
            continue;
          else if (x.t == "n" && x.v != null)
            val = "" + x.v;
          else if (x.t == "b")
            val = x.v ? "TRUE" : "FALSE";
          else if (x.w !== void 0)
            val = "'" + x.w;
          else if (x.v === void 0)
            continue;
          else if (x.t == "s")
            val = "'" + x.v;
          else
            val = "" + x.v;
          cmds[cmds.length] = y + "=" + val;
        }
      }
      return cmds;
    }
    function sheet_add_json(_ws, js, opts) {
      var o = opts || {};
      var offset = +!o.skipHeader;
      var ws = _ws || {};
      var _R = 0, _C = 0;
      if (ws && o.origin != null) {
        if (typeof o.origin == "number")
          _R = o.origin;
        else {
          var _origin = typeof o.origin == "string" ? decode_cell(o.origin) : o.origin;
          _R = _origin.r;
          _C = _origin.c;
        }
      }
      var cell;
      var range = { s: { c: 0, r: 0 }, e: { c: _C, r: _R + js.length - 1 + offset } };
      if (ws["!ref"]) {
        var _range = safe_decode_range(ws["!ref"]);
        range.e.c = Math.max(range.e.c, _range.e.c);
        range.e.r = Math.max(range.e.r, _range.e.r);
        if (_R == -1) {
          _R = range.e.r + 1;
          range.e.r = _R + js.length - 1 + offset;
        }
      }
      var hdr = o.header || [], C = 0;
      js.forEach(function(JS, R) {
        keys(JS).forEach(function(k) {
          if ((C = hdr.indexOf(k)) == -1)
            hdr[C = hdr.length] = k;
          var v = JS[k];
          var t = "z";
          var z = "";
          var ref2 = encode_cell({ c: _C + C, r: _R + R + offset });
          cell = utils.sheet_get_cell(ws, ref2);
          if (v && typeof v === "object" && !(v instanceof Date)) {
            ws[ref2] = v;
          } else {
            if (typeof v == "number")
              t = "n";
            else if (typeof v == "boolean")
              t = "b";
            else if (typeof v == "string")
              t = "s";
            else if (v instanceof Date) {
              t = "d";
              if (!o.cellDates) {
                t = "n";
                v = datenum(v);
              }
              z = o.dateNF || SSF._table[14];
            }
            if (!cell)
              ws[ref2] = cell = { t, v };
            else {
              cell.t = t;
              cell.v = v;
              delete cell.w;
              delete cell.R;
              if (z)
                cell.z = z;
            }
            if (z)
              cell.z = z;
          }
        });
      });
      range.e.c = Math.max(range.e.c, _C + hdr.length - 1);
      var __R = encode_row(_R);
      if (offset)
        for (C = 0; C < hdr.length; ++C)
          ws[encode_col(C + _C) + __R] = { t: "s", v: hdr[C] };
      ws["!ref"] = encode_range(range);
      return ws;
    }
    function json_to_sheet(js, opts) {
      return sheet_add_json(null, js, opts);
    }
    var utils = {
      encode_col,
      encode_row,
      encode_cell,
      encode_range,
      decode_col,
      decode_row,
      split_cell,
      decode_cell,
      decode_range,
      format_cell,
      get_formulae: sheet_to_formulae,
      make_csv: sheet_to_csv,
      make_json: sheet_to_json,
      make_formulae: sheet_to_formulae,
      sheet_add_aoa,
      sheet_add_json,
      aoa_to_sheet,
      json_to_sheet,
      table_to_sheet: parse_dom_table,
      table_to_book,
      sheet_to_csv,
      sheet_to_txt,
      sheet_to_json,
      sheet_to_html: HTML_.from_sheet,
      sheet_to_formulae,
      sheet_to_row_object_array: sheet_to_json
    };
    (function(utils2) {
      utils2.consts = utils2.consts || {};
      function add_consts(R) {
        R.forEach(function(a) {
          utils2.consts[a[0]] = a[1];
        });
      }
      function get_default(x, y, z) {
        return x[y] != null ? x[y] : x[y] = z;
      }
      function ws_get_cell_stub(ws, R, C) {
        if (typeof R == "string") {
          if (Array.isArray(ws)) {
            var RC = decode_cell(R);
            if (!ws[RC.r])
              ws[RC.r] = [];
            return ws[RC.r][RC.c] || (ws[RC.r][RC.c] = { t: "z" });
          }
          return ws[R] || (ws[R] = { t: "z" });
        }
        if (typeof R != "number")
          return ws_get_cell_stub(ws, encode_cell(R));
        return ws_get_cell_stub(ws, encode_cell({ r: R, c: C || 0 }));
      }
      utils2.sheet_get_cell = ws_get_cell_stub;
      function wb_sheet_idx(wb, sh) {
        if (typeof sh == "number") {
          if (sh >= 0 && wb.SheetNames.length > sh)
            return sh;
          throw new Error("Cannot find sheet # " + sh);
        } else if (typeof sh == "string") {
          var idx = wb.SheetNames.indexOf(sh);
          if (idx > -1)
            return idx;
          throw new Error("Cannot find sheet name |" + sh + "|");
        } else
          throw new Error("Cannot find sheet |" + sh + "|");
      }
      utils2.book_new = function() {
        return { SheetNames: [], Sheets: {} };
      };
      utils2.book_append_sheet = function(wb, ws, name) {
        if (!name) {
          for (var i3 = 1; i3 <= 65535; ++i3)
            if (wb.SheetNames.indexOf(name = "Sheet" + i3) == -1)
              break;
        }
        if (!name)
          throw new Error("Too many worksheets");
        check_ws_name(name);
        if (wb.SheetNames.indexOf(name) >= 0)
          throw new Error("Worksheet with name |" + name + "| already exists!");
        wb.SheetNames.push(name);
        wb.Sheets[name] = ws;
      };
      utils2.book_set_sheet_visibility = function(wb, sh, vis) {
        get_default(wb, "Workbook", {});
        get_default(wb.Workbook, "Sheets", []);
        var idx = wb_sheet_idx(wb, sh);
        get_default(wb.Workbook.Sheets, idx, {});
        switch (vis) {
          case 0:
          case 1:
          case 2:
            break;
          default:
            throw new Error("Bad sheet visibility setting " + vis);
        }
        wb.Workbook.Sheets[idx].Hidden = vis;
      };
      add_consts([
        ["SHEET_VISIBLE", 0],
        ["SHEET_HIDDEN", 1],
        ["SHEET_VERY_HIDDEN", 2]
      ]);
      utils2.cell_set_number_format = function(cell, fmt) {
        cell.z = fmt;
        return cell;
      };
      utils2.cell_set_hyperlink = function(cell, target, tooltip) {
        if (!target) {
          delete cell.l;
        } else {
          cell.l = { Target: target };
          if (tooltip)
            cell.l.Tooltip = tooltip;
        }
        return cell;
      };
      utils2.cell_set_internal_link = function(cell, range, tooltip) {
        return utils2.cell_set_hyperlink(cell, "#" + range, tooltip);
      };
      utils2.cell_add_comment = function(cell, text, author) {
        if (!cell.c)
          cell.c = [];
        cell.c.push({ t: text, a: author || "SheetJS" });
      };
      utils2.sheet_set_array_formula = function(ws, range, formula) {
        var rng = typeof range != "string" ? range : safe_decode_range(range);
        var rngstr = typeof range == "string" ? range : encode_range(range);
        for (var R = rng.s.r; R <= rng.e.r; ++R)
          for (var C = rng.s.c; C <= rng.e.c; ++C) {
            var cell = ws_get_cell_stub(ws, R, C);
            cell.t = "n";
            cell.F = rngstr;
            delete cell.v;
            if (R == rng.s.r && C == rng.s.c)
              cell.f = formula;
          }
        return ws;
      };
      return utils2;
    })(utils);
    if (has_buf && typeof commonjsRequire != "undefined")
      (function() {
        var Readable = require$$4.Readable;
        var write_csv_stream = function(sheet, opts) {
          var stream = Readable();
          var o = opts == null ? {} : opts;
          if (sheet == null || sheet["!ref"] == null) {
            stream.push(null);
            return stream;
          }
          var r = safe_decode_range(sheet["!ref"]);
          var FS = o.FS !== void 0 ? o.FS : ",", fs = FS.charCodeAt(0);
          var RS = o.RS !== void 0 ? o.RS : "\n", rs = RS.charCodeAt(0);
          var endregex = new RegExp((FS == "|" ? "\\|" : FS) + "+$");
          var row = "", cols = [];
          o.dense = Array.isArray(sheet);
          var colinfo = o.skipHidden && sheet["!cols"] || [];
          var rowinfo = o.skipHidden && sheet["!rows"] || [];
          for (var C = r.s.c; C <= r.e.c; ++C)
            if (!(colinfo[C] || {}).hidden)
              cols[C] = encode_col(C);
          var R = r.s.r;
          var BOM = false;
          stream._read = function() {
            if (!BOM) {
              BOM = true;
              return stream.push("\uFEFF");
            }
            while (R <= r.e.r) {
              ++R;
              if ((rowinfo[R - 1] || {}).hidden)
                continue;
              row = make_csv_row(sheet, r, R - 1, cols, fs, rs, FS, o);
              if (row != null) {
                if (o.strip)
                  row = row.replace(endregex, "");
                stream.push(row + RS);
                break;
              }
            }
            if (R > r.e.r)
              return stream.push(null);
          };
          return stream;
        };
        var write_html_stream = function(ws, opts) {
          var stream = Readable();
          var o = opts || {};
          var header = o.header != null ? o.header : HTML_.BEGIN;
          var footer = o.footer != null ? o.footer : HTML_.END;
          stream.push(header);
          var r = decode_range(ws["!ref"]);
          o.dense = Array.isArray(ws);
          stream.push(HTML_._preamble(ws, r, o));
          var R = r.s.r;
          var end = false;
          stream._read = function() {
            if (R > r.e.r) {
              if (!end) {
                end = true;
                stream.push("</table>" + footer);
              }
              return stream.push(null);
            }
            while (R <= r.e.r) {
              stream.push(HTML_._row(ws, r, R, o));
              ++R;
              break;
            }
          };
          return stream;
        };
        var write_json_stream = function(sheet, opts) {
          var stream = Readable({ objectMode: true });
          if (sheet == null || sheet["!ref"] == null) {
            stream.push(null);
            return stream;
          }
          var val = { t: "n", v: 0 }, header = 0, offset = 1, hdr = [], v = 0, vv = "";
          var r = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };
          var o = opts || {};
          var range = o.range != null ? o.range : sheet["!ref"];
          if (o.header === 1)
            header = 1;
          else if (o.header === "A")
            header = 2;
          else if (Array.isArray(o.header))
            header = 3;
          switch (typeof range) {
            case "string":
              r = safe_decode_range(range);
              break;
            case "number":
              r = safe_decode_range(sheet["!ref"]);
              r.s.r = range;
              break;
            default:
              r = range;
          }
          if (header > 0)
            offset = 0;
          var rr = encode_row(r.s.r);
          var cols = [];
          var counter = 0;
          var dense = Array.isArray(sheet);
          var R = r.s.r, C = 0, CC = 0;
          if (dense && !sheet[R])
            sheet[R] = [];
          for (C = r.s.c; C <= r.e.c; ++C) {
            cols[C] = encode_col(C);
            val = dense ? sheet[R][C] : sheet[cols[C] + rr];
            switch (header) {
              case 1:
                hdr[C] = C - r.s.c;
                break;
              case 2:
                hdr[C] = cols[C];
                break;
              case 3:
                hdr[C] = o.header[C - r.s.c];
                break;
              default:
                if (val == null)
                  val = { w: "__EMPTY", t: "s" };
                vv = v = format_cell(val, null, o);
                counter = 0;
                for (CC = 0; CC < hdr.length; ++CC)
                  if (hdr[CC] == vv)
                    vv = v + "_" + ++counter;
                hdr[C] = vv;
            }
          }
          R = r.s.r + offset;
          stream._read = function() {
            if (R > r.e.r)
              return stream.push(null);
            while (R <= r.e.r) {
              var row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);
              ++R;
              if (row.isempty === false || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {
                stream.push(row.row);
                break;
              }
            }
          };
          return stream;
        };
        XLSX.stream = {
          to_json: write_json_stream,
          to_html: write_html_stream,
          to_csv: write_csv_stream
        };
      })();
    if (typeof parse_xlscfb !== "undefined")
      XLSX.parse_xlscfb = parse_xlscfb;
    XLSX.parse_zip = parse_zip;
    XLSX.read = readSync;
    XLSX.readFile = readFileSync;
    XLSX.readFileSync = readFileSync;
    XLSX.write = writeSync;
    XLSX.writeFile = writeFileSync;
    XLSX.writeFileSync = writeFileSync;
    XLSX.writeFileAsync = writeFileAsync;
    XLSX.utils = utils;
    XLSX.SSF = SSF;
    if (typeof CFB !== "undefined")
      XLSX.CFB = CFB;
  }
  make_xlsx_lib(exports);
})(xlsx, xlsx.exports);
var xlsxExports = xlsx.exports;
const { gyRtzhUiOptions } = useGymRtzhUiOptions();
const BASEURL = () => {
  return gyRtzhUiOptions.value.BASEURL;
};
const postImportFile = ({ url, data }) => post({ url: BASEURL + url, data });
const getFileMuban = ({ url, data }) => ajaxFile({
  method: "get",
  contenType: "application/json",
  url: BASEURL + url,
  data
});
const ImportFile_vue_vue_type_style_index_0_lang = "";
const ImportFile_vue_vue_type_style_index_1_scoped_58c6ba1d_lang = "";
const ImportFile_vue_vue_type_style_index_2_lang = "";
const _sfc_main$3 = {
  name: "ImportFile",
  components: {
    ZhxdDialog: RtzhDialog,
    fileDiv: fileDiv$2,
    visBttton: RtzhButton
  },
  props: {
    tableThead: {
      default: () => []
    },
    startRow: {
      default: 0
    },
    headerRowLength: {
      default: 1
    },
    isFileChange: {
      default: true
    },
    dialogShow: {
      default: false
    },
    mubanUrl: {
      default: ""
    },
    daoruUrl: {
      default: ""
    },
    mubanData: {
      default: () => ({})
    },
    daoruData: {
      default: () => ({})
    },
    mubanName: {
      default: "模板.xlsx"
    },
    delLine: {
      default: 0
    },
    delLineIndex: {
      default: 0
    }
  },
  watch: {
    fileObj(newVal) {
      if (!newVal) {
        return;
      }
      this.errorIndexArr = [];
      this.tableDataDaoru = [];
      this.errorIndexMsgObj = {};
      this.getFileContent(newVal[0]);
    },
    dialogShow() {
      this.dialogDanwei = true;
    }
  },
  data: function() {
    return {
      errorIndexArr: [],
      errorIndexMsgObj: {},
      dialogDanwei: false,
      fileObj: "",
      fileName: "",
      filePath: "",
      tableDataDaoru: []
    };
  },
  methods: {
    closeDialogDanwei() {
      this.closeDaoru();
      this.dialogDanwei = false;
    },
    daoruDataFun() {
      if (this.tableDataDaoru.length == 0) {
        $common.showMsg("请最少导入一条数据!");
        return;
      }
      postImportFile({
        url: this.daoruUrl,
        data: {
          ...this.daoruData,
          list: this.tableDataDaoru
        }
      }).then((resp) => {
        let result = resp.result || {};
        if (result?.status?.toLowerCase() == "succeed" || result) {
          $common.showMsg("导入成功!");
          this.closeDialogDanwei();
          this.$emit("updateTableDate");
        } else {
          if (this.mubanData.moduleNameCn == "模板-1N客户保障" && result.message.toString().indexOf("客户名称不存在") > -1) {
            $common.showMsg("客户名称不存在");
          } else {
            $common.showMsg("上传文件格式不规范,请按照表格提示修改!");
          }
          this.resetFileObj();
          let msgArr = result.message || [];
          this.daoruErrorFun(msgArr);
        }
      });
    },
    daoruErrorFun(msgArr) {
      let errorIndexArr = [];
      let errorIndexMsgObj = {};
      msgArr.forEach((v) => {
        let arr = v.split("#@") || [];
        let index2 = parseFloat(arr[0]);
        errorIndexArr.push(index2);
        let value = arr[1] || "";
        let arr1 = value.split("@");
        errorIndexMsgObj[index2] = {};
        arr1.forEach((v1) => {
          let arr2 = v1.split(":");
          errorIndexMsgObj[index2][arr2[0]] = arr2[1];
        });
      });
      this.errorIndexArr = errorIndexArr;
      this.errorIndexMsgObj = errorIndexMsgObj;
    },
    getFileContent(f) {
      var wb;
      var reader = new FileReader();
      {
        reader.readAsBinaryString(f);
      }
      var arr = [];
      const _this = this;
      reader.onload = function(e) {
        var data = e.target.result;
        {
          wb = xlsxExports.read(data, {
            type: "binary"
          });
        }
        arr = xlsxExports.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]], { header: 1 });
        arr.splice(_this.delLineIndex, _this.delLine);
        if (_this.headerRowLength > 1) {
          let headerArr = arr.slice(_this.startRow, _this.startRow + _this.headerRowLength);
          let hArr = [];
          let startHeader = headerArr[0];
          for (let i2 = 0; i2 < startHeader.length; i2++) {
            let v = startHeader[i2];
            if (startHeader[i2] == void 0) {
              v = hArr[i2 - 1];
            }
            v = v.replaceAll("\r\n", "");
            hArr.push(v);
          }
          for (let i2 = 1; i2 < headerArr.length; i2++) {
            let h = headerArr[i2];
            h.forEach((v1, i1) => {
              if (v1) {
                hArr[i1] = hArr[i1] + "_" + v1.replaceAll("\r\n", "");
              }
            });
          }
          arr.splice(_this.startRow, _this.headerRowLength, hArr);
        }
        _this.tableDataDaoru = [];
        let objName = {
          "序号": "deviceIndex"
        };
        _this.tableThead.forEach((v) => {
          let label = (v.label || "").replaceAll("\r\n", "");
          if (v.children && v.children.length >= 1) {
            v.children.forEach((c) => {
              let cLabel = `${label}_${c.label}`.replaceAll("\r\n", "");
              c.props && (objName[cLabel] = c.props.trim());
            });
          }
          v.props && (objName[label] = v.props.trim());
        });
        if (this.isFileChange) {
          _this.$emit("fileChange", { arr, objName });
        } else {
          let propArr = [];
          let n = _this.startRow;
          let tableDataDaoru = [];
          for (let i2 = 0; i2 < arr.length; i2++) {
            let v = arr[i2];
            if (!Array.isArray(v)) {
              continue;
            }
            if (i2 == n) {
              v.forEach((v1, i1) => {
                v1 = (v1 + "").replaceAll(/\n/g, "");
                let key = objName[v1.trim()];
                if (!key) {
                  console.error(v1);
                }
                propArr.push(key);
              });
            } else if (i2 > n) {
              let obj = {};
              let isAllNull = true;
              v.forEach((v1, i1) => {
                if (v1) {
                  isAllNull = false;
                }
                let prop = propArr[i1];
                if (prop) {
                  obj[prop] = v1 && v1.trim ? v1.trim() : v1;
                }
              });
              if (isAllNull) {
                continue;
              }
              tableDataDaoru.push(obj);
            }
          }
          _this.tableDataDaoru = tableDataDaoru;
        }
        _this.$refs.showWendangTable.doLayout();
      };
      reader.onerror = function(e) {
        console.error(arr);
      };
    },
    tableRowClassName({ row, rowIndex }) {
      let $index = rowIndex;
      for (let props in row) {
        let res = this.errorIndexArr.indexOf($index) != -1 && this.errorIndexMsgObj[$index] && this.errorIndexMsgObj[$index][props];
        if (res) {
          return "table-row-error";
        }
      }
      if ($index % 2 == 1) {
        return "lightColor";
      } else {
        return "darkColor";
      }
    },
    downZhanshiMuban() {
      getFileMuban({
        url: this.mubanUrl,
        data: this.mubanData
      }).then((resp) => {
        const content = resp;
        const blob = new Blob([content]);
        const fileName = this.mubanName;
        if ("download" in document.createElement("a")) {
          const elink = document.createElement("a");
          elink.download = fileName;
          elink.style.display = "none";
          elink.href = URL.createObjectURL(blob);
          document.body.appendChild(elink);
          elink.click();
          URL.revokeObjectURL(elink.href);
          document.body.removeChild(elink);
        } else {
          navigator.msSaveBlob(blob, fileName);
        }
      });
    },
    resetFileObj() {
      this.fileObj = "";
      this.fileName = "";
      this.filePath = "";
    },
    closeDaoru() {
      this.tableDataDaoru = [];
      this.resetFileObj();
    }
  },
  mounted() {
  }
};
var _sfc_render$3 = function render32() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "ImportFile" }, [_c("div", { staticClass: "ChooseTree" }, [_c("ZhxdDialog", { attrs: { "title": "导入", "close-on-click-modal": false, "close-on-press-escape": false, "show-close": false, "visible": _vm.dialogDanwei, "custom-class": "dxjx-dialog widt" }, on: { "update:visible": function($event) {
    _vm.dialogDanwei = $event;
  }, "close": _vm.closeDaoru } }, [_c("div", { directives: [{ name: "dialog-bg", rawName: "v-dialog-bg" }] }), _c("div", { staticClass: "margin-T-20" }, [_c("div", { staticClass: "list-item", staticStyle: { "margin-bottom": "10px" } }, [_c("div", { staticClass: "vis_input" }, [_c("file-div", { attrs: { "iptFilesName": _vm.fileName, "iptFiles": _vm.filePath, "iptFilesObj": _vm.fileObj, "acceptStr": "application/msword, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, text/plain, application/pdf" }, on: { "update:iptFilesName": function($event) {
    _vm.fileName = $event;
  }, "update:ipt-files-name": function($event) {
    _vm.fileName = $event;
  }, "update:iptFiles": function($event) {
    _vm.filePath = $event;
  }, "update:ipt-files": function($event) {
    _vm.filePath = $event;
  }, "update:iptFilesObj": function($event) {
    _vm.fileObj = $event;
  }, "update:ipt-files-obj": function($event) {
    _vm.fileObj = $event;
  } } })], 1)]), _c("div", { staticClass: "vis_table" }, [[_c("el-table", { ref: "showWendangTable", staticClass: "tableFix", attrs: { "data": _vm.tableDataDaoru, "row-class-name": _vm.tableRowClassName, "tree-props": { children: "children", hasChildren: "hasChildren" }, "border": "", "height": "100%", "size": "small", "width": "100%" } }, _vm._l(_vm.tableThead, function(item, index2) {
    return _c("el-table-column", { key: index2, attrs: { "label": item.label, "prop": item.props, "min-width": item.width && item.width + "px", "width": "min-content" }, scopedSlots: _vm._u([{ key: "default", fn: function({ row, $index }) {
      return [_vm.errorIndexArr.indexOf($index) != -1 && _vm.errorIndexMsgObj[$index] && _vm.errorIndexMsgObj[$index][item.props] ? _c("el-tooltip", { attrs: { "effect": "dark", "content": _vm.errorIndexMsgObj[$index] && _vm.errorIndexMsgObj[$index][item.props], "placement": "top" } }, [_c("div", { staticClass: "table-content table-content-error" }, [_vm._v(" " + _vm._s(item.props && row[item.props] || "该列不可为空!") + " ")])]) : _c("div", { staticClass: "table-content" }, [_vm._v(" " + _vm._s(item.props && row[item.props]) + " ")])];
    } }], null, true) }, _vm._l(item.children, function(child, index22) {
      return _c("el-table-column", { key: index2 + "-tab-" + index22, attrs: { "label": child.label, "prop": child.props, "min-width": child.width && child.width + "px", "width": "min-content" }, scopedSlots: _vm._u([{ key: "default", fn: function({ row, $index }) {
        return [_vm.errorIndexArr.indexOf($index) != -1 && _vm.errorIndexMsgObj[$index] && _vm.errorIndexMsgObj[$index][child.props] ? _c("el-tooltip", { attrs: { "effect": "dark", "content": _vm.errorIndexMsgObj[$index] && _vm.errorIndexMsgObj[$index][child.props], "placement": "top" } }, [_c("div", { staticClass: "table-content table-content-error" }, [_vm._v(" " + _vm._s(child.props && row[child.props] || "该列不可为空!") + " ")])]) : _c("div", { staticClass: "table-content" }, [_vm._v(" " + _vm._s(child.props && row[child.props]) + " ")])];
      } }], null, true) });
    }), 1);
  }), 1)]], 2)]), _c("div", { staticClass: "tab-scroll table-add-edit" }, [_c("div", { staticClass: "list-item list-item-btn dxjx-dialog-footer" }, [_c("div", { staticClass: "vis_input" }, [_c("div", { staticClass: "vis_input_box" }, [_c("vis-bttton", { staticClass: "rightBtn", attrs: { "vis_text": "下载模板" }, on: { "click": _vm.downZhanshiMuban } }), _c("vis-bttton", { staticClass: "rightBtn", attrs: { "vis_text": "导入" }, on: { "click": _vm.daoruDataFun } }), _c("vis-bttton", { staticClass: "rightBtn", attrs: { "vis_text": "关 闭" }, on: { "click": _vm.closeDialogDanwei } })], 1)])])])])], 1)]);
};
var _sfc_staticRenderFns$3 = [];
var __component__$3 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$3,
  _sfc_render$3,
  _sfc_staticRenderFns$3,
  false,
  null,
  "58c6ba1d",
  null,
  null
);
const ImportFile = __component__$3.exports;
const index_vue_vue_type_style_index_0_scoped_e39e843f_lang = "";
const _sfc_main$2 = {
  name: "zhxdTable",
  components: {},
  props: {
    visible: {
      type: Boolean,
      default: true
    },
    hiddenIndex: {
      type: Boolean,
      default: false
    },
    indexWidth: {
      type: String,
      default: "50"
    },
    showtooltip: {
      type: Boolean,
      default: true
    },
    // 表格对齐方式
    align: {
      type: String,
      default: "center"
    },
    /**
     * 重置表格数据标识
     * @param {string | number} resetStatus - 1: 刷新,current不变 2: 重置,current重置为1
     * */
    resetStatus: {
      type: [String, Number],
      default: 0
    },
    /* 是否支持分页 */
    pagination: {
      type: Boolean,
      default: true
    },
    height: "",
    maxHeight: "",
    /* 表格高度是否与滚动高度等高 */
    heightEqualScrollHeight: {
      type: Boolean,
      default: false
    },
    showSearchFormSta: {
      type: Boolean,
      default: false
    },
    /* 是否启用勾选
    * 单选: single
    * 多选: multiple
    *  */
    selection: String,
    /* 表头配置 */
    tableList: {
      type: Array,
      default: () => []
    },
    /* 获取列表数据接口 */
    tableDataInterface: Function,
    /* 获取列表数据接口入参 */
    interfaceParams: {
      type: Object,
      default: () => ({})
    },
    /* 格式化接口入参 */
    formatInterfaceParams: Function,
    /* 字典集合 */
    dictionaries: {
      type: Object,
      default: () => ({})
    },
    /* 父组件传递的表格数据 */
    parentTableData: {
      type: Array,
      default: null
    },
    selectableFunc: {
      type: Function,
      default: null
    }
  },
  data() {
    return {
      pageInfo: {
        current: 1,
        size: 15,
        total: 0,
        visible: false
      },
      tableData: [],
      selectionArr: [],
      tableScrollHeight: 0,
      timer: null
    };
  },
  computed: {
    getTableIndex() {
      return (index2) => {
        const { current, size } = this.pageInfo;
        return (current - 1) * size + index2;
      };
    },
    tableRowClassName() {
      return ({ rowIndex }) => {
        return rowIndex % 2 === 1 ? "lightColor" : "darkColor";
      };
    },
    translateValueToText() {
      return (prop, value) => {
        if (!(prop in this.dictionaries)) {
          return value;
        } else {
          const dictionary = this.dictionaries[prop];
          return dictionary[value] || value;
        }
      };
    }
  },
  watch: {
    showSearchFormSta() {
      this.computedTableBodyContainer();
    },
    parentTableData: {
      handler(newVal, oldVal) {
        if (Array.isArray(newVal)) {
          this.tableData = [];
          this.$nextTick(() => {
            newVal.forEach((item) => this.tableData.push(item));
          });
        }
      },
      immediate: true
    },
    resetStatus: {
      handler(val) {
        if (val) {
          if (val == 2)
            this.pageInfo.current = 1;
          this.getTableData();
        }
      }
    },
    visible: {
      handler(newVal) {
        if (newVal) {
          this.computedRealTableWidth();
        }
      }
    }
  },
  methods: {
    objectSpanMethod: $common.objectSpanMethod,
    // 分页改变事件
    handleSizeChange(val) {
      this.pageInfo.current = 1;
      this.pageInfo.size = val;
      this.getTableData();
    },
    // 分页改变事件
    handleCurrentChange(val) {
      this.pageInfo.current = val;
      this.getTableData();
    },
    getTableData() {
      if (this.parentTableData !== null)
        return;
      if (!this.tableDataInterface) {
        console.warn("tableDataInterface is not defined");
        return;
      }
      this.computedTableBodyContainer();
      let params = {
        current: this.pageInfo.current,
        size: this.pagination ? this.pageInfo.size : 999,
        ...this.interfaceParams
      };
      if (this.formatInterfaceParams) {
        params = this.formatInterfaceParams(structuredClone(params));
      }
      this.tableData = [];
      this.tableDataInterface(params).then((res) => {
        const result = res.result;
        let list = result.records || result.list || [];
        if (!list.length && this.pageInfo.current > 1) {
          this.pageInfo.current--;
          this.getTableData();
          return;
        }
        this.$emit("successed", { tableData: this.tableData, pageInfo: this.pageInfo, res, params });
        this.$emit("update:resetStatus", 0);
      });
    },
    // 处理selection选中逻辑
    handleSelectionChange(val) {
      if (this.selection === "single") {
        if (val.length > 1) {
          this.$refs.elTable.clearSelection();
          this.$refs.elTable.toggleRowSelection(val.pop());
        } else {
          this.selectionArr = val;
        }
      } else {
        this.selectionArr = val;
      }
      this.$emit("selectionChange", this.selectionArr);
    },
    // 当表格存在fixed列时,计算非固定部分的容器宽度
    computedRealTableWidth() {
      this.timer = setTimeout(() => {
        try {
          const tableEle = this.$refs.elTable?.$el || this.$el.getElementsByClassName("el-table")[0];
          const headerWrapper = tableEle.getElementsByClassName("el-table__header-wrapper")[0];
          const bodyWrapper = tableEle.getElementsByClassName("el-table__body-wrapper")[0];
          const footerWrapper = tableEle.getElementsByClassName("el-table__footer-wrapper")[0] || null;
          const tableFixedEle = tableEle.getElementsByClassName("el-table__fixed")[0] || null;
          const tableFixedRightEle = tableEle.getElementsByClassName("el-table__fixed-right")[0] || null;
          const leftFixedWidth = tableFixedEle ? tableFixedEle.clientWidth : 0;
          const rightFixedWidth = tableFixedRightEle ? tableFixedRightEle.clientWidth : 0;
          bodyWrapper.style.clipPath = "polygon(" + leftFixedWidth + "px 0, calc(100% - " + rightFixedWidth + "px) 0, calc(100% - " + rightFixedWidth + "px) 100%, " + leftFixedWidth + "px 100%)";
          headerWrapper.style.clipPath = "polygon(" + leftFixedWidth + "px 0, calc(100% - " + rightFixedWidth + "px) 0, calc(100% - " + rightFixedWidth + "px) 100%, " + leftFixedWidth + "px 100%)";
          if (footerWrapper) {
            footerWrapper.style.clipPath = `polygon(${leftFixedWidth}px 0, calc(100% - ${rightFixedWidth}px) 0, calc(100% - ${rightFixedWidth}px) 100%, ${leftFixedWidth}px 100%)`;
          }
          if (tableFixedRightEle && this.heightEqualScrollHeight) {
            const fixedRightBodyWrapper = tableFixedRightEle.querySelector(".el-table__fixed-body-wrapper");
            if (fixedRightBodyWrapper.scrollHeight > fixedRightBodyWrapper.clientHeight) {
              fixedRightBodyWrapper.style.overflowY = "auto";
            }
            fixedRightBodyWrapper.removeEventListener("scroll", () => {
            });
            fixedRightBodyWrapper.addEventListener("scroll", (e) => {
              bodyWrapper.scrollTo(bodyWrapper.scrollLeft, e.target.scrollTop);
            });
          }
          clearTimeout(this.timer);
          this.timer = null;
          const actionClo = this.tableList.find((item) => item.type === "action");
          if (this.visible && actionClo && actionClo.width && !rightFixedWidth) {
            this.computedRealTableWidth();
          }
        } catch (e) {
          console.error(e);
        }
      }, 200);
    },
    // 计算当前组件表格滚动区域的高度
    computedTableBodyContainer() {
      this.$nextTick(() => {
        this.tableScrollHeight = this.pagination ? this.$refs.zhxdTable.clientHeight - 25 : this.$refs.zhxdTable.clientHeight;
      });
    },
    handleHeaderDragend(newWidth, oldWidth, column, event) {
    }
  },
  created() {
  },
  beforeMount() {
    this.getTableData();
  },
  mounted() {
    this.computedTableBodyContainer();
    this.computedRealTableWidth();
    window.addEventListener("resize", () => {
      this.computedRealTableWidth();
    });
  },
  beforeDestroy() {
    window.removeEventListener("resize", this.computedRealTableWidth);
  }
};
var _sfc_render$2 = function render33() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { ref: "zhxdTable", class: ["zhxd-table", "vis_table"] }, [_c("el-table", _vm._g(_vm._b({ ref: "elTable", class: ["tableFix", { "single-selection": _vm.selection === "single" }], attrs: { "size": "small", "data": _vm.tableData, "border": "", "width": "100%", "height": _vm.heightEqualScrollHeight ? _vm.tableScrollHeight : void 0, "max-height": _vm.maxHeight || _vm.tableScrollHeight, "row-class-name": _vm.tableRowClassName, "span-method": _vm.objectSpanMethod }, on: { "header-dragend": _vm.handleHeaderDragend, "selection-change": _vm.handleSelectionChange } }, "el-table", _vm.$attrs, false), _vm.$listeners), [_vm.selection ? _c("el-table-column", { attrs: { "type": "selection", "width": "50", "resizable": false, "fixed": "", "selectable": _vm.selectableFunc } }) : _vm._e(), !_vm.hiddenIndex ? _c("el-table-column", { attrs: { "label": "序号", "width": _vm.indexWidth, "resizable": false, "fixed": "" }, scopedSlots: _vm._u([{ key: "default", fn: function({ $index }) {
    return [_vm._v(" " + _vm._s(_vm.getTableIndex($index + 1)) + " ")];
  } }], null, false, 1097107516) }) : _vm._e(), _vm._l(_vm.tableList, function(item) {
    return [item.type === "expand" ? _c("el-table-column", { attrs: { "type": "expand", "width": 1 }, scopedSlots: _vm._u([{ key: "default", fn: function({ row }) {
      return [_vm._t("expand", null, { "row": row })];
    } }], null, true) }) : item.type === "action" ? _c("el-table-column", { attrs: { "label": "操作", "resizable": false, "width": item.width, "fixed": "right" }, scopedSlots: _vm._u([{ key: "default", fn: function({ row }) {
      return [_vm._t("actionCol", null, { "row": row })];
    } }], null, true) }) : item.slot ? _c("el-table-column", { attrs: { "label": item.label, "align": _vm.align, "header-align": _vm.align, "show-overflow-tooltip": _vm.showtooltip && !item.hideTip, "fixed": item.fixed, "width": item.width }, scopedSlots: _vm._u([item.customHeader ? { key: "header", fn: function({ column }) {
      return [_vm._t(item.customHeader, null, { "row": column })];
    } } : null, { key: "default", fn: function({ row }) {
      return [_vm._t(item.slot, null, { "row": row, "props": item.props })];
    } }], null, true) }) : _c("el-table-column", { attrs: { "label": item.label, "align": item.align || _vm.align, "prop": item.props, "width": item.width, "show-overflow-tooltip": _vm.showtooltip, "fixed": item.fixed }, scopedSlots: _vm._u([{ key: "default", fn: function({ row }) {
      return [_vm._v(" " + _vm._s(_vm.translateValueToText(item.props, row[item.props])) + " " + _vm._s(item.children && item.children.length) + " ")];
    } }], null, true) }, [item.children && item.children.length ? [_vm._l(item.children, function(itemC) {
      return [itemC.slot ? _c("el-table-column", { key: itemC.props, attrs: { "label": itemC.label, "align": _vm.align, "header-align": _vm.align, "show-overflow-tooltip": _vm.showtooltip && !itemC.hideTip, "width": itemC.width }, scopedSlots: _vm._u([itemC.customHeader ? { key: "header", fn: function({ column }) {
        return [_vm._t(itemC.customHeader, null, { "row": column })];
      } } : null, { key: "default", fn: function({ row }) {
        return [_vm._t(itemC.slot, null, { "row": row, "props": item.props })];
      } }], null, true) }) : _c("el-table-column", { key: itemC.props, attrs: { "label": itemC.label, "align": _vm.align, "prop": itemC.props, "width": itemC.width, "show-overflow-tooltip": _vm.showtooltip, "fixed": itemC.fixed }, scopedSlots: _vm._u([{ key: "default", fn: function({ row }) {
        return [_vm._v(" " + _vm._s(_vm.translateValueToText(itemC.props, row[itemC.props])) + " ")];
      } }], null, true) })];
    })] : _vm._e()], 2)];
  })], 2), _vm.pagination || _vm.pageInfo.visible ? _c("div", { staticClass: "vis_paging" }, [_c("el-pagination", { attrs: { "current-page": _vm.pageInfo.current, "page-sizes": [15, 30, 50, 100], "page-size": _vm.pageInfo.pageSize, "layout": "slot, total,sizes, prev, pager, next, jumper", "total": _vm.pageInfo.total }, on: { "size-change": _vm.handleSizeChange, "current-change": _vm.handleCurrentChange, "update:currentPage": function($event) {
    return _vm.$set(_vm.pageInfo, "current", $event);
  }, "update:current-page": function($event) {
    return _vm.$set(_vm.pageInfo, "current", $event);
  } } })], 1) : _vm._e()], 1);
};
var _sfc_staticRenderFns$2 = [];
var __component__$2 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$2,
  _sfc_render$2,
  _sfc_staticRenderFns$2,
  false,
  null,
  "e39e843f",
  null,
  null
);
const ZhxdTable = __component__$2.exports;
const rtzhTheme = ref("default");
const useRtzhConfig = () => {
  return {
    rtzhTheme,
    setRtzhTheme: (theme) => {
      rtzhTheme.value = theme;
    }
  };
};
const index_vue_vue_type_style_index_0_lang = "";
const _sfc_main$1 = {
  name: "ZhxdModulePageV2",
  components: {
    RtzhTree,
    ListItemInput,
    ListItemSelect,
    ListItemDate,
    FixedTable,
    ImportFile,
    VisConfirm,
    ZhxdTable,
    visBttton: RtzhButton
  },
  props: {
    hasTree: {
      type: Boolean,
      default: false
    },
    // 初始化参数
    initParams: {
      type: Object,
      default: null
    },
    title: {
      type: String,
      default: ""
    },
    backRefresh: false,
    noBasicButton: {
      type: Boolean,
      default: false
    },
    noTable: {
      type: Boolean,
      default: false
    },
    dictArr: {
      type: Object,
      default: () => ({})
    },
    dictObj: {
      type: Object,
      default: () => ({})
    },
    searchConfig: {
      type: Array,
      default: () => []
    },
    // 是否需要导入功能
    isImport: {
      type: Boolean,
      default: false
    },
    // 自定义重置按钮事件
    defineReset: {
      type: Boolean,
      default: false
    },
    buttonShowFlag: {
      type: Boolean,
      default: false
    },
    /* 激活页
     * 1:列表页
     * 2:表单页
     *  */
    activeTab: {
      type: Number,
      default: 1
    },
    /* 删除接口 */
    deleteInterface: Function,
    /* 删除接口入参 */
    deleteInterfaceParams: "",
    //列表数据有增改 是true,则是false
    onlyList: {
      type: Boolean,
      default: true
    },
    hiddenTabOne: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    nameCn() {
      return this.$route.meta?.nameCn || "页面标题";
    },
    getShowAllValue(val) {
      return (val2) => {
        return val2 ?? true;
      };
    },
    rtzhTheme() {
      const { rtzhTheme: rtzhTheme2 } = useRtzhConfig();
      return rtzhTheme2.value;
    }
  },
  watch: {
    activeTabKey: {
      handler(val) {
        if (val == 1 && !this.noTable) {
          this.$nextTick(() => {
            this.$refs.zhxdTable.$refs.elTable.doLayout();
          });
        }
      }
    }
  },
  data() {
    return {
      dateType: ["year", "month", "date", "dates", "week", "datetime", "datetimerange", "daterange", "monthrange"],
      changeval: 1,
      vis_delete_confirm_show: false,
      dialogAddType: this.$route.query.activityTab ? this.$route.query.activityTab : 0,
      tableData: [],
      activeTabKey: this.$route.query.activityTab ? 2 : 1,
      formOldHight: 100,
      searchKeys: {},
      showSearchFormSta: true,
      dialogDaoruShow: false,
      resetStatus: 0,
      titleStr: "",
      slots: []
    };
  },
  methods: {
    /** 展示导入弹框 */
    showImportDialog() {
      this.dialogDaoruShow = !this.dialogDaoruShow;
    },
    /** 暴露给父组件的方法,修改resetStatus的值
     * @param val {Number} - 1:保存筛选条件刷新 2:重置筛选条件刷新
     */
    setResetStatus(val) {
      this.resetStatus = val;
    },
    // 处理联动日期选择返回的数据
    handleDateChange(val) {
      if (val[2] && val[2].includes("rang")) {
        this.$set(this.searchKeys, `${val[1]}Start`, val[0][0]);
        this.$set(this.searchKeys, `${val[1]}End`, val[0][1]);
      }
      this.$emit("searchChange", val);
    },
    /**
     * 处理新增、编辑、详情、删除逻辑
     * @param {string} type - 'C':新增 'U':编辑  'R':详情  'D':删除
     * */
    handleCRUD(type, title = "") {
      if (!type || typeof type !== "string") {
        console.error('The optional values for the parameter "type" are case-insensitive "C", "R", "U", and "D".');
        return;
      }
      type = type.toLowerCase();
      switch (type) {
        case "c":
          this.add();
          break;
        case "r":
          this.detailFn();
          break;
        case "u":
          this.editFn();
          break;
        case "d":
          this.vis_delete_confirm_show = true;
          break;
      }
      this.titleStr = title;
    },
    // 新增页保存事件
    saveFun() {
      this.$emit("saveFun");
    },
    // 弹出框cancel事件
    cancelClick() {
      this.vis_delete_confirm_show = false;
    },
    // 弹出框confirm事件
    confirmClick() {
      this.vis_delete_confirm_show = false;
      if (this.deleteInterface) {
        this.deleteInterface(this.deleteInterfaceParams).then((res) => {
          if (res.status == "SUCCEED") {
            this.resetStatus = 1;
            this.$message({
              message: "删除成功",
              type: "info"
            });
          }
        });
      } else {
        this.$emit("confirmDelete");
      }
    },
    changeTableClick(index2) {
      this.topTabChange(null, index2);
    },
    topTabChange(e, keyword) {
      if (this.activeTabKey == keyword) {
        return;
      }
      if (keyword == 1) {
        this.titleStr = "";
        this.dialogAddType = 0;
        this.$emit("topTabChange", keyword);
      }
      this.activeTabKey = keyword;
    },
    // 搜索区域显示隐藏
    showSearchForm() {
      this.showSearchFormSta = !this.showSearchFormSta;
    },
    fileClick() {
      this.$refs.file.click();
    },
    // 关闭新增页签
    closeAdd(val) {
      if (this.$route.query.from) {
        this.$emit("closeToFrom");
      } else {
        this.topTabChange(null, 1);
        if (val) {
          this.resetStatus = 1;
        }
      }
    },
    // 初始化
    init() {
      this.searchConfig.forEach((item) => {
        const { prop, actionType, isMultiple } = item;
        if (actionType.includes("range")) {
          this.searchKeys[prop] = [];
          this.searchKeys[`${prop}Start`] = "";
          this.searchKeys[`${prop}End`] = "";
        } else {
          if (isMultiple) {
            this.searchKeys[prop] = [];
          } else {
            this.searchKeys[prop] = "";
          }
        }
      });
      this.resetStatus = 2;
    },
    // 搜索事件
    searchFun() {
      this.resetStatus = 2;
    },
    // 重置搜索
    resetSearch() {
      if (this.defineReset) {
        this.$emit("resetSearch");
      } else {
        this.init();
      }
    },
    // 点击编辑
    editFn() {
      this.dialogAddType = 1;
      this.topTabChange(null, 2);
    },
    // 点击详情
    detailFn() {
      this.dialogAddType = 2;
      this.topTabChange(null, 2);
    },
    // 点击新增
    add() {
      this.dialogAddType = 0;
      this.topTabChange(null, 2);
    },
    onSuccessed(data) {
      this.$emit("getDataSuccessed", data);
    }
  },
  created() {
    this.searchConfig.forEach(({ prop }) => {
      this.$set(this.searchKeys, prop, "");
    });
    if (this.initParams) {
      this.searchKeys = Object.assign(this.searchKeys, this.initParams);
    }
    this.topTabChange("", this.activeTab);
  },
  mounted() {
    Object.keys(this.$scopedSlots).forEach((item) => {
      this.slots.push(item);
    });
  }
};
var _sfc_render$1 = function render34() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "ZhxdModulePage counter" }, [_vm.hasTree ? _c("RtzhTree", _vm._g(_vm._b({}, "RtzhTree", _vm.$attrs, false), _vm.$listeners)) : _vm._e(), _c("div", { staticClass: "contentbox" }, [_c("div", { staticClass: "content" }, [_c("div", { staticClass: "topTabs" }, [_vm.rtzhTheme === "default" ? _c("h2", [_c("div", { directives: [{ name: "show", rawName: "v-show", value: !_vm.hiddenTabOne, expression: "!hiddenTabOne" }], staticClass: "tab", class: [_vm.activeTabKey == 1 && "active"], on: { "click": function($event) {
    return _vm.topTabChange($event, 1);
  } } }, [_vm._v(" " + _vm._s(`${_vm.title || _vm.nameCn}`) + " ")]), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.onlyList, expression: "onlyList" }], staticClass: "tab", class: [_vm.activeTabKey == 2 && "active"], on: { "click": function($event) {
    return _vm.topTabChange($event, 2);
  } } }, [_vm._v(" " + _vm._s(_vm.titleStr ? _vm.titleStr : _vm.dialogAddType == 2 ? `${_vm.title || _vm.nameCn}详情` : _vm.dialogAddType == 0 ? `新增${_vm.title || _vm.nameCn}` : `编辑${_vm.title || _vm.nameCn}`) + " ")]), _vm._t("tabBtn", null, { "activeTabKey": _vm.activeTabKey, "titleStr": _vm.titleStr })], 2) : _c("h2", [_c("div", { directives: [{ name: "show", rawName: "v-show", value: !_vm.hiddenTabOne, expression: "!hiddenTabOne" }], staticClass: "tab" }, [_vm._v(" " + _vm._s(`${_vm.nameCn}`) + " ")]), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.onlyList, expression: "onlyList" }], staticClass: "tab" }, [_vm._v(" " + _vm._s(_vm.activeTabKey == 1 ? `${_vm.title || _vm.nameCn}` : _vm.titleStr ? _vm.titleStr : _vm.dialogAddType == 2 ? `${_vm.title || _vm.nameCn}详情` : _vm.dialogAddType == 0 ? `新增${_vm.title || _vm.nameCn}` : `编辑${_vm.title || _vm.nameCn}`) + " ")]), _vm._t("tabBtn", null, { "activeTabKey": _vm.activeTabKey, "titleStr": _vm.titleStr })], 2), _c("div", { staticClass: "bottom_border_line" }, [_c("h3", { directives: [{ name: "show", rawName: "v-show", value: _vm.activeTabKey == 1, expression: "activeTabKey == 1" }] }, [_vm._t("topButton"), !_vm.noBasicButton ? [_c("vis-bttton", { directives: [{ name: "show", rawName: "v-show", value: !_vm.buttonShowFlag, expression: "!buttonShowFlag" }], staticClass: "rightBtn", attrs: { "vis_text": "刷新", "icon_class": "el-icon-refresh-left" }, on: { "click": _vm.init } }), _c("vis-bttton", { directives: [{ name: "show", rawName: "v-show", value: !_vm.buttonShowFlag, expression: "!buttonShowFlag" }], staticClass: "rightBtn", attrs: { "vis_text": _vm.showSearchFormSta ? "隐藏" : "显示", "icon_class": "shaixuan" }, on: { "click": _vm.showSearchForm } })] : _vm._e(), _vm._t("topRightButton")], 2)])]), _c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.activeTabKey == 1, expression: "activeTabKey == 1" }], ref: "borderBox", staticClass: "borderBox" }, [_c("div", { staticClass: "tableBorder" }, [_c("div", { directives: [{ name: "show", rawName: "v-show", value: _vm.showSearchFormSta && _vm.searchConfig.length, expression: "showSearchFormSta && searchConfig.length" }], ref: "searchForm", staticClass: "dx-search-list" }, [_vm._l(_vm.searchConfig, function(item) {
    return [item.actionType === "input" ? _c("ListItemInput", { key: item.prop, attrs: { "divClassName": "search-item", "labelName": item.label, "formData": _vm.searchKeys, "keyAttr": item.prop, "placeholder": "请输入" } }) : item.actionType === "select" ? _c("ListItemSelect", { key: "b" + item.prop, attrs: { "divClassName": "search-item", "labelName": item.label, "isShowAlll": item.isShowAll, "formData": _vm.searchKeys, "isMultiple": item.isMultiple || false, "collapseTags": item.collapseTags || false, "limitNum": item.multipleLimit || 0, "labelValue": item.labelValue || "", "keyAttr": item.prop, "list": _vm.dictArr[item.prop], "placeholder": "请选择" }, on: { "onChange": function($event) {
      return _vm.handleDateChange(arguments);
    } } }) : _vm.dateType.includes(item.actionType) && !item.actionType.includes("range") ? _c("ListItemDate", { key: "c" + item.prop, attrs: { "labelName": item.label, "dataType": item.actionType, "valueFormat": item.valueFormat ? item.valueFormat : "yyyy-MM-dd HH:mm:ss", "format": item.format ? item.format : "yyyy-MM-dd HH:mm:ss", "formData": _vm.searchKeys, "keyAttr": item.prop, "divClassName": ["search-item"] }, on: { "onChange": function($event) {
      return _vm.handleDateChange(arguments);
    } } }) : _vm.dateType.includes(item.actionType) && item.actionType.includes("range") ? _c("ListItemDate", { key: "d" + item.prop, attrs: { "labelName": item.label, "dataType": item.actionType, "time_left": true, "valueFormat": item.valueFormat ? item.valueFormat : "yyyy-MM-dd HH:mm:ss", "format": item.format ? item.format : "yyyy-MM-dd HH:mm:ss", "formData": _vm.searchKeys, "keyAttr": item.prop, "divClassName": ["search-item", "search-item-time"], "startPlaceholder": "请选择", "endPlaceholder": "请选择" }, on: { "onChange": function($event) {
      return _vm.handleDateChange(arguments);
    } } }) : _vm._e()];
  }), _c("div", { staticClass: "floatRight searchBtns" }, [_vm._t("actionButton"), !_vm.noBasicButton ? [_c("vis-bttton", { staticClass: "search", attrs: { "vis_text": "查询" }, on: { "click": _vm.searchFun } }), _c("vis-bttton", { staticClass: "reset", attrs: { "vis_text": "重置" }, on: { "click": _vm.resetSearch } })] : _vm._e()], 2)], 2), _c("div", { staticClass: "tableBox" }, [_c("div", { staticClass: "vis_table" }, [_vm._t("tableCon"), !_vm.noTable ? _c("ZhxdTable", _vm._g(_vm._b({ ref: "zhxdTable", attrs: { "height-equal-scroll-height": "", "showSearchFormSta": _vm.showSearchFormSta, "dictionaries": _vm.dictObj, "resetStatus": _vm.resetStatus, "interface-params": _vm.searchKeys }, on: { "update:resetStatus": function($event) {
    _vm.resetStatus = $event;
  }, "update:reset-status": function($event) {
    _vm.resetStatus = $event;
  }, "successed": _vm.onSuccessed }, scopedSlots: _vm._u([_vm._l(_vm.slots, function(slot) {
    return { key: slot, fn: function({ row, props }) {
      return [_vm._t(slot, null, { "row": row, "props": props })];
    } };
  }), { key: "actionCol", fn: function({ row }) {
    return [_vm._t("tableCaozuo", null, { "row": row })];
  } }], null, true) }, "ZhxdTable", _vm.$attrs, false), _vm.$listeners)) : _vm._e()], 2)])])]), _vm.activeTabKey == 2 ? _c("div", { staticClass: "borderBox box2" }, [_vm._t("customFormHead"), _c("div", { staticClass: "tableBorder con_overflow_auto" }, [_vm._t("formPage")], 2)], 2) : _vm._e(), _vm.activeTabKey != 1 && _vm.activeTabKey != 2 ? _c("div", { staticClass: "borderBox box3" }, [_vm._t("customFormHead"), _c("div", { staticClass: "tableBorder con_overflow_auto" }, [_vm._t("detailPage", null, { "activeTabKey": _vm.activeTabKey })], 2)], 2) : _vm._e()])]), _c("vis-confirm", { attrs: { "vis_msg": "确定删除吗?", "vis_show": _vm.vis_delete_confirm_show }, on: { "cancel": _vm.cancelClick, "confirm": _vm.confirmClick } }), _vm.isImport ? _c("ImportFile", _vm._g(_vm._b({ ref: "refImportFile", attrs: { "dialog-show": _vm.dialogDaoruShow }, on: { "update:dialogShow": function($event) {
    _vm.dialogDaoruShow = $event;
  }, "update:dialog-show": function($event) {
    _vm.dialogDaoruShow = $event;
  } } }, "ImportFile", _vm.$attrs, false), _vm.$listeners)) : _vm._e()], 1);
};
var _sfc_staticRenderFns$1 = [];
var __component__$1 = /* @__PURE__ */ normalizeComponent(
  _sfc_main$1,
  _sfc_render$1,
  _sfc_staticRenderFns$1,
  false,
  null,
  null,
  null,
  null
);
const index$2 = __component__$1.exports;
const ConfirmPWD_vue_vue_type_style_index_0_lang = "";
const _sfc_main = {
  name: "ConfirmPWD",
  components: {
    RtzhDialog,
    RtzhButton
  },
  watch: {
    showDialog() {
      this.showZhxdDialog = true;
      this.pwd = "";
    }
  },
  props: {
    showDialog: {
      type: Boolean,
      default: false
    }
  },
  data: function() {
    return {
      pwd: "",
      showZhxdDialog: false
    };
  },
  methods: {
    chooseSure() {
      if (this.pwd) {
        this.showZhxdDialog = false;
        this.$emit("dialogSuccFun", this.pwd);
      } else {
        $common.showMsg().info("密码不能为空!");
      }
    }
  },
  mounted() {
  }
};
var _sfc_render = function render35() {
  var _vm = this, _c = _vm._self._c;
  return _c("div", { staticClass: "ConfirmPWD" }, [_c("RtzhDialog", { attrs: { "title": "确认密码", "close-on-click-modal": false, "close-on-press-escape": false, "show-close": false, "visible": _vm.showZhxdDialog, "custom-class": "dxjx-dialog" }, on: { "update:visible": function($event) {
    _vm.showZhxdDialog = $event;
  } } }, [_c("div", { directives: [{ name: "dialog-bg", rawName: "v-dialog-bg" }] }), _c("div", { staticClass: "margin-T-20" }, [_vm.showZhxdDialog ? _c("el-input", { staticClass: "m-b-20", attrs: { "maxlength": "100", "show-password": "", "placeholder": "请输入密码" }, model: { value: _vm.pwd, callback: function($$v) {
    _vm.pwd = $$v;
  }, expression: "pwd" } }) : _vm._e()], 1), _c("div", { staticClass: "tab-scroll table-add-edit" }, [_c("div", { staticClass: "list-item list-item-btn dxjx-dialog-footer" }, [_c("div", { staticClass: "vis_input" }, [_c("div", { staticClass: "vis_input_box" }, [_c("RtzhButton", { staticClass: "rightBtn", attrs: { "vis_text": "确 定" }, on: { "click": _vm.chooseSure } }), _c("RtzhButton", { staticClass: "rightBtn", attrs: { "vis_text": "关 闭" }, on: { "click": function($event) {
    _vm.showZhxdDialog = false;
  } } })], 1)])])])])], 1);
};
var _sfc_staticRenderFns = [];
var __component__ = /* @__PURE__ */ normalizeComponent(
  _sfc_main,
  _sfc_render,
  _sfc_staticRenderFns,
  false,
  null,
  null,
  null,
  null
);
const ConfirmPWD = __component__.exports;
const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
  __proto__: null,
  ConfirmPWD,
  GyButton,
  ImageListDialog: RtzhImageListDialog,
  ImportFile,
  ListItemCheckbox,
  ListItemDate,
  ListItemFiles,
  ListItemFilesMultiple,
  ListItemFilesOne,
  ListItemImgs,
  ListItemInput,
  ListItemInputSelect: ListItemSelect$1,
  ListItemNumber,
  ListItemRadio,
  ListItemSelect,
  RtzhButton,
  RtzhCheckbox: ListItemCheckbox,
  RtzhConfirm: VisConfirm,
  RtzhConfirmPWD: ConfirmPWD,
  RtzhConfirmUpload: index$4,
  RtzhDate: ListItemDate,
  RtzhDialog,
  RtzhFiles: ListItemFiles,
  RtzhFilesMultiple: ListItemFilesMultiple,
  RtzhFilesOne: ListItemFilesOne,
  RtzhForm: index$3,
  RtzhGpyDialog: index$5,
  RtzhImage: visImage,
  RtzhImageListDialog,
  RtzhImgs: ListItemImgs,
  RtzhImportFile: ImportFile,
  RtzhInput: ListItemInput,
  RtzhInputSelect: ListItemSelect$1,
  RtzhModulePage: index$2,
  RtzhNumber: ListItemNumber,
  RtzhRadio: ListItemRadio,
  RtzhSelect: ListItemSelect,
  RtzhTree,
  RtzhWorkStopPeview: workStopPeview,
  VisConfirm,
  VisConfirmUpload: index$4,
  VisImage: visImage,
  VisTree: RtzhTree,
  ZhxdDialog: RtzhDialog,
  ZhxdForm: index$3,
  ZhxdModulePage: index$2,
  visBttton: RtzhButton,
  workStopPeview
}, Symbol.toStringTag, { value: "Module" }));
const index$1 = "";
function blobToFile(blob, fileName, mimeType = "") {
  return new File([blob], fileName, { type: mimeType });
}
function compressImage(file, shouldCompress = true, fileType = "file") {
  return new Promise((resolve, reject) => {
    if (file.size < 500 * 1024) {
      resolve(file);
    }
    if (!shouldCompress || !file.type.startsWith("image/")) {
      resolve(file);
    } else {
      new Compressor(file, {
        quality: 0.6,
        // 压缩质量,可以根据需要调整
        convertTypes: ["image/png", "image/webp", "image/jpg", "image/jpeg"],
        convertSize: 3e6,
        success(result) {
          if (fileType == "file") {
            resolve(blobToFile(result, file.name, file.type));
          } else {
            resolve(result);
          }
        },
        error(err) {
          reject(err);
        }
      });
    }
  });
}
const { setGymRtzhUiOptions } = useGymRtzhUiOptions();
let install = (Vue, options) => {
  if (!install.installed) {
    setGymRtzhUiOptions(options);
    if (!options.noAllComponents) {
      Object.keys(components).forEach((key) => {
        let component = components[key];
        Vue.component(key, component);
      });
    }
    Vue.directive("dialog-bg", {
      bind: function(el) {
        el.innerHTML = `
      <div class="dialog-bg dialog-bg-lt"></div>
      <div class="dialog-bg dialog-bg-lb"></div>
      <div class="dialog-bg dialog-bg-rt"></div>
      <div class="dialog-bg dialog-bg-rb"></div>
    `;
      }
    });
    if (!options.noUseGlobal) {
      Vue.prototype.$validator = validator;
      Vue.prototype.$validatorMessage = validatorMessage;
      Vue.prototype.$regexp = regexp;
      Vue.prototype.$compressImage = compressImage;
      Vue.prototype.$message = resetMessage;
      Vue.prototype.$getFileUrl = (url) => {
        return url;
      };
    }
    if (options.useCommonLess && typeof document !== "undefined" && !document.body.classList.contains("gy-rtzh-ui")) {
      document.body.classList.add("gy-rtzh-ui");
    }
  }
};
const index = {
  install
};
export {
  $common,
  ConfirmPWD,
  GyButton,
  RtzhImageListDialog as ImageListDialog,
  ImportFile,
  ListItemCheckbox,
  ListItemDate,
  ListItemFiles,
  ListItemFilesMultiple,
  ListItemFilesOne,
  ListItemImgs,
  ListItemInput,
  ListItemSelect$1 as ListItemInputSelect,
  ListItemNumber,
  ListItemRadio,
  ListItemSelect,
  RtzhButton,
  ListItemCheckbox as RtzhCheckbox,
  VisConfirm as RtzhConfirm,
  ConfirmPWD as RtzhConfirmPWD,
  index$4 as RtzhConfirmUpload,
  ListItemDate as RtzhDate,
  RtzhDialog,
  ListItemFiles as RtzhFiles,
  ListItemFilesMultiple as RtzhFilesMultiple,
  ListItemFilesOne as RtzhFilesOne,
  index$3 as RtzhForm,
  index$5 as RtzhGpyDialog,
  visImage as RtzhImage,
  RtzhImageListDialog,
  ListItemImgs as RtzhImgs,
  ImportFile as RtzhImportFile,
  ListItemInput as RtzhInput,
  ListItemSelect$1 as RtzhInputSelect,
  index$2 as RtzhModulePage,
  ListItemNumber as RtzhNumber,
  ListItemRadio as RtzhRadio,
  ListItemSelect as RtzhSelect,
  RtzhTree,
  workStopPeview as RtzhWorkStopPeview,
  VisConfirm,
  index$4 as VisConfirmUpload,
  visImage as VisImage,
  RtzhTree as VisTree,
  RtzhDialog as ZhxdDialog,
  index$3 as ZhxdForm,
  index$2 as ZhxdModulePage,
  ajaxFile,
  default2 as axios,
  index as default,
  deleted,
  get,
  post,
  postFormdata,
  put,
  resetMessage,
  service,
  sm4$1 as sm4,
  RtzhButton as visBttton,
  workStopPeview
};